mu: sexp-parser: add support for negative numbers
We need those too!
This commit is contained in:
@ -106,14 +106,19 @@ parse_string (const std::string& expr, size_t& pos)
|
||||
static Node
|
||||
parse_integer (const std::string& expr, size_t& pos)
|
||||
{
|
||||
if (!isdigit(expr[pos])) // sanity check.
|
||||
if (!isdigit(expr[pos]) && expr[pos] != '-') // sanity check.
|
||||
throw parsing_error(pos, "expected: <digit> but got '%c", expr[pos]);
|
||||
|
||||
std::string num;
|
||||
std::string num; // negative number?
|
||||
if (expr[pos] == '-') {
|
||||
num = "-";
|
||||
++pos;
|
||||
}
|
||||
|
||||
for (; isdigit(expr[pos]); ++pos)
|
||||
num += expr[pos];
|
||||
|
||||
return Node {Type::Integer, std::move(num)};
|
||||
return Node {Type::Integer, std::move(num)};
|
||||
}
|
||||
|
||||
static Node
|
||||
@ -126,7 +131,7 @@ parse_symbol (const std::string& expr, size_t& pos)
|
||||
for (++pos; isalnum(expr[pos]) || expr[pos] == '-'; ++pos)
|
||||
symbol += expr[pos];
|
||||
|
||||
return Node { Type::Symbol, std::move(symbol)};
|
||||
return Node { Type::Symbol, std::move(symbol)};
|
||||
}
|
||||
|
||||
|
||||
@ -144,7 +149,7 @@ parse (const std::string& expr, size_t& pos)
|
||||
return parse_list (expr, pos);
|
||||
else if (kar == '"')
|
||||
return parse_string(expr, pos);
|
||||
else if (isdigit(kar))
|
||||
else if (isdigit(kar) || kar == '-')
|
||||
return parse_integer(expr, pos);
|
||||
else if (isalpha(kar) || kar == ':')
|
||||
return parse_symbol(expr, pos);
|
||||
|
||||
@ -48,6 +48,7 @@ test_parser()
|
||||
check_parse(R"(:foo-123)", "<symbol>{:foo-123}");
|
||||
check_parse(R"("foo")", "<string>{foo}");
|
||||
check_parse(R"(12345)", "<integer>{12345}");
|
||||
check_parse(R"(-12345)", "<integer>{-12345}");
|
||||
check_parse(R"((123 bar "cuux"))", "<list>(<integer>{123}<symbol>{bar}<string>{cuux})");
|
||||
|
||||
check_parse(R"("\"")", "<string>{\"}");
|
||||
|
||||
Reference in New Issue
Block a user