feat: finish expr_seq_parser
This commit is contained in:
		
							parent
							
								
									3bc507c9e8
								
							
						
					
					
						commit
						59a9bac9b5
					
				|  | @ -268,3 +268,57 @@ pub enum UntypedExpr { | |||
|         value: Box<Self>, | ||||
|     }, | ||||
| } | ||||
| 
 | ||||
| impl UntypedExpr { | ||||
|     pub fn append_in_sequence(self, next: Self) -> Self { | ||||
|         let location = Span { | ||||
|             start: self.location().start, | ||||
|             end: next.location().end, | ||||
|             ..self.location() | ||||
|         }; | ||||
| 
 | ||||
|         match self { | ||||
|             Self::Sequence { | ||||
|                 mut expressions, .. | ||||
|             } => { | ||||
|                 expressions.push(next); | ||||
|                 Self::Sequence { | ||||
|                     location, | ||||
|                     expressions, | ||||
|                 } | ||||
|             } | ||||
|             _ => Self::Sequence { | ||||
|                 location, | ||||
|                 expressions: vec![self, next], | ||||
|             }, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn location(&self) -> Span { | ||||
|         match self { | ||||
|             Self::Try { then, .. } => then.location(), | ||||
|             Self::PipeLine { expressions, .. } => expressions.last().location(), | ||||
|             Self::Fn { location, .. } | ||||
|             | Self::Var { location, .. } | ||||
|             | Self::Int { location, .. } | ||||
|             | Self::Todo { location, .. } | ||||
|             | Self::Case { location, .. } | ||||
|             | Self::Call { location, .. } | ||||
|             | Self::List { location, .. } | ||||
|             | Self::Float { location, .. } | ||||
|             | Self::BinOp { location, .. } | ||||
|             | Self::Tuple { location, .. } | ||||
|             | Self::String { location, .. } | ||||
|             | Self::Assignment { location, .. } | ||||
|             | Self::TupleIndex { location, .. } | ||||
|             | Self::FieldAccess { location, .. } | ||||
|             | Self::RecordUpdate { location, .. } | ||||
|             | Self::Negate { location, .. } => *location, | ||||
|             Self::Sequence { | ||||
|                 location, | ||||
|                 expressions, | ||||
|                 .. | ||||
|             } => expressions.last().map(Self::location).unwrap_or(*location), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -227,12 +227,13 @@ pub fn fn_param_parser() -> impl Parser<Token, ast::UntypedArg, Error = ParseErr | |||
| 
 | ||||
| pub fn expr_seq_parser() -> impl Parser<Token, expr::UntypedExpr, Error = ParseError> { | ||||
|     recursive(|r| { | ||||
|         choice((just(Token::Try) | ||||
|         choice(( | ||||
|             just(Token::Try) | ||||
|                 .ignore_then(pattern_parser()) | ||||
|                 .then(just(Token::Colon).ignore_then(type_parser()).or_not()) | ||||
|                 .then_ignore(just(Token::Equal)) | ||||
|                 .then(expr_parser()) | ||||
|             .then(r) | ||||
|                 .then(r.clone()) | ||||
|                 .map_with_span(|(((pattern, annotation), value), then_), span| { | ||||
|                     expr::UntypedExpr::Try { | ||||
|                         location: span, | ||||
|  | @ -241,12 +242,22 @@ pub fn expr_seq_parser() -> impl Parser<Token, expr::UntypedExpr, Error = ParseE | |||
|                         then: Box::new(then_), | ||||
|                         annotation, | ||||
|                     } | ||||
|             }),)) | ||||
|                 }), | ||||
|             expr_parser() | ||||
|                 .then(r.repeated()) | ||||
|                 .map_with_span(|(expr, exprs), span| { | ||||
|                     exprs | ||||
|                         .into_iter() | ||||
|                         .fold(expr, |acc, elem| acc.append_in_sequence(elem)) | ||||
|                 }), | ||||
|         )) | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| pub fn expr_parser() -> impl Parser<Token, expr::UntypedExpr, Error = ParseError> {} | ||||
| 
 | ||||
| pub fn expr_unit_parser() -> impl Parser<Token, expr::UntypedExpr, Error = ParseError> {} | ||||
| 
 | ||||
| pub fn type_parser() -> impl Parser<Token, ast::Annotation, Error = ParseError> { | ||||
|     recursive(|r| { | ||||
|         choice(( | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 rvcas
						rvcas