From ee1a97c282989a4c84a217991886a915abee5d3b Mon Sep 17 00:00:00 2001 From: Bobby Date: Wed, 7 Feb 2024 21:26:59 +0000 Subject: removing optional ; todos --- parser/parser.go | 8 ++++---- parser/parser_test.go | 51 ++++++++++++++++++++++++--------------------------- 2 files changed, 28 insertions(+), 31 deletions(-) (limited to 'parser') 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;" -- cgit v1.2.3