Share
Embed
Transcript
77 slides
-
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 -
*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 -
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 -
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 } -
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 -
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 -
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 -
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 } -
*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 - -
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 -
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 -
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 -
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 } -
*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 - -
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 -
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 -
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 -
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 } -
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 -
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 -
/* 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 } -
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 -
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 -
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 -
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 } -
*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 - -
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 -
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 -
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 } -
*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 - -
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 -
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 -
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 -
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 } -
*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 - * -
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 -
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 -
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 -
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 } -
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 -
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 -
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 -
/* 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 -
&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 -
*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 - + * -
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 -
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 -
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 } -
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 -
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 -
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 -
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 } -
*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 - * + -
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 -
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 } -
*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 - + * + -
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 -
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 -
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 -
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 } -
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 -
*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 -
*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 - -
*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 - -
*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 - -
*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 - -
*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 - * -
*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 - + * -
*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 - + * + -
*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 - * +