Browse Source

Clean up expression parsing

github-actions
Garrit Franke 3 years ago
parent
commit
66e24bae70
  1. 4
      examples/hello_world.sb
  2. 4
      examples_out/out.js
  3. 32
      src/parser/mod.rs
  4. 1
      src/parser/tests.rs

4
examples/hello_world.sb

@ -1,3 +1,3 @@
fn main(n) {
return 2 * n;
fn main() {
return 2 * 5 / 3;
}

4
examples_out/out.js

@ -1,4 +1,4 @@
function main(n) {
return 2 * n
function main() {
return 2 * 5 / 3
}
console.log(main())

32
src/parser/mod.rs

@ -195,33 +195,25 @@ impl Parser {
}
fn parse_statement(&mut self) -> Result<Statement, String> {
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<Statement, String> {
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<Statement, String> {
self.match_keyword(Keyword::Let)?;
match (
self.next_token().kind,
self.peek().ok_or("Expected ; or =")?.kind,

1
src/parser/tests.rs

@ -163,7 +163,6 @@ fn test_parse_basic_ops() {
}
#[test]
#[ignore]
fn test_parse_compound_ops() {
let raw = "
fn main() {

Loading…
Cancel
Save