From 134d23299afc0ef1296642c3273e7d5d38872043 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sun, 22 Jan 2023 20:19:34 +0100 Subject: [PATCH] Let --- parser/src/ast.rs | 2 +- parser/src/lexer.rs | 3 + parser/src/parser.rs | 16 ++--- .../parser__parser__tests__types.snap | 44 +++++++------- .../parser__parser__tests__var_decl.snap | 60 ++++++++++++++++--- 5 files changed, 88 insertions(+), 37 deletions(-) diff --git a/parser/src/ast.rs b/parser/src/ast.rs index 21cb5cb..7de07b0 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -70,7 +70,7 @@ pub enum Stmt { #[derive(Debug, Clone, PartialEq)] pub struct VarDecl { pub name: String, - pub ty: Ty, + pub ty: Option, pub rhs: Option, pub span: Span, } diff --git a/parser/src/lexer.rs b/parser/src/lexer.rs index fa0133d..6b56217 100644 --- a/parser/src/lexer.rs +++ b/parser/src/lexer.rs @@ -80,6 +80,8 @@ pub enum Token<'a> { Loop, #[token("ptr")] Ptr, + #[token("let")] + Let, #[regex(r"[a-zA-Z_]\w*")] Ident(&'a str), @@ -134,6 +136,7 @@ impl<'a> Display for Token<'a> { Token::While => f.write_str("while"), Token::Loop => f.write_str("loop"), Token::Ptr => f.write_str("ptr"), + Token::Let => f.write_str("let"), Token::Ident(ident) => write!(f, "identifier `{ident}`"), Token::String(str) => write!(f, "\"{str}\""), Token::Integer(int) => write!(f, "{int}"), diff --git a/parser/src/parser.rs b/parser/src/parser.rs index 61fcace..1b1ca07 100644 --- a/parser/src/parser.rs +++ b/parser/src/parser.rs @@ -233,16 +233,16 @@ fn statement_parser<'src>( state: &'src ParserState, ) -> impl Parser, Stmt, Error = Error<'src>> + Clone { recursive(|stmt| { - let var_decl = ty_parser() - .then(ident_parser()) - .then_ignore(just(Token::Eq)) - .then(expr_parser(state)) + let var_decl = just(Token::Let) + .ignore_then(ident_parser()) + .then(just(Token::Colon).ignore_then(ty_parser()).or_not()) + .then(just(Token::Eq).ignore_then(expr_parser(state)).or_not()) .then_ignore(just(Token::Semi)) - .map(|((ty, name), rhs)| { + .map(|((name, ty), rhs)| { Stmt::VarDecl(VarDecl { name, ty, - rhs: Some(rhs), + rhs, span: Default::default(), }) }) @@ -492,7 +492,7 @@ mod tests { fn var_decl() { let state = ParserState::default(); - let r = parse("fn foo() -> u64 { u64 hello = 5; }", &state); + let r = parse("fn foo() -> u64 { let hello: u64 = 5; let owo = 0; let nice: u64; let nothing; }", &state); insta::assert_debug_snapshot!(r); } @@ -509,7 +509,7 @@ mod tests { let state = ParserState::default(); let r = parse( - "fn types() -> ptr u64 { Test test = 2; ptr u64 int = 25; }", + "fn types() -> ptr u64 { let test: Test = 2; let int: ptr u64 = 25; }", &state, ); insta::assert_debug_snapshot!(r); diff --git a/parser/src/snapshots/parser__parser__tests__types.snap b/parser/src/snapshots/parser__parser__tests__types.snap index 72bfe38..a76d80f 100644 --- a/parser/src/snapshots/parser__parser__tests__types.snap +++ b/parser/src/snapshots/parser__parser__tests__types.snap @@ -25,29 +25,31 @@ expression: r id: NodeId( 2, ), - span: 0..58, + span: 0..68, body: [ VarDecl( VarDecl { name: "test", - ty: Ty { - span: 24..28, - kind: Name( - "Test", - ), - }, + ty: Some( + Ty { + span: 34..38, + kind: Name( + "Test", + ), + }, + ), rhs: Some( Expr { kind: Literal( Integer( 2, - 36..37, + 41..42, ), ), id: NodeId( 0, ), - span: 36..37, + span: 41..42, }, ), span: 0..0, @@ -56,27 +58,29 @@ expression: r VarDecl( VarDecl { name: "int", - ty: Ty { - span: 39..46, - kind: Ptr( - Ty { - span: 43..46, - kind: U64, - }, - ), - }, + ty: Some( + Ty { + span: 53..60, + kind: Ptr( + Ty { + span: 57..60, + kind: U64, + }, + ), + }, + ), rhs: Some( Expr { kind: Literal( Integer( 25, - 53..55, + 63..65, ), ), id: NodeId( 1, ), - span: 53..55, + span: 63..65, }, ), span: 0..0, diff --git a/parser/src/snapshots/parser__parser__tests__var_decl.snap b/parser/src/snapshots/parser__parser__tests__var_decl.snap index 470bac2..99201d7 100644 --- a/parser/src/snapshots/parser__parser__tests__var_decl.snap +++ b/parser/src/snapshots/parser__parser__tests__var_decl.snap @@ -18,34 +18,78 @@ expression: r }, ), id: NodeId( - 1, + 2, ), - span: 0..34, + span: 0..80, body: [ VarDecl( VarDecl { name: "hello", - ty: Ty { - span: 18..21, - kind: U64, - }, + ty: Some( + Ty { + span: 29..32, + kind: U64, + }, + ), rhs: Some( Expr { kind: Literal( Integer( 5, - 30..31, + 35..36, ), ), id: NodeId( 0, ), - span: 30..31, + span: 35..36, }, ), span: 0..0, }, ), + VarDecl( + VarDecl { + name: "owo", + ty: None, + rhs: Some( + Expr { + kind: Literal( + Integer( + 0, + 48..49, + ), + ), + id: NodeId( + 1, + ), + span: 48..49, + }, + ), + span: 0..0, + }, + ), + VarDecl( + VarDecl { + name: "nice", + ty: Some( + Ty { + span: 61..64, + kind: U64, + }, + ), + rhs: None, + span: 0..0, + }, + ), + VarDecl( + VarDecl { + name: "nothing", + ty: None, + rhs: None, + span: 0..0, + }, + ), ], }, ),