Fixed an error in double parsing logic
All checks were successful
ci/woodpecker/push/workflow Pipeline was successful
All checks were successful
ci/woodpecker/push/workflow Pipeline was successful
This commit is contained in:
@@ -19,9 +19,8 @@ enum TokenType {
|
|||||||
struct Token {
|
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& other);
|
|
||||||
};
|
};
|
||||||
|
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 {
|
||||||
|
15
src/lex.cpp
15
src/lex.cpp
@@ -23,8 +23,8 @@ std::ostream &operator<<(std::ostream &os, Token const &t) {
|
|||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Token::operator==(Token const& other) {
|
bool operator==(Token const& one, Token const& other) {
|
||||||
return this->type == other.type && this->value == other.value;
|
return one.type == other.type && one.value == other.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ispunct(char c) {
|
bool ispunct(char c) {
|
||||||
@@ -65,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;
|
||||||
@@ -76,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) {
|
||||||
|
Reference in New Issue
Block a user