Add pat_lit to ast, and support parsing it.
This commit is contained in:
parent
b59d98ccb9
commit
a396652766
2 changed files with 22 additions and 22 deletions
|
@ -57,6 +57,7 @@ type pat = spanned[pat_];
|
||||||
tag pat_ {
|
tag pat_ {
|
||||||
pat_wild(ann);
|
pat_wild(ann);
|
||||||
pat_bind(ident, def_id, ann);
|
pat_bind(ident, def_id, ann);
|
||||||
|
pat_lit(@lit, ann);
|
||||||
pat_tag(path, vec[@pat], option.t[variant_def], ann);
|
pat_tag(path, vec[@pat], option.t[variant_def], ann);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -351,9 +351,9 @@ impure fn parse_seq[T](token.token bra,
|
||||||
ret spanned(lo, hi, v);
|
ret spanned(lo, hi, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
impure fn parse_lit(parser p) -> option.t[ast.lit] {
|
impure fn parse_lit(parser p) -> ast.lit {
|
||||||
auto lo = p.get_span();
|
auto lo = p.get_span();
|
||||||
let ast.lit_ lit;
|
let ast.lit_ lit = ast.lit_nil;
|
||||||
alt (p.peek()) {
|
alt (p.peek()) {
|
||||||
case (token.LIT_INT(?i)) {
|
case (token.LIT_INT(?i)) {
|
||||||
p.bump();
|
p.bump();
|
||||||
|
@ -379,12 +379,11 @@ impure fn parse_lit(parser p) -> option.t[ast.lit] {
|
||||||
p.bump();
|
p.bump();
|
||||||
lit = ast.lit_str(s);
|
lit = ast.lit_str(s);
|
||||||
}
|
}
|
||||||
case (_) {
|
case (?t) {
|
||||||
lit = ast.lit_nil; // FIXME: typestate bug requires this
|
unexpected(p, t);
|
||||||
ret none[ast.lit];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret some(spanned(lo, lo, lit));
|
ret spanned(lo, lo, lit);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_ident(token.token t) -> bool {
|
fn is_ident(token.token t) -> bool {
|
||||||
|
@ -565,15 +564,9 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
|
||||||
}
|
}
|
||||||
|
|
||||||
case (_) {
|
case (_) {
|
||||||
alt (parse_lit(p)) {
|
auto lit = parse_lit(p);
|
||||||
case (some[ast.lit](?lit)) {
|
hi = lit.span;
|
||||||
hi = lit.span;
|
ex = ast.expr_lit(@lit, ast.ann_none);
|
||||||
ex = ast.expr_lit(@lit, ast.ann_none);
|
|
||||||
}
|
|
||||||
case (none[ast.lit]) {
|
|
||||||
p.err("expecting expression");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1081,10 +1074,12 @@ impure fn parse_initializer(parser p) -> option.t[@ast.expr] {
|
||||||
|
|
||||||
impure fn parse_pat(parser p) -> @ast.pat {
|
impure fn parse_pat(parser p) -> @ast.pat {
|
||||||
auto lo = p.get_span();
|
auto lo = p.get_span();
|
||||||
|
auto hi = lo;
|
||||||
auto pat = ast.pat_wild(ast.ann_none); // FIXME: typestate bug
|
auto pat = ast.pat_wild(ast.ann_none); // FIXME: typestate bug
|
||||||
|
|
||||||
alt (p.peek()) {
|
alt (p.peek()) {
|
||||||
case (token.UNDERSCORE) {
|
case (token.UNDERSCORE) {
|
||||||
|
hi = p.get_span();
|
||||||
p.bump();
|
p.bump();
|
||||||
pat = ast.pat_wild(ast.ann_none);
|
pat = ast.pat_wild(ast.ann_none);
|
||||||
}
|
}
|
||||||
|
@ -1092,6 +1087,7 @@ impure fn parse_pat(parser p) -> @ast.pat {
|
||||||
p.bump();
|
p.bump();
|
||||||
alt (p.peek()) {
|
alt (p.peek()) {
|
||||||
case (token.IDENT(?id)) {
|
case (token.IDENT(?id)) {
|
||||||
|
hi = p.get_span();
|
||||||
p.bump();
|
p.bump();
|
||||||
pat = ast.pat_bind(id, p.next_def_id(), ast.ann_none);
|
pat = ast.pat_bind(id, p.next_def_id(), ast.ann_none);
|
||||||
}
|
}
|
||||||
|
@ -1104,13 +1100,16 @@ impure fn parse_pat(parser p) -> @ast.pat {
|
||||||
}
|
}
|
||||||
case (token.IDENT(?id)) {
|
case (token.IDENT(?id)) {
|
||||||
auto tag_path = parse_path(p, GREEDY);
|
auto tag_path = parse_path(p, GREEDY);
|
||||||
|
hi = tag_path.span;
|
||||||
|
|
||||||
let vec[@ast.pat] args;
|
let vec[@ast.pat] args;
|
||||||
alt (p.peek()) {
|
alt (p.peek()) {
|
||||||
case (token.LPAREN) {
|
case (token.LPAREN) {
|
||||||
auto f = parse_pat;
|
auto f = parse_pat;
|
||||||
args = parse_seq[@ast.pat](token.LPAREN, token.RPAREN,
|
auto a = parse_seq[@ast.pat](token.LPAREN, token.RPAREN,
|
||||||
some(token.COMMA), f, p).node;
|
some(token.COMMA), f, p);
|
||||||
|
args = a.node;
|
||||||
|
hi = a.span;
|
||||||
}
|
}
|
||||||
case (_) { args = vec(); }
|
case (_) { args = vec(); }
|
||||||
}
|
}
|
||||||
|
@ -1118,13 +1117,13 @@ impure fn parse_pat(parser p) -> @ast.pat {
|
||||||
pat = ast.pat_tag(tag_path, args, none[ast.variant_def],
|
pat = ast.pat_tag(tag_path, args, none[ast.variant_def],
|
||||||
ast.ann_none);
|
ast.ann_none);
|
||||||
}
|
}
|
||||||
case (?tok) {
|
case (_) {
|
||||||
p.err("expected pattern but found " + token.to_str(tok));
|
auto lit = parse_lit(p);
|
||||||
fail;
|
hi = lit.span;
|
||||||
|
pat = ast.pat_lit(@lit, ast.ann_none);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto hi = p.get_span();
|
|
||||||
ret @spanned(lo, hi, pat);
|
ret @spanned(lo, hi, pat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue