Я пытаюсь разобрать такие вещи, как это,
! (a="1" AND b="2")
Но '!' expression
'!' 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; }
;
Поскольку ваше правило lexer называется expression
, $ value и $ expression.value относятся к одной и той же переменной. Вы читаете его перед установкой, что приводит к null
значению.
Вы хотите:
expression returns [String value] // A
...
| '!' e = expression
{ $value = " ! " + $e.value; }
;