Я нашел ответ на пути восстановления исправления в режиме паники, но у него тоже есть некоторые ошибки. То, что я сделал, это изменить мою грамматику, чтобы после того, как я столкнулся с отсутствующим символом в строке входного файла (в приведенном выше примере с точкой с запятой), продолжайте, пока он не найдет аналогичный символ. Эти аналогичные символы называются синхронизирующими токенами.
См. Пример ниже. Сначала я заменил все маркеры 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);
Таким образом, после нахождения первой точки с запятой в приведенном выше примере возвращается к правилу переменной декларации (потому что это один, который называется методом точка с запятой().) Но что мы находим после того, как вновь найти точку с запятой является вызов функции, а не объявление переменной.
Может кто-нибудь предложить способ решить эту проблему.