Remove TODO's

git-svn-id: https://svn.tlawal.org/svn/monkey@40 f6afcba9-9ef1-4bdd-9b72-7484f5705bac
This commit is contained in:
Tijani Lawal 2022-08-01 05:26:02 +00:00
parent 7e34164019
commit e5d2851c2e
2 changed files with 48 additions and 8 deletions

View File

@ -175,7 +175,9 @@ func (l_parser *Parser) parse_statement() ast.Statement {
func (l_parser *Parser) parse_let_statement() *ast.LetStatement {
defer untrace(trace("parse_let_statement"))
statement := &ast.LetStatement{ Token: l_parser.current_token }
if !l_parser.expect_peek(token.IDENT){
return nil
}
@ -185,8 +187,10 @@ func (l_parser *Parser) parse_let_statement() *ast.LetStatement {
return nil
}
// TODO(tijani): Skipping the expressins until there is a semicolon
for !l_parser.current_token_is(token.SEMICOLON) {
l_parser.next_token()
statement.Value = l_parser.parse_expression(LOWEST)
if l_parser.peek_token_is(token.SEMICOLON){
l_parser.next_token()
}
return statement
@ -194,11 +198,13 @@ func (l_parser *Parser) parse_let_statement() *ast.LetStatement {
func (l_parser *Parser) parse_return_statement() *ast.ReturnStatement {
defer untrace(trace("parse_return_statement"))
statement := &ast.ReturnStatement{Token: l_parser.current_token}
l_parser.next_token()
// TODO(tijani): Skipping the expression until there is semicolon
for !l_parser.current_token_is(token.SEMICOLON) {
statement.ReturnValue = l_parser.parse_expression(LOWEST)
if l_parser.peek_token_is(token.SEMICOLON) {
l_parser.next_token()
}
return statement

View File

@ -624,6 +624,40 @@ func TestCallExpressionParameterParsing(l_test *testing.T) {
}
}
func TestLetStatements(l_test *testing.T) {
tests := []struct {
input string
expected_identifier string
expected_value interface{}
}{
{"let x = 5;", "x", 5},
{"let y = true;", "y", true},
{"let foobar = y;", "foobar", "y"},
}
for _, tt := range tests {
l_lexer := lexer.New(tt.input)
l_parser := New(l_lexer)
program := l_parser.ParseProgram()
check_parser_errors(l_test, l_parser)
if len(program.Statements) != 1 {
l_test.Fatalf("program.Statements does not contain 1 statements, got=%d",
len(program.Statements))
}
statement := program.Statements[0]
if !testLetStatement(l_test, statement, tt.expected_identifier){
return
}
val := statement.(*ast.LetStatement).Value
if !testLiteralExpression(l_test, val, tt.expected_value){
return
}
}
}
// Helpers
func check_parser_errors(l_test *testing.T, l_parser *Parser) {