Как мне сказать бизону есть синтаксическая ошибка?

Что происходит, это особый случай, когда после анализа AST я узнаю, есть ли ошибка или нет, когда правило закончено. Я попробовал yyerror("бла") без удачи.

Поскольку я не могу сказать, что есть ошибка, он заканчивает другое правило и теперь имеет конфликт уменьшения / уменьшения. Это раздражает, потому что я ЗНАЮ, когда один из них недействителен, не глядя на другого, но пользователь должен страдать, потому что я не знаю, как сказать, игнорировать эту ветку, потому что она недействительна

Как мне решить эту проблему?

2 ответа

Решение

Ты хочешь YYERROR не yyerror - положить YYERROR в действии заставляет синтаксический анализатор сделать действие синтаксической ошибкой и перейти в режим восстановления после ошибок (если у вас есть какие-либо действия по исправлению ошибок в вашем анализаторе - в противном случае это более или менее эквивалентно YYABORT). yyerror это процедура, вызываемая бизоном с сообщениями об ошибках - реализация по умолчанию - печатать сообщение об ошибке - но она не имеет (конкретно) ничего общего с синтаксическим анализом или синтаксическими ошибками.

Обратите внимание, что это не имеет никакого отношения ни к каким конфликтам уменьшения-уменьшения (или сдвига-уменьшения) - конфликты не являются ошибками, это вещи в вашей грамматике, которые делают его не-LALR(1), так что парсер, сгенерированный зубрами, не может Надежно распознать это.

Вам нужно создать синтаксис, свободный от уменьшения / уменьшения конфликтов

Другие вопросы по тегам