2014-10-05 3 views
0

У меня есть эта грамматика:ANTLR Выдает ошибку, но грамматика функциональна

grammar Flow; 

@header { import java.util.HashMap; } 

@members { HashMap<String, String> vars = new HashMap<>(); } 

WS:   (' '|'\n'|'\r'|'\t') -> skip; 

flow:  (print|var)+ EOF; 

print:  'print' (toPrint=PRINTABLE { System.out.println($toPrint.text); })|(id=ID { 
    if (vars.containsKey($id.text)) { 
     System.out.println(vars.get($id.text)); 
    } else { 
     System.err.println("This variable is not assigned!"); 
    } 
}); 

var:  'var' id=ID '=' val=PRINTABLE { vars.put($id.text, $val.text); }; 

PRINTABLE: STRING|NUMBER|LETTER|DIGIT; 

STRING:  '"' (.)*? '"'; 

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

NUMBER:  DIGIT+ ('.' DIGIT+)?; 

ID:   LETTER (LETTER|DIGIT)*; 

Когда я взываю правило запуска «поток» и ввести некоторые действительные переменную и попытаться напечатать его, TestRig кидает ошибку:

линии 2: 6 отсутствует ПЕЧАТЬ на «выходе»

Но все работает хорошо. Как заблокировать эти досадные ошибки?

Благодарим за отзыв!

+0

Может Вы публикуете ввод образца? – Onur

+1

КПП. Я бы сделал 'PRINTABLE' правилом парсера, т. Е.' Printable'. В противном случае не будет токенов для 'STRING',' NUMBER' и т. Д., Так как все они станут токенами «PRINTABLE». Также единственным символьным идентификатором будет «PRINTABLE», а не идентификатор, так как первым приходит «PRINTABLE». – Onur

ответ

0

не решение вашей проблемы, но немного улучшенная версия вашей грамматики адресации, упомянутые в моем комментарии вопросов:

grammar Flow; 

@header { import java.util.HashMap; } 

@members { HashMap<String, String> vars = new HashMap<>(); } 

WS:   (' '|'\n'|'\r'|'\t') -> skip; 

flow:  (print|var)+ EOF; 

print:  'print' (toPrint=printable { System.out.println($toPrint.text); }) 
      | (id=ID { 
         if (vars.containsKey($id.text)) { 
         System.out.println(vars.get($id.text)); 
         } else { 
          System.err.println("This variable is not assigned!"); 
         } 
        } 
      ) 
      ; 

var:  'var' id=ID '=' val=printable { vars.put($id.text, $val.text); }; 

printable: STRING|NUMBER|ID|NUMBER; 

STRING:  '"' (.)*? '"'; 

NUMBER:  DIGIT+ ('.' DIGIT+)?; 

ID:   LETTER (LETTER|DIGIT)*; 

fragment LETTER: ('a'..'z'|'A'..'Z'); 
fragment DIGIT: ('0'..'9'); 
Смежные вопросы