Compare commits

...

2 Commits

Author SHA1 Message Date
acc9b94c1f Fixed an error in double parsing logic
All checks were successful
ci/woodpecker/push/workflow Pipeline was successful
2025-09-30 21:32:02 +03:00
8d3cc2181e Added equality operator to Token, will be useful for testing. 2025-09-30 20:58:56 +03:00
2 changed files with 12 additions and 4 deletions

View File

@@ -20,6 +20,7 @@ struct Token {
enum TokenType type; enum TokenType type;
std::variant<int64_t, double, std::string> value; std::variant<int64_t, double, std::string> value;
}; };
bool operator==(Token const& one, Token const& other);
std::ostream &operator<<(std::ostream &os, Token const &t); std::ostream &operator<<(std::ostream &os, Token const &t);
class Lexer { class Lexer {

View File

@@ -23,6 +23,10 @@ std::ostream &operator<<(std::ostream &os, Token const &t) {
return os; return os;
} }
bool operator==(Token const& one, Token const& other) {
return one.type == other.type && one.value == other.value;
}
bool ispunct(char c) { bool ispunct(char c) {
for (char i : "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~") { for (char i : "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~") {
if (i == c) return true; if (i == c) return true;
@@ -61,9 +65,10 @@ Token Lexer::lexNumOrSym() {
// ... this will almost certainly change, won't it? // ... this will almost certainly change, won't it?
string s = acc.str(); string s = acc.str();
string iterate_over = (s.at(0) == '-') ? s.substr(1) : s; string iterate_over = (s.at(0) == '-') ? s.substr(1) : s;
bool is_number = true; bool is_number = false;
bool dot_seen = false; bool dot_seen = false;
for (char c : s) { for (char c : iterate_over) {
if (c == '.') { if (c == '.') {
if (dot_seen) { if (dot_seen) {
is_number = false; is_number = false;
@@ -72,14 +77,16 @@ Token Lexer::lexNumOrSym() {
dot_seen = true; dot_seen = true;
continue; continue;
} }
if (!isdigit(c)) { if (isdigit(c)) {
is_number = true;
} else {
is_number = false; is_number = false;
break; break;
} }
} }
if (is_number && dot_seen) { if (is_number && dot_seen) {
if (s == ".") if (iterate_over == ".")
return {TokenType::Symbol, s}; return {TokenType::Symbol, s};
return {TokenType::Double, stod(s)}; return {TokenType::Double, stod(s)};
} else if (is_number) { } else if (is_number) {