parser_let.go 831 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package parser
  2. import (
  3. "code.osinet.fr/fgm/waiig15/ast"
  4. "code.osinet.fr/fgm/waiig15/token"
  5. )
  6. func (p *Parser) parseLetStatement() *ast.LetStatement {
  7. defer untrace(trace("parseLetStatement"))
  8. stmt := &ast.LetStatement{
  9. Token: p.curToken,
  10. }
  11. // Let statement starts with an IDENT token, so if next token is not an
  12. // IDENT, the next statement cannot be a Let statement.
  13. if !p.expectPeek(token.IDENT) {
  14. return nil
  15. }
  16. stmt.Name = &ast.Identifier{
  17. Token: p.curToken,
  18. Value: p.curToken.Literal,
  19. }
  20. // The previous expectPeek() call fetched the next token, so we should now
  21. // be on the assignment.
  22. if !p.expectPeek(token.ASSIGN) {
  23. return nil
  24. }
  25. // Skip the expression for now, progress to the semicolon terminating the
  26. // statement.
  27. for !p.curTokenIs(token.SEMICOLON) {
  28. p.nextToken()
  29. }
  30. return stmt
  31. }