递归表达式规则 returns null

Recursive expression rule returns null

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

! (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; }
;

这只是一些命名混乱:

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

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

因为您的词法分析器规则称为 expression,$value 和 $expression.value 指的是同一个变量。您在设置它之前正在阅读它,这会导致 null 值。

你想要的是:

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

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