From cbc937884e3c2b32b891b0c82f2f4c97b0dbe2cc Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sat, 10 Sep 2022 19:11:16 +0100 Subject: [PATCH] Found a rare lexer bug --- source/lexer.c | 2 +- source/parser.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/source/lexer.c b/source/lexer.c index 5b20ce5..0efa4fd 100644 --- a/source/lexer.c +++ b/source/lexer.c @@ -139,7 +139,7 @@ static Token makeIntegerOrFloat(Lexer* lexer) { while(isDigit(lexer)) advance(lexer); - if (peek(lexer) == '.') { + if (peek(lexer) == '.' && (peekNext(lexer) >= '0' && peekNext(lexer) <= '9')) { //BUGFIX: peekNext == digit type = TOKEN_LITERAL_FLOAT; advance(lexer); while(isDigit(lexer)) advance(lexer); diff --git a/source/parser.c b/source/parser.c index 585adbb..14c4566 100644 --- a/source/parser.c +++ b/source/parser.c @@ -791,6 +791,11 @@ static Opcode dot(Parser* parser, Node** nodeHandle) { parsePrecedence(parser, &node, PREC_CALL); + if (node == NULL || node->binary.right == NULL) { + error(parser, parser->previous, "Expected function call after dot operator"); + return OP_EOF; + } + //hijack the function call, and hack in an extra parameter node->binary.right->fnCall.argumentCount++; node->binary.opcode = OP_DOT;