Add parsing of casting
This commit is contained in:
		
							parent
							
								
									b2e9849504
								
							
						
					
					
						commit
						c4ab4ac0b3
					
				| @ -66,6 +66,7 @@ pub enum ExpressionKind { | ||||
|     IfExpr(Box<IfExpression>), | ||||
|     StructExpression(StructExpression), | ||||
|     UnaryOperation(UnaryOperator, Box<Expression>), | ||||
|     CastTo(Box<Expression>, Type), | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
|  | ||||
| @ -233,10 +233,27 @@ impl Parse for PrimaryExpression { | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         while let Ok(as_cast) = stream.parse::<AsCast>() { | ||||
|             expr = Expression( | ||||
|                 ExpressionKind::CastTo(Box::new(expr), as_cast.0), | ||||
|                 stream.get_range().unwrap(), | ||||
|             ); | ||||
|         } | ||||
| 
 | ||||
|         Ok(PrimaryExpression(expr)) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct AsCast(Type); | ||||
| 
 | ||||
| impl Parse for AsCast { | ||||
|     fn parse(mut stream: TokenStream) -> Result<Self, Error> { | ||||
|         stream.expect(Token::AsKeyword)?; | ||||
|         Ok(AsCast(stream.parse()?)) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// This algorithm seems somewhat like magic to me. I understand it if I read
 | ||||
| /// carefully, but it is difficult to read every single time.
 | ||||
| ///
 | ||||
|  | ||||
| @ -256,6 +256,7 @@ impl ast::Expression { | ||||
|                     Box::new(expr.process(module_id)), | ||||
|                 ), | ||||
|             }, | ||||
|             ast::ExpressionKind::CastTo(expression, _) => todo!(), | ||||
|         }; | ||||
| 
 | ||||
|         mir::Expression(kind, self.1.as_meta(module_id)) | ||||
|  | ||||
| @ -24,6 +24,8 @@ pub enum Token { | ||||
|     FnKeyword, | ||||
|     /// `pub`
 | ||||
|     PubKeyword, | ||||
|     /// `as`
 | ||||
|     AsKeyword, | ||||
|     /// `->`
 | ||||
|     Arrow, | ||||
|     /// `if`
 | ||||
| @ -124,6 +126,7 @@ impl ToString for Token { | ||||
|             Token::False => String::from("false"), | ||||
|             Token::Extern => String::from("extern"), | ||||
|             Token::Struct => String::from("struct"), | ||||
|             Token::AsKeyword => String::from("as"), | ||||
|             Token::Semi => String::from(';'), | ||||
|             Token::Equals => String::from('='), | ||||
|             Token::Colon => String::from(':'), | ||||
| @ -286,6 +289,7 @@ pub fn tokenize<T: Into<String>>(to_tokenize: T) -> Result<Vec<FullToken>, Error | ||||
|                     "extern" => Token::Extern, | ||||
|                     "pub" => Token::PubKeyword, | ||||
|                     "struct" => Token::Struct, | ||||
|                     "as" => Token::AsKeyword, | ||||
|                     _ => Token::Identifier(value), | ||||
|                 }; | ||||
|                 variant | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user