diff --git a/jlox/lox/src/main/java/xyz/ctsk/lox/Parser.java b/jlox/lox/src/main/java/xyz/ctsk/lox/Parser.java index 401c4e0..2fe849c 100644 --- a/jlox/lox/src/main/java/xyz/ctsk/lox/Parser.java +++ b/jlox/lox/src/main/java/xyz/ctsk/lox/Parser.java @@ -14,7 +14,8 @@ import static xyz.ctsk.lox.TokenType.*; * | funDecl * | varDecl * | statement ; - * classDecl → "class" IDENTIFIER "{" function* "}" ; + * classDecl → "class" IDENTIFIER ( "<" IDENTIFIER )? + * "{" function* "}" ; * funDecl → "fun" function ; * function → IDENTIFIER "(" parameters? ")" block ; * parameters → IDENTIFIER ( "," IDENTIFIER )* ; @@ -87,6 +88,13 @@ public class Parser { private Stmt classDeclaration() { var 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 methods = new ArrayList<>(); @@ -96,8 +104,7 @@ public class Parser { } consume(LEFT_BRACE, "Expect '}' after class body."); - return new Stmt.Class(name, methods); - + return new Stmt.Class(name, superclass, methods); } private Stmt.Function function(FunctionType kind) { diff --git a/jlox/lox/src/main/java/xyz/ctsk/lox/package-info.java b/jlox/lox/src/main/java/xyz/ctsk/lox/package-info.java index 685bb9e..77f7d2f 100644 --- a/jlox/lox/src/main/java/xyz/ctsk/lox/package-info.java +++ b/jlox/lox/src/main/java/xyz/ctsk/lox/package-info.java @@ -16,7 +16,7 @@ @Root(name = "Stmt", rules = { @Rule(head = "Block", body = {"List statements"}), - @Rule(head = "Class", body = {"Token name", "List methods"}), + @Rule(head = "Class", body = {"Token name", "Expr.Variable superclass", "List methods"}), @Rule(head = "Expression", body = {"Expr expression"}), @Rule(head = "Function", body = {"Token name", "List params", "List body"}), @Rule(head = "If", body = {"Expr condition", "Stmt thenBranch", "Stmt elseBranch"}),