В разделе класса моего кода, если я пишу об ошибке, несколько строк будут сообщены как ошибки, хотя этого не должно быть. Я помещаю «| error
» в определенные места, где хорошо/безопасно восстанавливаться после ошибок, но я не думаю, что он его использует. Может быть, он пытается где-то возобновить среднее выражение?
Есть ли способ заставить Bison попытаться восстановиться в определенных местах? Как это работает и что я могу делать не так?
Я помещаю строку ошибки рядом с циклом. Вот пример:
SomeRuleLoop:
| Rule ',' SomeRuleLoop
Rule:
A
| B
| C
| Error
A:
AA AAB AABC
| AA AAB AABC Z
...
Вот пример моих правил. Я вижу «ошибку funcBody» в своей консоли, однако в следующей строке появляется ошибка из-за первой ошибки. Несмотря на то, что каждое funcBodyRule является автономным.
funcBodyLoop:
| funcBodyLoop funcBody
funcBody:
funcBodyRule
| error { printf("funcBody error"); $$=0; }
| '#' EQ { printf("still in funcBody\n"); $$=0; }
Пробовал писать #== между строкой с первой ошибкой и строкой со второй. Я написал это, чтобы проверить, находится ли синтаксический анализатор в цикле funcbody. Это не выдает ошибку, поэтому это. Неважно, я добавил printf, а строка не печатается, так что, может быть, ее больше нет в цикле функций? Как я могу это исправить?