From a0d5d62a34844ca665945d58f6776cc7a1124a05 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Mon, 3 Oct 2022 15:20:31 +0000 Subject: [PATCH] Fixed a bug in the Scanner when parsing a hex number, still not super robust but it'll work. --- src/scanner.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/scanner.c b/src/scanner.c index d85b34c..b28202f 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -1,6 +1,8 @@ #include "../includes/scanner.h" +#include #include #include +#include const char* SourceCode; int Line = 1; @@ -8,6 +10,7 @@ int Position = 0; int SourceLength = 0; int ScannerAtEnd(void); int IsPunctuation(char); +int IsWhiteSpace(char); char PeekScanner(void); char PeekAheadScanner(void); void AdvanceScanner(void); @@ -34,6 +37,8 @@ List* GenerateTokenList(const char* source) { case ' ': case '\r': case '\t': + case '\v': + case '\f': AdvanceScanner(); break; //Ignore whitespace case '\n': @@ -98,9 +103,21 @@ Token* ParseNumber(void) { while(!ScannerAtEnd() && isdigit(PeekScanner())) AdvanceScanner(); - if (PeekScanner() == 'x' && isdigit(PeekAheadScanner())) { - AdvanceScanner(); //Consume the 'x' - while(!ScannerAtEnd() && isdigit(PeekScanner())) AdvanceScanner(); + if (tolower(PeekScanner()) == 'x') { + char ahead = tolower(PeekAheadScanner()); + + if ((ahead >= 'a' && ahead <= 'f') || isdigit(ahead)) { + AdvanceScanner(); //Consume the 'x' + + while(!ScannerAtEnd() && PeekScanner() != '\n' && !IsWhiteSpace(PeekScanner())) { + if (isdigit(PeekScanner())) { + AdvanceScanner(); + continue; + } + + if (tolower(PeekScanner()) >= 'a' && tolower(PeekScanner()) <= 'f') AdvanceScanner(); + } + } } int length = Position - start; @@ -119,6 +136,12 @@ Token* ParseNumber(void) { Token* token = CreateToken(Line, NumberClass); token->Value.Number = strtol(lexeme, NULL, 0); + + if (errno != 0) { + fprintf(stderr, "[Error] Line %d: Invalid number detected. %s.\n", Line, strerror(errno)); + exit(1); + } + token->Lemexe = lexeme; return token; @@ -285,6 +308,19 @@ int IsPunctuation(char c) { } } +int IsWhiteSpace(char c) { + switch(c) { + case ' ': + case '\t': + case '\v': + case '\f': + case '\r': + return 1; + default: + return 0; + } +} + Token* ParsePunctuation(char c) { TokenPunctuation punctuation;