Как мне сказать бизону есть синтаксическая ошибка?
Что происходит, это особый случай, когда после анализа AST я узнаю, есть ли ошибка или нет, когда правило закончено. Я попробовал yyerror("бла") без удачи.
Поскольку я не могу сказать, что есть ошибка, он заканчивает другое правило и теперь имеет конфликт уменьшения / уменьшения. Это раздражает, потому что я ЗНАЮ, когда один из них недействителен, не глядя на другого, но пользователь должен страдать, потому что я не знаю, как сказать, игнорировать эту ветку, потому что она недействительна
Как мне решить эту проблему?
2 ответа
Ты хочешь YYERROR
не yyerror
- положить YYERROR
в действии заставляет синтаксический анализатор сделать действие синтаксической ошибкой и перейти в режим восстановления после ошибок (если у вас есть какие-либо действия по исправлению ошибок в вашем анализаторе - в противном случае это более или менее эквивалентно YYABORT
). yyerror
это процедура, вызываемая бизоном с сообщениями об ошибках - реализация по умолчанию - печатать сообщение об ошибке - но она не имеет (конкретно) ничего общего с синтаксическим анализом или синтаксическими ошибками.
Обратите внимание, что это не имеет никакого отношения ни к каким конфликтам уменьшения-уменьшения (или сдвига-уменьшения) - конфликты не являются ошибками, это вещи в вашей грамматике, которые делают его не-LALR(1), так что парсер, сгенерированный зубрами, не может Надежно распознать это.
Вам нужно создать синтаксис, свободный от уменьшения / уменьшения конфликтов