|
|
|
@ -17,12 +17,16 @@ extern {
|
|
|
|
|
|
|
|
|
|
Ident => lexer::Token::Ident(<String>),
|
|
|
|
|
|
|
|
|
|
"let" => lexer::Token::Let,
|
|
|
|
|
"in" => lexer::Token::In,
|
|
|
|
|
|
|
|
|
|
r"\" => lexer::Token::Lambda,
|
|
|
|
|
"=>" => lexer::Token::FatArrow,
|
|
|
|
|
"->" => lexer::Token::ThinArrow,
|
|
|
|
|
":" => lexer::Token::Colon,
|
|
|
|
|
"." => lexer::Token::Period,
|
|
|
|
|
"," => lexer::Token::Comma,
|
|
|
|
|
":=" => lexer::Token::Becomes,
|
|
|
|
|
|
|
|
|
|
"=" => lexer::Token::Equals,
|
|
|
|
|
"<>" => lexer::Token::NotEquals,
|
|
|
|
@ -44,19 +48,31 @@ extern {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Multi<T>: Vec<T> = { // (1)
|
|
|
|
|
Multi<T>: Vec<T> = {
|
|
|
|
|
<mut v:(<T> ",")*> <e:T> => {
|
|
|
|
|
v.push(e);
|
|
|
|
|
v
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
MultiTr<T>: Vec<T> = {
|
|
|
|
|
<mut v:(<T> ",")*> <e:T> ","? => {
|
|
|
|
|
v.push(e);
|
|
|
|
|
v
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub Ast: Ast = {
|
|
|
|
|
Term => <>,
|
|
|
|
|
r"\" <args:Multi<IdentAndType>> "." <ast:Ast> => args.into_iter().rev().fold(ast, |ast, (i, t)| Ast::Abstraction(i, t, Box::new(ast))),
|
|
|
|
|
r"\" <args:Multi<IdentAndType>> "." <ast:Ast> =>
|
|
|
|
|
args.into_iter().rev().fold(ast, |ast, (i, t)| Ast::Abstraction(i, t, Box::new(ast))),
|
|
|
|
|
"let" <binds:MultiTr<LetBind>> "in" <ast:Ast> =>
|
|
|
|
|
binds.into_iter().rev().fold(ast, |ast, (i, t, b)| Ast::LetIn(i, t, Box::new(b), Box::new(ast))),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
pub IdentAndType: (String, Option<TaggedType>) = <x:Ident> <t:(":" <TaggedType>)?> => (<>);
|
|
|
|
|
IdentAndType: (String, Option<TaggedType>) = <x:Ident> <t:(":" <TaggedType>)?> => (<>);
|
|
|
|
|
|
|
|
|
|
LetBind: (String, Option<TaggedType>, Ast) = <x:Ident> <t:(":" <TaggedType>)?> ":=" <a:Ast> => (<>);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Term: Ast = {
|
|
|
|
|