Skip to content

Commit 220e00a

Browse files
committed
---
yaml --- r: 947 b: refs/heads/master c: 756880a h: refs/heads/master i: 945: 0a85ea7 943: 79b22de v: v3
1 parent e026a4d commit 220e00a

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 5d72dae1d13fdbe6275d732aac7dd9a9ad604b6f
2+
refs/heads/master: 756880a5f5e5df2474a9770d27fa3751b0be4916

trunk/src/comp/front/ast.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ type block = spanned[block_];
3939
type block_ = rec(vec[@stmt] stmts,
4040
hashmap[ident,uint] index);
4141

42+
type pat = spanned[pat_];
43+
tag pat_ {
44+
pat_wild;
45+
pat_bind(ident);
46+
pat_tag(ident, vec[@pat]);
47+
}
48+
49+
type arm = rec(@pat pat, block block);
50+
4251
tag binop {
4352
add;
4453
sub;
@@ -104,6 +113,7 @@ tag expr_ {
104113
expr_if(@expr, block, option.t[block], ann);
105114
expr_while(@expr, block, ann);
106115
expr_do_while(block, @expr, ann);
116+
expr_alt(@expr, vec[arm], ann);
107117
expr_block(block, ann);
108118
expr_assign(@expr /* TODO: @expr|is_lval */, @expr, ann);
109119
expr_field(@expr, ident, ann);

trunk/src/comp/front/parser.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,38 @@ impure fn parse_do_while_expr(parser p) -> @ast.expr {
745745
ret @spanned(lo, hi, ast.expr_do_while(body, cond, ast.ann_none));
746746
}
747747

748+
impure fn parse_alt_expr(parser p) -> @ast.expr {
749+
auto lo = p.get_span();
750+
expect(p, token.ALT);
751+
expect(p, token.LPAREN);
752+
auto discriminant = parse_expr(p);
753+
expect(p, token.RPAREN);
754+
expect(p, token.LBRACE);
755+
756+
let vec[ast.arm] arms = vec();
757+
while (p.peek() != token.RBRACE) {
758+
alt (p.peek()) {
759+
case (token.CASE) {
760+
p.bump();
761+
expect(p, token.LPAREN);
762+
auto pat = parse_pat(p);
763+
expect(p, token.RPAREN);
764+
auto block = parse_block(p);
765+
arms += vec(rec(pat=pat, block=block));
766+
}
767+
case (token.RBRACE) { /* empty */ }
768+
case (?tok) {
769+
p.err("expected 'case' or '}' when parsing 'alt' statement " +
770+
"but found " + token.to_str(tok));
771+
}
772+
}
773+
}
774+
775+
auto expr = ast.expr_alt(discriminant, arms, ast.ann_none);
776+
auto hi = p.get_span();
777+
ret @spanned(lo, hi, expr);
778+
}
779+
748780
impure fn parse_expr(parser p) -> @ast.expr {
749781
alt (p.peek()) {
750782
case (token.LBRACE) {
@@ -761,6 +793,9 @@ impure fn parse_expr(parser p) -> @ast.expr {
761793
case (token.DO) {
762794
ret parse_do_while_expr(p);
763795
}
796+
case (token.ALT) {
797+
ret parse_alt_expr(p);
798+
}
764799
case (_) {
765800
ret parse_assign_expr(p);
766801
}
@@ -777,6 +812,48 @@ impure fn parse_initializer(parser p) -> option.t[@ast.expr] {
777812
ret none[@ast.expr];
778813
}
779814

815+
impure fn parse_pat(parser p) -> @ast.pat {
816+
auto lo = p.get_span();
817+
818+
auto pat = ast.pat_wild; // FIXME: typestate bug
819+
alt (p.peek()) {
820+
case (token.UNDERSCORE) { p.bump(); pat = ast.pat_wild; }
821+
case (token.QUES) {
822+
p.bump();
823+
alt (p.peek()) {
824+
case (token.IDENT(?id)) { p.bump(); pat = ast.pat_bind(id); }
825+
case (?tok) {
826+
p.err("expected identifier after '?' in pattern but " +
827+
"found " + token.to_str(tok));
828+
fail;
829+
}
830+
}
831+
}
832+
case (token.IDENT(?id)) {
833+
p.bump();
834+
835+
let vec[@ast.pat] args;
836+
alt (p.peek()) {
837+
case (token.LPAREN) {
838+
auto f = parse_pat;
839+
args = parse_seq[@ast.pat](token.LPAREN, token.RPAREN,
840+
some(token.COMMA), f, p).node;
841+
}
842+
case (_) { args = vec(); }
843+
}
844+
845+
pat = ast.pat_tag(id, args);
846+
}
847+
case (?tok) {
848+
p.err("expected pattern but found " + token.to_str(tok));
849+
fail;
850+
}
851+
}
852+
853+
auto hi = p.get_span();
854+
ret @spanned(lo, hi, pat);
855+
}
856+
780857
impure fn parse_let(parser p) -> @ast.decl {
781858
auto lo = p.get_span();
782859

0 commit comments

Comments
 (0)