我正在尝试解析这样的事情:
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
但在这种情况下,我会有两个同名的变量。
什么是正确的解决方案?
答案 0 :(得分:1)
您可以为匹配的子表达式添加标签:
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;
以任何方式,您都可以在所需的位置/子规则获得表达式的值。