修改文档

This commit is contained in:
Luke 2025-05-21 17:14:46 +08:00
parent 6f2f2bb38e
commit 25ec8844dd

View File

@ -116,13 +116,7 @@ SCompiler 的虚拟机(位于`org.jcnc.snow.vm`包)是一个**基于栈的
* 条件分支if-else可以编写`if 条件:` 开始一个条件块,然后缩进编写分支语句。支持可选的`else:`块。语法分析会生成对应的`IfNode`含条件表达式、then块语句列表、以及可选的else块语句列表。注意当前编译器能识别if语法并通过语义检查但由于IR和虚拟机支持未完善**含有if的代码无法正确编译执行**(详见后续不足部分)。 * 条件分支if-else可以编写`if 条件:` 开始一个条件块,然后缩进编写分支语句。支持可选的`else:`块。语法分析会生成对应的`IfNode`含条件表达式、then块语句列表、以及可选的else块语句列表。注意当前编译器能识别if语法并通过语义检查但由于IR和虚拟机支持未完善**含有if的代码无法正确编译执行**(详见后续不足部分)。
* 循环loop支持类似`loop 条件:`或无条件的循环结构(具体语法可能类似`loop:`表示无限循环,或`loop 条件:`表示当条件为真时循环)。解析产生`LoopNode`其中包含循环条件表达式或无条件以及循环体语句列表。与if相似目前语法和AST层面支持循环但实际编译执行尚未完全实现。 * 循环loop支持类似`loop 条件:`或无条件的循环结构(具体语法可能类似`loop:`表示无限循环,或`loop 条件:`表示当条件为真时循环)。解析产生`LoopNode`其中包含循环条件表达式或无条件以及循环体语句列表。与if相似目前语法和AST层面支持循环但实际编译执行尚未完全实现。
* **函数定义与调用**:可以定义有参数和返回值的函数。函数定义以关键字`function`开始,格式例如: * **函数定义与调用**:可以定义有参数和返回值的函数。函数定义以关键字`function`开始
```
function funcName(param1: INT, param2: STRING): INT
# 函数体若干语句
end function
```
函数可以有多个参数(形参列表带类型注解),以及指定返回类型。函数体内部可以声明局部变量、编写控制流等。支持在函数体内使用`return`语句返回值或提前退出。编译器对函数调用进行了支持包括解析调用表达式、检查参数、在IR中生成调用指令以及虚拟机执行函数调用机制。当前实现应允许运行时递归调用等基本功能。**注意**:函数参数在语义分析时会加入函数作用域符号表,并在调用时按值传递。返回类型为`VOID`表示不返回值,`return`语句可省略值。 函数可以有多个参数(形参列表带类型注解),以及指定返回类型。函数体内部可以声明局部变量、编写控制流等。支持在函数体内使用`return`语句返回值或提前退出。编译器对函数调用进行了支持包括解析调用表达式、检查参数、在IR中生成调用指令以及虚拟机执行函数调用机制。当前实现应允许运行时递归调用等基本功能。**注意**:函数参数在语义分析时会加入函数作用域符号表,并在调用时按值传递。返回类型为`VOID`表示不返回值,`return`语句可省略值。
@ -183,14 +177,8 @@ SCompiler 的虚拟机(位于`org.jcnc.snow.vm`包)是一个**基于栈的
* **运行**:引擎设置好栈等环境后,设置指令指针(程序计数器)从入口点开始。循环执行:取出当前指令对象,调用其执行方法(`Command.execute(...)`)。这个执行过程中会对虚拟机状态进行读写。例如算术指令从OperandStack弹出操作数、运算并压入结果调用指令创建新StackFrame、调整指令指针到被调函数入口返回指令弹出当前StackFrame、恢复调用者指令指针跳转指令修改指令指针跳到目标位置等。每执行完一条指令若未跳转则指令指针顺序加一。如此循环直至遇到程序结束指令例如`HaltCommand`)或指令指针越界。期间如果有异常指令(目前没有异常机制,则可能是虚拟机检测到非法操作如栈溢出等),虚拟机会中止执行并报告错误。 * **运行**:引擎设置好栈等环境后,设置指令指针(程序计数器)从入口点开始。循环执行:取出当前指令对象,调用其执行方法(`Command.execute(...)`)。这个执行过程中会对虚拟机状态进行读写。例如算术指令从OperandStack弹出操作数、运算并压入结果调用指令创建新StackFrame、调整指令指针到被调函数入口返回指令弹出当前StackFrame、恢复调用者指令指针跳转指令修改指令指针跳到目标位置等。每执行完一条指令若未跳转则指令指针顺序加一。如此循环直至遇到程序结束指令例如`HaltCommand`)或指令指针越界。期间如果有异常指令(目前没有异常机制,则可能是虚拟机检测到非法操作如栈溢出等),虚拟机会中止执行并报告错误。
* **输出和调试**:如有需要,虚拟机可以输出计算结果到控制台或者通过`FileIOUtils`写文件等视具体实现而定项目中FileIOUtils可能提供简单IO操作。调试方面`VMStateLogger`可以在每步执行后打印当前操作数栈、局部变量等状态,从而帮助开发者跟踪程序运行轨迹。 * **输出和调试**:如有需要,虚拟机可以输出计算结果到控制台或者通过`FileIOUtils`写文件等视具体实现而定项目中FileIOUtils可能提供简单IO操作。调试方面`VMStateLogger`可以在每步执行后打印当前操作数栈、局部变量等状态,从而帮助开发者跟踪程序运行轨迹。
通过上述阶段SCompiler将源码成功地翻译并运行。一个简单示例总结:对于源码输入: 通过上述阶段SCompiler将源码成功地翻译并运行。
```
module Demo:
function add(a: INT, b: INT): INT
declare sum: INT = a + b
return sum
```
编译器会lexer分出`module`,`function`,`declare`,`return`等Tokenparser建立ModuleNode("Demo")下挂一个FunctionNode("add")里面有DeclarationNode(sum)和ReturnNodesemantic检查类型a、b为Inta+b结果Int赋给sum也为Int返回类型匹配IR生成创建IRFunction("add")发出指令将a和b加载、加法、存sum、再加载sum返回后端转为虚拟机指令序列如`ILoad 0; ILoad 1; IAdd; IStore 2; ILoad 2; Ret`假定a槽0, b槽1, sum槽2虚拟机执行这些指令最终计算出正确结果返回给调用者。整个流程体现了编译各阶段各司其职将高级源代码逐步细化为低级操作并执行的过程。 编译器会lexer分出`module`,`function`,`declare`,`return`等Tokenparser建立ModuleNode("Demo")下挂一个FunctionNode("add")里面有DeclarationNode(sum)和ReturnNodesemantic检查类型a、b为Inta+b结果Int赋给sum也为Int返回类型匹配IR生成创建IRFunction("add")发出指令将a和b加载、加法、存sum、再加载sum返回后端转为虚拟机指令序列如`ILoad 0; ILoad 1; IAdd; IStore 2; ILoad 2; Ret`假定a槽0, b槽1, sum槽2虚拟机执行这些指令最终计算出正确结果返回给调用者。整个流程体现了编译各阶段各司其职将高级源代码逐步细化为低级操作并执行的过程。