From 101ad0878dfbfc03934309514133c1f2b1900f19 Mon Sep 17 00:00:00 2001 From: Garrit Franke Date: Thu, 3 Dec 2020 23:36:28 +0100 Subject: [PATCH] Add variable declarations --- examples/hello_world.fx | 3 ++- src/lexer/mod.rs | 8 ++++---- src/lexer/tests.rs | 4 ++-- src/parser/mod.rs | 23 +++++++++++++++++++++++ 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/examples/hello_world.fx b/examples/hello_world.fx index 21fbd38..671a55f 100644 --- a/examples/hello_world.fx +++ b/examples/hello_world.fx @@ -1,8 +1,9 @@ // This is a comment fn main() { + let x = 2; + let y; return 1; - } fn fib() {} \ No newline at end of file diff --git a/src/lexer/mod.rs b/src/lexer/mod.rs index 311dbc4..7e2c695 100644 --- a/src/lexer/mod.rs +++ b/src/lexer/mod.rs @@ -43,9 +43,9 @@ pub enum TokenKind { /// ";" SemiColon, /// "=" - Equals, + Assign, /// "==" - DeepEquals, + Equals, /// "<" SmallerThen, /// ">" @@ -147,8 +147,8 @@ impl Cursor<'_> { _ => Slash, }, '=' => match self.first() { - '=' => DeepEquals, - _ => Equals, + '=' => Equals, + _ => Assign, }, ':' => Colon, ';' => SemiColon, diff --git a/src/lexer/tests.rs b/src/lexer/tests.rs index 22fc8b3..584096b 100644 --- a/src/lexer/tests.rs +++ b/src/lexer/tests.rs @@ -28,7 +28,7 @@ mod tests { tokens.nth(0).unwrap(), Token { len: 1, - kind: TokenKind::Equals, + kind: TokenKind::Assign, raw: "=".to_owned() } ); @@ -69,7 +69,7 @@ mod tests { tokens.nth(0).unwrap(), Token { len: 1, - kind: TokenKind::Equals, + kind: TokenKind::Assign, raw: "=".to_owned() } ); diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 87fd5d4..b2ef191 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -146,6 +146,12 @@ impl Parser { let token = self.next_token(); println!("parse_statement: {:?}", token); match token.kind { + TokenKind::Keyword(Keyword::Let) => { + let state = self.parse_declare(); + self.match_token(TokenKind::SemiColon)?; + + state + } TokenKind::Keyword(Keyword::Return) => { let state = Statement::Return(self.parse_expression()?); self.match_token(TokenKind::SemiColon)?; @@ -166,6 +172,23 @@ impl Parser { other => Err(format!("Expected Expression, found {:?}", other)), } } + + fn parse_declare(&mut self) -> Result { + match ( + self.next_token().kind, + self.peek().ok_or("Expected ; or =")?.kind, + ) { + (TokenKind::Identifier(name), TokenKind::SemiColon) => { + Ok(Statement::Declare(Variable { name }, None)) + } + (TokenKind::Identifier(name), TokenKind::Assign) => { + self.drop(1); + let exp = self.parse_expression().ok(); + Ok(Statement::Declare(Variable { name }, exp)) + } + other => Err(format!("Expected identifier, found {:?}", other)), + } + } } pub fn parse(tokens: Vec) -> Result {