aboutsummaryrefslogtreecommitdiff
path: root/src/comp/front
diff options
context:
space:
mode:
Diffstat (limited to 'src/comp/front')
-rw-r--r--src/comp/front/parser.rs22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index 8e848afb..2571c5d7 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -141,7 +141,7 @@ io fn parse_seq[T](token.token bra,
ret spanned(lo, hi, v);
}
-io fn parse_lit(parser p) -> @ast.lit {
+io fn parse_lit(parser p) -> option[ast.lit] {
auto lo = p.get_span();
let ast.lit_ lit;
alt (p.peek()) {
@@ -166,12 +166,11 @@ io fn parse_lit(parser p) -> @ast.lit {
lit = ast.lit_str(s);
}
case (_) {
- lit = ast.lit_nil;
- p.err("expected literal");
- fail;
+ lit = ast.lit_nil; // FIXME: typestate bug requires this
+ ret none[ast.lit];
}
}
- ret @spanned(lo, lo, lit);
+ ret some(spanned(lo, lo, lit));
}
io fn parse_name(parser p, ast.ident id) -> ast.name {
@@ -263,9 +262,16 @@ io fn parse_bottom_expr(parser p) -> @ast.expr {
}
case (_) {
- auto lit = parse_lit(p);
- hi = lit.span;
- ex = ast.expr_lit(lit);
+ alt (parse_lit(p)) {
+ case (some[ast.lit](?lit)) {
+ hi = lit.span;
+ ex = ast.expr_lit(@lit);
+ }
+ case (none[ast.lit]) {
+ p.err("expecting expression");
+ fail;
+ }
+ }
}
}
ret @spanned(lo, hi, ex);