Правило рекурсивного выражения возвращает ноль

1

Я пытаюсь разобрать такие вещи, как это,

! (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; }
;
Теги:
antlr

1 ответ

1
Лучший ответ

Это просто путаница:

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; }
;
  • 0
    Отличный ответ! У меня была такая же проблема с паренами, и я их тоже решил!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню