在 YACC 错误消息中打印多字符标记

问题描述

如果 Yacc 检测到语法错误并定义了详细错误,则打印错误消息,例如

unexpected '[',expecting BECOMES

有没有办法用错误消息中的实际字符串(例如 BECOMES)替换多字符标记(例如 :=)的标记名称?我问的原因是解析器的用户可能不清楚 BECOMES 代表 :=

解决方法

您可以通过在 %token 定义中的令牌名称后添加引号来定义令牌名称的人类可读版本:

%token BECOMES "':='"

这会将错误消息更改为:

unexpected '[',expecting ':='