# sysy_compiler **Repository Path**: edidada/sysy_compiler ## Basic Information - **Project Name**: sysy_compiler - **Description**: 使用rust完成北大编译实践课程https://pku-minic.github.io/online-doc/#/ - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-04-07 - **Last Updated**: 2026-08-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SysY Compiler 一个使用 Rust 编写的 SysY 编译器练习项目。它读取 SysY 源程序(可使用 `.c` 或 `.sy` 扩展名),先解析为 AST,再生成 Koopa IR;项目也包含尚在完善中的 RISC-V 输出代码。 更多 SysY 语言背景、示例与本仓库的支持范围请参阅 [SYSY.md](SYSY.md)。 ## 编译什么语言? 输入是 **SysY 语言**,即面向编译原理教学的 C 语言子集,而不是完整的 ISO C。当前实现支持的语法范围如下: - 一个 `int` 返回类型、无参数的函数定义,例如 `int main() { ... }`; - 一个 `return <表达式>;` 语句; - 十进制、八进制和十六进制整数常量; - 圆括号表达式; - 一元 `+`、`-` 和逻辑非 `!` 运算; - 空白、`//` 行注释和 `/* ... */` 块注释。 变量、函数参数、局部声明、赋值、二元运算、条件与循环等完整 SysY/C 功能目前尚未实现。 ## Rust 代码功能 - `src/sysy.lalrpop`:使用 LALRPOP 定义词法跳过规则和 SysY 子集语法; - `src/ast.rs`:定义 AST,并把受支持的表达式转换为 Koopa IR; - `src/ir.rs`:遍历 Koopa IR,提供实验性的 RISC-V 文本生成; - `src/main.rs`:处理命令行参数、读取源文件、调用解析器和写出结果; - `build.rs`:构建时生成 LALRPOP 解析器。 ## 构建与运行 需要稳定版 Rust 工具链。先构建: ```powershell cargo build --locked ``` 将示例 SysY 源文件编译为 Koopa IR: ```powershell cargo run --locked -- -koopa hello.c -o hello.koopa ``` `--` 之后才是编译器自身的参数;缺少 `-koopa`、输入文件或 `-o` 输出文件时,当前程序会因参数校验尚未完善而报错。 `-riscv` 分支会尝试从 Koopa IR 生成 RISC-V 文本,但输出文件写入仍被注释,且后端只覆盖很小一部分 IR,因此暂不应将它视为完整可用的 RISC-V 编译目标。 ## 测试 ```powershell cargo test --locked ``` 目前没有 Rust 单元测试。GitHub Actions 除了构建和运行 `cargo test` 外,还会编译 `hello.c` 并检查生成的 Koopa IR 是否包含预期的函数定义和 `ret 0`。 ## 项目背景 从 Git 历史看,项目始于 2024 年,并按 Koopa IR、RISC-V 输出、单目运算等功能逐步增加实现。仓库说明和提交记录中没有竞赛报名、题目或提交信息,因此**无法将其确认是竞赛项目**;更准确地说,它目前是一个围绕 SysY 编译流程实现的学习/实验项目。SysY 本身常用于编译原理课程与相关训练场景。