Browse Source

Add function arguments

github-actions
Garrit Franke 3 years ago
parent
commit
1514eee549
  1. 4
      examples/hello_world.sb
  2. 4
      examples_out/out.js
  3. 23
      src/parser/mod.rs

4
examples/hello_world.sb

@ -1,5 +1,5 @@
fn main() {
return "Hello World";
fn main(message) {
return message;
}
fn fib() {}

4
examples_out/out.js

@ -1,5 +1,5 @@
function main() {
return "Hello World"
function main(message,) {
return message
}
function fib() {
}

23
src/parser/mod.rs

@ -138,6 +138,14 @@ impl Parser {
let name = self.match_identifier()?;
self.match_token(TokenKind::BraceOpen)?;
let arguments: Vec<Variable> = match self.peek() {
Some(t) if t.kind == TokenKind::BraceClose => Vec::new(),
_ => self
.parse_arguments()
.expect("Failed to parse function arguments"),
};
self.match_token(TokenKind::BraceClose)?;
self.match_token(TokenKind::CurlyBracesOpen)?;
@ -153,11 +161,24 @@ impl Parser {
Ok(Function {
name: name,
arguments: Vec::new(),
arguments: arguments,
statements: statements,
})
}
fn parse_arguments(&mut self) -> Result<Vec<Variable>, String> {
let mut args = Vec::new();
while let Err(_) = self.peek_token(TokenKind::BraceClose) {
let next = self.next().ok_or_else(|| "Expected identifier")?;
match next.kind {
TokenKind::Identifier(name) => args.push(Variable { name: name }),
_ => return Err(self.make_error(TokenKind::Identifier("".into()), next)),
}
}
Ok(args)
}
fn parse_statement(&mut self) -> Result<Statement, String> {
let token = self.next_token();
dbg!(&token);

Loading…
Cancel
Save