# c-compiler **Repository Path**: createmaker/c-compiler ## Basic Information - **Project Name**: c-compiler - **Description**: c-compiler by cursor with zq - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-06 - **Last Updated**: 2025-09-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: C语言 ## README # C编译器 一个用C++编写的简单C编译器,将C源代码翻译成x86-64汇编语言。 ## 功能特性 - **词法分析**:将C源代码标记化 - **语法分析**:构建抽象语法树(AST) - **代码生成**:产生x86-64汇编输出 - **基础C支持**:变量、函数、控制流、算术运算 ## 项目结构 ``` c-compiler/ ├── include/ # 头文件 │ ├── token.h # 标记定义 │ ├── lexer.h # 词法分析器 │ ├── parser.h # 解析器 │ ├── ast.h # 抽象语法树 │ └── codegen.h # 代码生成器 ├── src/ # 源文件 │ ├── main.cpp # 主编译器驱动 │ ├── token.cpp # 标记实现 │ ├── lexer.cpp # 词法分析器实现 │ ├── parser.cpp # 解析器实现 │ ├── ast.cpp # AST实现 │ ├── codegen.cpp # 代码生成器实现 │ └── main.c # 工作版C编译器 ├── examples/ # 示例C程序 │ ├── hello.c # 简单hello world │ ├── arithmetic.c # 算术运算 │ └── control_flow.c # 控制流示例 ├── docs/ # 文档 │ ├── compiler-principles.md │ ├── 编译器原理.md │ ├── working-compiler.md │ └── 工作编译器.md ├── Makefile # 构建配置 ├── README.md # 英文说明 └── README_CN.md # 中文说明 ``` ## 构建编译器 ### 先决条件 - C编译器(gcc、clang) - Linux/macOS(用于x86-64汇编) ### 构建说明 ```bash # 克隆或下载项目 cd c-compiler # 构建简单C编译器 gcc src/main.c -o bin/c-compiler-simple # 测试编译器 ./bin/c-compiler-simple examples/hello.c ``` ### 替代C++构建(如果C++标准库可用) ```bash # 构建完整C++编译器 make # 运行测试 make test # 清理构建产物 make clean ``` ## 使用方法 ```bash # 将C文件编译为汇编(简单版本) ./bin/c-compiler-simple input.c # 示例 ./bin/c-compiler-simple examples/hello.c ``` ### 完整C++版本(如果可用) ```bash # 将C文件编译为汇编 ./bin/c-compiler input.c output.s # 示例 ./bin/c-compiler examples/hello.c hello.s ``` ## 示例程序 ### Hello World ```c int main() { int x = 5; int y = 10; int result = x + y; return result; } ``` ### 算术运算 ```c int add(int a, int b) { return a + b; } int multiply(int x, int y) { return x * y; } int main() { int a = 10; int b = 20; int sum = add(a, b); int product = multiply(a, b); return sum + product; } ``` ### 控制流 ```c int max(int a, int b) { if (a > b) { return a; } else { return b; } } int factorial(int n) { int result = 1; int i = 1; while (i <= n) { result = result * i; i = i + 1; } return result; } ``` ## 生成的汇编 编译器生成AT&T语法的x86-64汇编代码。例如,hello world程序产生: ```assembly .section .text .global _start main: push %rbp mov %rsp, %rbp ; int x = 5; mov $5, %rax mov %rax, -8(%rbp) ; int y = 10; mov $10, %rax mov %rax, -16(%rbp) ; int result = x + y; mov -8(%rbp), %rax push %rax mov -16(%rbp), %rax pop %rcx add %rcx, %rax mov %rax, -24(%rbp) ; return result; mov -24(%rbp), %rax mov %rbp, %rsp pop %rbp ret _start: mov $60, %rax mov $0, %rdi syscall ``` ## 编译器阶段 1. **词法分析**:将源代码分解为标记 2. **语法分析**:构建抽象语法树 3. **代码生成**:产生汇编代码 ## 支持的C特性 ### 数据类型 - `int` - 32位整数 - `char` - 8位字符 - `float` - 32位浮点 - `double` - 64位浮点 - `void` - 无类型 ### 控制流 - `if` / `else` 语句 - `while` 循环 - `return` 语句 ### 操作符 - 算术:`+`、`-`、`*`、`/`、`%` - 比较:`==`、`!=`、`<`、`<=`、`>`、`>=` - 逻辑:`&&`、`||`、`!` - 赋值:`=` ### 函数 - 函数声明 - 函数调用 - 参数和返回值 ## 限制 - 无数组或指针 - 无结构体或联合 - 无预处理器指令 - 无标准库函数 - 无类型检查 - 无优化 - 有限的错误处理 ## 文档 查看 `docs/编译器原理.md` 了解编译器理论和实现的详细解释。 ## 贡献 这是一个教育项目。欢迎: - 添加新的语言特性 - 改进错误处理 - 添加优化 - 修复错误 - 改进文档 ## 许可证 本项目用于教育目的。根据需要自由使用和修改。