From ac564e6e41647c405a8ca3b66ca9bd3917cfc033 Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Wed, 6 Mar 2024 09:50:42 -0800 Subject: [PATCH] Add support for syntax blocks. --- examples/basic/function0001.ngr | 2 +- examples/basic/function0002.ngr | 2 +- examples/basic/function0003.ngr | 11 +++++++++++ examples/basic/generated0001.ngr | 2 +- examples/basic/generated0003.ngr | 2 +- src/syntax/ast.rs | 5 +++++ src/syntax/eval.rs | 2 ++ src/syntax/parser.lalrpop | 6 +++++- src/syntax/pretty.rs | 1 + src/syntax/validate.rs | 7 +++++++ src/type_infer/convert.rs | 4 ++++ 11 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 examples/basic/function0003.ngr diff --git a/examples/basic/function0001.ngr b/examples/basic/function0001.ngr index 6cdb5c3..ebd955d 100644 --- a/examples/basic/function0001.ngr +++ b/examples/basic/function0001.ngr @@ -1,5 +1,5 @@ x = 1; -function add_x(y) x + y +function add_x(y) x + y; a = 3; print x; result = add_x(a); diff --git a/examples/basic/function0002.ngr b/examples/basic/function0002.ngr index 53a0bac..2ff6935 100644 --- a/examples/basic/function0002.ngr +++ b/examples/basic/function0002.ngr @@ -1,5 +1,5 @@ x = 1; -function add_x(y) x + y +function add_x(y) x + y; a = 3; function add_x_twice(y) add_x(y) + x print x; diff --git a/examples/basic/function0003.ngr b/examples/basic/function0003.ngr new file mode 100644 index 0000000..0b55b08 --- /dev/null +++ b/examples/basic/function0003.ngr @@ -0,0 +1,11 @@ +x = 1u64; +function mean_x(y) { + base = x + y; + result = base / 2; + result; +}; +a = 3; +mean_x_and_a = mean_x(a); +mean_x_and_9 = mean_x(9); +print mean_x_and_a; +print mean_x_and_9; \ No newline at end of file diff --git a/examples/basic/generated0001.ngr b/examples/basic/generated0001.ngr index ae46375..3f4ffad 100644 --- a/examples/basic/generated0001.ngr +++ b/examples/basic/generated0001.ngr @@ -1,3 +1,3 @@ x = 4u64; -function f(y) (x + y) +function f(y) (x + y); print x; \ No newline at end of file diff --git a/examples/basic/generated0003.ngr b/examples/basic/generated0003.ngr index 616bba6..c43d413 100644 --- a/examples/basic/generated0003.ngr +++ b/examples/basic/generated0003.ngr @@ -1,4 +1,4 @@ n = (49u8 + 155u8); q = n; -function u (b) n + b +function u (b) n + b; v = n; \ No newline at end of file diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs index 89928e8..5a947fe 100644 --- a/src/syntax/ast.rs +++ b/src/syntax/ast.rs @@ -95,6 +95,7 @@ impl fmt::Display for Name { pub enum Statement { Binding(Location, Name, Expression), Print(Location, Name), + Expression(Expression), } impl PartialEq for Statement { @@ -108,6 +109,10 @@ impl PartialEq for Statement { Statement::Print(_, name2) => name1 == name2, _ => false, }, + Statement::Expression(e1) => match other { + Statement::Expression(e2) => e1 == e2, + _ => false, + }, } } } diff --git a/src/syntax/eval.rs b/src/syntax/eval.rs index e84a0b9..98f482c 100644 --- a/src/syntax/eval.rs +++ b/src/syntax/eval.rs @@ -69,6 +69,8 @@ impl Statement { stdout.push_str(&line); Ok(Value::Void) } + + Statement::Expression(e) => e.eval(stdout, env), } } } diff --git a/src/syntax/parser.lalrpop b/src/syntax/parser.lalrpop index cb5d37c..9798ed1 100644 --- a/src/syntax/parser.lalrpop +++ b/src/syntax/parser.lalrpop @@ -77,7 +77,7 @@ pub TopLevel: TopLevel = { } Function: TopLevel = { - "function" "(" OptionalComma ")" => + "function" "(" OptionalComma ")" ";" => TopLevel::Function(opt_name, args, exp), } @@ -154,6 +154,10 @@ Statement: Statement = { Location::new(file_idx, ls..le), Name::new(v, Location::new(file_idx, name_start..name_end)), ), + + // A statement can just be an expression. + ";" => + Statement::Expression(e), } // Expressions! Expressions are a little fiddly, because we're going to diff --git a/src/syntax/pretty.rs b/src/syntax/pretty.rs index 3186b63..740021e 100644 --- a/src/syntax/pretty.rs +++ b/src/syntax/pretty.rs @@ -56,6 +56,7 @@ impl Statement { .text("print") .append(allocator.space()) .append(allocator.text(var.to_string())), + Statement::Expression(e) => e.pretty(allocator), } } } diff --git a/src/syntax/validate.rs b/src/syntax/validate.rs index 9c89885..de7dbee 100644 --- a/src/syntax/validate.rs +++ b/src/syntax/validate.rs @@ -177,6 +177,13 @@ impl Statement { Statement::Print(loc, var) => { errors.push(Error::UnboundVariable(loc.clone(), var.to_string())) } + + Statement::Expression(e) => { + let (mut exp_errors, mut exp_warnings) = e.validate(bound_variables); + + errors.append(&mut exp_errors); + warnings.append(&mut exp_warnings); + } } (errors, warnings) diff --git a/src/type_infer/convert.rs b/src/type_infer/convert.rs index 0d5c2a8..01b6955 100644 --- a/src/type_infer/convert.rs +++ b/src/type_infer/convert.rs @@ -163,6 +163,10 @@ fn convert_statement( ir::Expression::Bind(loc, final_name, ty, Box::new(expr)) } + + syntax::Statement::Expression(e) => { + convert_expression(e, constraint_db, renames, bindings).0 + } } }