diff --git a/src/syntax/parser.lalrpop b/src/syntax/parser.lalrpop index 1bf890e..5d3936f 100644 --- a/src/syntax/parser.lalrpop +++ b/src/syntax/parser.lalrpop @@ -20,6 +20,7 @@ extern { "," => Token::Comma, "`" => Token::BackTick, "\\" => Token::Lambda(_), + "->" => Token::Arrow, "" => Token::TypeName(), "" => Token::ValueName(), @@ -32,6 +33,36 @@ extern { } } +pub Type: Type = { + FunctionType, +} + +FunctionType: Type = { + TypeApplication, + "->" => + Type::Function(Box::new(argtype), Box::new(ret)), +} + +TypeApplication: Type = { + BaseType, + "> => { + let constructor = Type::Constructor(Location::new(file_id, s..e), c); + Type::Application(Box::new(constructor), arguments) + }, + "> => { + let constructor = Type::Constructor(Location::new(file_id, s..e), c); + Type::Application(Box::new(constructor), arguments) + }, +} + +BaseType: Type = { + "> => + Type::Variable(Location::new(file_id, s..e), v), + "> => + Type::Primitive(Location::new(file_id, s..e), p), + "(" ")" => t, +} + pub ConstantValue: ConstantValue = { "> => ConstantValue::Integer(Location::new(file_id, s..e), x), "> => ConstantValue::Character(Location::new(file_id, s..e), x),