嵌套表达式,我应该如何获取值

Nested expression, how should I get the value

我正在尝试解析这样的东西:

where length matches "5000" (status matches "200" OR status matches "302")

where
    : WHERE whereExpression
    ;

whereExpression
    : Identifier MATCHES StringLiteral
    | LPAREN whereExpression RPAREN
    | whereExpression AND whereExpression
    | whereExpression OR  whereExpression
    ;
WHERE: 'where' ;

现在,如果我需要获取 IdentifierStringLiteral 的值,我可以使用 $ 东西。

但是如何从 whereExpression AND whereExpression 模式中获取值呢?

我一直在考虑用Identifier MATCHES StringLiteral AND Identifier MATCHES StringLiteral

代替它

但在那种情况下,我会有两个同名变量。

什么是正确的解决方案?

您可以为匹配的子表达式添加标签:

whereExpression
: Identifier MATCHES StringLiteral #whereMatches
| LPAREN whereExpression RPAREN   # whereParens
| lhsAnd = whereExpression AND rhsAnd = whereExpression   #whereAnd
| lhsOr = whereExpression OR  rhsOr = whereExpression #whereOr
;

有关详细信息,请参阅 documentation

或者您可以将规则拆分为多个规则

whereExpression
: whereMatches
| whereParens
| whereAnd
| whereOr
;


whereMatches : Identifier MATCHES StringLiteral;
whereParens : LPAREN whereExpression RPAREN;
whereAnd : lhs = whereExpression AND rhs = whereExpression;
whereOr : lhs = whereExpression OR  rhs = whereExpression;

您可以通过任何方式获得所需 position/subrule 处的表达式值。