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