2012-06-06 4 views
1

Я хочу сделать LL (1) грамматик в ANTLR, который допускает множественную привязку, например: x = y = 5;ANTLR - Семантический предикат и LL (1)

Я думаю, что семантический предикат имеет смысл использовать в этой ситуации, но следующие правила не будут работать :(

tokens { 
BECOMES = '=' 
} 

    assignment_statement 
      : IDENTIFIER BECOMES expr 
      ; 

     expr 
      : (IDENTIFIER BECOMES)=> IDENTIFIER BECOMES expr 
      | expr_or 
      ; 

     IDENTIFIER 
      : LETTER (LETTER | DIGIT)* 
      ; 

ANTLRWORKS дает NoViableAltException.

Вы знаете, что я сделал не так и как сделать эту работу? Спасибо!

ответ

1

грамматику с синтаксической (не семантического) предикат, который выглядит ах Конечно, 2 токена не LL (1).

Но вам не нужен предикат, просто сделать что-то вроде этого:

grammar T; 

options { 
    output=AST; 
} 

tokens { 
    BECOMES = '='; 
} 

assignment_statement 
: (IDENTIFIER BECOMES)+ expr ';' 
; 

expr 
: IDENTIFIER 
| NUMBER 
; 

IDENTIFIER 
: LETTER (LETTER | DIGIT)* 
; 

NUMBER 
: DIGIT+ 
; 

fragment LETTER : 'a'..'z' | 'A'..'Z'; 
fragment DIGIT : '0'..'9'; 

, который будет анализировать ввод "x=y=5;" следующим образом:

enter image description here

но отвергнет вход как "x=2=3;".

Кроме того, интерпретатор ANTLRWorks не работает с каким-либо предикатом: вместо этого используйте отладчик ANTLRWorks.

+0

Я хотел бы убедиться, что что-то вроде x = 2 = 3; не могло случиться. Но для вас теперь ваше решение работает! :) Спасибо! – user1255553

+0

@ user1255553, да, это имеет смысл: см. Мой отредактированный ответ. –

+0

К сожалению, вы отредактировали ответ уже не LL (1): p – user1255553

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