ANTLR4: посторонняя ошибка ввода

Я следую книге «Полный справочник по ANTLR4» и решил добавить пару ключевых слов в грамматику своего калькулятора, чтобы помочь очистить память. Построение грамматики и компиляция полученного java-кода работает нормально, но когда я выполняю код посетителя, я получаю ошибку: "line 6:0 extraneous input '$rem' expecting {<EOF>, '(', ID, INT, NEWLINE}" и то же самое для '$clearmem' в строке 8:0.

Вот мой файл грамматики:

grammar LabeledExpr;

//Parser rules================================= 
prog: kword+
    | stat+ 
    ;

stat: expr endl             # printExpr
    | ID '=' expr endl      # assign
    | NEWLINE               # blank
    ;

expr: expr op=('*'|'/') expr    # MulDiv
    | expr op=('+'|'-') expr    # AddSub
    | INT                       # int
    | ID                        # id
    | '(' expr ')'              # parens
    ;

kword: '$clearmem' endl     #clearMem
    | '$rem' ID endl        #remVar
    ;

endl: NEWLINE
    | EOF
    ;

//Lexer rules==================================
ID: [a-zA-Z]+ ;
INT: [0-9]+ ;
NEWLINE: '\r'? '\n' ;
WS: [ \t]+ -> skip;

MUL: '*' ;
DIV: '/' ;
ADD: '+' ;
SUB: '-' ;

И файл .expr с кодом для разбора:

193
a = 5
b = 6
a
b 
$rem a
a
$clearmem

Я только начал работать с ANTLR4 прошлой ночью, поэтому я действительно не знаю, что искать в отношении ошибок, но из того, что я могу сказать, с обоими файлами все в порядке.

Я уверен, что мне не хватает чего-то довольно простого, но я могу это найти, поэтому я был бы признателен за помощь всем, кто более знаком с ANTLR4.

Спасибо.


person sm81095    schedule 27.01.2014    source источник


Ответы (1)


Проблема в вашем prog правиле:

prog: kword+
  | stat+ 
  ;

Это правило гласит, что программа состоит из одного или нескольких kword правил или одного или нескольких stat правил. Не существует программы, которая включала бы и kword, и stat. Вероятно, вы хотели написать следующее, что допускает любую последовательность правил kword или stat. Обратите внимание, что я изменил + на *, чтобы разрешить пустую программу. Даже если ваш компилятор не должен допускать, чтобы программа была пустой, эту ошибку лучше оставить для проверки в посетителе или слушателе.

prog
  : ( kword
    | stat
    )*
  ;
person Sam Harwell    schedule 27.01.2014
comment
Ах да, это исправлено. Оказывается, это было что-то простое. Спасибо. - person sm81095; 27.01.2014