Add loops ast -> mir
This commit is contained in:
		
							parent
							
								
									ef4964ed86
								
							
						
					
					
						commit
						1a5e3ef1d9
					
				| @ -178,7 +178,7 @@ pub enum BlockLevelStatement { | |||||||
|     }, |     }, | ||||||
|     Expression(Expression), |     Expression(Expression), | ||||||
|     Return(ReturnType, Expression), |     Return(ReturnType, Expression), | ||||||
|     ForLoop(String, Expression, Expression, Block), |     ForLoop(String, TokenRange, Expression, Expression, Block), | ||||||
|     WhileLoop(Expression, Block), |     WhileLoop(Expression, Block), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -669,7 +669,7 @@ impl Parse for BlockLevelStatement { | |||||||
|             } |             } | ||||||
|             Some(Token::For) => { |             Some(Token::For) => { | ||||||
|                 let for_stmt = stream.parse::<ForStatement>()?; |                 let for_stmt = stream.parse::<ForStatement>()?; | ||||||
|                 Stmt::ForLoop(for_stmt.0, for_stmt.1, for_stmt.2, for_stmt.3) |                 Stmt::ForLoop(for_stmt.0, for_stmt.1, for_stmt.2, for_stmt.3, for_stmt.4) | ||||||
|             } |             } | ||||||
|             Some(Token::While) => { |             Some(Token::While) => { | ||||||
|                 let while_stmt = stream.parse::<WhileStatement>()?; |                 let while_stmt = stream.parse::<WhileStatement>()?; | ||||||
| @ -692,7 +692,7 @@ impl Parse for BlockLevelStatement { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct ForStatement(String, Expression, Expression, Block); | pub struct ForStatement(String, TokenRange, Expression, Expression, Block); | ||||||
| 
 | 
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct WhileStatement(Expression, Block); | pub struct WhileStatement(Expression, Block); | ||||||
| @ -703,12 +703,13 @@ impl Parse for ForStatement { | |||||||
|         let Some(Token::Identifier(idx)) = stream.next() else { |         let Some(Token::Identifier(idx)) = stream.next() else { | ||||||
|             return Err(stream.expected_err("loop counter")?); |             return Err(stream.expected_err("loop counter")?); | ||||||
|         }; |         }; | ||||||
|  |         let start_range = stream.get_range().unwrap(); | ||||||
|         stream.expect(Token::In)?; |         stream.expect(Token::In)?; | ||||||
|         let start = stream.parse()?; |         let start = stream.parse()?; | ||||||
|         stream.expect(Token::To)?; |         stream.expect(Token::To)?; | ||||||
|         let end = stream.parse()?; |         let end = stream.parse()?; | ||||||
| 
 | 
 | ||||||
|         Ok(ForStatement(idx, start, end, stream.parse()?)) |         Ok(ForStatement(idx, start_range, start, end, stream.parse()?)) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,8 +3,8 @@ use std::path::PathBuf; | |||||||
| use crate::{ | use crate::{ | ||||||
|     ast::{self}, |     ast::{self}, | ||||||
|     mir::{ |     mir::{ | ||||||
|         self, CustomTypeKey, ModuleMap, NamedVariableRef, SourceModuleId, StmtKind, StructField, |         self, CustomTypeKey, ForStatement, ModuleMap, NamedVariableRef, SourceModuleId, StmtKind, | ||||||
|         StructType, |         StructField, StructType, WhileStatement, | ||||||
|     }, |     }, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -148,10 +148,28 @@ impl ast::Block { | |||||||
|                 ast::BlockLevelStatement::Return(_, e) => { |                 ast::BlockLevelStatement::Return(_, e) => { | ||||||
|                     (StmtKind::Expression(e.process(module_id)), e.1) |                     (StmtKind::Expression(e.process(module_id)), e.1) | ||||||
|                 } |                 } | ||||||
|                 ast::BlockLevelStatement::ForLoop(counter, start, end, block) => { |                 ast::BlockLevelStatement::ForLoop(counter, counter_range, start, end, block) => ( | ||||||
|                     todo!() |                     StmtKind::For(ForStatement { | ||||||
|                 } |                         counter: NamedVariableRef( | ||||||
|                 ast::BlockLevelStatement::WhileLoop(expression, block) => todo!(), |                             mir::TypeKind::Vague(mir::VagueType::Unknown), | ||||||
|  |                             counter.clone(), | ||||||
|  |                             counter_range.as_meta(module_id), | ||||||
|  |                         ), | ||||||
|  |                         start: start.process(module_id), | ||||||
|  |                         end: end.process(module_id), | ||||||
|  |                         block: block.into_mir(module_id), | ||||||
|  |                         meta: self.2.as_meta(module_id), | ||||||
|  |                     }), | ||||||
|  |                     self.2, | ||||||
|  |                 ), | ||||||
|  |                 ast::BlockLevelStatement::WhileLoop(expression, block) => ( | ||||||
|  |                     StmtKind::While(WhileStatement { | ||||||
|  |                         condition: expression.process(module_id), | ||||||
|  |                         block: block.into_mir(module_id), | ||||||
|  |                         meta: self.2.as_meta(module_id), | ||||||
|  |                     }), | ||||||
|  |                     self.2, | ||||||
|  |                 ), | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             mir_statements.push(mir::Statement(kind, range.as_meta(module_id))); |             mir_statements.push(mir::Statement(kind, range.as_meta(module_id))); | ||||||
|  | |||||||
| @ -598,6 +598,8 @@ impl mir::Statement { | |||||||
|             } |             } | ||||||
|             mir::StmtKind::Import(_) => todo!(), |             mir::StmtKind::Import(_) => todo!(), | ||||||
|             mir::StmtKind::Expression(expression) => expression.codegen(scope, state), |             mir::StmtKind::Expression(expression) => expression.codegen(scope, state), | ||||||
|  |             mir::StmtKind::For(for_statement) => todo!(), | ||||||
|  |             mir::StmtKind::While(while_statement) => todo!(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -147,7 +147,7 @@ impl Display for Statement { | |||||||
| impl Display for StmtKind { | impl Display for StmtKind { | ||||||
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||||
|         match self { |         match self { | ||||||
|             Self::Let(var, mutable, block) => { |             StmtKind::Let(var, mutable, block) => { | ||||||
|                 write!( |                 write!( | ||||||
|                     f, |                     f, | ||||||
|                     "let{} {} = {}", |                     "let{} {} = {}", | ||||||
| @ -156,9 +156,26 @@ impl Display for StmtKind { | |||||||
|                     block |                     block | ||||||
|                 ) |                 ) | ||||||
|             } |             } | ||||||
|             Self::Set(var, expr) => write!(f, "{} = {}", var, expr), |             StmtKind::Set(var, expr) => write!(f, "{} = {}", var, expr), | ||||||
|             Self::Import(n) => write!(f, "import {}", n), |             StmtKind::Import(n) => write!(f, "import {}", n), | ||||||
|             Self::Expression(exp) => Display::fmt(exp, f), |             StmtKind::Expression(exp) => Display::fmt(exp, f), | ||||||
|  |             StmtKind::For(for_statement) => { | ||||||
|  |                 write!( | ||||||
|  |                     f, | ||||||
|  |                     "for {} in {} to {} {}", | ||||||
|  |                     for_statement.counter, | ||||||
|  |                     for_statement.start, | ||||||
|  |                     for_statement.end, | ||||||
|  |                     for_statement.block | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|  |             StmtKind::While(while_statement) => { | ||||||
|  |                 write!( | ||||||
|  |                     f, | ||||||
|  |                     "while {} {}", | ||||||
|  |                     while_statement.condition, while_statement.block, | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ pub enum ReturnTypeOther { | |||||||
|     NoBlockReturn(Metadata), |     NoBlockReturn(Metadata), | ||||||
|     IndexingNonArray(Metadata), |     IndexingNonArray(Metadata), | ||||||
|     DerefNonBorrow(Metadata), |     DerefNonBorrow(Metadata), | ||||||
|  |     Loop, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl TypeKind { | impl TypeKind { | ||||||
| @ -374,6 +375,8 @@ impl Statement { | |||||||
|             ), |             ), | ||||||
|             Import(_) => todo!(), |             Import(_) => todo!(), | ||||||
|             Expression(expression) => expression.return_type(refs, mod_id), |             Expression(expression) => expression.return_type(refs, mod_id), | ||||||
|  |             For(_) => Err(ReturnTypeOther::Loop), | ||||||
|  |             While(_) => Err(ReturnTypeOther::Loop), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -383,6 +386,8 @@ impl Statement { | |||||||
|             StmtKind::Set(_, _) => None, |             StmtKind::Set(_, _) => None, | ||||||
|             StmtKind::Import(_) => None, |             StmtKind::Import(_) => None, | ||||||
|             StmtKind::Expression(expr) => expr.backing_var(), |             StmtKind::Expression(expr) => expr.backing_var(), | ||||||
|  |             StmtKind::For(_) => None, | ||||||
|  |             StmtKind::While(_) => None, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -338,6 +338,24 @@ pub enum StmtKind { | |||||||
|     Set(Expression, Expression), |     Set(Expression, Expression), | ||||||
|     Import(Import), |     Import(Import), | ||||||
|     Expression(Expression), |     Expression(Expression), | ||||||
|  |     For(ForStatement), | ||||||
|  |     While(WhileStatement), | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[derive(Debug)] | ||||||
|  | pub struct ForStatement { | ||||||
|  |     pub counter: NamedVariableRef, | ||||||
|  |     pub start: Expression, | ||||||
|  |     pub end: Expression, | ||||||
|  |     pub block: Block, | ||||||
|  |     pub meta: Metadata, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[derive(Debug)] | ||||||
|  | pub struct WhileStatement { | ||||||
|  |     pub condition: Expression, | ||||||
|  |     pub block: Block, | ||||||
|  |     pub meta: Metadata, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
|  | |||||||
| @ -390,10 +390,19 @@ impl Statement { | |||||||
|             StmtKind::Set(_, expression) => { |             StmtKind::Set(_, expression) => { | ||||||
|                 expression.pass(pass, state, scope, mod_id)?; |                 expression.pass(pass, state, scope, mod_id)?; | ||||||
|             } |             } | ||||||
|             StmtKind::Import(_) => {} // Never exists at this stage
 |             StmtKind::Import(_) => {} | ||||||
|             StmtKind::Expression(expression) => { |             StmtKind::Expression(expression) => { | ||||||
|                 expression.pass(pass, state, scope, mod_id)?; |                 expression.pass(pass, state, scope, mod_id)?; | ||||||
|             } |             } | ||||||
|  |             StmtKind::For(for_statement) => { | ||||||
|  |                 for_statement.start.pass(pass, state, scope, mod_id); | ||||||
|  |                 for_statement.end.pass(pass, state, scope, mod_id); | ||||||
|  |                 for_statement.block.pass(pass, state, scope, mod_id); | ||||||
|  |             } | ||||||
|  |             StmtKind::While(while_statement) => { | ||||||
|  |                 while_statement.condition.pass(pass, state, scope, mod_id); | ||||||
|  |                 while_statement.block.pass(pass, state, scope, mod_id); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         pass.stmt(self, PassState::from(state, scope, Some(mod_id)))?; |         pass.stmt(self, PassState::from(state, scope, Some(mod_id)))?; | ||||||
| @ -412,8 +421,10 @@ impl Statement { | |||||||
|                     .ok(); |                     .ok(); | ||||||
|             } |             } | ||||||
|             StmtKind::Set(_, _) => {} |             StmtKind::Set(_, _) => {} | ||||||
|             StmtKind::Import(_) => {} // Never exists at this stage
 |             StmtKind::Import(_) => {} | ||||||
|             StmtKind::Expression(_) => {} |             StmtKind::Expression(_) => {} | ||||||
|  |             StmtKind::For(_) => {} | ||||||
|  |             StmtKind::While(_) => {} | ||||||
|         }; |         }; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -323,7 +323,7 @@ impl Block { | |||||||
| 
 | 
 | ||||||
|                     None |                     None | ||||||
|                 } |                 } | ||||||
|                 StmtKind::Import(_) => todo!(), // TODO
 |                 StmtKind::Import(_) => todo!(), | ||||||
|                 StmtKind::Expression(expression) => { |                 StmtKind::Expression(expression) => { | ||||||
|                     let res = expression.typecheck(&mut state, &typerefs, None); |                     let res = expression.typecheck(&mut state, &typerefs, None); | ||||||
|                     state.or_else(res, TypeKind::Void, expression.1); |                     state.or_else(res, TypeKind::Void, expression.1); | ||||||
| @ -335,6 +335,8 @@ impl Block { | |||||||
|                         None |                         None | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |                 StmtKind::For(for_statement) => todo!(), | ||||||
|  |                 StmtKind::While(while_statement) => todo!(), | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             if let Some((ReturnKind::Hard, _)) = ret { |             if let Some((ReturnKind::Hard, _)) = ret { | ||||||
|  | |||||||
| @ -126,6 +126,8 @@ impl Block { | |||||||
|                     let expr_res = expr.infer_types(&mut state, &inner_refs); |                     let expr_res = expr.infer_types(&mut state, &inner_refs); | ||||||
|                     state.ok(expr_res, expr.1); |                     state.ok(expr_res, expr.1); | ||||||
|                 } |                 } | ||||||
|  |                 StmtKind::For(for_statement) => todo!(), | ||||||
|  |                 StmtKind::While(while_statement) => todo!(), | ||||||
|             }; |             }; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user