diff options
Diffstat (limited to 'src/com/craftinginterpreters/lox/Parser.java')
-rw-r--r-- | src/com/craftinginterpreters/lox/Parser.java | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/com/craftinginterpreters/lox/Parser.java b/src/com/craftinginterpreters/lox/Parser.java index a3f4897..3150035 100644 --- a/src/com/craftinginterpreters/lox/Parser.java +++ b/src/com/craftinginterpreters/lox/Parser.java @@ -3,8 +3,8 @@ package com.craftinginterpreters.lox; import static com.craftinginterpreters.lox.TokenType.*; import java.util.ArrayList; -import java.util.List; import java.util.Arrays; +import java.util.List; class Parser { private static class ParseError extends RuntimeException { @@ -49,6 +49,13 @@ class Parser { private Stmt classDeclaration() { Token name = consume(IDENTIFIER, "Expect class name."); + + Expr.Variable superclass = null; + if (match(LESS)) { + consume(IDENTIFIER, "Expect superclass name."); + superclass = new Expr.Variable(previous()); + } + consume(LEFT_BRACE, "Expect '{' before class body."); List<Stmt.Function> methods = new ArrayList<>(); @@ -58,7 +65,7 @@ class Parser { consume(RIGHT_BRACE, "Expect '}' after class body."); - return new Stmt.Class(name, methods); + return new Stmt.Class(name, superclass, methods); } private Stmt statement() { @@ -218,7 +225,7 @@ class Parser { Token name = ((Expr.Variable) expr).name; return new Expr.Assign(name, value); } else if (expr instanceof Expr.Get) { - Expr.Get get = (Expr.Get)expr; + Expr.Get get = (Expr.Get) expr; return new Expr.Set(get.object, get.name, value); } @@ -355,7 +362,8 @@ class Parser { return new Expr.Literal(previous().literal); } - if (match(THIS)) return new Expr.This(previous()); + if (match(THIS)) + return new Expr.This(previous()); if (match(IDENTIFIER)) { return new Expr.Variable(previous()); @@ -425,15 +433,15 @@ class Parser { return; switch (peek().type) { - case CLASS: - case FUN: - case VAR: - case FOR: - case IF: - case WHILE: - case PRINT: - case RETURN: - return; + case CLASS: + case FUN: + case VAR: + case FOR: + case IF: + case WHILE: + case PRINT: + case RETURN: + return; } advance(); |