Get initial AST-UIR translation sort of working
This commit is contained in:
parent
df7e8b9d74
commit
4480a1973a
|
@ -148,6 +148,7 @@ enum Location {
|
||||||
/// Converts a program's abstract syntax tree into untyped IR code.
|
/// Converts a program's abstract syntax tree into untyped IR code.
|
||||||
pub fn ast_to_untyped_ir(ast: SyntaxTree) -> Program {
|
pub fn ast_to_untyped_ir(ast: SyntaxTree) -> Program {
|
||||||
let mut defs = vec![];
|
let mut defs = vec![];
|
||||||
|
let mut counter = 0;
|
||||||
for stmt in ast.0.into_iter() {
|
for stmt in ast.0.into_iter() {
|
||||||
match stmt {
|
match stmt {
|
||||||
syntax::Statement::TypeDefinition {
|
syntax::Statement::TypeDefinition {
|
||||||
|
@ -169,7 +170,14 @@ pub fn ast_to_untyped_ir(ast: SyntaxTree) -> Program {
|
||||||
arguments,
|
arguments,
|
||||||
definition,
|
definition,
|
||||||
}) => {
|
}) => {
|
||||||
todo!();
|
defs.push((
|
||||||
|
name,
|
||||||
|
convert_fn(
|
||||||
|
&mut counter,
|
||||||
|
arguments,
|
||||||
|
definition.expect("Empty functions unimplemented"),
|
||||||
|
),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
syntax::Statement::ClassMember(syntax::ClassMember::TypeAlias {
|
syntax::Statement::ClassMember(syntax::ClassMember::TypeAlias {
|
||||||
left: _,
|
left: _,
|
||||||
|
@ -203,14 +211,21 @@ fn convert_fn(
|
||||||
let arg_loc = temporary(counter);
|
let arg_loc = temporary(counter);
|
||||||
vec![
|
vec![
|
||||||
Instruction::DefLambda {
|
Instruction::DefLambda {
|
||||||
target: lambda_loc,
|
target: lambda_loc.clone(),
|
||||||
param: arg_loc,
|
param: arg_loc.clone(),
|
||||||
body: todo!(),
|
body: bind_pattern(counter, first, &arg_loc)
|
||||||
|
.into_iter()
|
||||||
|
.chain(convert_fn(counter, arguments, definition))
|
||||||
|
.collect(),
|
||||||
},
|
},
|
||||||
Instruction::Return { target: lambda_loc },
|
Instruction::Return { target: lambda_loc },
|
||||||
]
|
]
|
||||||
} else {
|
} else {
|
||||||
todo!()
|
let ret_loc = temporary(counter);
|
||||||
|
eval_expr(counter, definition, &ret_loc)
|
||||||
|
.into_iter()
|
||||||
|
.chain(std::iter::once(Instruction::Return { target: ret_loc }))
|
||||||
|
.collect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +302,19 @@ fn eval_expr(counter: &mut u64, e: syntax::Expr, l: &Location) -> Vec<Instructio
|
||||||
syntax::Expr::Lambda { arguments, result } => todo!(),
|
syntax::Expr::Lambda { arguments, result } => todo!(),
|
||||||
syntax::Expr::DotSubscript { value, subscript } => todo!(),
|
syntax::Expr::DotSubscript { value, subscript } => todo!(),
|
||||||
syntax::Expr::BracketSubscript { value, subscript } => todo!(),
|
syntax::Expr::BracketSubscript { value, subscript } => todo!(),
|
||||||
syntax::Expr::Tuple(_) => todo!(),
|
syntax::Expr::Tuple(elems) => {
|
||||||
|
let elem_locs: Vec<_> = elems.iter().map(|_| temporary(counter)).collect();
|
||||||
|
elems
|
||||||
|
.into_iter()
|
||||||
|
.zip(elem_locs.iter())
|
||||||
|
.map(|(elem, elem_loc)| eval_expr(counter, elem, elem_loc))
|
||||||
|
.flatten()
|
||||||
|
.chain(std::iter::once(Instruction::Collect {
|
||||||
|
target: l.to_owned(),
|
||||||
|
source: elem_locs.clone(),
|
||||||
|
}))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
syntax::Expr::VariableReference(_) => todo!(),
|
syntax::Expr::VariableReference(_) => todo!(),
|
||||||
syntax::Expr::Literal(_) => todo!(),
|
syntax::Expr::Literal(_) => todo!(),
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ use std::{error::Error, fmt::Display, process::exit, str::FromStr};
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use drimc_rs::{
|
use drimc_rs::{
|
||||||
parser::{parser, ParserError, ParserMeta},
|
parser::{parser, ParserError, ParserMeta},
|
||||||
typeck::typeck,
|
typeck::typeck, ir_untyped::ast_to_untyped_ir,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Optimization levels.
|
/// Optimization levels.
|
||||||
|
@ -254,9 +254,9 @@ fn main() {
|
||||||
let source = std::fs::read_to_string(&args.source_file)?;
|
let source = std::fs::read_to_string(&args.source_file)?;
|
||||||
let meta = ParserMeta::default();
|
let meta = ParserMeta::default();
|
||||||
let ast = chumsky::Parser::parse(&parser(&meta), source).map_err(ParserError)?;
|
let ast = chumsky::Parser::parse(&parser(&meta), source).map_err(ParserError)?;
|
||||||
let ast = typeck(ast)?;
|
let untyped_ir = ast_to_untyped_ir(ast);
|
||||||
|
|
||||||
println!("{ast:?}");
|
println!("{untyped_ir:#?}");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
3
drimc_rs/uir_test.drim
Normal file
3
drimc_rs/uir_test.drim
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
// IR Test
|
||||||
|
|
||||||
|
def nul (a, b) = ();
|
Loading…
Reference in a new issue