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