|
|
@@ -29,7 +29,7 @@ void parser::parse_dN(sign s, int value) {
|
|
|
throw unexpected_token("Expected a number of sides", in.tellg());
|
|
|
}
|
|
|
in >> d.of.back().sides;
|
|
|
- parse(ZERO);
|
|
|
+ parse_impl(ZERO);
|
|
|
}
|
|
|
|
|
|
void parser::parse_const(sign s, int value) {
|
|
|
@@ -38,7 +38,7 @@ void parser::parse_const(sign s, int value) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void parser::parse(sign s) {
|
|
|
+void parser::parse_impl(sign s) {
|
|
|
advance_over_whitespace(in);
|
|
|
// By defaulting this to zero, we can write a more elegant handling of
|
|
|
// expressions like 1d4+1d6+5+1
|
|
|
@@ -58,7 +58,7 @@ void parser::parse(sign s) {
|
|
|
// Handle 5+... cases
|
|
|
parse_const(s, value);
|
|
|
// Add another token
|
|
|
- parse((in.get() == '+') ? PLUS : MINUS);
|
|
|
+ parse_impl((in.get() == '+') ? PLUS : MINUS);
|
|
|
break;
|
|
|
default:
|
|
|
parse_const(s, value);
|
|
|
@@ -66,4 +66,35 @@ void parser::parse(sign s) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+dice parser::parse() {
|
|
|
+ d = {};
|
|
|
+ int value{1};
|
|
|
+ advance_over_whitespace(in);
|
|
|
+ if (isnumber(in.peek())) { in >> value; }
|
|
|
+ advance_over_whitespace(in);
|
|
|
+
|
|
|
+ switch (in.peek()) {
|
|
|
+ case 'd':
|
|
|
+ case 'D':
|
|
|
+ parse_impl(ZERO);
|
|
|
+ d.of.front().num = value;
|
|
|
+ break;
|
|
|
+ case '{':
|
|
|
+ in.get();
|
|
|
+ d.num = value;
|
|
|
+ parse_impl(ZERO);
|
|
|
+ if (in.get() != '}') {
|
|
|
+ throw unexpected_token("Expected closing '}' in repeated roll",
|
|
|
+ in.tellg());
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case EOF:
|
|
|
+ throw unexpected_token("No dice in expression", in.tellg());
|
|
|
+ default:
|
|
|
+ throw unexpected_token("Unexpected token", in.tellg());
|
|
|
+ }
|
|
|
+
|
|
|
+ return d;
|
|
|
+}
|
|
|
+
|
|
|
}
|