From 0826c04e1454b41dac18365b08b4d59b2a82f543 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 20 Sep 2013 16:00:13 -0400 Subject: [PATCH] cmd/yacc: report correct line for 'default action causes potential type clash' R=golang-dev, iant CC=golang-dev https://golang.org/cl/13588044 --- src/cmd/yacc/yacc.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/cmd/yacc/yacc.go b/src/cmd/yacc/yacc.go index bb406f5743..dd4d3e69af 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() -- 2.48.1