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

时间:2015-03-10 09:51:07

标签: antlr antlr4

我正在尝试解析这样的事情:

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

替换它

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

什么是正确的解决方案?

1 个答案:

答案 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;

以任何方式,您都可以在所需的位置/子规则获得表达式的值。