Hydrogen-python/README.md
2025-06-12 13:48:30 +08:00

209 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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 的值)。