diff --git a/src/parser.rs b/src/parser.rs index f7390e3..7f4a722 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -9,6 +9,7 @@ mod basic; mod expr; +mod func_defs; mod lit; mod prefix; mod suffix; diff --git a/src/parser/basic.rs b/src/parser/basic.rs index 570cc83..f5e732b 100644 --- a/src/parser/basic.rs +++ b/src/parser/basic.rs @@ -46,7 +46,7 @@ pub fn ident() -> BoxedParser<'static, char, Ident, Error> { .try_map(|name, span| { if matches!( &name as &str, - "nil" | "true" | "false" | "local" | "not" | "and" | "or" + "nil" | "true" | "false" | "local" | "function" | "not" | "and" | "or" ) { Err(Simple::custom(span, "identifier uses reserved name")) } else { diff --git a/src/parser/expr.rs b/src/parser/expr.rs index b129aa0..c307086 100644 --- a/src/parser/expr.rs +++ b/src/parser/expr.rs @@ -6,6 +6,7 @@ use crate::ast::{BinOp, Expr}; use crate::span::HasSpan; use super::basic::{space, Error}; +use super::func_defs::func_def; use super::lit::lit; use super::prefix::prefixed; use super::suffix::suffixed; @@ -36,9 +37,16 @@ fn atom( let var = var(expr.clone()).map(Expr::Var); let table_constr = table_constr(expr.clone()).map(Expr::TableConstr); let table_destr = table_destr(expr.clone()).map(Expr::TableDestr); + let func_def = func_def(expr.clone()).map(Expr::FuncDef); let paren = atom_paren(expr.clone()); - let base = lit.or(paren).or(table_destr).or(table_constr).or(var); + let base = lit + .or(paren) + .or(table_destr) + .or(table_constr) + .or(func_def) + .or(var); + prefixed(suffixed(base, expr)) } diff --git a/src/parser/func_defs.rs b/src/parser/func_defs.rs new file mode 100644 index 0000000..af6b0f7 --- /dev/null +++ b/src/parser/func_defs.rs @@ -0,0 +1,11 @@ +use chumsky::prelude::*; + +use crate::ast::{Expr, FuncDef}; + +use super::basic::Error; + +pub fn func_def( + expr: impl Parser, +) -> BoxedParser<'static, char, FuncDef, Error> { + todo().boxed() +}