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}; }