@@ -49,7 +49,7 @@ impl<'s> Parser<'s> {
4949 . xresult_or ( |expr| result_expr ! ( Import , mutability, identifier, expr) )
5050 }
5151
52- pub fn tag (
52+ pub fn _tag (
5353 & mut self ,
5454 visibility : Option < Lexeme > ,
5555 mutability : Lexeme ,
@@ -82,6 +82,29 @@ impl<'s> Parser<'s> {
8282 result_expr ! ( ErrorDecl , visibility, mutability, identifier, sig)
8383 }
8484
85+ pub fn _enum (
86+ & mut self ,
87+ visibility : Option < Lexeme > ,
88+ mutability : Lexeme ,
89+ identifier : Box < Expr > ,
90+ sig : Option < Box < Expr > > ,
91+ ) -> ResultExpr {
92+ let mut variants: Vec < Box < Expr > > = vec ! [ ] ;
93+ let oparen = self . lexer . collect_if ( Token :: OParen ) ;
94+ let enum_type = self . val_type ( ) ;
95+ if oparen. is_some ( ) {
96+ let _ = self
97+ . lexer
98+ . collect_if ( Token :: CParen )
99+ . xexpect_token ( & self , "expected ')'" . to_string ( ) ) ?;
100+ }
101+ while let Some ( _) = self . lexer . collect_if ( Token :: Bar ) {
102+ let x = self . ident ( ) . xconvert_to_sym_decl ( ) ?;
103+ variants. push ( x) ;
104+ }
105+ result_expr ! ( EnumDecl , visibility, mutability, identifier, variants, sig, enum_type)
106+ }
107+
85108 pub fn _struct (
86109 & mut self ,
87110 visibility : Option < Lexeme > ,
@@ -123,14 +146,16 @@ impl<'s> Parser<'s> {
123146 Token :: Import ,
124147 Token :: Tag ,
125148 Token :: Error ,
149+ Token :: Enum ,
126150 ] ) {
127151 match val. token {
128152 Token :: Struct => return self . _struct ( has_pub, mutability, identifier, sig) ,
129153 Token :: Func => return self . _fn ( has_pub, mutability, identifier, sig) ,
130154 Token :: Import => return self . _import ( mutability, identifier) ,
131- Token :: Tag => return self . tag ( has_pub, mutability, identifier, sig) ,
155+ Token :: Tag => return self . _tag ( has_pub, mutability, identifier, sig) ,
132156 Token :: Trait => return self . _trait ( has_pub, mutability, identifier, sig) ,
133157 Token :: Error => return self . _error ( has_pub, mutability, identifier, sig) ,
158+ Token :: Enum => return self . _enum ( has_pub, mutability, identifier, sig) ,
134159 _ => panic ! ( "type-lang error unreachable code hit" ) ,
135160 }
136161 }
@@ -427,6 +452,26 @@ impl<'s> Parser<'s> {
427452 let blk = self . block ( ) ?;
428453 return bubble_expr ! ( For , x, blk) ;
429454 }
455+ pub fn _while ( & mut self ) -> ResultOptExpr {
456+ let f = self . lexer . collect_if ( Token :: While ) ;
457+ if f. is_none ( ) {
458+ return Ok ( None ) ;
459+ }
460+ let _ = self
461+ . lexer
462+ . collect_if ( Token :: OParen )
463+ . xexpect_token ( & self , "expected '('" . to_string ( ) ) ?;
464+ let x = self . or ( ) ?;
465+ let _ = self
466+ . lexer
467+ . collect_if ( Token :: CParen )
468+ . xexpect_token ( & self , "expected ')'" . to_string ( ) ) ?;
469+ if let Some ( _fn) = self . anon_fn ( ) ? {
470+ return bubble_expr ! ( While , x, _fn) ;
471+ }
472+ let blk = self . block ( ) ?;
473+ return bubble_expr ! ( While , x, blk) ;
474+ }
430475 pub fn _for ( & mut self ) -> ResultOptExpr {
431476 let f = self . lexer . collect_if ( Token :: For ) ;
432477 if f. is_none ( ) {
@@ -461,7 +506,10 @@ impl<'s> Parser<'s> {
461506 Some ( x) => exprs. push ( x) ,
462507 None => match self . _if ( ) ? {
463508 Some ( x) => exprs. push ( x) ,
464- None => break ,
509+ None => match self . _while ( ) ? {
510+ Some ( x) => exprs. push ( x) ,
511+ None => break ,
512+ } ,
465513 } ,
466514 } ,
467515 } ,
@@ -641,9 +689,10 @@ impl<'s> Parser<'s> {
641689 let lexeme = self . lexer . collect_of_if ( & [
642690 Token :: Ampersand ,
643691 Token :: Asterisk ,
644- Token :: Exclam ,
645692 Token :: Dash ,
646693 Token :: Copy ,
694+ Token :: Clone ,
695+ Token :: Try ,
647696 ] ) ;
648697 if let Some ( x) = lexeme {
649698 let expr = self . unary ( ) ;
@@ -658,21 +707,25 @@ impl<'s> Parser<'s> {
658707 if let Some ( x) = self . lexer . collect_of_if ( & [
659708 Token :: Question ,
660709 Token :: Period ,
661- Token :: Tilde ,
710+ Token :: Try ,
662711 Token :: OBracket ,
663712 Token :: OParen ,
664713 Token :: OBrace ,
714+ Token :: Catch ,
665715 ] ) {
666716 match x. token {
667717 Token :: Question => self . resolve_access ( expr ! ( UndefBubble , prev) ) ,
668- Token :: Tilde => self . resolve_access ( expr ! ( ErrBubble , prev) ) ,
718+ Token :: Try => self . resolve_access ( expr ! ( ErrBubble , prev) ) ,
669719 Token :: Period => {
670720 let ident = self
671721 . ident ( )
672722 . xconvert_to_result ( & self , "expected identifier" . to_string ( ) ) ?;
673723
674724 self . resolve_access ( expr ! ( PropAccess , prev, ident) )
675725 }
726+ Token :: Catch => {
727+ return self . catch ( ) . xconvert_to_result_opt ( ) ;
728+ }
676729 Token :: OBracket => {
677730 let expr = self . array_access ( ) ?;
678731 self . resolve_access ( expr ! ( ArrayAccess , expr, prev) )
@@ -732,6 +785,26 @@ impl<'s> Parser<'s> {
732785 Ok ( Some ( prev) )
733786 }
734787 }
788+ pub fn catch ( & mut self ) -> ResultExpr {
789+ let _ = self
790+ . lexer
791+ . collect_if ( Token :: OParen )
792+ . xexpect_token ( & self , "expected one of '('" . to_string ( ) ) ?;
793+ let args = self . arg ( ) ?;
794+ let ret_type = self
795+ . sig_union ( )
796+ . xexpect_expr ( & self , "expected catch return type" . to_string ( ) ) ?;
797+ let _ = self
798+ . lexer
799+ . collect_if ( Token :: CParen )
800+ . xexpect_token ( & self , "expected one of ')'" . to_string ( ) ) ?;
801+
802+ let bl = self . block ( ) ?;
803+ if args. is_some ( ) {
804+ return result_expr ! ( CatchDecl , Some ( vec![ args. unwrap( ) ] ) , ret_type, bl) ;
805+ }
806+ return result_expr ! ( CatchDecl , None , ret_type, bl) ;
807+ }
735808 pub fn access ( & mut self ) -> ResultOptExpr {
736809 let term = self . terminal ( ) ?;
737810 if let Some ( t) = term {
0 commit comments