2016-10-15 7 views
0

Я пишу парсер, но я не знаю, почему я не могу разобрать этот:Negative выражение ANTLR

Proceso A 
    varX <- - 4; 
FinProceso 

я получаю

line 2:12 extraneous input '-' expecting {NEGOP, '(', '-', INT, DOUBLE, STRING, BOOL, ID} 

Это моя грамматика в ANTLR

Grammar

ответ

0

Объяснение

Ваша грамматика состоит из двух лексем, соответствующих знаку -: SUMOP и NEG. В вашем случае лексем SUMOP будет всегда производиться лексером, потому что он определен до NEG lexem. Поэтому правило operatorUnary не используется.

SUMOP : ('+' | '-'); 
NEG : '-'; 

expr 
    : expr SUMOP expr 
    | operatorUnary expr 
    ; 

operatorUnary: '-'; 

Решение

Вы должны orginize свои лексем. Например, вы можете удалить лексем NEG и использовать только лексику SUMOP. .

SUMOP : ('+' | '-'); 

expr 
    : SUMOP expr   // higher precedence 
    | expr SUMOP expr  // lower precedence 
    ; 

Также часто является хорошей идея, чтобы сделать одноместный операцию отрицания с более высоким приоритетом, чем двоичное сложение и/или оператор Substraction. Вы можете добиться этого, изменив порядок правил expr альтернативы.

 Смежные вопросы

  • Нет связанных вопросов^_^