Skip to content

Commit

Permalink
return keyword
Browse files Browse the repository at this point in the history
  • Loading branch information
cezaris13 committed Dec 10, 2024
1 parent b65bbce commit ce393fb
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 18 deletions.
3 changes: 3 additions & 0 deletions loxGrammar.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
| <ifStatement>
| <whileStatement>
| <forStatement>
| <returnStatement>

<printStatement> ::= "print " <expression> ";"

Expand All @@ -64,6 +65,8 @@
<expression>? ";"
<expression>? ")" <statement>

<returnStatement> ::= "return" <expression>? ";"

<expression> ::= <assignment>

<assignment> ::= <identifier> "=" <assignment>
Expand Down
3 changes: 3 additions & 0 deletions src/interpreter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ impl Interpreter {
},
);
}
Statement::Return { keyword, value } => {
todo!()
}
};
}

Expand Down
51 changes: 33 additions & 18 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,7 @@ pub struct Parser<'a> {

impl<'a> Parser<'a> {
pub fn new(tokens: &'a Vec<Token>) -> Self {
Self {
tokens,
current: 0,
}
Self { tokens, current: 0 }
}

// region grammar components
Expand Down Expand Up @@ -160,6 +157,10 @@ impl<'a> Parser<'a> {
return self.print_statement();
}

if self.match_tokens(vec![Return]) {
return self.return_statement();
}

self.expression_statement()
}

Expand Down Expand Up @@ -248,20 +249,6 @@ impl<'a> Parser<'a> {
Ok(body)
}

fn print_statement(&mut self) -> Result<Statement, String> {
let expression = self.expression()?;
self.consume(Semicolon, "Expected ';' after the value.")?;

Ok(Statement::Print { expression })
}

fn expression_statement(&mut self) -> Result<Statement, String> {
let expression = self.expression()?;
self.consume(Semicolon, "Expected ';' after the value.")?;

Ok(Statement::Expression { expression })
}

fn if_statement(&mut self) -> Result<Statement, String> {
self.consume(LeftParen, "Expected '(' after 'if'")?;
let condition = self.expression()?;
Expand All @@ -284,6 +271,34 @@ impl<'a> Parser<'a> {
})
}

fn print_statement(&mut self) -> Result<Statement, String> {
let expression = self.expression()?;
self.consume(Semicolon, "Expected ';' after the value.")?;

Ok(Statement::Print { expression })
}

fn return_statement(&mut self) -> Result<Statement, String> {
let keyword = self.previous();

let mut value = None;

if !self.check(Semicolon) {
value = Some(self.expression()?);
}

self.consume(Semicolon, "Expected ';' after return value")?;

Ok(Statement::Return { keyword, value })
}

fn expression_statement(&mut self) -> Result<Statement, String> {
let expression = self.expression()?;
self.consume(Semicolon, "Expected ';' after the value.")?;

Ok(Statement::Expression { expression })
}

pub fn expression(&mut self) -> Result<Expression, String> {
self.assignment()
}
Expand Down
5 changes: 5 additions & 0 deletions src/statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,9 @@ pub enum Statement {
parameters: Vec<Token>,
body: Vec<Statement>,
},

Return {
keyword: Token,
value: Option<expression::Expression>,
},
}

0 comments on commit ce393fb

Please sign in to comment.