diff --git a/examples/hello_world.sb b/examples/hello_world.sb index 0a132c2..e6cc36c 100644 --- a/examples/hello_world.sb +++ b/examples/hello_world.sb @@ -1,3 +1,3 @@ -fn main(n) { - return 2 * n; +fn main() { + return 2 * 5 / 3; } \ No newline at end of file diff --git a/examples_out/out.js b/examples_out/out.js index c92ccfa..41b2667 100644 --- a/examples_out/out.js +++ b/examples_out/out.js @@ -1,4 +1,4 @@ -function main(n) { -return 2 * n +function main() { +return 2 * 5 / 3 } console.log(main()) \ No newline at end of file diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 9a0a165..8d6fa77 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -195,33 +195,25 @@ impl Parser { } fn parse_statement(&mut self) -> Result { - let token = self.next_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 = self.parse_return()?; - self.match_token(TokenKind::SemiColon)?; - - Ok(state) - } - TokenKind::Identifier(name) => { + let token = self.peek().ok_or_else(|| "Expected token")?; + let state = match &token.kind { + TokenKind::Keyword(Keyword::Let) => self.parse_declare(), + TokenKind::Keyword(Keyword::Return) => self.parse_return(), + TokenKind::Identifier(_) => { + let ident = self.match_identifier()?; if let Ok(_) = self.peek_token(TokenKind::BraceOpen) { let state = self.parse_function_call()?; - self.match_token(TokenKind::SemiColon)?; Ok(Statement::Exp(state)) } else { - let state = Statement::Exp(Expression::Variable(name.into())); + let state = Statement::Exp(Expression::Variable(ident.into())); Ok(state) } } - + TokenKind::Literal(_) => Ok(Statement::Exp(self.parse_expression()?)), _ => return Err(self.make_error(TokenKind::Unknown, token)), - } + }; + self.match_token(TokenKind::SemiColon)?; + state } /// Parses a function call from tokens. @@ -262,6 +254,7 @@ impl Parser { } fn parse_return(&mut self) -> Result { + self.match_keyword(Keyword::Return)?; // TODO: Replace unwrap with make_error let peeked = self.peek().unwrap(); match peeked.kind { @@ -338,6 +331,7 @@ impl Parser { } fn parse_declare(&mut self) -> Result { + self.match_keyword(Keyword::Let)?; match ( self.next_token().kind, self.peek().ok_or("Expected ; or =")?.kind, diff --git a/src/parser/tests.rs b/src/parser/tests.rs index 925c5cf..90293e9 100644 --- a/src/parser/tests.rs +++ b/src/parser/tests.rs @@ -163,7 +163,6 @@ fn test_parse_basic_ops() { } #[test] -#[ignore] fn test_parse_compound_ops() { let raw = " fn main() {