Browse Source

Fix multiple function arguments

github-actions
Garrit Franke 3 years ago
parent
commit
2d26d0a198
  1. 1
      TODO
  2. 15
      examples/ackermann.sb
  3. 3
      src/parser/rules.rs
  4. 24
      src/parser/tests.rs

1
TODO

@ -1,5 +1,6 @@
# Bugs
- Uninitialized variables don't compile
- stdlib moves line of file, which makes error reporting impossible
# Features
- For loop

15
examples/ackermann.sb

@ -0,0 +1,15 @@
fn main() {
let m = 3
let n = 3
println(ackermann(m, n))
}
fn ackermann(m, n) {
if m == 0 {
return n + 1
} else if n == 0 {
return ackermann(m - 1, 1)
} else {
return ackermann(m - 1, ackermann(m, n - 1))
}
}

3
src/parser/rules.rs

@ -79,6 +79,9 @@ impl Parser {
while let Err(_) = self.peek_token(TokenKind::BraceClose) {
let next = self.next()?;
match next.kind {
TokenKind::Comma => {
continue;
}
TokenKind::Identifier(name) => args.push(Variable { name: name }),
_ => return Err(self.make_error(TokenKind::Identifier("Argument".into()), next)),
}

24
src/parser/tests.rs

@ -530,3 +530,27 @@ fn test_uninitialized_variables() {
let tree = parse(tokens, Some(raw.to_string()));
assert!(tree.is_ok())
}
#[test]
fn test_function_call_math() {
let raw = "
fn main(m) {
main(m - 1)
}
";
let tokens = tokenize(raw);
let tree = parse(tokens, Some(raw.to_string()));
assert!(tree.is_ok())
}
#[test]
fn test_function_multiple_args() {
let raw = "
fn main(m, n) {
main(m, n)
}
";
let tokens = tokenize(raw);
let tree = parse(tokens, Some(raw.to_string()));
assert!(tree.is_ok())
}

Loading…
Cancel
Save