Зубр уменьшит ошибки. Почему он использует это размещение ошибок вместо этого? - PullRequest
1 голос
/ 11 февраля 2011

Я очень смущен.У меня ошибка в моем файле и 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; }

1 Ответ

1 голос
/ 13 февраля 2011

Как написано, ваша грамматика имеет конфликт сдвига / уменьшения между двумя правилами ошибок в funcBodyLoop2 и конфликт уменьшения / уменьшения между первым правилом ошибок funcBodyLoop2 и правилом ошибок funcBody.Последнее означает, что правило ошибки funcBody никогда не может сработать, так как правило funcBody2 всегда будет иметь приоритет (его ранее в файле).

Так что если вы получите ошибку в самом начале funcBody2 (вы 'При попытке проанализировать один и самый первый токен не может по закону начать funcBody2 или следовать за пустым funcBody2 в текущем контексте), он вызовет вторую ошибку funcBody2 (shift) и затем выбросит токены, пока не увидитaEOS (так как это единственная законная вещь, которая там подходит), которая затем сместит и уменьшит это b правило ошибки.

Если вы получите ошибку после уменьшения хотя бы одного funcBody2 (так что не всамый первый токен), затем он запускает первое правило ошибки funcBody2 (не-b).

...