解释器执行 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
:设置属性