Как написать грамматику для восстановления лексических и синтаксических ошибок? - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь написать грамматику для восстановления лексических и синтаксических ошибок, используя 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 в грамматике, но вместо этого перехватывается в основной функции внутри класса моего синтаксического анализатора.

...