@@ -745,6 +745,38 @@ impure fn parse_do_while_expr(parser p) -> @ast.expr {
745
745
ret @spanned ( lo, hi, ast. expr_do_while ( body, cond, ast. ann_none ) ) ;
746
746
}
747
747
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
+
748
780
impure fn parse_expr ( parser p) -> @ast . expr {
749
781
alt ( p. peek ( ) ) {
750
782
case ( token. LBRACE ) {
@@ -761,6 +793,9 @@ impure fn parse_expr(parser p) -> @ast.expr {
761
793
case ( token. DO ) {
762
794
ret parse_do_while_expr ( p) ;
763
795
}
796
+ case ( token. ALT ) {
797
+ ret parse_alt_expr ( p) ;
798
+ }
764
799
case ( _) {
765
800
ret parse_assign_expr ( p) ;
766
801
}
@@ -777,6 +812,48 @@ impure fn parse_initializer(parser p) -> option.t[@ast.expr] {
777
812
ret none[ @ast. expr ] ;
778
813
}
779
814
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
+
780
857
impure fn parse_let ( parser p) -> @ast. decl {
781
858
auto lo = p. get_span ( ) ;
782
859
0 commit comments