cmd/compile: remove gratuituous copying of lexer token data
Rename yySymType to lexer; should eventually capture all lexer state.
Embed lexer in parser and access lexer token data directly.
Change-Id: I246194705d594f80426f3ba77d8580af9185daf7
Reviewed-on: https://go-review.googlesource.com/19759
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
diff --git a/src/cmd/compile/internal/gc/lex.go b/src/cmd/compile/internal/gc/lex.go
index 08545df..a6f65be 100644
--- a/src/cmd/compile/internal/gc/lex.go
+++ b/src/cmd/compile/internal/gc/lex.go
@@ -866,10 +866,15 @@
return false
}
-type yySymType struct {
- sym *Sym
- val Val
- op Op
+type lexer struct {
+ // TODO(gri) move other lexer state here and out of global variables
+ // (source, current line number, etc.)
+
+ // current token
+ tok int32
+ sym_ *Sym // valid if tok == LNAME
+ val Val // valid if tok == LLITERAL
+ op Op // valid if tok == LASOP
}
const (
@@ -920,7 +925,7 @@
LRSH
)
-func _yylex(yylval *yySymType) int32 {
+func (yylval *lexer) _yylex() int32 {
var c1 int
var op Op
var escflag int
@@ -1402,7 +1407,7 @@
if Debug['x'] != 0 {
fmt.Printf("lex: %s %s\n", s, lexname(int(s.Lexical)))
}
- yylval.sym = s
+ yylval.sym_ = s
return int32(s.Lexical)
ncu:
@@ -1828,16 +1833,16 @@
}
}
-func yylex(yylval *yySymType) int32 {
- lx := _yylex(yylval)
+func (l *lexer) next() {
+ tok := l._yylex()
- if curio.nlsemi && lx == EOF {
+ if curio.nlsemi && tok == EOF {
// Treat EOF as "end of line" for the purposes
// of inserting a semicolon.
- lx = ';'
+ tok = ';'
}
- switch lx {
+ switch tok {
case LNAME,
LLITERAL,
LBREAK,
@@ -1855,7 +1860,7 @@
curio.nlsemi = false
}
- return lx
+ l.tok = tok
}
func getc() int {
diff --git a/src/cmd/compile/internal/gc/parser.go b/src/cmd/compile/internal/gc/parser.go
index 3a5b508..deae40c 100644
--- a/src/cmd/compile/internal/gc/parser.go
+++ b/src/cmd/compile/internal/gc/parser.go
@@ -42,21 +42,10 @@
}
type parser struct {
- tok int32 // next token (one-token look-ahead)
- op Op // valid if tok == LASOP
- val Val // valid if tok == LLITERAL
- sym_ *Sym // valid if tok == LNAME
- fnest int // function nesting level (for error handling)
- xnest int // expression nesting level (for complit ambiguity resolution)
- yy yySymType // for temporary use by next
- indent []byte // tracing support
-}
-
-func (p *parser) next() {
- p.tok = yylex(&p.yy)
- p.op = p.yy.op
- p.val = p.yy.val
- p.sym_ = p.yy.sym
+ lexer
+ fnest int // function nesting level (for error handling)
+ xnest int // expression nesting level (for complit ambiguity resolution)
+ indent []byte // tracing support
}
func (p *parser) got(tok int32) bool {