Skip to content

Commit

Permalink
feat: adds return statements to ast and parser
Browse files Browse the repository at this point in the history
  • Loading branch information
Tezzish committed Sep 19, 2024
1 parent bcd4afb commit d8774e0
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 0 deletions.
8 changes: 8 additions & 0 deletions ast/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,16 @@ type LetStatement struct {
Value Expression
}

type ReturnStatement struct {
Token token.Token
ReturnValue Expression
}

func (i *Identifier) expressionNode() {}
func (i *Identifier) TokenLiteral() string { return i.Token.Literal }

func (ls *LetStatement) statementNode() {}
func (ls *LetStatement) TokenLiteral() string { return ls.Token.Literal }

func (rs *ReturnStatement) statementNode() {}
func (rs *ReturnStatement) TokenLiteral() string { return rs.Token.Literal }
11 changes: 11 additions & 0 deletions parser/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ func (p *Parser) parseStatement() ast.Statement {
switch p.curToken.Type {
case token.LET:
return p.parseLetStatement()
case token.RETURN:
return p.parseReturnStatment()
default:
return nil
}
Expand All @@ -105,3 +107,12 @@ func (p *Parser) parseLetStatement() *ast.LetStatement {
}
return stmt
}

func (p *Parser) parseReturnStatment() *ast.ReturnStatement {
stmt := &ast.ReturnStatement{Token: p.curToken}
p.nextToken()
for !p.curTokenIs(token.SEMICOLON) {
p.nextToken()
}
return stmt
}
27 changes: 27 additions & 0 deletions parser/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,30 @@ func testLetStatement(t *testing.T, s ast.Statement, name string) bool {
}
return true
}

func TestReturnStatements(t *testing.T) {
input := `
return 5;
return 10;
return 993322;
`
l := lexer.New(input)
p := New(l)
program := p.ParseProgram()
// checkParserErrors(t, p)
if len(program.Statements) != 3 {
t.Fatalf("program.Statements does not contain 3 statements. got=%d",
len(program.Statements))
}
for _, stmt := range program.Statements {
returnStmt, ok := stmt.(*ast.ReturnStatement)
if !ok {
t.Errorf("stmt not *ast.returnStatement. got=%T", stmt)
continue
}
if returnStmt.TokenLiteral() != "return" {
t.Errorf("returnStmt.TokenLiteral not 'return', got %q",
returnStmt.TokenLiteral())
}
}
}

0 comments on commit d8774e0

Please sign in to comment.