Prepare parser for function definitions

This commit is contained in:
Joscha 2022-11-19 18:58:39 +01:00
parent 86006933d7
commit 9a1bb92dfe
4 changed files with 22 additions and 2 deletions

View file

@ -9,6 +9,7 @@
mod basic; mod basic;
mod expr; mod expr;
mod func_defs;
mod lit; mod lit;
mod prefix; mod prefix;
mod suffix; mod suffix;

View file

@ -46,7 +46,7 @@ pub fn ident() -> BoxedParser<'static, char, Ident, Error> {
.try_map(|name, span| { .try_map(|name, span| {
if matches!( if matches!(
&name as &str, &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")) Err(Simple::custom(span, "identifier uses reserved name"))
} else { } else {

View file

@ -6,6 +6,7 @@ use crate::ast::{BinOp, Expr};
use crate::span::HasSpan; use crate::span::HasSpan;
use super::basic::{space, Error}; use super::basic::{space, Error};
use super::func_defs::func_def;
use super::lit::lit; use super::lit::lit;
use super::prefix::prefixed; use super::prefix::prefixed;
use super::suffix::suffixed; use super::suffix::suffixed;
@ -36,9 +37,16 @@ fn atom(
let var = var(expr.clone()).map(Expr::Var); let var = var(expr.clone()).map(Expr::Var);
let table_constr = table_constr(expr.clone()).map(Expr::TableConstr); let table_constr = table_constr(expr.clone()).map(Expr::TableConstr);
let table_destr = table_destr(expr.clone()).map(Expr::TableDestr); 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 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)) prefixed(suffixed(base, expr))
} }

11
src/parser/func_defs.rs Normal file
View file

@ -0,0 +1,11 @@
use chumsky::prelude::*;
use crate::ast::{Expr, FuncDef};
use super::basic::Error;
pub fn func_def(
expr: impl Parser<char, Expr, Error = Error>,
) -> BoxedParser<'static, char, FuncDef, Error> {
todo().boxed()
}