1
0
Fork 0

Add function calls to IR Generator

This commit is contained in:
Vili Sinervä 2025-02-05 23:28:00 +02:00
parent 2cf26ec39d
commit b3a8188dfe
No known key found for this signature in database
GPG key ID: DF8FEAF54EFAC996
3 changed files with 30 additions and 3 deletions

View file

@ -220,7 +220,31 @@ fn visit_ast_node<'source>(
symbols.get("unit").clone()
}
FunCall(_, _) => todo!(),
FunCall(name, expressions) => {
let fn_var = symbols.get(name).clone();
let Type::Func(_, result_type) = types.get(&fn_var).unwrap().clone() else {
panic!("Function call does not have entry in types table!");
};
let mut args = Vec::new();
for expression in expressions {
args.push(visit_ast_node(
expression,
types,
symbols,
instructions,
labels,
));
}
let result_var = add_var(&result_type, types);
instructions.push(IrInstruction::new(
ast.loc,
Call(fn_var, args, result_var.clone()),
));
result_var
}
Block(expressions) => {
let mut result_var = symbols.get("unit").clone();
for expression in expressions {

View file

@ -49,6 +49,9 @@ impl<'source> SymTab<'source, Type> {
pub fn new_type_table() -> SymTab<'source, Type> {
use Type::*;
let globals = HashMap::from([
("print_bool", Func(vec![Bool], Box::new(Unit))),
("print_int", Func(vec![Int], Box::new(Unit))),
("read_int", Func(vec![], Box::new(Int))),
("+", Func(vec![Int, Int], Box::new(Int))),
("*", Func(vec![Int, Int], Box::new(Int))),
("-", Func(vec![Int, Int], Box::new(Int))),

View file

@ -122,8 +122,8 @@ fn get_type<'source>(ast: &mut AstNode<'source>, symbols: &mut SymTab<'source, T
}
FunCall(name, args) => {
let mut arg_types = Vec::new();
for mut arg in args {
arg_types.push(type_check(&mut arg, symbols));
for arg in args {
arg_types.push(type_check(arg, symbols));
}
let Type::Func(sig_arg_types, sig_ret_type) = symbols.get(name) else {