diff options
Diffstat (limited to 'src/parser.rs')
-rw-r--r-- | src/parser.rs | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/parser.rs b/src/parser.rs index add31d9..6e6a262 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -47,21 +47,23 @@ pub fn parse_lambda(input: &str) -> Result<Expression, peg::error::ParseError<pe } } } - // fucking awful but i don't know another way - // k:("empty" / "unit" / etc) returns () - // and i can't seem to match and raise a parse error - // so ¯\_(ツ)_/¯ - rule empty() -> Type = k:"empty" {Type::Empty} - rule unit() -> Type = k:"unit" {Type::Unit} - rule boolean() -> Type = k:"bool" {Type::Boolean} - rule natural() -> Type = k:"nat" {Type::Natural} - rule integer() -> Type = k:"int" {Type::Integer} + rule primitive() -> Type + = k:$("empty" / "unit" / "bool" / "nat" / "int") { + match k { + "empty" => Type::Empty, + "unit" => Type::Unit, + "bool" => Type::Boolean, + "nat" => Type::Natural, + "int" => Type::Integer, + _ => Type::Empty + } + } // fixme: brackets are necessary here rule function() -> Type = "(" f:kind() " "* "->" " "* t:kind() ")" { Type::Function { from: Box::new(f), to: Box::new(t) } } rule kind() -> Type - = k:(function() / empty() / unit() / boolean() / natural() / integer()) { + = k:(function() / primitive()) { k } rule ann() -> Expression |