From 29044dc74cdd37e75db3fd19b0dd1f1aefc63e7e Mon Sep 17 00:00:00 2001 From: Sky Johnson Date: Tue, 10 Jun 2025 09:46:17 -0500 Subject: [PATCH] fix if/then errors --- parser/parser.go | 22 ++++++++++++++++++++-- parser/token.go | 2 ++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index d268c5d..086e230 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -157,7 +157,18 @@ func (p *Parser) parseIfStatement() *IfStatement { return nil } - p.nextToken() // move past condition + // Optional 'then' keyword + if p.peekTokenIs(THEN) { + p.nextToken() + } + + p.nextToken() // move past condition (and optional 'then') + + // Check if we immediately hit END (missing body) + if p.curTokenIs(END) { + p.addError("expected 'end' to close if statement") + return nil + } // Parse if body stmt.Body = p.parseBlockStatements(ELSEIF, ELSE, END) @@ -174,7 +185,12 @@ func (p *Parser) parseIfStatement() *IfStatement { return nil } - p.nextToken() // move past condition + // Optional 'then' keyword + if p.peekTokenIs(THEN) { + p.nextToken() + } + + p.nextToken() // move past condition (and optional 'then') elseif.Body = p.parseBlockStatements(ELSEIF, ELSE, END) stmt.ElseIfs = append(stmt.ElseIfs, elseif) @@ -563,6 +579,8 @@ func tokenTypeString(t TokenType) string { return "var" case IF: return "if" + case THEN: + return "then" case ELSEIF: return "elseif" case ELSE: diff --git a/parser/token.go b/parser/token.go index 2caa96d..19400dc 100644 --- a/parser/token.go +++ b/parser/token.go @@ -29,6 +29,7 @@ const ( // Keywords VAR IF + THEN ELSEIF ELSE END @@ -74,6 +75,7 @@ func lookupIdent(ident string) TokenType { "false": FALSE, "nil": NIL, "if": IF, + "then": THEN, "elseif": ELSEIF, "else": ELSE, "end": END,