修改文档
This commit is contained in:
parent
6f2f2bb38e
commit
25ec8844dd
@ -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`等Token;parser建立ModuleNode("Demo")下挂一个FunctionNode("add"),里面有DeclarationNode(sum)和ReturnNode;semantic检查类型(a、b为Int,a+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`等Token;parser建立ModuleNode("Demo")下挂一个FunctionNode("add"),里面有DeclarationNode(sum)和ReturnNode;semantic检查类型(a、b为Int,a+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);虚拟机执行这些指令,最终计算出正确结果返回给调用者。整个流程体现了编译各阶段各司其职,将高级源代码逐步细化为低级操作并执行的过程。
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user