feat: finish expr_seq_parser
This commit is contained in:
		
							parent
							
								
									3bc507c9e8
								
							
						
					
					
						commit
						59a9bac9b5
					
				|  | @ -268,3 +268,57 @@ pub enum UntypedExpr { | ||||||
|         value: Box<Self>, |         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> { | pub fn expr_seq_parser() -> impl Parser<Token, expr::UntypedExpr, Error = ParseError> { | ||||||
|     recursive(|r| { |     recursive(|r| { | ||||||
|         choice((just(Token::Try) |         choice(( | ||||||
|  |             just(Token::Try) | ||||||
|                 .ignore_then(pattern_parser()) |                 .ignore_then(pattern_parser()) | ||||||
|                 .then(just(Token::Colon).ignore_then(type_parser()).or_not()) |                 .then(just(Token::Colon).ignore_then(type_parser()).or_not()) | ||||||
|                 .then_ignore(just(Token::Equal)) |                 .then_ignore(just(Token::Equal)) | ||||||
|                 .then(expr_parser()) |                 .then(expr_parser()) | ||||||
|             .then(r) |                 .then(r.clone()) | ||||||
|                 .map_with_span(|(((pattern, annotation), value), then_), span| { |                 .map_with_span(|(((pattern, annotation), value), then_), span| { | ||||||
|                     expr::UntypedExpr::Try { |                     expr::UntypedExpr::Try { | ||||||
|                         location: span, |                         location: span, | ||||||
|  | @ -241,12 +242,22 @@ pub fn expr_seq_parser() -> impl Parser<Token, expr::UntypedExpr, Error = ParseE | ||||||
|                         then: Box::new(then_), |                         then: Box::new(then_), | ||||||
|                         annotation, |                         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_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> { | pub fn type_parser() -> impl Parser<Token, ast::Annotation, Error = ParseError> { | ||||||
|     recursive(|r| { |     recursive(|r| { | ||||||
|         choice(( |         choice(( | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 rvcas
						rvcas