lexical | ||
Optimizer | ||
semantic | ||
syntax | ||
.gitignore | ||
error.py | ||
main.py | ||
README.md | ||
test1.hy | ||
test2.hy | ||
test3.hy | ||
test4.hy | ||
test5.hy | ||
test6.hy | ||
test7.hy | ||
test.py | ||
tk_ui.py |
Hydrogen 语言大纲
[toc]
1. 语法文档
1.1 变量
变量声明
i32 f1; // 整型字变量默认为i32,支持自动类型转换
f32 f2;
i32[5] f3; // 数组声明
f32[93] f4;
支持的数值类型
实数类型 | 数组类型 |
---|---|
i32 | i32[num-int] |
f32 | f32[num-int] |
1.2 注释
单行注释
单行注释使用 //
开头,后面跟随注释内容。例如:
// 这是一个单行注释
多行注释
多行注释使用 /*
开头,并以 */
结束。例如:
/*
这是一个多行注释
可以跨越多行
*/
1.3 控制结构
if 语法
if condition {
// 当 condition 为 true 时执行的代码
} else {
// 当 condition 为 false 时执行的代码
}
condition 的类型必须是 bool
可以使用 else 语法来检查多个条件,示例:
fn main() {
i32 type;
i32 foo;
age = 32;
if foo >= 60 {
a = 0;
} else {
if foo >= 18 {
a = 1;
} else {
a = 2;
}
}
}
While 语法
while
语句用于循环执行代码块。Nature 语言中的 for
语句有三种主要形式:经典循环、条件循环。
- 经典循环
经典循环用于执行固定次数的循环。基本语法如下:
fn main() {
i32 a;
i32 sum;
a = 0;
sum = 0;
while a <= 100 {
sum = sum + a;
a = a + 1;
}
}
在这个示例中,循环从 i = 1
开始,每次循环 i
增加 1,直到 i
大于 100。
- 1.5 算术运算符
优先级 | 关键字 | 使用示例 | 说明 |
---|---|---|---|
1 | () | (1 + 1) | (expr) |
2 | / | 1 / 2 | 除 |
2 | * | 1 * 2 | 乘 |
2 | % | 5 % 2 | 余数 |
3 | + | 1 + 1 | 加 |
3 | - | 1 - 1 | 减 |
4 | > | 1 > 2 | 大于 |
4 | >= | 1 >= 2 | 大于等于 |
4 | < | 1 < 2 | 小于 |
4 | <= | 1 <= 2 | 小于等于 |
4 | == | 1 == 2 | 等于 |
4 | != | 1 != 2 | 不等于 |
1.4 函数
函数声明语法如下
fn 函数名(参数名:参数类型,....) -> 返回类型 {
...
}
注意: -> 返回类型可以省略,省略后默认返回void
例子:
fn main() {
return 0;
}
2. 实现细节
2.1 符号表
全局变量表
Name | Type | Width | Offset |
---|---|---|---|
g_a | i32 | 4 | 0 |
函数表
Function Name | Return Type | Local Var Table |
---|---|---|
main | void | main |
局部变量表
表名称:main
Name | Type | Width | Offset | Is Param |
---|---|---|---|---|
test | i32 | 4 | 0 | True |
a | i32[] | 128 | 4 | False |
2.2 四元式
- 函数定义
- 表示函数入口,例如:(fun, _, _, main)(定义主函数)。
- 赋值操作
- 将常量或变量赋给临时变量或目标变量,例如:
- (=, 32, _, _v0)(常量赋值)
- (=, _v0, _, age)(变量赋值)
- (=, 0, _, _v18)(常量赋值给临时变量)。
- 将常量或变量赋给临时变量或目标变量,例如:
- 比较操作
- 包括大于等于 (>=) 和小于等于 (<=),生成布尔结果,例如:
- (>=, foo, _v1, _v2)
- (<=, foo, _v10, _v11)
- 包括大于等于 (>=) 和小于等于 (<=),生成布尔结果,例如:
- 条件跳转
- 根据条件判断跳转到指定基本块,例如:(if, _v3, goto, __b3)。
- 无条件跳转
- 直接跳转到指定基本块,例如:(goto, _, _, __b5)。
- 基本块标记
- 定义控制流中的基本块,例如:(block, _, _, __b3)。
- 算术操作
- 执行加法运算,例如:(+, age, a, _v13)。
- 返回操作
- 新增:表示函数返回特定值,例如:(return, _, _, _v18)(返回临时变量 _v18 的值)。