Lexはトークン識別子を返し、他のトークン の情報をlval(通常のyylvalを置き換えます)に置きます。Go 1.5と1.6のyaccの下位互換性
から取られた上記テキスト私はYACCファイル(some.yファイル)に文法規則のアクション部分に変数(yylval)を使用。コードはGo 1.5で動作しました。しかしGo 1.6では同じコードがコンパイルされませんでした。生成されたy.goファイル( 'yacc tool some.y'コマンドから)を確認すると、Goは異なるバージョンの異なる変数名を作成します。
var yylval yySymType //in G0 1.5
var yyVAL yySymType //in Go 1.6
これは下位互換性とは異なりますか?またはGoは変数の下位互換性を保証していませんか?またはyylval変数の使用が間違っていますか?
varibaleの名前yylvalをyyVALに置き換えても、コードは正常に機能しました。
私はあなたのソリューションを試しました。しかし、それは動作しませんでした。私が本当に欲しかったのはyyVAL.some_xです。 $$ VAL.some_xのようなソリューションを試してみると、yyVAL.some_type_of_nonterminal.some_x(y.go生成時)に置き換えられました。しかしsome_xはyyVALのフィールドです。 [some_type_of_nonterminalは、ルールを書いて、アクションブロックで前述の式(yyVAL.some_x)を使用している非端末のタイプです。 – Spartan
私が言っていたことは、コードを読んだ後、 'yyVAL'(これはソースコードでは' $$ VAL'と表現されています)を使うことになっていると思います。 '$$ VAL'や' yylval'ではなく。 – thwd
したがって、yaccファイルの変数yylvalをGo 1.6のyyVALに変更する必要があります。それがあなたが意味するものなら、この約束についてのあなたの言うことを言いなさい、「https://golang.org/doc/go1compat」。 – Spartan