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
|
static Node
|
||||||
parse_integer (const std::string& expr, size_t& pos)
|
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]);
|
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)
|
for (; isdigit(expr[pos]); ++pos)
|
||||||
num += expr[pos];
|
num += expr[pos];
|
||||||
|
|
||||||
return Node {Type::Integer, std::move(num)};
|
return Node {Type::Integer, std::move(num)};
|
||||||
}
|
}
|
||||||
|
|
||||||
static Node
|
static Node
|
||||||
@ -126,7 +131,7 @@ parse_symbol (const std::string& expr, size_t& pos)
|
|||||||
for (++pos; isalnum(expr[pos]) || expr[pos] == '-'; ++pos)
|
for (++pos; isalnum(expr[pos]) || expr[pos] == '-'; ++pos)
|
||||||
symbol += expr[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);
|
return parse_list (expr, pos);
|
||||||
else if (kar == '"')
|
else if (kar == '"')
|
||||||
return parse_string(expr, pos);
|
return parse_string(expr, pos);
|
||||||
else if (isdigit(kar))
|
else if (isdigit(kar) || kar == '-')
|
||||||
return parse_integer(expr, pos);
|
return parse_integer(expr, pos);
|
||||||
else if (isalpha(kar) || kar == ':')
|
else if (isalpha(kar) || kar == ':')
|
||||||
return parse_symbol(expr, pos);
|
return parse_symbol(expr, pos);
|
||||||
|
|||||||
@ -48,6 +48,7 @@ test_parser()
|
|||||||
check_parse(R"(:foo-123)", "<symbol>{:foo-123}");
|
check_parse(R"(:foo-123)", "<symbol>{:foo-123}");
|
||||||
check_parse(R"("foo")", "<string>{foo}");
|
check_parse(R"("foo")", "<string>{foo}");
|
||||||
check_parse(R"(12345)", "<integer>{12345}");
|
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"((123 bar "cuux"))", "<list>(<integer>{123}<symbol>{bar}<string>{cuux})");
|
||||||
|
|
||||||
check_parse(R"("\"")", "<string>{\"}");
|
check_parse(R"("\"")", "<string>{\"}");
|
||||||
|
|||||||
Reference in New Issue
Block a user