Appendix II
Để bạn tiện tham khảo, dưới đây là phần code được tạo ra bởi script nhỏ mà chúng ta đã viết để tự động sinh các class syntax tree cho jlox.
A2 . 1Expressions
Expressions là những node syntax tree đầu tiên mà ta gặp, được giới thiệu trong “Representing Code”. Class Expr
chính định nghĩa visitor interface dùng để phân phối xử lý đến từng loại expression cụ thể, và chứa các subclass expression khác dưới dạng nested class.
create new file
package com.craftinginterpreters.lox; import java.util.List; abstract class Expr { interface Visitor<R> { R visitAssignExpr(Assign expr); R visitBinaryExpr(Binary expr); R visitCallExpr(Call expr); R visitGetExpr(Get expr); R visitGroupingExpr(Grouping expr); R visitLiteralExpr(Literal expr); R visitLogicalExpr(Logical expr); R visitSetExpr(Set expr); R visitSuperExpr(Super expr); R visitThisExpr(This expr); R visitUnaryExpr(Unary expr); R visitVariableExpr(Variable expr); } // Nested Expr classes here... abstract <R> R accept(Visitor<R> visitor); }
A2 . 1 . 1Assign expression
Gán giá trị cho biến được giới thiệu trong “Statements and State”.
nest inside class Expr
static class Assign extends Expr { Assign(Token name, Expr value) { this.name = name; this.value = value; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitAssignExpr(this); } final Token name; final Expr value; }
A2 . 1 . 2Binary expression
Các toán tử binary được giới thiệu trong “Representing Code”.
nest inside class Expr
static class Binary extends Expr { Binary(Expr left, Token operator, Expr right) { this.left = left; this.operator = operator; this.right = right; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitBinaryExpr(this); } final Expr left; final Token operator; final Expr right; }
A2 . 1 . 3Call expression
Biểu thức gọi hàm được giới thiệu trong “Functions”.
nest inside class Expr
static class Call extends Expr { Call(Expr callee, Token paren, List<Expr> arguments) { this.callee = callee; this.paren = paren; this.arguments = arguments; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitCallExpr(this); } final Expr callee; final Token paren; final List<Expr> arguments; }
A2 . 1 . 4Get expression
Truy cập property, hay “get” expression, được giới thiệu trong “Classes”.
nest inside class Expr
static class Get extends Expr { Get(Expr object, Token name) { this.object = object; this.name = name; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitGetExpr(this); } final Expr object; final Token name; }
A2 . 1 . 5Grouping expression
Dùng dấu ngoặc đơn để nhóm biểu thức được giới thiệu trong “Representing Code”.
nest inside class Expr
static class Grouping extends Expr { Grouping(Expr expression) { this.expression = expression; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitGroupingExpr(this); } final Expr expression; }
A2 . 1 . 6Literal expression
Biểu thức giá trị literal được giới thiệu trong “Representing Code”.
nest inside class Expr
static class Literal extends Expr { Literal(Object value) { this.value = value; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitLiteralExpr(this); } final Object value; }
A2 . 1 . 7Logical expression
Toán tử logic and
và or
được giới thiệu trong “Control Flow”.
nest inside class Expr
static class Logical extends Expr { Logical(Expr left, Token operator, Expr right) { this.left = left; this.operator = operator; this.right = right; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitLogicalExpr(this); } final Expr left; final Token operator; final Expr right; }
A2 . 1 . 8Set expression
Gán giá trị cho property, hay “set” expression, được giới thiệu trong “Classes”.
nest inside class Expr
static class Set extends Expr { Set(Expr object, Token name, Expr value) { this.object = object; this.name = name; this.value = value; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitSetExpr(this); } final Expr object; final Token name; final Expr value; }
A2 . 1 . 9Super expression
Biểu thức super
được giới thiệu trong “Inheritance”.
nest inside class Expr
static class Super extends Expr { Super(Token keyword, Token method) { this.keyword = keyword; this.method = method; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitSuperExpr(this); } final Token keyword; final Token method; }
A2 . 1 . 10This expression
Biểu thức this
được giới thiệu trong “Classes”.
nest inside class Expr
static class This extends Expr { This(Token keyword) { this.keyword = keyword; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitThisExpr(this); } final Token keyword; }
A2 . 1 . 11Unary expression
Các toán tử unary được giới thiệu trong “Representing Code”.
nest inside class Expr
static class Unary extends Expr { Unary(Token operator, Expr right) { this.operator = operator; this.right = right; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitUnaryExpr(this); } final Token operator; final Expr right; }
A2 . 1 . 12Variable expression
Biểu thức truy cập biến được giới thiệu trong “Statements and State”.
nest inside class Expr
static class Variable extends Expr { Variable(Token name) { this.name = name; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitVariableExpr(this); } final Token name; }
A2 . 2Statements
Statements tạo thành một hệ thống phân cấp syntax tree thứ hai, độc lập với expressions. Chúng ta thêm vài statement đầu tiên trong “Statements and State”.
create new file
package com.craftinginterpreters.lox; import java.util.List; abstract class Stmt { interface Visitor<R> { R visitBlockStmt(Block stmt); R visitClassStmt(Class stmt); R visitExpressionStmt(Expression stmt); R visitFunctionStmt(Function stmt); R visitIfStmt(If stmt); R visitPrintStmt(Print stmt); R visitReturnStmt(Return stmt); R visitVarStmt(Var stmt); R visitWhileStmt(While stmt); } // Nested Stmt classes here... abstract <R> R accept(Visitor<R> visitor); }
A2 . 2 . 1Block statement
Statement block dùng dấu ngoặc nhọn để định nghĩa một scope cục bộ được giới thiệu trong “Statements and State”.
nest inside class Stmt
static class Block extends Stmt { Block(List<Stmt> statements) { this.statements = statements; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitBlockStmt(this); } final List<Stmt> statements; }
A2 . 2 . 2Class statement
Khai báo class được giới thiệu, không bất ngờ gì, trong “Classes”.
nest inside class Stmt
static class Class extends Stmt { Class(Token name, Expr.Variable superclass, List<Stmt.Function> methods) { this.name = name; this.superclass = superclass; this.methods = methods; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitClassStmt(this); } final Token name; final Expr.Variable superclass; final List<Stmt.Function> methods; }
A2 . 2 . 3Expression statement
Expression statement được giới thiệu trong “Statements and State”.
nest inside class Stmt
static class Expression extends Stmt { Expression(Expr expression) { this.expression = expression; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitExpressionStmt(this); } final Expr expression; }
A2 . 2 . 4Function statement
Khai báo hàm được giới thiệu trong “Functions”.
nest inside class Stmt
static class Function extends Stmt { Function(Token name, List<Token> params, List<Stmt> body) { this.name = name; this.params = params; this.body = body; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitFunctionStmt(this); } final Token name; final List<Token> params; final List<Stmt> body; }
A2 . 2 . 5If statement
Câu lệnh if
được giới thiệu trong “Control Flow”.
nest inside class Stmt
static class If extends Stmt { If(Expr condition, Stmt thenBranch, Stmt elseBranch) { this.condition = condition; this.thenBranch = thenBranch; this.elseBranch = elseBranch; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitIfStmt(this); } final Expr condition; final Stmt thenBranch; final Stmt elseBranch; }
A2 . 2 . 6Print statement
Câu lệnh print
được giới thiệu trong “Statements and State”.
nest inside class Stmt
static class Print extends Stmt { Print(Expr expression) { this.expression = expression; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitPrintStmt(this); } final Expr expression; }
A2 . 2 . 7Return statement
Bạn cần một hàm để có thể return
, nên câu lệnh return
được giới thiệu trong “Functions”.
nest inside class Stmt
static class Return extends Stmt { Return(Token keyword, Expr value) { this.keyword = keyword; this.value = value; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitReturnStmt(this); } final Token keyword; final Expr value; }
A2 . 2 . 8Variable statement
Khai báo biến được giới thiệu trong “Statements and State”.
nest inside class Stmt
static class Var extends Stmt { Var(Token name, Expr initializer) { this.name = name; this.initializer = initializer; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitVarStmt(this); } final Token name; final Expr initializer; }
A2 . 2 . 9While statement
Câu lệnh while
được giới thiệu trong “Control Flow”.
nest inside class Stmt
static class While extends Stmt { While(Expr condition, Stmt body) { this.condition = condition; this.body = body; } @Override <R> R accept(Visitor<R> visitor) { return visitor.visitWhileStmt(this); } final Expr condition; final Stmt body; }