递归表达式规则 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; }
;
我正在尝试解析这样的东西,
! (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; }
;