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