diff options
author | Russ Cox <rsc@golang.org> | 2013-09-20 16:00:13 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2013-09-20 16:00:13 -0400 |
commit | 6995d3e7ff466f3504da6d6d826751a110d1c4ac (patch) | |
tree | 139da4ca4258df04ca1805b2c708e7b2c6e64c52 | |
parent | a41fa7205f9fdc49954b3ac2fde0156e92994434 (diff) | |
download | go-6995d3e7ff466f3504da6d6d826751a110d1c4ac.tar.gz |
cmd/yacc: report correct line for 'default action causes potential type clash'
R=golang-dev, iant
CC=golang-dev
https://codereview.appspot.com/13588044
-rw-r--r-- | src/cmd/yacc/yacc.go | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/cmd/yacc/yacc.go b/src/cmd/yacc/yacc.go index bb406f574..dd4d3e69a 100644 --- a/src/cmd/yacc/yacc.go +++ b/src/cmd/yacc/yacc.go @@ -555,17 +555,18 @@ outer: // process a rule rlines[nprod] = lineno + ruleline := lineno if t == '|' { curprod[mem] = prdptr[nprod-1][0] mem++ } else if t == IDENTCOLON { curprod[mem] = chfind(1, tokname) if curprod[mem] < NTBASE { - errorf("token illegal on LHS of grammar rule") + lerrorf(ruleline, "token illegal on LHS of grammar rule") } mem++ } else { - errorf("illegal rule: missing semicolon or | ?") + lerrorf(ruleline, "illegal rule: missing semicolon or | ?") } // read rule body @@ -586,11 +587,11 @@ outer: } if t == PREC { if gettok() != IDENTIFIER { - errorf("illegal %%prec syntax") + lerrorf(ruleline, "illegal %%prec syntax") } j = chfind(2, tokname) if j >= NTBASE { - errorf("nonterminal " + nontrst[j-NTBASE].name + " illegal after %%prec") + lerrorf(ruleline, "nonterminal "+nontrst[j-NTBASE].name+" illegal after %%prec") } levprd[nprod] = toklev[j] t = gettok() @@ -646,7 +647,7 @@ outer: // no explicit action, LHS has value tempty := curprod[1] if tempty < 0 { - errorf("must return a value, since LHS has a type") + lerrorf(ruleline, "must return a value, since LHS has a type") } if tempty >= NTBASE { tempty = nontrst[tempty-NTBASE].value @@ -654,7 +655,7 @@ outer: tempty = TYPE(toklev[tempty]) } if tempty != nontrst[curprod[0]-NTBASE].value { - errorf("default action causes potential type clash") + lerrorf(ruleline, "default action causes potential type clash") } fmt.Fprintf(fcode, "\n\tcase %v:", nprod) fmt.Fprintf(fcode, "\n\t\t%sVAL.%v = %sS[%spt-0].%v", @@ -3193,7 +3194,7 @@ func create(s string) *bufio.Writer { // // write out error comment // -func errorf(s string, v ...interface{}) { +func lerrorf(lineno int, s string, v ...interface{}) { nerrors++ fmt.Fprintf(stderr, s, v...) fmt.Fprintf(stderr, ": %v:%v\n", infile, lineno) @@ -3203,6 +3204,10 @@ func errorf(s string, v ...interface{}) { } } +func errorf(s string, v ...interface{}) { + lerrorf(lineno, s, v...) +} + func exit(status int) { if ftable != nil { ftable.Flush() |