From 580a5acb580a858c8ffa705f5f64f095cb0b4b37 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Wed, 17 Mar 2021 22:52:35 -0700 Subject: Chapter 12, Sections 1, 2, and 3 --- src/com/craftinginterpreters/lox/Parser.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/com/craftinginterpreters/lox/Parser.java') diff --git a/src/com/craftinginterpreters/lox/Parser.java b/src/com/craftinginterpreters/lox/Parser.java index 528326c..fe51e45 100644 --- a/src/com/craftinginterpreters/lox/Parser.java +++ b/src/com/craftinginterpreters/lox/Parser.java @@ -33,6 +33,8 @@ class Parser { private Stmt declaration() { try { + if (match(CLASS)) + return classDeclaration(); if (match(FUN)) return function("function"); if (match(VAR)) @@ -45,6 +47,20 @@ class Parser { } } + private Stmt classDeclaration() { + Token name = consume(IDENTIFIER, "Expect class name."); + consume(LEFT_BRACE, "Expect '{' before class body."); + + List methods = new ArrayList<>(); + while (!check(RIGHT_BRACE) && !isAtEnd()) { + methods.add(function("method")); + } + + consume(RIGHT_BRACE, "Expect '}' after class body."); + + return new Stmt.Class(name, methods); + } + private Stmt statement() { if (match(FOR)) return forStatement(); @@ -201,6 +217,9 @@ class Parser { if (expr instanceof Expr.Variable) { Token name = ((Expr.Variable) expr).name; return new Expr.Assign(name, value); + } else if (expr instanceof Expr.Get) { + Expr.Get get = (Expr.Get)expr; + return new Expr.Set(get.object, get.name, value); } error(equals, "Invalid assignment target."); @@ -313,6 +332,9 @@ class Parser { while (true) { if (match(LEFT_PAREN)) { expr = finishCall(expr); + } else if (match(DOT)) { + Token name = consume(IDENTIFIER, "Expect property name after '.'"); + expr = new Expr.Get(expr, name); } else { break; } -- cgit v1.2.3-54-g00ecf