diff options
author | Tom Willemse | 2021-02-17 22:06:55 -0800 |
---|---|---|
committer | Tom Willemse | 2021-02-17 22:06:55 -0800 |
commit | a0df1715fcefd422a0cdd0d247c79cd966b304d5 (patch) | |
tree | 2197617e98edb77624165bbaa528afe152ca7181 /src/com/craftinginterpreters/lox/Parser.java | |
parent | 4fbfa53dd79a84465256010a263dd4863e93032c (diff) | |
download | crafting-interpreters-a0df1715fcefd422a0cdd0d247c79cd966b304d5.tar.gz crafting-interpreters-a0df1715fcefd422a0cdd0d247c79cd966b304d5.zip |
Add anonymous functionschapter-10-challenges
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<>(); |