我使用带有%define parse.error verbose
选项的Bison来提供更多信息性错误消息。 Bison使用Java语言生成解析器。目前,解析器打印诸如
syntax error, unexpected IDENTIFIER, expecting RPAREN or COMMA
我想使用%printer
声明来替换默认令牌名称,但我在bison docs中发现它们在Java中不受支持:
Java parsers do not support %printer, as toString() can be used to print the semantic values. This however may change (in a backwards-compatible way) in future versions of Bison.
每个令牌都声明了sematic值的类型,例如: %token <Symbol> IDENTIFIER
其中Symbol
具有自定义toString()
方法。
但我仍然不知道如何告诉解析器调用toSting()
方法而不是打印默认令牌的名称。
你有什么建议吗?
提前致谢!
的Grzegorz
答案 0 :(得分:1)
使用别名声明令牌:
%token <id> IDENTIFIER "identifier"
%token RPAREN "right parenthesis"
%printer
函数不会在错误消息中使用,即使它是用Java实现的,因为错误是在谈论尚未遇到的令牌,而%printer
方法用于打印遇到的令牌的语义值。未被攻击的令牌不存在,因此无法打印其语义值,只能打印其描述。