diff options
Diffstat (limited to 'src/com/craftinginterpreters/lox/Parser.java')
-rw-r--r-- | src/com/craftinginterpreters/lox/Parser.java | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/com/craftinginterpreters/lox/Parser.java b/src/com/craftinginterpreters/lox/Parser.java index 528326c..b6c134a 100644 --- a/src/com/craftinginterpreters/lox/Parser.java +++ b/src/com/craftinginterpreters/lox/Parser.java @@ -28,6 +28,8 @@ class Parser { } private Expr expression() { + if (match(FUN)) + return lambda(); return assignment(); } @@ -180,6 +182,25 @@ class Parser { return new Stmt.Function(name, parameters, body); } + private Expr.Lambda lambda() { + consume(LEFT_PAREN, "You can't see this message."); + List<Token> parameters = new ArrayList(); + if (!check(RIGHT_PAREN)) { + do { + if (parameters.size() >= 255) { + error(peek(), "Can't have more than 255 parameters."); + } + + parameters.add(consume(IDENTIFIER, "Expect parameter name.")); + } while (match(COMMA)); + } + consume(RIGHT_PAREN, "Expect ')' after parameters."); + + consume(LEFT_BRACE, "Expext '{' before lambda body."); + List<Stmt> body = block(); + return new Expr.Lambda(parameters, body); + } + private List<Stmt> block() { List<Stmt> statements = new ArrayList<>(); |