rust/syntax: explicit binds for lambda types

This commit is contained in:
Alain Zscheile 2023-11-06 21:26:11 +01:00
parent 8e5c8f697f
commit 3f609ccc40
2 changed files with 16 additions and 6 deletions

View file

@ -29,13 +29,17 @@ impl Parse for Lambda {
#[derive(Clone, Debug)]
pub enum Expr {
Infer,
Literal(Literal),
Use(SelIdent),
Lambda(Lambda),
TyLambda(Lambda),
TyLambdaLin(Lambda),
TyLambda {
binds: Box<Expr>,
lam: Lambda,
},
Apply(Box<Expr>, Vec<(EvEqSourceSpan, Expr)>),
Record(Record<Expr>),
@ -64,10 +68,16 @@ fn parse_minexpr(env: &mut ParseEnv<'_>) -> Result<Expr> {
}
}
Tok::Kw(Kw::Infer) => Ok(Expr::Infer),
Tok::Kw(Kw::Literal(lit)) => Ok(Expr::Literal(lit)),
Tok::Kw(Kw::Lambda) => Lambda::parse(env).map(Expr::Lambda),
Tok::Kw(Kw::TyLambda) => Lambda::parse(env).map(Expr::TyLambda),
Tok::Kw(Kw::TyLambdaLin) => Lambda::parse(env).map(Expr::TyLambdaLin),
Tok::Kw(Kw::TyLambda) => {
env.lxr.expect(Tok::LParen, Ectx::Parentheses)?;
let binds = Box::new(Expr::parse(env)?);
env.lxr.expect(Tok::RParen, Ectx::Parentheses)?;
let lam = Lambda::parse(env)?;
Ok(Expr::TyLambda { binds, lam })
},
Tok::LParen => {
let inner = Expr::parse(env)?;

View file

@ -14,7 +14,7 @@ pub enum Kw {
Let,
Lambda,
TyLambda,
TyLambdaLin,
Infer,
}
impl MaybeParse for (EvEqSourceSpan, Literal) {
@ -51,7 +51,7 @@ impl core::str::FromStr for Kw {
Ok(match s {
"λ" => Kw::Lambda,
"Λ" => Kw::TyLambda,
"Λlin" => Kw::TyLambdaLin,
"infer" => Kw::Infer,
"let" => Kw::Let,
_ => return Err(()),
})