递归表达式规则返回null

时间:2015-04-02 10:56:20

标签: java regex antlr

我试图解析这样的事情,

! (a="1" AND b="2")

但首先会处理'!' expression,因此它会变为!(a="1" AND b="2"),而expression部分的值将变为空。 (因为它尚未处理)

有什么想法吗?这似乎是一个普遍的问题。

附上规则:

expression returns [String value]
:  StringLiteral
{ $value = $StringLiteral.text; }

|  IntegerLiteral
{ $value = $IntegerLiteral.text; }

|  Identifier '=' StringLiteral
{ $value = $Identifier.text + ":" + $StringLiteral.text; }

|  Identifier '=' IntegerLiteral
{ $value = $Identifier.text + ":" + $IntegerLiteral.text; }

|  '!' expression
{ $value = " ! " + $expression.value; }

|  '(' expression ')'
{ $value = '(' + $expression.value + ')'; }

|  le = expression AND re = expression
{ $value = $le.value + " AND " + $re.value; }

|  le = expression OR  re = expression
{ $value = $le.value + " OR " + $re.value; }
;

1 个答案:

答案 0 :(得分:1)

这只是一些命名混淆:

expression returns [String value] // A
    ...

    |  '!' expression
    { $value = " ! " + $expression.value; }
;

因为您的词法分析器规则称为expression,所以$ value和$ expression.value引用相同的变量。您在设置之前正在阅读它,这会产生null值。

你想要的是:

expression returns [String value] // A
    ...

    |  '!' e = expression
    { $value = " ! " + $e.value; }
;