File tree 3 files changed +58
-1
lines changed
3 files changed +58
-1
lines changed Original file line number Diff line number Diff line change @@ -50,3 +50,13 @@ func (ls *VarStatement) statementNode() {}
50
50
func (ls * VarStatement ) TokenLiteral () string {
51
51
return ls .Token .Literal
52
52
}
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
+ }
Original file line number Diff line number Diff line change @@ -45,6 +45,8 @@ func (p *Parser) parseStatement() ast.Statement {
45
45
switch p .curToken .Type {
46
46
case token .VAR :
47
47
return p .parseVarStatement ()
48
+ case token .RETURN :
49
+ return p .parseReturnStatement ()
48
50
default :
49
51
return nil
50
52
@@ -73,3 +75,17 @@ func (p *Parser) parseVarStatement() *ast.VarStatement {
73
75
74
76
return stmt
75
77
}
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
+ }
Original file line number Diff line number Diff line change 7
7
"github.com/54L1m/mil-lang/lexer"
8
8
)
9
9
10
- func TestLetStatement (t * testing.T ) {
10
+ func TestVarStatement (t * testing.T ) {
11
11
input := `
12
12
var x = 5;
13
13
var y = 10;
@@ -42,6 +42,37 @@ func TestLetStatement(t *testing.T) {
42
42
}
43
43
}
44
44
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
+
45
76
func testVarStatement (t * testing.T , s ast.Statement , name string ) bool {
46
77
if s .TokenLiteral () != "var" {
47
78
t .Errorf ("s.TokenLiteral not 'var'. got=%q" , s .TokenLiteral ())
You can’t perform that action at this time.
0 commit comments