Я пытаюсь написать грамматику для восстановления лексических и синтаксических ошибок, используя Javacc, и не знаю, как использовать грамматику error_skipto (). Сначала я пытаюсь восстановить ошибки только из нескольких строк print () или вмой язык, операторы "syout ()", чтобы понять, как он работает, и применить его к остальным моим грамматикам, но я не могу получить ожидаемые результаты, также мой оператор try-catch не улавливает ошибку TokenMnger
внутриграмматика, в которой я ее объявляю, вместо этого ловится в той, которая объявлена в главной функции моего класса синтаксического анализатора
Структура моего исходного кода на моем языке будет выглядеть следующим образом
//source code
start
syout(1)~
syout(2)
syout(3)
syout(4)~
over
//source code
//the "~" symbol is the line-end indicator,and "start" and "over" delimits
//the "main function"
Я создаю 3 последовательных синтаксических ошибки
И моя грамматика для операторов syout () следующая: я передаю грамматике error_skip () символ "~" и исключение
void imprimir():
{}
{
try{
<DATA_OUT><OPEN_PAREN>(<NUM_INT>|
<NUM_FLOAT>|<CHAR>|<STRING>|<IDENTIFIER>)
<CLOSE_PAREN><LINE_END>
}catch(ParseException e){
error_skipto(LINE_END, e);
}catch(TokenMgrError err){
error_skipto2(LINE_END,err);
}
}
Я использую грамматику error_skipto () из документации Javacc и добавил аргумент для печати точного сообщения об ошибке
JAVACODE
void error_skipto(int kind, ParseException ex){
System.out.println(ex.toString());
Token t;
do {
t=getNextToken();
} while (t.kind!=kind);
}
Для этого источникакод, я должен получить 3 сообщения об ошибках от парсера, но я получаю только одно, первое. Но когда я выдаю непоследовательные ошибки, я получаю все ошибки. Также, если я выдаю лексическую ошибку, этоне перехватывается внутри блока try-catch в грамматике, но вместо этого перехватывается в основной функции внутри класса моего синтаксического анализатора.