Compiler Jlox Execution. (v1.0.0 Scanner Test)
javac TokenType.java Token.java Scanner.java Lox.java
java -classpath ../../../ com.craftinginterpreters.lox.Lox
Generate "lox/Expr.java" by "tool/GenerateAst.java".
javac GenerateAst.java
java -classpath ../../../ com.craftinginterpreters.tool.GenerateAst ../lox/
Checkout AstPrinter Demo.
javac Expr.java AstPrinter.java Token.java TokenType.java
java -classpath ../../../ com.craftinginterpreters.lox.AstPrinter
Output: (* (- 123) (group 45.67))
Compiler Jlox Execution. (v2.0.0 Parser Test)
javac TokenType.java Token.java Scanner.java AstPrinter.java Expr.java Parser.java Lox.java
java -classpath ../../../ com.craftinginterpreters.lox.Lox
Compiler Jlox Execution. (v2.1.0 Interpreter Test)
javac TokenType.java Token.java Scanner.java AstPrinter.java Expr.java Parser.java RuntimeError.java Interpreter.java Lox.java
java -classpath ../../../ com.craftinginterpreters.lox.Lox
Compiler Jlox Execution. (v3.0.0 AST)
javac TokenType.java Token.java Scanner.java AstPrinter.java Expr.java Parser.java RuntimeError.java Interpreter.java Stmt.java Environment.java Lox.java
java -classpath ../../../ com.craftinginterpreters.lox.Lox ../test/test1.lox
Generate "lox/Stmt.java" by "tool/GenerateAst.java".
javac GenerateAst.java
java -classpath ../../../ com.craftinginterpreters.tool.GenerateAst ../lox/
Literals. Numbers, strings, Booleans, and nil
Unary expressions. A prefix ! to perform a logical not, and - to negate a number.
Binary expressions. The infix arithmetic (+, -, *, /) and logic operators (==, !=, <, <=, >, >=) we know and love.
Parentheses. A pair of ( and ) wrapped around an expression.
expression → literal
| unary
| binary
| grouping ;
literal → NUMBER | STRING | "true" | "false" | "nil" ;
grouping → "(" expression ")" ;
unary → ( "-" | "!" ) expression ;
binary → expression operator expression ;
operator → "==" | "!=" | "<" | "<=" | ">" | ">="
| "+" | "-" | "*" | "/" ;
Syntax: The same precedence rules as C
expression → equality ;
equality → comparison ( ( "!=" | "==" ) comparison )* ;
comparison → term ( ( ">" | ">=" | "<" | "<=" ) term )* ;
term → factor ( ( "-" | "+" ) factor )* ;
factor → unary ( ( "/" | "*" ) unary )* ;
unary → ( "!" | "-" ) unary
| primary ;
primary → NUMBER | STRING | "true" | "false" | "nil"
| "(" expression ")" ;
program → statement* EOF ;
statement → exprStmt
| printStmt ;
exprStmt → expression ";" ;
printStmt → "print" expression ";" ;
program → declaration* EOF ;
declaration → varDecl
| statement ;
statement → exprStmt
| printStmt ;
varDecl → "var" IDENTIFIER ( "=" expression )? ";" ;
expression → assignment ;
assignment → IDENTIFIER "=" assignment
| equality ;
statement → exprStmt
| printStmt
| block ;
block → "{" declaration* "}" ;
var a = "global a";
{var a = "outer a"; {var a = "inner a"; print a;} print a;} print a;
var a = 1; {var a = a + 2; print a; }
statement → exprStmt
| ifStmt
| printStmt
| block ;
ifStmt → "if" "(" expression ")" statement
( "else" statement )? ;
expression → assignment ;
assignment → IDENTIFIER "=" assignment
| logic_or ;
logic_or → logic_and ( "or" logic_and )* ;
logic_and → equality ( "and" equality )* ;
statement → exprStmt
| ifStmt
| printStmt
| whileStmt
| block ;
whileStmt → "while" "(" expression ")" statement ;
statement → exprStmt
| forStmt
| ifStmt
| printStmt
| whileStmt
| block ;
forStmt → "for" "(" ( varDecl | exprStmt | ";" )
expression? ";"
expression? ")" statement ;
git add .
git status
git commit -m "v2.1.0 Interpreter"
git push origin main