parser_expression.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package parser
  2. import (
  3. "fmt"
  4. "code.osinet.fr/fgm/waiig15/ast"
  5. "code.osinet.fr/fgm/waiig15/token"
  6. )
  7. func (p *Parser) noPrefixParseFnError(t token.TokenType) {
  8. msg := fmt.Sprintf("no prefix parse function for %s found", t)
  9. p.errors = append(p.errors, msg)
  10. }
  11. func (p *Parser) parseExpression(precedence int) ast.Expression {
  12. defer untrace(trace("parseExpression"))
  13. prefix := p.prefixParseFns[p.curToken.Type]
  14. if prefix == nil {
  15. p.noPrefixParseFnError(p.curToken.Type)
  16. return nil
  17. }
  18. leftExp := prefix()
  19. for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() {
  20. infix := p.infixParseFns[p.peekToken.Type]
  21. if infix == nil {
  22. return leftExp
  23. }
  24. p.nextToken()
  25. leftExp = infix(leftExp)
  26. }
  27. return leftExp
  28. }
  29. func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement {
  30. defer untrace(trace("parseExpressionStatement"))
  31. stmt := &ast.ExpressionStatement{
  32. Token: p.curToken,
  33. }
  34. stmt.Expression = p.parseExpression(LOWEST)
  35. // Semicolons are optional to help use REPL input.
  36. if p.peekTokenIs(token.SEMICOLON) {
  37. p.nextToken()
  38. }
  39. return stmt
  40. }