mu: sexp-parser: add support for negative numbers
We need those too!
This commit is contained in:
@ -106,10 +106,15 @@ 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];
|
||||||
|
|
||||||
@ -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