diff --git a/examples/functions.e0 b/examples/functions.e0 new file mode 100644 index 0000000..f1caf58 --- /dev/null +++ b/examples/functions.e0 @@ -0,0 +1,7 @@ +fn compute() -> int { + return 42; +} + +fn main() -> int { + return compute(); +} diff --git a/src/ast/llvm.rs b/src/ast/llvm.rs index a30387c..cb43ed4 100644 --- a/src/ast/llvm.rs +++ b/src/ast/llvm.rs @@ -72,6 +72,13 @@ impl Expr { } } } + + ExprKind::Call(func, args) => { + let func_llvm = func.into_llvm(); + builder.build_call(func_llvm); + + todo!() + } } } } diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 15260bd..6e3d69b 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -44,6 +44,7 @@ pub enum ExprKind { Int(i64), Var(String), BinOp(Box>, Op, Box>), + Call(Box>, Vec>), } #[derive(Copy, Clone, Debug)] diff --git a/src/ast/typed.rs b/src/ast/typed.rs index fff96ab..9dce3e9 100644 --- a/src/ast/typed.rs +++ b/src/ast/typed.rs @@ -210,6 +210,25 @@ fn annotate_expr(ctx: &mut AnnotationContext, expr: &Expr<()>) -> Expr { ty: output, } } + + ExprKind::Call(func, args) => { + let func = annotate_expr(ctx, func); + let mut args_annot = Vec::new(); + let ret_ty = ctx.type_var(); + + for arg in args { + let arg_annot = annotate_expr(ctx, arg); + args_annot.push(arg_annot); + } + + // ctx.constrain(); + // TODO: + + Expr { + kind: ExprKind::Call(Box::new(func), args_annot), + ty: ret_ty, + } + } } } @@ -328,6 +347,14 @@ fn substitute_in_expr_kind( let right = substitute_in_expr(assignments, *right)?; ExprKind::BinOp(Box::new(left), op, Box::new(right)) } + ExprKind::Call(func, args) => { + let func = substitute_in_expr(assignments, *func)?; + let args = args + .into_iter() + .map(|arg| substitute_in_expr(assignments, arg)) + .collect::>()?; + ExprKind::Call(Box::new(func), args) + } }) } diff --git a/src/parser.lalrpop b/src/parser.lalrpop index 8d43793..74c1877 100644 --- a/src/parser.lalrpop +++ b/src/parser.lalrpop @@ -42,6 +42,10 @@ Expr: Expr<()> = { #[precedence(level = "0")] Ident => Expr { kind: ExprKind::Var(<>), ty: () }, + #[precedence(level = "2")] + "(" > ")" => + Expr { kind: ExprKind::Call(Box::new(expr), args), ty: () }, + #[precedence(level = "13")] #[assoc(side = "none")] => Expr { @@ -60,3 +64,17 @@ Type: Type = { }; Ident: String = r"([A-Za-z][A-Za-z0-9_]*)|(_[A-Za-z0-9_]+)" => <>.to_string(); + +Punct: Vec = { + P => vec![], + )?> => { + match rest { + Some(rest) => { + let (_, mut vec) = rest; + vec.insert(0, first); + vec + } + None => vec![first], + } + }, +};