|
|
|
@ -86,7 +86,7 @@ func (p *Parser) varDeclaration() ast.Stmt {
|
|
|
|
return &ast.VarStmt{Name: name, Initializer: initializer}
|
|
|
|
return &ast.VarStmt{Name: name, Initializer: initializer}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// statement → exprStmt | forStmt | ifStmt | printStmt | whileStmt | block ;
|
|
|
|
// statement → exprStmt | forStmt | ifStmt | printStmt | returnStmt | whileStmt | block ;
|
|
|
|
func (p *Parser) statement() ast.Stmt {
|
|
|
|
func (p *Parser) statement() ast.Stmt {
|
|
|
|
if p.match(token.FOR) {
|
|
|
|
if p.match(token.FOR) {
|
|
|
|
return p.forStatement()
|
|
|
|
return p.forStatement()
|
|
|
|
@ -97,6 +97,9 @@ func (p *Parser) statement() ast.Stmt {
|
|
|
|
if p.match(token.PRINT) {
|
|
|
|
if p.match(token.PRINT) {
|
|
|
|
return p.printStatement()
|
|
|
|
return p.printStatement()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if p.match(token.RETURN) {
|
|
|
|
|
|
|
|
return p.returnStatement()
|
|
|
|
|
|
|
|
}
|
|
|
|
if p.match(token.WHILE) {
|
|
|
|
if p.match(token.WHILE) {
|
|
|
|
return p.whileStatement()
|
|
|
|
return p.whileStatement()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -193,6 +196,22 @@ func (p *Parser) printStatement() ast.Stmt {
|
|
|
|
return &ast.PrintStmt{Expression: expr}
|
|
|
|
return &ast.PrintStmt{Expression: expr}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// returnStmt → "return" expression? ";" ;
|
|
|
|
|
|
|
|
func (p *Parser) returnStatement() ast.Stmt {
|
|
|
|
|
|
|
|
keyword := p.previous()
|
|
|
|
|
|
|
|
var value ast.Expr
|
|
|
|
|
|
|
|
if !p.check(token.SEMICOLON) {
|
|
|
|
|
|
|
|
value = p.expression()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
err := p.consume(token.SEMICOLON, "Expect ';' after return value.")
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return p.fromErrorExpr(err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return &ast.ReturnStmt{Keyword: keyword, Value: value}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// whileStmt → "while" "(" expression ")" statement ;
|
|
|
|
// whileStmt → "while" "(" expression ")" statement ;
|
|
|
|
func (p *Parser) whileStatement() ast.Stmt {
|
|
|
|
func (p *Parser) whileStatement() ast.Stmt {
|
|
|
|
err := p.consume(token.LEFT_PAREN, "Expect '(' after 'while'.")
|
|
|
|
err := p.consume(token.LEFT_PAREN, "Expect '(' after 'while'.")
|
|
|
|
|