From ca26d0ea40b2b70fc81cca1becfe8d1d5d778fe6 Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Sat, 7 Oct 2023 11:25:49 +0200 Subject: [PATCH] Fix the parser, make the function name optional. --- src/syntax/ast.rs | 2 +- src/syntax/parser.lalrpop | 9 ++++++++- src/syntax/pretty.rs | 6 +++++- src/syntax/validate.rs | 4 +++- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs index 4749acd..b97851f 100644 --- a/src/syntax/ast.rs +++ b/src/syntax/ast.rs @@ -27,7 +27,7 @@ pub struct Program { #[derive(Clone, Debug, PartialEq)] pub enum TopLevel { Statement(Statement), - Function(Name, Vec, Expression), + Function(Option, Vec, Expression), } /// A Name. diff --git a/src/syntax/parser.lalrpop b/src/syntax/parser.lalrpop index 2a0d882..d433571 100644 --- a/src/syntax/parser.lalrpop +++ b/src/syntax/parser.lalrpop @@ -76,7 +76,14 @@ pub TopLevel: TopLevel = { } Function: TopLevel = { - "function" "(" Arguments OptionalComma ")" Expression => unimplemented!(), + "function" "(" OptionalComma ")" => + TopLevel::Function(opt_name, args, exp), +} + +OptionalName: Option = { + "> => + Some(Name::new(v, Location::new(file_idx, name_start..name_end))), + => None, } Arguments: Vec = { diff --git a/src/syntax/pretty.rs b/src/syntax/pretty.rs index b0b91cb..c52a827 100644 --- a/src/syntax/pretty.rs +++ b/src/syntax/pretty.rs @@ -33,7 +33,11 @@ where TopLevel::Function(name, arg_names, body) => allocator .text("function") .append(allocator.space()) - .append(allocator.text(name.to_string())) + .append( + name.as_ref() + .map(|x| allocator.text(x.to_string())) + .unwrap_or_else(|| allocator.nil()), + ) .append( allocator .intersperse( diff --git a/src/syntax/validate.rs b/src/syntax/validate.rs index 58d25e8..f175eed 100644 --- a/src/syntax/validate.rs +++ b/src/syntax/validate.rs @@ -117,7 +117,9 @@ impl TopLevel { match self { TopLevel::Function(name, arguments, body) => { bound_variables.new_scope(); - bound_variables.insert(name.name.clone(), name.location.clone()); + if let Some(name) = name { + bound_variables.insert(name.name.clone(), name.location.clone()); + } for arg in arguments.iter() { bound_variables.insert(arg.name.clone(), arg.location.clone()); }