@@ -21,16 +21,19 @@ type Parser struct {
2121 l * lexer.Lexer
2222 errors []error
2323
24- curToken token.Token
25- peekToken token.Token
24+ curToken token.Token
25+ peekToken token.Token
26+ peekToken2 token.Token
2627
2728 depth int // Current recursion depth
2829}
2930
3031// New returns a parser over the provided lexer.
3132func New (l * lexer.Lexer ) * Parser {
3233 p := & Parser {l : l , errors : make ([]error , 0 )}
33- p .nextToken ()
34+ p .curToken = token.Token {}
35+ p .peekToken = p .l .NextToken ()
36+ p .peekToken2 = p .l .NextToken ()
3437 p .nextToken ()
3538 return p
3639}
@@ -47,11 +50,13 @@ func (p *Parser) addError(pos token.Position, format string, args ...interface{}
4750
4851func (p * Parser ) nextToken () {
4952 p .curToken = p .peekToken
50- p .peekToken = p .l .NextToken ()
53+ p .peekToken = p .peekToken2
54+ p .peekToken2 = p .l .NextToken ()
5155}
5256
53- func (p * Parser ) curTokenIs (t token.Type ) bool { return p .curToken .Type == t }
54- func (p * Parser ) peekTokenIs (t token.Type ) bool { return p .peekToken .Type == t }
57+ func (p * Parser ) curTokenIs (t token.Type ) bool { return p .curToken .Type == t }
58+ func (p * Parser ) peekTokenIs (t token.Type ) bool { return p .peekToken .Type == t }
59+ func (p * Parser ) peekPeekTokenIs (t token.Type ) bool { return p .peekToken2 .Type == t }
5560
5661func (p * Parser ) expectPeek (t token.Type ) bool {
5762 if p .peekTokenIs (t ) {
@@ -655,6 +660,9 @@ func (p *Parser) parseIdentifier() *ast.Identifier {
655660func (p * Parser ) parseQualifiedName () * ast.Identifier {
656661 parts := []string {p .curToken .Literal }
657662 for p .peekTokenIs (token .DOT ) {
663+ if p .peekPeekTokenIs (token .STAR ) {
664+ break
665+ }
658666 p .nextToken ()
659667 if ! p .expectPeek (token .IDENT ) {
660668 return & ast.Identifier {Parts : parts }
0 commit comments