0

Lex should return the token identifier, and place other token information in lval (which replaces the usual yylval).

The above text taken from the go document.

I used the variable(yylval) in the action part of grammar rules in the yacc file(some.y file). The code worked in Go 1.5. But the same code didn't compile in Go 1.6. When I checked the generated y.go file(from the 'go yacc tool some.y' command), Go creates different variable names in different version.

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

Is this against backward compatibility? or Go doesn't guarantee backward compatibility for the variable? or Is usage of yylval variable is wrong?

Code worked well after replacing the varibale name yylval with yyVAL.

IhtkaS
  • 1,314
  • 3
  • 15
  • 31

1 Answers1

0

You are most probably seeing the changes made in this commit. But according to the code you were supposed to be using $$VAL (i.e. yyVAL) all along. In Go 1.6 the same value should be accessible through $$rcvr.lval as well.

Anywho, glad you solved it.

Edit:

To clarify, I presume that even in Go 1.5 or lower we were supposed to use yyVAL and not yylval. In consequence, I am implying that the documentation you linked in your question is probably wrong and the bug lays there. However you are 100% correct that if this is not the case, then the Go 1 promise was broken and it should be rectified.

thwd
  • 23,956
  • 8
  • 74
  • 108
  • I tried your solution. But it didn't work. What I really wanted is yyVAL.some_x. When I tried your solution like $$VAL.some_x, it was replaced as yyVAL.some_type_of_nonterminal.some_x(in generated y.go). But some_x is a field in yyVAL. [some_type_of_nonterminal is the type of non terminal for which I have written a rule and used the mentioned expression(yyVAL.some_x) in the action block. – IhtkaS Mar 30 '16 at 10:41
  • What I meant to say is that after reading the code I think we're supposed to use `yyVAL` (which in the source code is represnted as `$$VAL`). Not `$$VAL` or `yylval` directly. – thwd Mar 30 '16 at 12:12
  • So, you mean that the variable yylval in yacc file has to be changed to yyVAL for Go 1.6. If that is what you mean, please mention your say about this promise 'https://golang.org/doc/go1compat'. – IhtkaS Mar 31 '16 at 07:20