209 lines
4.4 KiB
Markdown
209 lines
4.4 KiB
Markdown
<h1 align="center"> Hydrogen 语言大纲</h1>
|
||
|
||
[toc]
|
||
|
||
## 1. 语法文档
|
||
|
||
### 1.1 变量
|
||
|
||
|
||
变量声明
|
||
|
||
```go
|
||
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 四元式
|
||
|
||
1. **函数定义**
|
||
- 表示函数入口,例如:(fun, _, _, main)(定义主函数)。
|
||
2. **赋值操作**
|
||
- 将常量或变量赋给临时变量或目标变量,例如:
|
||
- (=, 32, _, _v0)(常量赋值)
|
||
- (=, _v0, _, age)(变量赋值)
|
||
- (=, 0, _, _v18)(常量赋值给临时变量)。
|
||
3. **比较操作**
|
||
- 包括大于等于 (>=) 和小于等于 (<=),生成布尔结果,例如:
|
||
- (>=, foo, _v1, _v2)
|
||
- (<=, foo, _v10, _v11)
|
||
4. **条件跳转**
|
||
- 根据条件判断跳转到指定基本块,例如:(if, _v3, goto, __b3)。
|
||
5. **无条件跳转**
|
||
- 直接跳转到指定基本块,例如:(goto, _, _, __b5)。
|
||
6. **基本块标记**
|
||
- 定义控制流中的基本块,例如:(block, _, _, __b3)。
|
||
7. **算术操作**
|
||
- 执行加法运算,例如:(+, age, a, _v13)。
|
||
8. **返回操作**
|
||
- **新增**:表示函数返回特定值,例如:(return, _, _, _v18)(返回临时变量 _v18 的值)。
|