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 (
LRSH
)
-func _yylex(yylval *yySymType) int32 {
+func (yylval *lexer) _yylex() int32 {
var c1 int
var op Op
var escflag int
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:
}
}
-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,
curio.nlsemi = false
}
- return lx
+ l.tok = tok
}
func getc() int {
}
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 {