2012-03-10 1 views
0

Есть ли способ в javacc для синтаксического анализа входного файла даже после обнаружения ошибки. Я узнал, что существует несколько способов восстановления панического режима, восстановления уровня фразы и т. Д. Но я не могу понять, как реализовать его в javacc jjt-файле. Для примера предположит, мой входного файлВосстановление нескольких ошибок в Javacc

Line 1: int i 
Line 2: int x; 
Line 3: int k 

Так что я хочу, после обнаружения ошибки недостающей точки с запятой в строке 1, выполните синтаксический анализ и найти ошибку в строке-тоже.

ответ

0

Я нашел ответ на пути восстановления исправления в режиме паники, но у него тоже есть некоторые ошибки. То, что я сделал, это изменить мою грамматику, чтобы после того, как я столкнулся с отсутствующим символом в строке входного файла (в приведенном выше примере с точкой с запятой), продолжайте, пока он не найдет аналогичный символ. Эти аналогичные символы называются синхронизирующими токенами.

См. Пример ниже. Сначала я заменил все маркеры SEMICOLON в своей грамматике.

Semicolon() 

Затем добавьте это новое правило производства.

void Semicolon() : 
    {} 
    { 
    try 
    { 
    <SEMICOLON> 
    } catch (ParseException e) { 
     Token t; 
     System.out.println(e.toString()); 
     do { 
     t = getNextToken(); 
     } while (t.kind != SEMICOLON && t!=null && t.kind != EOF); 
    } 
    } 

После того, как я сталкиваюсь недостающий поиск символов парсера для подобного character.When он находит такой характер она возвращается к правилу, которое называется его.

Пример: - Предположим, что в объявлении переменной отсутствует точка с запятой.

int a=10 <--- no semicolon 

Таким образом, парсер ищет точку с запятой. В какой-то момент он находит точку с запятой.

___(some code)__; method(param1); 

Таким образом, после нахождения первой точки с запятой в приведенном выше примере возвращается к правилу переменной декларации (потому что это один, который называется методом точка с запятой().) Но что мы находим после того, как вновь найти точку с запятой является вызов функции, а не объявление переменной.

Может кто-нибудь предложить способ решить эту проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^