]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/yacc: fix handling of tokens that don't start with letters
authorIan Lance Taylor <iant@golang.org>
Mon, 29 Sep 2014 20:32:14 +0000 (13:32 -0700)
committerIan Lance Taylor <iant@golang.org>
Mon, 29 Sep 2014 20:32:14 +0000 (13:32 -0700)
CL 149110043 changed yacc to no longer keep a leading space
for quoted tokens.  That is OK by itself but unfortunately
yacc was relying on that leading space to notice which tokens
it should not output as const declarations.

Add a few such tokens to expr.y, although it won't make any
immediate difference as we seem to have no tests for yacc.

LGTM=rsc
R=golang-codereviews, rsc
CC=golang-codereviews
https://golang.org/cl/152720043

src/cmd/yacc/testdata/expr/expr.y
src/cmd/yacc/yacc.go

index 09451949ff8a49ddae9ac99adce436ad3d78a98a..721b1c9172d628bafe40616d756ab1cceabe2263 100644 (file)
@@ -32,6 +32,8 @@ import (
 
 %type  <num>   expr expr1 expr2 expr3
 
+%token '+' '-' '*' '/' '(' ')'
+
 %token <num>   NUM
 
 %%
index 0761811cf4f4e71c7d7fffdf5d5c465258f48d51..4dba376fc24951f5dacabe26c71331ffba9a630c 100644 (file)
@@ -195,8 +195,9 @@ type Item struct {
 }
 
 type Symb struct {
-       name  string
-       value int
+       name    string
+       noconst bool
+       value   int
 }
 
 type Wset struct {
@@ -509,8 +510,7 @@ outer:
        // put out non-literal terminals
        for i := TOKSTART; i <= ntokens; i++ {
                // non-literals
-               c := tokset[i].name[0]
-               if c != ' ' && c != '$' {
+               if !tokset[i].noconst {
                        fmt.Fprintf(ftable, "const %v = %v\n", tokset[i].name, tokset[i].value)
                }
        }
@@ -734,7 +734,7 @@ func defin(nt int, s string) int {
                        copy(anontrst, nontrst)
                        nontrst = anontrst
                }
-               nontrst[nnonter] = Symb{s, 0}
+               nontrst[nnonter] = Symb{name: s}
                return NTBASE + nnonter
        }
 
@@ -769,9 +769,13 @@ func defin(nt int, s string) int {
                if val == 0 {
                        errorf("token value 0 is illegal")
                }
+               tokset[ntokens].noconst = true
        } else {
                val = extval
                extval++
+               if s[0] == '$' {
+                       tokset[ntokens].noconst = true
+               }
        }
 
        tokset[ntokens].value = val