aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/craftinginterpreters/lox/Parser.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/craftinginterpreters/lox/Parser.java')
-rw-r--r--src/com/craftinginterpreters/lox/Parser.java40
1 files changed, 34 insertions, 6 deletions
diff --git a/src/com/craftinginterpreters/lox/Parser.java b/src/com/craftinginterpreters/lox/Parser.java
index 7d7b27a..df3ce3f 100644
--- a/src/com/craftinginterpreters/lox/Parser.java
+++ b/src/com/craftinginterpreters/lox/Parser.java
@@ -84,13 +84,11 @@ class Parser {
Stmt body = statement();
if (increment != null) {
- body = new Stmt.Block(
- Arrays.asList(
- body,
- new Stmt.Expression(increment)));
+ body = new Stmt.Block(Arrays.asList(body, new Stmt.Expression(increment)));
}
- if (condition == null) condition = new Expr.Literal(true);
+ if (condition == null)
+ condition = new Expr.Literal(true);
body = new Stmt.While(condition, body);
if (initializer != null) {
@@ -255,7 +253,37 @@ class Parser {
return new Expr.Unary(operator, right);
}
- return primary();
+ return call();
+ }
+
+ private Expr finishCall(Expr callee) {
+ List<Expr> arguments = new ArrayList<>();
+ if (!check(RIGHT_PAREN)) {
+ do {
+ if (arguments.size() >= 255) {
+ error(peek(), "Can't have more than 255 arguments.");
+ }
+ arguments.add(expression());
+ } while (match(COMMA));
+ }
+
+ Token paren = consume(RIGHT_PAREN, "Expect ')' after arguments.");
+
+ return new Expr.Call(callee, paren, arguments);
+ }
+
+ private Expr call() {
+ Expr expr = primary();
+
+ while (true) {
+ if (match(LEFT_PAREN)) {
+ expr = finishCall(expr);
+ } else {
+ break;
+ }
+ }
+
+ return expr;
}
private Expr primary() {