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;
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);
class Lexer {

View File

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