1

我正在使用 Bison 和 Java 进行解析器,但我遇到了一些问题。我使用我自己的类型“TreeNode”作为默认语义值。这是我的 .y 文件中的代码:

prog: def_var TERMINATOR inc_val {
    TreeNode t = new TreeNode();
    t = $1;
}

它的代码由 Bison 生成:

TreeNode t = new TreeNode();
t = ((Integer)(yystack.valueAt (9-(1))));

而且我有错误“不可转换的类型”,因为我的 TreeNode 无法转换为整数。如何禁用此自动转换?

4

1 回答 1

2

我不相信您引用的代码来自您引用的野牛规范,因为我不相信野牛会更改变量名,即使在 Java 中也是如此。因此,您应该尝试追踪实际产生该编译时错误的产品。我怀疑您会发现b从该生产中分配的任何内容都有 type Integer

bison 总是为其 Java 对象堆栈使用一些基本类型(我猜你会说是超级类型),它可以保存来自任何终端或令牌的任何语义值。默认情况下,它使用,Object但如果您愿意,您可以定义更严格的内容。因此它必须将对象堆栈上的值转换为令牌或终端的已知(声明的)值。这就是它的(Integer)来源。

于 2012-12-10T00:35:44.153 回答