Skip to content

Commit a24334e

Browse files
committed
parse return statements
1 parent 9e62a08 commit a24334e

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

ast/ast.go

+10
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,13 @@ func (ls *VarStatement) statementNode() {}
5050
func (ls *VarStatement) TokenLiteral() string {
5151
return ls.Token.Literal
5252
}
53+
54+
type ReturnStatement struct {
55+
Token token.Token
56+
ReturnValue Expression
57+
}
58+
59+
func (rs *ReturnStatement) statementNode() {}
60+
func (rs *ReturnStatement) TokenLiteral() string {
61+
return rs.Token.Literal
62+
}

parser/parser.go

+16
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ func (p *Parser) parseStatement() ast.Statement {
4545
switch p.curToken.Type {
4646
case token.VAR:
4747
return p.parseVarStatement()
48+
case token.RETURN:
49+
return p.parseReturnStatement()
4850
default:
4951
return nil
5052

@@ -73,3 +75,17 @@ func (p *Parser) parseVarStatement() *ast.VarStatement {
7375

7476
return stmt
7577
}
78+
79+
// parse return statement
80+
func (p *Parser) parseReturnStatement() *ast.ReturnStatement {
81+
stmt := &ast.ReturnStatement{Token: p.curToken}
82+
83+
p.nextToken()
84+
85+
//TODO: We're skipping the expressions until we encounter a semicolon
86+
87+
for !p.curTokenIs(token.SEMICOLON) {
88+
p.nextToken()
89+
}
90+
return stmt
91+
}

parser/parser_test.go

+32-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"github.com/54L1m/mil-lang/lexer"
88
)
99

10-
func TestLetStatement(t *testing.T) {
10+
func TestVarStatement(t *testing.T) {
1111
input := `
1212
var x = 5;
1313
var y = 10;
@@ -42,6 +42,37 @@ func TestLetStatement(t *testing.T) {
4242
}
4343
}
4444

45+
func TestReturnStatement(t *testing.T) {
46+
input := `
47+
return 5;
48+
return 10;
49+
return 993322;
50+
`
51+
l := lexer.New(input)
52+
p := New(l)
53+
54+
program := p.ParseProgram()
55+
checkParseErrors(t, p)
56+
57+
if len(program.Statements) != 3 {
58+
t.Fatalf("program.Statements does not contain 3 statements. got=%d",
59+
len(program.Statements))
60+
}
61+
62+
for _, stmt := range program.Statements {
63+
returnStmt, ok := stmt.(*ast.ReturnStatement)
64+
if !ok {
65+
t.Errorf("stmt not *ast.ReturnStatement. got=%T", stmt)
66+
continue
67+
}
68+
if returnStmt.TokenLiteral() != "return" {
69+
t.Errorf("returnStmt.TokenLiteral not 'return', got %q",
70+
returnStmt.TokenLiteral())
71+
}
72+
}
73+
74+
}
75+
4576
func testVarStatement(t *testing.T, s ast.Statement, name string) bool {
4677
if s.TokenLiteral() != "var" {
4778
t.Errorf("s.TokenLiteral not 'var'. got=%q", s.TokenLiteral())

0 commit comments

Comments
 (0)