嵌套表达式,我应该如何获取值
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' ;
现在,如果我需要获取 Identifier
和 StringLiteral
的值,我可以使用 $
东西。
但是如何从 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 处的表达式值。
我正在尝试解析这样的东西:
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' ;
现在,如果我需要获取 Identifier
和 StringLiteral
的值,我可以使用 $
东西。
但是如何从 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 处的表达式值。