我试图解析这样的事情,
! (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; }
;
答案 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; }
;