Go 1.5和1.6中yacc的向后兼容性

Go 1.5和1.6中yacc的向后兼容性,go,yacc,backwards-compatibility,Go,Yacc,Backwards Compatibility,Lex应该返回令牌标识符,并放置其他令牌 lval中的信息(替代通常的yylval) 以上文字摘自《围棋》 我在yacc文件(some.y文件)的语法规则的动作部分使用了变量(yylval)。代码在GO1.5中工作。但是Go1.6中没有编译相同的代码。当我检查生成的y.go文件(从'go yacc tool some.y'命令)时,go在不同版本中创建了不同的变量名 var yylval yySymType //in G0 1.5 var yyVAL yySymType //in Go 1.6

Lex应该返回令牌标识符,并放置其他令牌 lval中的信息(替代通常的yylval)

以上文字摘自《围棋》

我在yacc文件(some.y文件)的语法规则的动作部分使用了变量(yylval)。代码在GO1.5中工作。但是Go1.6中没有编译相同的代码。当我检查生成的y.go文件(从'go yacc tool some.y'命令)时,go在不同版本中创建了不同的变量名

var yylval yySymType //in G0 1.5
var yyVAL yySymType //in Go 1.6
这是反对向后兼容的吗?或者Go不能保证变量的向后兼容性?还是yylval变量的用法是错误的


将变量名称yylval替换为yyVAL后,代码运行良好。

您很可能看到中所做的更改。但是根据代码,您应该一直使用
$$VAL
(即
yyVAL
)。在Go 1.6中,同样的值也可以通过
$$rcvr.lval
访问

不管是谁,很高兴你解决了

编辑:


为了澄清,我假设即使在Go 1.5或更低版本中,我们也应该使用
yyVAL
,而不是
yylval
。因此,我的意思是,您在问题中链接的文档可能是错误的,错误就在那里。但是,您100%正确地认为,如果情况并非如此,则Go 1承诺已被打破,应予以纠正。

我尝试了您的解决方案。但它不起作用。我真正想要的是一些。当我尝试像$$VAL.some_x这样的解决方案时,它被替换为yyVAL.some_type_of_nonterminal.some_x(在生成的y.go中)。但有些是yyVAL中的一个字段。[some_type_of_nonterminal是我为其编写了一条规则并在操作块中使用了提到的表达式(yyVAL.some_x)的非终端类型。我想说的是,在阅读代码后,我认为我们应该使用
yyVAL
(在源代码中表示为
$$VAL
)。而不是直接使用
$$VAL
yylval
。因此,您的意思是,对于Go 1.6,必须将yacc文件中的变量yylval更改为yylval。如果这是您的意思,请提及您对该承诺的看法“”。