В моей грамматике с antlrworks я могу получить исключение noviablealtexception для правил вроде if, для которых нужны соответствующие правая и левая скобки. Тем не менее, в Java, я не могу получить noviablealtexception.
loop_statement: (WHILE LPAREN expr RPAREN statement)
| (DO statement WHILE LPAREN expr RPAREN);
condition_statement
: IF LPAREN expr RPAREN statement (options {greedy=true;}: ELSE statement)?
В правиле оператора у меня есть правило блока,
statement_blocks
: (LBRACE statement* RBRACE)
;
И правило утверждения ниже,
statement
: var_dec
| statement_blocks
| condition_statement
| loop_statement
| expr_statement
;
Перед публикацией я проверил несколько примеров. Я думаю, что мне нужно добавить EOF в конце каждого правила. Когда я добавляю EOF для этих правил, я получаю разные ошибки. Например,
loop_statement: ((WHILE LPAREN expr RPAREN statement)
| (DO statement WHILE LPAREN expr RPAREN)) EOF;
condition_statement
: (
(IF LPAREN expr RPAREN statement (options {greedy=true;}: ELSE statement)?
)EOF
Это то, что я получаю за следующие данные;
if(s==d){
d=s;
if(a=n){
s=h;
}
a=g;
}
строка 6: 0 отсутствует EOF при 'a'
Когда я удаляю первую левую скобку из первого «если»
if(s==d)
d=s;
if(a=n){
s=h;
}
a=g;
}
testcases / строка нового файла 3: 0 отсутствует EOF при 'if',
testcases / новая строка файла 6: 0 отсутствует EOF при 'a'
while(s==d){
d=s;
while(a=n){
s=h;
}
a=g;
}
в строке 6: 0 отсутствует EOF при 'a'
Когда я убираю первую левую скобку с первого «пока»
while(s==d)
d=s;
while(a=n){
s=h;
}
a=g;
}
testcases / новая строка файла 3: 0 отсутствует EOF при 'while'
testcases / new file line 6: 0 отсутствует EOF при 'a'