From f93b2deda272367e9a92242bb9680a1f02dccbeb Mon Sep 17 00:00:00 2001 From: haxala1r Date: Tue, 30 Sep 2025 20:30:05 +0300 Subject: [PATCH] Added lexing logic for doubles --- src/include/lex.hpp | 3 ++- src/lex.cpp | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/include/lex.hpp b/src/include/lex.hpp index dd13749..1329a08 100644 --- a/src/include/lex.hpp +++ b/src/include/lex.hpp @@ -11,13 +11,14 @@ enum TokenType { Symbol, String, Int, + Double, End }; // Plain Old Data struct Token { enum TokenType type; - std::variant value; + std::variant value; }; std::ostream &operator<<(std::ostream &os, Token const &t); diff --git a/src/lex.cpp b/src/lex.cpp index 5b6b6f2..d04ea83 100644 --- a/src/lex.cpp +++ b/src/lex.cpp @@ -1,10 +1,8 @@ -#include #include #include #include #include #include -#include using namespace std; @@ -17,6 +15,7 @@ std::ostream &operator<<(std::ostream &os, Token const &t) { case TokenType::Symbol: os << "Symbol, " << get(t.value) << ")"; break; case TokenType::String: os << "String, \"" << get(t.value) << "\")"; break; case TokenType::Int: os << "Int, " << get(t.value) << ")"; break; + case TokenType::Double: os << "Double, " << get(t.value) << ")"; break; case TokenType::End: os << "END)"; break; default: os << ")"; @@ -71,6 +70,7 @@ Token Lexer::lexNumOrSym() { break; } dot_seen = true; + continue; } if (!isdigit(c)) { is_number = false; @@ -78,8 +78,12 @@ Token Lexer::lexNumOrSym() { } } - if (is_number) { - return {TokenType::Int, atoll(s.c_str())}; + if (is_number && dot_seen) { + if (s == ".") + return {TokenType::Symbol, s}; + return {TokenType::Double, stod(s)}; + } else if (is_number) { + return {TokenType::Int, stoll(s)}; } return {TokenType::Symbol, s}; }