2016-03-30 8 views
0

Lex sollte die Token-ID zurückgeben und andere Token Informationen in lval (die das übliche yylval ersetzt) ​​platzieren.Abwärtskompatibilität für yacc in Go 1.5 und 1.6

Der obige Text aus den document.

ich die Variable verwendet, geht genommen (yylval) im Aktionsteil von Grammatikregeln in der yacc-Datei (some.y-Datei). Der Code funktionierte in Go 1.5. Aber der gleiche Code wurde in Go 1.6 nicht kompiliert. Als ich die erzeugte y.go-Datei überprüfte (aus dem Befehl 'go yacc tool some.y'), erstellt Go verschiedene Variablennamen in verschiedenen Versionen.

var yylval yySymType //in G0 1.5 
var yyVAL yySymType //in Go 1.6 

Ist dies gegen Rückwärtskompatibilität? oder Go garantiert keine Rückwärtskompatibilität für die Variable? oder Ist die Verwendung der Yylval-Variablen falsch?

Der Code funktionierte gut, nachdem der Varibale-Name yylval durch yyVAL ersetzt wurde.

Antwort

0

Sie werden wahrscheinlich die vorgenommenen Änderungen in this commit sehen. Aber gemäß dem Code, den Sie verwenden sollten, war die ganze Zeit $$VAL (d. H. yyVAL). In Go 1.6 sollte der gleiche Wert auch über $$rcvr.lval erreichbar sein.

Anywho, froh, dass Sie es gelöst haben.

Edit:

Um zu klären, ich nehme an, dass auch in Go 1.5 oder niedriger wir sollten yyVAL und nicht yylval verwenden. Folglich unterstelle ich, dass die Dokumentation, die Sie in Ihrer Frage verlinkt haben, wahrscheinlich falsch ist und der Fehler dort liegt. Sie sind jedoch zu 100% richtig, dass, wenn dies nicht der Fall ist, das Go1-Versprechen gebrochen wurde und es behoben werden sollte.

+0

Ich habe Ihre Lösung versucht. Aber es hat nicht funktioniert. Was ich wirklich wollte, ist yyVAL.some_x. Wenn ich Ihre Lösung wie $$ VAL.some_x versuchte, wurde sie als yyVAL.some_type_of_nonterminal.some_x (in generierten y.go) ersetzt. Aber some_x ist ein Feld in yyVAL. [some_type_of_nonterminal ist der Typ des Nicht-Terminals, für den ich eine Regel geschrieben habe und den genannten Ausdruck (yyVAL.some_x) im Aktionsblock verwendet habe. – Spartan

+0

Was ich sagen wollte, ist, dass ich nach dem Lesen des Codes 'yyVAL' verwenden soll (was im Quellcode als' $$ VAL' bezeichnet wird). Nicht '$ VAL' oder 'yylval' direkt. – thwd

+0

Also meinst du, dass die Variable yylval in der yacc-Datei zu yyVAL für Go 1.6 geändert werden muss. Wenn Sie das meinen, erwähnen Sie bitte dieses Versprechen "https://golang.org/doc/go1compat". – Spartan