aboutsummaryrefslogtreecommitdiff
path: root/asm
diff options
context:
space:
mode:
Diffstat (limited to 'asm')
-rw-r--r--asm/lexer.cpp30
1 files changed, 27 insertions, 3 deletions
diff --git a/asm/lexer.cpp b/asm/lexer.cpp
index 0024b05..189b330 100644
--- a/asm/lexer.cpp
+++ b/asm/lexer.cpp
@@ -16,10 +16,11 @@
#include "./lexer.hpp"
-using std::string_view, std::pair, std::make_pair;
+using std::string, std::string_view, std::pair, std::make_pair;
-constexpr auto VALID_SYMBOL =
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.:()%#$";
+constexpr auto VALID_SYMBOL = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV"
+ "WXYZ0123456789-_.:()%#$",
+ VALID_DIGIT = "0123456789";
bool is_char_in_s(char c, const char *s)
{
@@ -213,3 +214,26 @@ pair<token_t, lerr_t> tokenise_symbol(string_view &source, size_t &column)
column += sym.size();
return make_pair(t, lerr_t::OK);
}
+
+token_t tokenise_literal_number(string_view &source, size_t &column)
+{
+ bool is_negative = false;
+ if (source[0] == '-')
+ {
+ is_negative = true;
+ source.remove_prefix(1);
+ }
+
+ auto end = source.find_first_not_of(VALID_DIGIT);
+ if (end == string::npos)
+ end = source.size() - 1;
+ string digits{source.substr(0, end)};
+ source.remove_prefix(end);
+
+ token_t t{token_type_t::LITERAL_NUMBER, (is_negative ? "-" : "") + digits,
+ column};
+
+ column += digits.size() + (is_negative ? 1 : 0);
+
+ return t;
+}