Skip to content

一个基于 LL(1) 文法构建的 C 语言编译器,支持基本的 C 语言语法特性。

Notifications You must be signed in to change notification settings

Owl23007/CCompiler

Repository files navigation

C 编译器 - 使用说明

一个基于 LL(1) 文法构建的 C 语言编译器,支持基本的 C 语言语法特性。

🚀 快速开始

系统要求

  • Windows 操作系统
  • GCC 编译器
  • PowerShell 或命令行界面

编译编译器

# 快速编译
.\build.bat

# 完整编译和测试
.\build_and_test.bat

使用编译器

# 编译C源文件
.\compiler.exe <源文件名.c>

# 示例
.\compiler.exe simple_test.c

📋 支持的语言特性

✅ 已实现功能

基本语法

  • 变量声明: int a;, int b = 5;
  • 数据类型: int, char, void
  • 赋值操作: a = b + 1;

运算符

  • 算术运算: +, -, *, /, %
    • 支持基本四则运算和取模运算
    • 正确处理运算符优先级(乘除优先于加减)
    • 支持负数运算
  • 比较运算: <, <=, >, >=, ==, !=
    • 支持所有关系比较运算符
    • 返回布尔值(0 或 1)

控制流

  • 条件语句: if-else
  • 循环语句: while, for
  • 函数调用: 自定义函数和递归调用
  • 返回语句: return

函数

  • 函数定义: 支持参数和返回值
  • 函数调用: 支持多层函数调用
  • 参数传递: 按值传递

🛠️ 构建脚本

build.bat

快速编译脚本,只编译编译器本身:

.\build.bat

build_and_test.bat

完整的构建和测试脚本,编译编译器并运行所有测试:

.\build_and_test.bat

clean.bat

清理临时文件和编译产物:

.\clean.bat

🏗️ 编译器架构

编译流程

  1. 词法分析 (lexer.c) - 将源代码转换为 token 流
  2. 语法分析 (parser.c) - 生成抽象语法树(AST)
  3. 中间代码生成 (ir_gen.c) - 生成中间表示(IR)
  4. 目标代码生成 (code_gen.c) - 生成 x86 汇编代码
  5. 链接 - 使用 GCC 生成最终可执行文件

目录结构

CCompiler/
├── src/                 # 源代码
│   ├── lexer.c         # 词法分析器
│   ├── parser.c        # 语法分析器
│   ├── ir_gen.c        # 中间代码生成器
│   ├── code_gen.c      # 目标代码生成器
│   └── main.c          # 主程序
├── include/            # 头文件
├── obj/               # 目标文件
├── *.c                # 测试文件
├── build.bat          # 快速构建脚本
├── build_and_test.bat # 完整构建测试脚本
└── clean.bat          # 清理脚本

🔧 命令行选项

.\compiler.exe <输入文件> [选项]

选项:
  -o <文件>     指定输出文件名 (默认: a.s)
  --tokens      打印词法分析结果
  --ast         打印抽象语法树
  --ir          打印中间代码
  --help        显示帮助信息

使用示例

# 编译并显示中间过程
.\compiler.exe simple_test.c --tokens --ast --ir

# 指定输出文件
.\compiler.exe simple_test.c -o output.s

🧪 测试

运行所有测试用例:

.\build_and_test.bat

测试文件说明

基础功能测试

  • simple_test.c - 基本语法和条件语句测试
  • function_test.c - 函数定义和调用测试
  • loop_test.c - while 和 for 循环综合测试
  • for_test.c - for 循环专项测试
  • simple_operator_test.c - 运算符测试

About

一个基于 LL(1) 文法构建的 C 语言编译器,支持基本的 C 语言语法特性。

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published