aboutsummaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorBobby <[email protected]>2024-02-07 21:26:59 +0000
committerBobby <[email protected]>2024-02-07 21:26:59 +0000
commitee1a97c282989a4c84a217991886a915abee5d3b (patch)
tree6eeaa457988c750a02bf4d1adb4e7258660190cf /parser
parentfebcc8807295c84ec8755b2468cc943cfa882a59 (diff)
downloadmana-ee1a97c282989a4c84a217991886a915abee5d3b.tar.xz
mana-ee1a97c282989a4c84a217991886a915abee5d3b.zip
removing optional ; todos
Diffstat (limited to 'parser')
-rw-r--r--parser/parser.go8
-rw-r--r--parser/parser_test.go51
2 files changed, 28 insertions, 31 deletions
diff --git a/parser/parser.go b/parser/parser.go
index 31e89f3..c7d6234 100644
--- a/parser/parser.go
+++ b/parser/parser.go
@@ -181,8 +181,9 @@ func (p *Parser) parseLetStatement() *ast.LetStatement {
return nil
}
- // TODO: We're skipping the expressions until we
- // encounter a semicolon.
+ p.nextToken()
+
+ stmt.Value = p.parseExpression(LOWEST)
for !p.curTokenIs(tokens.SEMICOLON) {
p.nextToken()
@@ -197,8 +198,7 @@ func (p *Parser) parseReturnStatement() *ast.ReturnStatement {
p.nextToken()
- // TODO: We're skipping the expressions until we
- // encounter a semicolon.
+ stmt.ReturnValue = p.parseExpression(LOWEST)
for !p.curTokenIs(tokens.SEMICOLON) {
p.nextToken()
diff --git a/parser/parser_test.go b/parser/parser_test.go
index cd38144..a9754f5 100644
--- a/parser/parser_test.go
+++ b/parser/parser_test.go
@@ -8,40 +8,37 @@ import (
)
func TestLetStatements(t *testing.T) {
- const input string = `
- let x = 5;
- let y = 10;
- let foobar = 838383;
- `
-
- var l *lexer.Lexer = lexer.New(input)
- var p *Parser = New(l)
-
- var program *ast.Program = p.ParseProgram()
- checkParserErrors(t, p)
-
- if program == nil {
- t.Fatalf("ParseProgram() returned nil")
+ tests := []struct {
+ input string
+ expectedIdentifier string
+ expectedValue interface{}
+ } {
+ {"let x = 5;", "x", 5},
+ {"let y = true;", "y", true},
+ {"let foobar = y;", "foobar", "y"},
}
- if len(program.Statements) != 3 {
- t.Fatalf("program.Statements does not contain 3 statements. got=%d", len(program.Statements))
- }
+ for _, tt := range tests {
+ var l *lexer.Lexer = lexer.New(tt.input)
+ var p *Parser = New(l)
+ var program *ast.Program = p.ParseProgram()
+ checkParserErrors(t, p)
- var tests = []struct {
- expectedIdentifier string
- }{
- {"x"},
- {"y"},
- {"foobar"},
- }
+ if len(program.Statements) != 1 {
+ t.Fatalf("program.Statements does not contain 1 statements. got=%d", len(program.Statements))
+ }
- for i, tt := range tests {
- var stmt ast.Statement = program.Statements[i]
+ stmt := program.Statements[0]
if !testLetStatement(t, stmt, tt.expectedIdentifier) {
return
}
+
+ val := stmt.(*ast.LetStatement).Value
+
+ if !testLiteralExpression(t, val, tt.expectedValue) {
+ return
+ }
}
}
@@ -196,7 +193,7 @@ func testInfixExpression(
return true
}
-// Identifier expression tests.
+// Identifier expression tests.f
func TestIdentifierExpression(t *testing.T) {
var input string = "foobar;"