Я очень смущен.У меня ошибка в моем файле и funcBodyLoop2 error aEOS
НЕ используется.
Почему?Это то, что беспокоит меня.У funcBodyLoop2 есть пустое правило, поэтому оно никогда не может потерпеть неудачу.И чтобы провалиться, funcBodyLoop2 должен быть уменьшен хотя бы один раз, прежде чем он сможет попытаться запустить правило | funcBodyLoop2 funcBody
. Из этих правил видно, что единственное место, где он может получить ошибку - это funcBody.Поэтому я добавил | funcBodyLoop2 error aEOS
(aEOS проверяет один или несколько операторов в конце, которые являются символами новой строки и ';').Таким образом, поскольку funcBodyLoop2 уже уменьшен, должна ли ошибка всегда быть в | funcBodyLoop2 error aEOS
?Запустив его, я всегда получал сводить к правилу дальше, чем хотел.Я заканчиваю тем, что пишу | error aEOS
, просто чтобы посмотреть, что происходит, и вижу сообщение о funcBodyLoop2 b после моей ошибки.
Мой вопрос: почему он использует это правило или не использует funcBodyLoop2 error aEOS
.Я не понимаю.
funcBodyLoop2:
| funcBodyLoop2 funcBody
| funcBodyLoop2 error aEOS { doerror("funcBodyLoop2", YYRECOVERING()); yyclearin; yyerrok; }
| error aEOS { doerror("funcBodyLoop2 b", YYRECOVERING()); yyclearin; yyerrok; }
funcBody:
funcBodyA
| funcBodyS mEOS
| funcBodyEs aEOS
| error aEOS { doerror("funcBody", YYRECOVERING()); yyclearin; yyerrok; }