From c1c834701a21f2181e6ab1ac0ef3952bcf9a4c77 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 30 Oct 2023 00:07:27 -0500 Subject: [PATCH] parser: Mockup type-expression syntax - Allow `name: Type` notation for parameters - Allow `fn x() -> RetVal` notation for return values - TODO: Create syntax for type-expressions/paths --- dummy.cl | 2 +- libconlang/src/parser.rs | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dummy.cl b/dummy.cl index 351ff76..0e5b318 100644 --- a/dummy.cl +++ b/dummy.cl @@ -2,7 +2,7 @@ // This is a function. It can be called with the call operator. // The function called `main` is the program's entrypoint -fn main() { +fn main() -> (&str, bool, i128) { // An if expression is like the ternary conditional operator in C let y = if 10 < 50 { "\u{1f988}" diff --git a/libconlang/src/parser.rs b/libconlang/src/parser.rs index 09b0cfe..91a8b25 100644 --- a/libconlang/src/parser.rs +++ b/libconlang/src/parser.rs @@ -393,7 +393,7 @@ impl Parser { self.consume_type(Type::LParen)?; let args = self.params()?; self.consume_type(Type::RParen)?; - // Discard return type, for now + // TODO: Parse type-expressions and store return types in the AST if self.consume_type(Type::Arrow).is_ok() { self.expr()?; } @@ -404,6 +404,10 @@ impl Parser { let mut args = vec![]; while let Ok(ident) = self.identifier() { args.push(ident); + if self.consume_type(Type::Colon).is_ok() { + // TODO: Parse type-expressions and make this mandatory + self.expr()?; + } if self.consume_type(Type::Comma).is_err() { break; }