aboutsummaryrefslogtreecommitdiffstats
path: root/src/com/craftinginterpreters/lox/Parser.java
diff options
context:
space:
mode:
authorGravatar Tom Willemse2021-06-14 23:36:10 -0700
committerGravatar Tom Willemse2021-06-14 23:36:10 -0700
commitdb403da4b2ed543100dc42fd3f0036fd64ed76a9 (patch)
tree1bfba97f0580d8274173642897148eb68566ea2a /src/com/craftinginterpreters/lox/Parser.java
parent958ba22a570594ed2ce60d24cd082ce3b8a6b89a (diff)
downloadcrafting-interpreters-db403da4b2ed543100dc42fd3f0036fd64ed76a9.tar.gz
crafting-interpreters-db403da4b2ed543100dc42fd3f0036fd64ed76a9.zip
13.1 Superclasses and Subclasses
Diffstat (limited to 'src/com/craftinginterpreters/lox/Parser.java')
-rw-r--r--src/com/craftinginterpreters/lox/Parser.java34
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();