Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TopDownOperatorPrecedenceにおけるExpressionの解析処理を追う

kooooohe
September 26, 2019

 TopDownOperatorPrecedenceにおけるExpressionの解析処理を追う

kooooohe

September 26, 2019
Tweet

More Decks by kooooohe

Other Decks in Programming

Transcript

  1. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression

    BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  2. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1
  3. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  4. func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement { stmt := &ast.ExpressionStatement{Token: p.curToken}

    stmt.Expression = p.parseExpression(LOWEST) if p.peekTokenIs(token.SEMICOLON) { p.nextToken() } return stmt }
  5. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  6. func (p *Parser) parseExpression(precedence int /*LOWEST*/) ast.Expression { prefix/*parsePrefixExpression*/ :=

    p.prefixParseFns[p.curToken.Type] /* - MINUS*/ if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp := prefix()/*parsePrefixExpression*/ for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) } return leftExp } 1
  7. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  8. func (p *Parser) parsePrefixExpression() ast.Expression { expression := &ast.PrefixExpression{ Token:

    p.curToken, /* - MINUS*/ Operator: p.curToken.Literal, } p.nextToken() /* 3*/ expression.Right = p.parseExpression(PREFIX) return expression }
  9. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 -
  10. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  11. func (p *Parser) parseExpression(precedence int /*PREFIX*/) ast.Expression { prefix/*parsePrefixExpression*/ :=

    p.prefixParseFns[p.curToken.Type] /* 3 IDENT*/ if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp := prefix()/*parseIntegerLiteral*/ for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) } return leftExp } 2
  12. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  13. func (p *Parser) parseIntegerLiteral() ast.Expression { lit := &ast.IntegerLiteral{Token: p.curToken}

    value, err := strconv.ParseInt(p.curToken.Literal, 0, 64) if err != nil { msg := fmt.Sprintf("could not parse %q as integer", p.curToken.Literal) p.errors = append(p.errors, msg) return nil } lit.Value = value return lit }
  14. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 -
  15. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  16. func (p *Parser) parseExpression(precedence int /*PREFIX*/) ast.Expression { prefix/*parsePrefixExpression*/ :=

    p.prefixParseFns[p.curToken.Type] /* 3 IDENT*/ if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp/*&ast.IntegerLiteral{Token: p.curToken} 3 */ := prefix()/*parseIntegerLiteral*/ /*FLASE*/ for !p.peekTokenIs(token.SEMICOLON) && precedence/*PREFIX*/ < p.peekPrecedence() /* PLUS + */ { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) } return leftExp } 2
  17. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  18. func (p *Parser) parsePrefixExpression() ast.Expression { expression := &ast.PrefixExpression{ Token:

    p.curToken, /* - MINUS*/ Operator: p.curToken.Literal, } p.nextToken() /* 3*/ expression.Right/*&ast.IntegerLiteral{Token: p.curToken} 3 */ = p.parseExpression(PREFIX) return expression }
  19. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  20. func (p *Parser) parseExpression(precedence int /*LOWEST*/) ast.Expression { prefix/*parsePrefixExpression*/ :=

    p.prefixParseFns[p.curToken.Type] /* - MINUS*/ if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp := prefix()/*parsePrefixExpression*/ leftExp / * &ast.PrefixExpression{Token: /* - MINUS*/ Operator: /* - */,Rignt: &ast.IntegerLiteral{Token:3} } */ /*TRUE*/ for !p.peekTokenIs(token.SEMICOLON) && precedence/*LOWEST*/ < p.peekPrecedence() /*PLUS*/{ infix := p.infixParseFns[p.peekToken.Type]/*PLUS*/ if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) /*parseInfixExpression*/ } return leftExp } 1
  21. /* left = &ast.PrefixExpression{Token: /* - MINUS*/ Operator: /* -

    */,Rignt: &ast.IntegerLiteral{Token:3} } */ func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression { expression := &ast.InfixExpression{ Token: p.curToken, Operator: p.curToken.Literal, Left: left, } precedence := p.curPrecedence() / * PLUS*/ p.nextToken() expression.Right = p.parseExpression(precedence) return expression }
  22. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  23. func (p *Parser) parseExpression(precedence int / * PLUS*/ ) ast.Expression

    { prefix := p.prefixParseFns[p.curToken.Type / * 10*/ ] if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp := prefix() /*parseIntegerLiteral*/ for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) } return leftExp } 3
  24. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  25. func (p *Parser) parseIntegerLiteral() ast.Expression { lit := &ast.IntegerLiteral{Token: p.curToken}

    /*10*/ value, err := strconv.ParseInt(p.curToken.Literal, 0, 64) if err != nil { msg := fmt.Sprintf("could not parse %q as integer", p.curToken.Literal) p.errors = append(p.errors, msg) return nil } lit.Value = value return lit }
  26. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 -
  27. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  28. func (p *Parser) parseExpression(precedence int / * PLUS*/ ) ast.Expression

    { prefix := p.prefixParseFns[p.curToken.Type / * 10*/ ] if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp/*&ast.IntegerLiteral{Token: 10} */ := prefix() /*parseIntegerLiteral*/ /*TRUE*/ for !p.peekTokenIs(token.SEMICOLON) && precedence/*PLUS*/ < p.peekPrecedence()/*PRODUCT*/ { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) /*parseInfixExpression*/ } return leftExp } 3
  29. func (p *Parser) parseInfixExpression(left ast.Expression /*&ast.IntegerLiteral{Token: 10} */ ) ast.Expression

    { expression := &ast.InfixExpression{ Token: p.curToken, Operator: p.curToken.Literal, Left: left,/*&ast.IntegerLiteral{Token: 10} */ } precedence := p.curPrecedence() /*PRODUCT */ p.nextToken() expression.Right = p.parseExpression(precedence) return expression }
  30. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 -
  31. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  32. func (p *Parser) parseExpression(precedence int /*PRODUCT*/ ) ast.Expression { prefix

    := p.prefixParseFns[p.curToken.Type/*2*/ ] if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp := prefix()/* parseIntegerLiteral*/ for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) } return leftExp } 4
  33. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  34. func (p *Parser) parseIntegerLiteral() ast.Expression { lit := &ast.IntegerLiteral{Token: p.curToken}

    /*2*/ value, err := strconv.ParseInt(p.curToken.Literal, 0, 64) if err != nil { msg := fmt.Sprintf("could not parse %q as integer", p.curToken.Literal) p.errors = append(p.errors, msg) return nil } lit.Value = value return lit }
  35. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 - *
  36. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  37. func (p *Parser) parseExpression(precedence int /*PRODUCT*/ ) ast.Expression { prefix

    := p.prefixParseFns[p.curToken.Type/*2*/ ] if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp/* &ast.IntegerLiteral{Token: 2}*/ := prefix()/* parseIntegerLiteral*/ /*FALSE*/ for !p.peekTokenIs(token.SEMICOLON) && precedence/*PRODUCT*/ < p.peekPrecedence() /*PLUS*/ { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) } return leftExp } 4
  38. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  39. func (p *Parser) parseInfixExpression(left ast.Expression /*&ast.IntegerLiteral{Token: 10} */ ) ast.Expression

    { expression := &ast.InfixExpression{ Token: p.curToken,*PLUS*/ Operator: p.curToken.Literal/*-*/ , Left: left,/*&ast.IntegerLiteral{Token: 10} */ } precedence := p.curPrecedence() /*PRODUCT */ p.nextToken() expression.Right/* &ast.IntegerLiteral{Token: 2}*/ = p.parseExpression(precedence) return expression }
  40. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  41. func (p *Parser) parseExpression(precedence int / * PLUS*/ ) ast.Expression

    { prefix := p.prefixParseFns[p.curToken.Type / * 10*/ ] if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp/*&ast.IntegerLiteral{Token: 10} */ := prefix() /*parseIntegerLiteral*/ /*TRUE*/ for !p.peekTokenIs(token.SEMICOLON) && precedence/*PLUS*/ < p.peekPrecedence()/*PRODUCT*/ { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) /*parseInfixExpression*/ &ast.InfixExpression{Token: PLUS,Operator: +l ,Left:/*&ast.IntegerLiteral{Token: 10} */ , Right: /*&ast.IntegerLiteral{Token: 2} */ } } 3
  42. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  43. /* left = &ast.PrefixExpression{Token: /* - MINUS*/ Operator: /* -

    */,Rignt: &ast.IntegerLiteral{Token:3} } */ func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression { expression := &ast.InfixExpression{ Token: p.curToken, PLUS Operator: p.curToken.Literal, PLUS Left: left, } precedence := p.curPrecedence() / * PLUS*/ p.nextToken() expression.Right = p.parseExpression(precedence) Right &ast.InfixExpression{Token: PLUS,Operator: +l ,Left:/*&ast.IntegerLiteral{Token: 10} */ , Right: /*&ast.IntegerLiteral{Token: 2} */ }} return expression
  44. &ast.InfixExpression{ Token: PLUS Operator: PLUS Left: &ast.PrefixExpression{Token: /* - MINUS*/

    Operator: /* - */,Rignt: &ast.IntegerLiteral{Token:3} } , Right: &ast.InfixExpression{Token: PLUS,Operator: +l ,Left:/*&ast.IntegerLiteral{Token: 10} */ , Right: /*&ast.IntegerLiteral{Token: 2} */ }} } = X
  45. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 - + *
  46. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  47. func (p *Parser) parseExpression(precedence int /*LOWEST*/) ast.Expression { prefix/*parsePrefixExpression*/ :=

    p.prefixParseFns[p.curToken.Type] /* - MINUS*/ if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp := prefix()/*parsePrefixExpression*/ /*TRUE*/ for !p.peekTokenIs(token.SEMICOLON) && precedence/*LOWEST*/ < p.peekPrecedence()/* PLUS*/ { infix := p.infixParseFns[p.peekToken.Type]/* PLUS*/ if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExpX)/*parseInfixExpression*/ } return leftExp } 1
  48. func (p *Parser) parseInfixExpression(left ast.Expression X) ast.Expression { expression :=

    &ast.InfixExpression{ Token: p.curToken, PLUS Operator: p.curToken.Literal,PLUS Left: left, X } precedence := p.curPrecedence() PLUS p.nextToken() expression.Right = p.parseExpression(precedence) return expression }
  49. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  50. func (p *Parser) parseExpression(precedence int PLUS) ast.Expression { prefix :=

    p.prefixParseFns[p.curToken.Type] 1 if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp := prefix() for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) } return leftExp } 5
  51. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  52. func (p *Parser) parseIntegerLiteral() ast.Expression { lit := &ast.IntegerLiteral{Token: p.curToken}

    1 value, err := strconv.ParseInt(p.curToken.Literal, 0, 64) if err != nil { msg := fmt.Sprintf("could not parse %q as integer", p.curToken.Literal) p.errors = append(p.errors, msg) return nil } lit.Value = value return lit }
  53. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 - * +
  54. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  55. func (p *Parser) parseInfixExpression(left ast.Expression X) ast.Expression { expression :=

    &ast.InfixExpression{ Token: p.curToken, PLUS Operator: p.curToken.Literal,PLUS Left: left, X } precedence := p.curPrecedence() PLUS p.nextToken() expression.Right = p.parseExpression(precedence) 1 return expression }
  56. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 - + * +
  57. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  58. func (p *Parser) parseExpression(precedence int /*LOWEST*/) ast.Expression { prefix/*parsePrefixExpression*/ :=

    p.prefixParseFns[p.curToken.Type] /* - MINUS*/ if prefix == nil { p.noPrefixParseFnError(p.curToken.Type) return nil } leftExp := prefix()/*parsePrefixExpression*/ /*TRUE*/ for !p.peekTokenIs(token.SEMICOLON) && precedence/*LOWEST*/ < p.peekPrecedence()/* PLUS*/ { infix := p.infixParseFns[p.peekToken.Type]/* PLUS*/ if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExpX)/*parseInfixExpression*/ } return leftExp } 1
  59. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  60. func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement { stmt := &ast.ExpressionStatement{Token: p.curToken}

    stmt.Expression = p.parseExpression(LOWEST) if p.peekTokenIs(token.SEMICOLON) { p.nextToken() } return stmt }
  61. BEGIN parseExpresssionStatement BEGIN parseExpresssion BEGIN parsePrefixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral

    END parseIntegerLiteral END parseExpresssion END parsePrefixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseInfixExpression BEGIN parseInfixExpression BEGIN parseExpresssion BEGIN parseIntegerLiteral END parseIntegerLiteral END parseExpresssion END parseInfixExpression END parseExpresssion END parseExpresssionStatement
  62. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1
  63. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 -
  64. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 -
  65. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 -
  66. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 -
  67. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 - *
  68. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 - + *
  69. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 - + * +
  70. *ast.InfixExpres sion *ast.InfixExpres sion *ast.PrefixExpre ssion *ast.InfixExpres sion *ast.IntegerLiter al

    *ast.IntegerLiter al *ast.IntegerLiter al *ast.IntegerLiter al 3 10 2 1 - * +