2016-03-30 9 views
0

Lexはトークン識別子を返し、他のトークン の情報をlval(通常のyylvalを置き換えます)に置きます。Go 1.5と1.6のyaccの下位互換性

行くdocument.

から取られた上記テキスト私は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に置き換えても、コードは正常に機能しました。

答えて

0

おそらく、this commitの変更が表示されています。しかしコードによれば、$$VAL(すなわちyyVAL)を使用していたはずです。 Go 1.6では、同じ値には$$rcvr.lvalでアクセスする必要があります。

あなたがそれを解決してうれしいです。

編集:

は明確にするために、私もゴー1.5以下に私たちはyyVALなくyylvalを使用するようになっていたを推定。結果として、私はあなたの質問にリンクした文書が間違っていて、そのバグがそこにあることを暗示しています。しかし、あなたは100%正しいです。これが当てはまらない場合、Go 1約束は壊れており、修正されるべきです。

+0

私はあなたのソリューションを試しました。しかし、それは動作しませんでした。私が本当に欲しかったのは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

+0

私が言っていたことは、コードを読んだ後、 'yyVAL'(これはソースコードでは' $$ VAL'と表現されています)を使うことになっていると思います。 '$$ VAL'や' yylval'ではなく。 – thwd

+0

したがって、yaccファイルの変数yylvalをGo 1.6のyyVALに変更する必要があります。それがあなたが意味するものなら、この約束についてのあなたの言うことを言いなさい、「https://golang.org/doc/go1compat」。 – Spartan