Skip to content

Commit

Permalink
bnf and parsing function body
Browse files Browse the repository at this point in the history
  • Loading branch information
cezaris13 committed Dec 9, 2024
1 parent d0ed623 commit 75f4fc0
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 0 deletions.
7 changes: 7 additions & 0 deletions loxGrammar.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@

<declaration> ::= <variableDeclaration>
| <statement>
| <functionDeclaration>

<functionDeclaration> ::= "fun" <function>

<function> ::= <identifier> "(" <parameters> ")" <block>

<parameters> ::= <identifier> ( "," <identifier> )*

<variableDeclaration> ::= "var " <identifier> ("=" <expression>) ";"

Expand Down
7 changes: 7 additions & 0 deletions src/interpreter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,13 @@ impl Interpreter {
self.interpret_statements(vec![*body.clone()])?; // fix here??
}
}
Statement::Function {
name,
parameters,
body,
} => {
todo!()
}
};
}

Expand Down
38 changes: 38 additions & 0 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,47 @@ impl Parser {
};
}

if self.match_tokens(vec![Fun]) {
self.function("function")?;
}

self.statement()
}

fn function(&mut self, kind: &str) -> Result<Statement, String> {
let function_name = self.consume(Identifier, &format!("Expect {} name", kind))?;

self.consume(LeftParen, &format!("Expect '(' after {} name", kind))?;

let mut parameters = vec![];

if !self.check(RightParen) {
loop {
if parameters.len() >= 255 {
return Err(String::from("Can't have more than 255 parameters."));
}

parameters.push(self.consume(Identifier, "Expect parameter name")?);

if !self.match_tokens(vec![Comma]) {
break;
}
}
}

self.consume(RightParen, "Expect ')' after parameters")?;

self.consume(LeftBrace, &format!("Expect '{{' before {} body", kind))?;

let body = self.blocks()?;

Ok(Statement::Function {
name: function_name,
parameters: parameters,
body: body,
})
}

fn variable_declaration(&mut self) -> Result<Statement, String> {
let token_name = self.consume(Identifier, "Expect variable name")?;

Expand Down
6 changes: 6 additions & 0 deletions src/statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,10 @@ pub enum Statement {
condition: expression::Expression,
body: Box<Statement>,
},

Function {
name: Token,
parameters: Vec<Token>,
body: Vec<Statement>,
},
}

0 comments on commit 75f4fc0

Please sign in to comment.