Java中的打印机声明

Java中的打印机声明,java,bison,Java,Bison,我正在使用Bison和%define parse.error verbose选项来提供更多信息性错误消息。Bison用Java语言生成解析器。当前解析器打印消息,例如 语法错误,意外标识符,应为RPAREN或逗号 我想使用%printer声明来替换默认令牌名称,但我在bison文档中发现Java不支持它们: Java解析器不支持%printer,因为toString()可用于打印语义值。但是,在未来版本的Bison中,这可能会发生变化(以向后兼容的方式)。 每个标记都声明了语义值的类型,例如%t

我正在使用Bison和
%define parse.error verbose
选项来提供更多信息性错误消息。Bison用Java语言生成解析器。当前解析器打印消息,例如

语法错误,意外标识符,应为RPAREN或逗号

我想使用
%printer
声明来替换默认令牌名称,但我在bison文档中发现Java不支持它们:

Java解析器不支持%printer,因为toString()可用于打印语义值。但是,在未来版本的Bison中,这可能会发生变化(以向后兼容的方式)。

每个标记都声明了语义值的类型,例如
%tokenidentifier
,其中
Symbol
具有自定义的
toString()
方法

但我仍然不知道如何告诉解析器调用
toSting()
方法,而不是打印默认令牌的名称

你有什么建议吗

提前谢谢


Grzegorz

用别名声明代币:

%token <id> IDENTIFIER "identifier"
%token RPAREN "right parenthesis"
%令牌标识符“标识符”
%标记RPAREN“右括号”

%printer
函数不会在错误消息中使用,即使它是在Java中实现的,因为错误是指未遇到的标记,而
%printer
方法用于打印遇到的标记的语义值。未计数器标记不存在,因此无法打印其语义值,只能打印其描述。

错误消息中的一个标记不是“未计数器”,而是一个前瞻标记。因此它确实有一个相关的语义值(在lexer设置的
yylval
中),它只是还没有在解析器堆栈上移动。所以有人会认为它会使用
%打印机
,但事实并非如此。