В общем, для функции t_error () доступна только очень ограниченная информация. В качестве входных данных он получает маркерный объект, значение которого было установлено для оставшегося входного текста. Анализ этого текста полностью зависит от вас. Вы можете использовать функцию t.lexer.skip (n), чтобы лексер пропустил определенное количество символов, и это все.
Нет понятия «тип ошибки», кроме факта, что существует входной символ, который не соответствует регулярному выражению какого-либо известного токена. Поскольку лексер отделен от синтаксического анализатора, не существует прямого способа получить какую-либо информацию о состоянии механизма синтаксического анализа или выяснить, какое грамматическое правило анализируется. Даже если бы вы могли получить состояние (которое будет просто номером основного состояния конечного автомата LALR), его интерпретация, вероятно, будет очень трудной, поскольку анализатор может находиться на промежуточных этапах сопоставления десятков возможных правил грамматики в поисках сокращения. действия.
Мой совет таков: если вам нужна дополнительная информация в функции t_error (), вы должны установить какой-либо объект, который будет использоваться совместно компонентами lexer и parser вашего кода. Вы должны явно заставить разные части вашего компилятора обновлять этот объект по мере необходимости (например, он может обновляться в определенных грамматических правилах).
Кроме того, как правило, существует очень мало путей действия для плохого жетона. По сути, вы получаете вводимый текст, который не содержит какой-либо известной части алфавита языка (например, нет известного символа). Таким образом, нет даже никакого значения токена, которое вы можете дать парсеру. Обычно единственный способ действия - сообщить о неверном вводе, выбросить его и продолжить.
В качестве продолжения ответа Раймонда я бы также не советовал изменять какой-либо атрибут объекта лексера в t_error ().