Go to file
2025-06-12 13:49:33 +08:00
lexical Merge branch 'main' of git.gangary.cn:gary/Hydrogen-python 2025-06-12 13:49:33 +08:00
Optimizer 修改了浮点数的词法分析 2025-06-12 13:20:07 +08:00
semantic 更新ReadMe 2025-06-12 13:48:30 +08:00
syntax 更新ReadMe 2025-06-12 13:48:30 +08:00
.gitignore 添加expression语义 2025-06-12 00:05:54 +08:00
error.py 初始化仓库 2025-06-11 19:51:42 +08:00
main.py 更新ReadMe 2025-06-12 13:48:30 +08:00
README.md 更新ReadMe 2025-06-12 13:48:30 +08:00
test1.c 初始化仓库 2025-06-11 19:51:42 +08:00
test2.c 初始化仓库 2025-06-11 19:51:42 +08:00
test3.c 初始化仓库 2025-06-11 19:51:42 +08:00
test4.c 初始化仓库 2025-06-11 19:51:42 +08:00
test5.c 初始化仓库 2025-06-11 19:51:42 +08:00
test6.c 初始化仓库 2025-06-11 19:51:42 +08:00
test7.c 初始化仓库 2025-06-11 19:51:42 +08:00
test8.c 初始化仓库 2025-06-11 19:51:42 +08:00
test9.c 更新ReadMe 2025-06-12 13:48:30 +08:00
test.c 初始化仓库 2025-06-11 19:51:42 +08:00
test.py 优化了syntax的LL1Generator对象 , 加入debug功能, 加入导出excel表功能 2025-06-11 21:06:40 +08:00
tk_ui.py 更新ReadMe 2025-06-12 13:48:30 +08:00

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 四元式

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