Add middleware PrimaryExpression-struct to make TokenRanges correct
This commit is contained in:
		
							parent
							
								
									20dfdfec9f
								
							
						
					
					
						commit
						454cefafc9
					
				| @ -28,47 +28,50 @@ impl Parse for Type { | ||||
| 
 | ||||
| impl Parse for Expression { | ||||
|     fn parse(mut stream: TokenStream) -> Result<Expression, Error> { | ||||
|         let lhs = parse_primary_expression(&mut stream)?; | ||||
|         let lhs = stream.parse::<PrimaryExpression>()?.0; | ||||
|         parse_binop_rhs(&mut stream, lhs, None) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn parse_primary_expression(stream: &mut TokenStream) -> Result<Expression, Error> { | ||||
|     use ExpressionKind as Kind; | ||||
| #[derive(Debug)] | ||||
| pub struct PrimaryExpression(Expression); | ||||
| 
 | ||||
|     if let Ok(exp) = stream.parse() { | ||||
|         Ok(Expression( | ||||
|             Kind::FunctionCall(Box::new(exp)), | ||||
|             stream.get_range().unwrap(), | ||||
|         )) | ||||
|     } else if let Ok(block) = stream.parse() { | ||||
|         Ok(Expression( | ||||
|             Kind::BlockExpr(Box::new(block)), | ||||
|             stream.get_range().unwrap(), | ||||
|         )) | ||||
|     } else if let Ok(ifexpr) = stream.parse() { | ||||
|         Ok(Expression( | ||||
|             Kind::IfExpr(Box::new(ifexpr)), | ||||
|             stream.get_range().unwrap(), | ||||
|         )) | ||||
|     } else if let Some(token) = stream.next() { | ||||
|         Ok(match &token { | ||||
|             Token::Identifier(v) => { | ||||
|                 Expression(Kind::VariableName(v.clone()), stream.get_range().unwrap()) | ||||
|             } | ||||
|             Token::DecimalValue(v) => Expression( | ||||
|                 Kind::Literal(Literal::I32(v.parse().unwrap())), | ||||
| impl Parse for PrimaryExpression { | ||||
|     fn parse(mut stream: TokenStream) -> Result<Self, Error> { | ||||
|         use ExpressionKind as Kind; | ||||
| 
 | ||||
|         let expr = if let Ok(exp) = stream.parse() { | ||||
|             Expression( | ||||
|                 Kind::FunctionCall(Box::new(exp)), | ||||
|                 stream.get_range().unwrap(), | ||||
|             ), | ||||
|             Token::ParenOpen => { | ||||
|                 let exp = stream.parse()?; | ||||
|                 stream.expect(Token::ParenClose)?; | ||||
|                 exp | ||||
|             ) | ||||
|         } else if let Ok(block) = stream.parse() { | ||||
|             Expression( | ||||
|                 Kind::BlockExpr(Box::new(block)), | ||||
|                 stream.get_range().unwrap(), | ||||
|             ) | ||||
|         } else if let Ok(ifexpr) = stream.parse() { | ||||
|             Expression(Kind::IfExpr(Box::new(ifexpr)), stream.get_range().unwrap()) | ||||
|         } else if let Some(token) = stream.next() { | ||||
|             match &token { | ||||
|                 Token::Identifier(v) => { | ||||
|                     Expression(Kind::VariableName(v.clone()), stream.get_range().unwrap()) | ||||
|                 } | ||||
|                 Token::DecimalValue(v) => Expression( | ||||
|                     Kind::Literal(Literal::I32(v.parse().unwrap())), | ||||
|                     stream.get_range().unwrap(), | ||||
|                 ), | ||||
|                 Token::ParenOpen => { | ||||
|                     let exp = stream.parse()?; | ||||
|                     stream.expect(Token::ParenClose)?; | ||||
|                     exp | ||||
|                 } | ||||
|                 _ => Err(stream.expected_err("identifier, constant or parentheses")?)?, | ||||
|             } | ||||
|             _ => Err(stream.expected_err("identifier, constant or parentheses")?)?, | ||||
|         }) | ||||
|     } else { | ||||
|         Err(stream.expected_err("expression")?)? | ||||
|         } else { | ||||
|             Err(stream.expected_err("expression")?)? | ||||
|         }; | ||||
|         Ok(PrimaryExpression(expr)) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -95,7 +98,7 @@ fn parse_binop_rhs( | ||||
|         stream.parse_if::<BinaryOperator, _>(|b| b.get_precedence() >= expr_precedence) | ||||
|     { | ||||
|         let curr_token_prec = op.get_precedence(); | ||||
|         let mut rhs = parse_primary_expression(stream)?; | ||||
|         let mut rhs = stream.parse::<PrimaryExpression>()?.0; | ||||
| 
 | ||||
|         if let Ok(next_op) = stream.parse_peek::<BinaryOperator>() { | ||||
|             let next_prec = next_op.get_precedence(); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user