解释器执行 lox 代码的流程
graph LR A[lox] --> B[词法分析] B --> C[语法分析] C --> D[生成抽象语法树] D --> E[生成字节码] E --> F[执行字节码]
词法分析
词法分析是将源代码转换为 token 流的过程。lox 语言的 token 有以下几种:
- (, ), {, }, ,, ., ;
- +, -, *, /
- !, !=, =, ==, >, >=, <, <=
- and, class, else, false, fun, for, if, nil, or, print, return, super, this, true, var, while
- identifier
- number
- string
- EOF
- error
- comment
- whitespace
语法分析
语法分析是将 token 流转换为抽象语法树的过程。lox 语言的语法规则如下:
program → declaration* EOF ;
declaration → classDecl
| funDecl
| varDecl
| statement ;
classDecl → "class" IDENTIFIER
( "<" IDENTIFIER )?
"{" function* "}" ;
funDecl → "fun" function ;
function → IDENTIFIER "(" parameters? ")" block ;
parameters → IDENTIFIER ( "," IDENTIFIER )* ;
varDecl → "var" IDENTIFIER ( "=" expression )? ";" ;
statement → exprStmt
| forStmt
| ifStmt
| printStmt
| returnStmt
| whileStmt
| block ;
exprStmt → expression ";" ;
forStmt → "for" "(" ( varDecl | exprStmt | ";" )
expression? ";"
expression? ")" statement ;
ifStmt → "if" "(" expression ")" statement ( "else" statement )? ;
printStmt → "print" expression ";" ;
returnStmt → "return" expression? ";" ;
whileStmt → "while" "(" expression ")" statement ;
block → "{" declaration* "}" ;
expression → assignment ;
assignment → ( call "." )? IDENTIFIER "=" assignment
| logic_or ;
logic_or → logic_and ( "or" logic_and )* ;
logic_and → equality ( "and" equality )* ;
equality → comparison ( ( "!=" | "==" ) comparison )* ;
comparison → addition ( ( ">" | ">=" | "<" | "<=" ) addition )* ;
addition → multiplication ( ( "-" | "+" ) multiplication )* ;
multiplication → unary ( ( "/" | "*" ) unary )* ;
unary → ( "!" | "-" ) unary
| call ;
call → primary ( "(" arguments? ")" | "." IDENTIFIER )* ;
arguments → expression ( "," expression )* ;
primary → "true" | "false" | "nil" | "this"
| NUMBER | STRING | IDENTIFIER
| "(" expression ")" ;
生成抽象语法树
抽象语法树是一种树形结构,用于表示程序的语法结构。lox 语言的抽象语法树节点有以下几种:
Binary:二元表达式Grouping:分组表达式Literal:字面量表达式Unary:一元表达式Variable:变量表达式Assign:赋值表达式Logical:逻辑表达式Call:函数调用表达式Get:属性访问表达式Set:属性赋值表达式This:this 表达式Super:super 表达式Function:函数表达式Return:返回表达式Class:类表达式Block:块表达式Expression:表达式语句Print:打印语句Var:变量声明语句If:if 语句While:while 语句For:for 语句Break:break 语句Continue:continue 语句Function:函数声明语句Error:错误语句Empty:空语句Block:块语句
生成字节码
字节码是一种中间表示形式,用于表示程序的执行逻辑。lox 语言的字节码指令有以下几种:
OP_CONSTANT:将常量推入栈顶OP_NIL:将 nil 值推入栈顶OP_TRUE:将 true 值推入栈顶OP_FALSE:将 false 值推入栈顶OP_POP:弹出栈顶元素OP_GET_LOCAL:获取局部变量OP_SET_LOCAL:设置局部变量OP_GET_GLOBAL:获取全局变量OP_DEFINE_GLOBAL:定义全局变量OP_SET_GLOBAL:设置全局变量OP_EQUAL:比较相等OP_GREATER:比较大于OP_LESS:比较小于OP_ADD:加法运算OP_SUBTRACT:减法运算OP_MULTIPLY:乘法运算OP_DIVIDE:除法运算OP_NOT:逻辑非运算OP_NEGATE:取负运算OP_PRINT:打印栈顶元素OP_JUMP:无条件跳转OP_JUMP_IF_FALSE:条件跳转OP_LOOP:循环跳转OP_CALL:调用函数OP_RETURN:返回值OP_CLASS:定义类OP_METHOD:定义方法OP_INVOKE:调用方法OP_GET_PROPERTY:获取属性OP_SET_PROPERTY:设置属性OP_INHERIT:继承类OP_GET_SUPER:获取父类OP_SUPER_INVOKE:调用父类方法OP_CLOSE_UPVALUE:关闭上值OP_CLOSURE:创建闭包OP_GET_UPVALUE:获取上值OP_SET_UPVALUE:设置上值OP_GET_PROPERTY:获取属性OP_SET_PROPERTY:设置属性