Files
2026-05-30 07:59:28 +08:00

117 lines
6.0 KiB
Markdown
Raw Permalink 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.
# Requirements Document
## Introduction
本项目旨在开发一个使用 C# 语言编写的 C 语言编译器,参考 TCCTiny C Compiler的设计理念。编译器将 C 源代码直接编译为 x86/x64 本地机器码,而非 MSILMicrosoft Intermediate Language。目标是实现一个轻量级、快速的 C 编译器,支持 C99 标准的核心特性。
## Glossary
- **TCC**: Tiny C Compiler一个小型、快速的 C 编译器
- **本地代码**: 直接可在 CPU 上执行的机器码x86/x64
- **MSIL**: Microsoft Intermediate Language.NET 平台的中间语言
- **代码生成**: 将中间表示转换为目标机器码的过程
- **词法分析**: 将源代码分解为 token 流的过程
- **语法分析**: 将 token 流构建为抽象语法树AST的过程
- **语义分析**: 验证 AST 的语义正确性并进行类型检查
- **目标平台**: x86 (32-bit) 和 x64 (64-bit) Windows/Linux
## Requirements
### Requirement 1: 词法分析器
**User Story:** AS 一个 C 编译器开发者I WANT 实现词法分析器SO THAT 可以将 C 源代码转换为 token 流
#### Acceptance Criteria
1. WHEN 接收到 C 源代码文件,词法分析器 SHALL 输出 token 流
2. WHEN 遇到 C 语言关键字if, else, while, for, int, char 等),词法分析器 SHALL 识别为关键字 token
3. WHEN 遇到标识符,词法分析器 SHALL 识别为标识符 token
4. WHEN 遇到字面量(整数、浮点数、字符、字符串),词法分析器 SHALL 识别为相应的字面量 token
5. WHEN 遇到注释(单行 // 和多行 /* */),词法分析器 SHALL 忽略注释内容
6. WHEN 遇到词法错误,词法分析器 SHALL 报告错误位置和错误信息
### Requirement 2: 语法分析器
**User Story:** AS 一个 C 编译器开发者I WANT 实现语法分析器SO THAT 可以将 token 流构建为抽象语法树AST
#### Acceptance Criteria
1. WHEN 接收到 token 流,语法分析器 SHALL 构建 AST
2. WHEN 遇到语法错误,语法分析器 SHALL 报告错误位置和错误描述
3. WHILE 解析表达式,语法分析器 SHALL 正确处理运算符优先级
4. WHEN 解析函数定义,语法分析器 SHALL 识别函数名、参数列表和函数体
5. WHEN 解析控制流语句if, while, for, switch语法分析器 SHALL 构建对应的控制流 AST 节点
### Requirement 3: 语义分析器
**User Story:** AS 一个 C 编译器开发者I WANT 实现语义分析器SO THAT 可以验证 AST 的语义正确性
#### Acceptance Criteria
1. WHEN 接收到 AST语义分析器 SHALL 执行类型检查
2. WHEN 遇到未声明的变量,语义分析器 SHALL 报告错误
3. WHEN 遇到类型不匹配的赋值或运算,语义分析器 SHALL 报告类型错误
4. WHEN 遇到函数调用,语义分析器 SHALL 验证函数签名和参数类型
5. WHILE 解析作用域,语义分析器 SHALL 正确管理变量的作用域
### Requirement 4: 中间表示IR生成
**User Story:** AS 一个 C 编译器开发者I WANT 生成中间表示SO THAT 可以优化并转换为目标机器码
#### Acceptance Criteria
1. WHEN 接收到语义分析后的 ASTIR 生成器 SHALL 输出三地址码形式的 IR
2. WHEN 生成 IRIR 生成器 SHALL 处理控制流图的构建
3. WHILE 生成 IRIR 生成器 SHALL 支持基本的数据流分析
### Requirement 5: 代码生成器x86/x64
**User Story:** AS 一个 C 编译器开发者I WANT 实现代码生成器SO THAT 可以将 IR 转换为 x86/x64 本地机器码
#### Acceptance Criteria
1. WHEN 接收到 IR代码生成器 SHALL 输出 x86/x64 机器码
2. WHEN 处理函数调用,代码生成器 SHALL 遵循目标平台的调用约定calling convention
3. WHEN 处理局部变量,代码生成器 SHALL 分配栈空间
4. WHEN 处理全局变量,代码生成器 SHALL 在数据段分配空间
5. IF 目标平台为 x64代码生成器 SHALL 使用 x64 寄存器
6. IF 目标平台为 x86代码生成器 SHALL 使用 x86 寄存器
### Requirement 6: 可执行文件生成
**User Story:** AS 一个 C 编译器用户I WANT 编译器生成可执行文件SO THAT 可以直接运行编译后的程序
#### Acceptance Criteria
1. WHEN 编译完成,编译器 SHALL 生成 PEWindows或 ELFLinux格式的可执行文件
2. WHEN 生成 PE 文件,编译器 SHALL 包含正确的 PE 头和节表
3. WHEN 生成 ELF 文件,编译器 SHALL 包含正确的 ELF 头和节头
4. WHEN 生成的可执行文件被操作系统加载,操作系统 SHALL 能够正确执行程序
### Requirement 7: 命令行接口
**User Story:** AS 一个 C 编译器用户I WANT 使用命令行编译 C 文件SO THAT 可以方便地集成到构建系统中
#### Acceptance Criteria
1. WHEN 用户提供源文件路径,编译器 SHALL 编译并生成可执行文件
2. WHEN 用户指定输出文件名,编译器 SHALL 使用指定的文件名
3. WHEN 用户指定目标架构x86/x64编译器 SHALL 生成对应架构的代码
4. IF 编译过程中发生错误,编译器 SHALL 输出错误信息并返回非零退出码
5. WHEN 用户请求帮助信息,编译器 SHALL 显示使用说明
### Requirement 8: C99 核心特性支持
**User Story:** AS 一个 C 程序员I WANT 编译器支持 C99 核心特性SO THAT 可以编译现有的 C 代码
#### Acceptance Criteria
1. WHEN 编译 C99 代码,编译器 SHALL 支持基本数据类型int, char, float, double, long, short
2. WHEN 编译 C99 代码,编译器 SHALL 支持指针和数组
3. WHEN 编译 C99 代码,编译器 SHALL 支持结构体struct和联合体union
4. WHEN 编译 C99 代码,编译器 SHALL 支持函数定义和调用
5. WHEN 编译 C99 代码,编译器 SHALL 支持控制流语句if, else, while, for, do-while, switch, break, continue, return
6. WHEN 编译 C99 代码,编译器 SHALL 支持宏定义(#define)和条件编译(#ifdef, #ifndef, #endif
7. WHEN 编译 C99 代码,编译器 SHALL 支持头文件包含(#include
8. IF 使用 C99 特性(如单行注释 //),编译器 SHALL 正确解析