Как упомянуть блок try-catch в грамматике JavaCC

#java #parsing #parser-generator #javacc

#java #синтаксический анализ #анализатор-генератор #javacc

Вопрос:

Я пытаюсь реализовать отчеты об ошибках и восстановление в грамматике JavaCC, как указано в http://javacc.java.net/doc/errorrecovery.html

После упоминания кода;

 void Stm() :
{}
{
  try {
    (
      IfStm()
    |
      WhileStm()
    )
  catch (ParseException e) {
    error_skipto(SEMICOLON);
  }
}


void error_skipto(int kind) {
  ParseException e = generateParseException();  // generate the exception object.
  System.out.println(e.toString());  // print the error message
  Token t;
  do {
    t = getNextToken();
  } while (t.kind != kind);
    // The above loop consumes tokens all the way up to a token of
    // "kind".  We use a do-while loop rather than a while because the
    // current token is the one immediately before the erroneous token
    // (in our case the token immediately before what should have been
    // "if"/"while".
}
  

Файл не удалось проанализировать JavaCC, показывая ошибку в слове ‘try’ и в строке

 'void error_skipto(int kind)' .
  

Каков правильный способ сделать это?

Заранее спасибо

 This is the error that is coming
  

введите описание изображения здесь

Комментарии:

1. Что означает «отображение ошибки в слове ‘try'». Какие точные сообщения об ошибках вы видите, и в каких точных строках они происходят? Пожалуйста, помните при размещении вопросов здесь, что мы не можем видеть ваш экран отсюда, и что единственная информация, которой мы располагаем, — это то, что вы указали в своем вопросе. «отображение ошибки» бессмысленно без знания того, что это за ошибка, и остальной информации, которая у вас есть о ней. Вы гораздо быстрее получите помощь в решении возникающих проблем, если при публикации вашего вопроса вы дадите нам информацию, с помощью которой их можно решить. Спасибо. 🙂

Ответ №1:

Очевидно, вы используете не JavaCC, а JTB 1.3.2.

JTB предположительно имеет свой собственный анализатор для файлов грамматики .jj, и может случиться так, что JTB не поддерживает try -catch, как показано. В этом случае использование JavaCC на том же входе должно дать вам другой результат.

Комментарии:

1. Получение исходного кода JTB и просмотр их грамматики показали бы, поддерживается ли try-catch. Также ищите версии новее 1.3.2.