From 0a08aaa7b2076afb28a47848bab01d5426e811b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Tue, 5 Aug 2025 12:03:01 +0900 Subject: [PATCH] Match token blob --- samples/test.brc | 2 +- src/Lexer/Lexer.cpp | 70 ++++++++++++++++++++++++--------------------- src/Lexer/Lexer.h | 2 +- src/Lexer/Token.cpp | 2 +- src/Lexer/Token.h | 5 ++-- src/Logger.cpp | 10 ++++--- 6 files changed, 49 insertions(+), 42 deletions(-) diff --git a/samples/test.brc b/samples/test.brc index 001ed1c..b30ff0c 100644 --- a/samples/test.brc +++ b/samples/test.brc @@ -1,4 +1,4 @@ -User pack +User blob ; main fun -> u32 diff --git a/src/Lexer/Lexer.cpp b/src/Lexer/Lexer.cpp index 0706245..56fccf4 100644 --- a/src/Lexer/Lexer.cpp +++ b/src/Lexer/Lexer.cpp @@ -208,14 +208,6 @@ shared_ptr Lexer::nextToken() { return token; // keywords - token = match(TokenKind::IF, "if", true); - if (token != nullptr) - return token; - - token = match(TokenKind::ELSE, "else", true); - if (token != nullptr) - return token; - token = match(TokenKind::FUNCTION, "fun", true); if (token != nullptr) return token; @@ -225,12 +217,24 @@ shared_ptr Lexer::nextToken() { foundRawSourceStart = true; return token; } + + token = match(TokenKind::BLOB, "blob", true); + if (token != nullptr) + return token; token = match(TokenKind::RETURN, "ret", true); if (token != nullptr) return token; token = match(TokenKind::REPEAT, "rep", true); + if (token != nullptr) + return token; + + token = match(TokenKind::IF, "if", true); + if (token != nullptr) + return token; + + token = match(TokenKind::ELSE, "else", true); if (token != nullptr) return token; @@ -313,6 +317,31 @@ shared_ptr Lexer::match(TokenKind kind, string lexme, bool needsSeparator return token; } +shared_ptr Lexer::matchReal() { + int nextIndex = currentIndex; + + while (nextIndex < source.length() && isDecDigit(nextIndex)) + nextIndex++; + + if (nextIndex >= source.length() || source.at(nextIndex) != '.') + return nullptr; + else + nextIndex++; + + while (nextIndex < source.length() && isDecDigit(nextIndex)) + nextIndex++; + + if (!isSeparator(nextIndex)) { + markError(); + return nullptr; + } + + string lexme = source.substr(currentIndex, nextIndex - currentIndex); + shared_ptr token = make_shared(TokenKind::REAL, lexme, currentLine, currentColumn); + advanceWithToken(token); + return token; +} + shared_ptr Lexer::matchIntegerDec() { int nextIndex = currentIndex; @@ -399,31 +428,6 @@ shared_ptr Lexer::matchIntegerChar() { return token; } -shared_ptr Lexer::matchReal() { - int nextIndex = currentIndex; - - while (nextIndex < source.length() && isDecDigit(nextIndex)) - nextIndex++; - - if (nextIndex >= source.length() || source.at(nextIndex) != '.') - return nullptr; - else - nextIndex++; - - while (nextIndex < source.length() && isDecDigit(nextIndex)) - nextIndex++; - - if (!isSeparator(nextIndex)) { - markError(); - return nullptr; - } - - string lexme = source.substr(currentIndex, nextIndex - currentIndex); - shared_ptr token = make_shared(TokenKind::REAL, lexme, currentLine, currentColumn); - advanceWithToken(token); - return token; -} - shared_ptr Lexer::matchString() { int nextIndex = currentIndex; diff --git a/src/Lexer/Lexer.h b/src/Lexer/Lexer.h index 805ad50..7c36882 100644 --- a/src/Lexer/Lexer.h +++ b/src/Lexer/Lexer.h @@ -22,11 +22,11 @@ private: shared_ptr nextToken(); shared_ptr match(TokenKind kind, string lexme, bool needsSeparator); + shared_ptr matchReal(); shared_ptr matchIntegerDec(); shared_ptr matchIntegerHex(); shared_ptr matchIntegerBin(); shared_ptr matchIntegerChar(); - shared_ptr matchReal(); shared_ptr matchString(); shared_ptr matchType(); shared_ptr matchIdentifier(); diff --git a/src/Lexer/Token.cpp b/src/Lexer/Token.cpp index 2adddfe..57e5626 100644 --- a/src/Lexer/Token.cpp +++ b/src/Lexer/Token.cpp @@ -47,11 +47,11 @@ vector Token::tokensBinary = { vector Token::tokensLiteral = { TokenKind::BOOL, + TokenKind::REAL, TokenKind::INTEGER_DEC, TokenKind::INTEGER_HEX, TokenKind::INTEGER_BIN, TokenKind::INTEGER_CHAR, - TokenKind::REAL, TokenKind::STRING }; diff --git a/src/Lexer/Token.h b/src/Lexer/Token.h index 4b1ab57..5e6ad36 100644 --- a/src/Lexer/Token.h +++ b/src/Lexer/Token.h @@ -32,20 +32,21 @@ enum class TokenKind { FUNCTION, RAW_FUNCTION, RAW_SOURCE_LINE, + BLOB, RETURN, REPEAT, IF, ELSE, BOOL, + REAL, INTEGER_DEC, INTEGER_HEX, INTEGER_BIN, INTEGER_CHAR, - REAL, STRING, - IDENTIFIER, TYPE, + IDENTIFIER, M_EXTERN, diff --git a/src/Logger.cpp b/src/Logger.cpp index 0ba1a47..9747083 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -94,20 +94,22 @@ string Logger::toString(shared_ptr token) { case TokenKind::TYPE: return "TYPE(" + token->getLexme() + ")"; - case TokenKind::IF: - return "IF"; - case TokenKind::ELSE: - return "ELSE"; case TokenKind::FUNCTION: return "FUN"; case TokenKind::RAW_FUNCTION: return "RAW"; case TokenKind::RAW_SOURCE_LINE: return format("RAW_SOURCE_LINE({})", token->getLexme()); + case TokenKind::BLOB: + return "BLOB"; case TokenKind::RETURN: return "RET"; case TokenKind::REPEAT: return "REP"; + case TokenKind::IF: + return "IF"; + case TokenKind::ELSE: + return "ELSE"; case TokenKind::M_EXTERN: return "@EXTERN";