Skip to content

Latest commit

 

History

50 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ToyC Compiler

一个用C++实现的简单C语言子集编译器,将Toy C代码编译为RISC-V 32位汇编代码。

功能特性

  • 词法分析: 支持关键字、标识符、字面量、运算符和分隔符
  • 语法分析: 递归下降解析器,构建抽象语法树(AST)
  • 语义分析: 类型检查和符号表管理
  • 代码生成: 生成RISC-V 32位汇编代码

支持的语法

数据类型

  • int - 整数类型
  • void - 空类型

语句

  • 变量声明: int x = 10;
  • 赋值: x = 20;
  • 条件语句: if (x > 0) { ... } else { ... }
  • 循环语句: while (x > 0) { ... }
  • 返回语句: return x;
  • 中断语句: break;, continue;
  • 表达式语句: x + y;

表达式

  • 算术运算: +, -, *, /, %
  • 比较运算: ==, !=, <, <=, >, >=
  • 逻辑运算: &&, ||, !
  • 函数调用: func(x, y)

函数

  • 函数定义和调用
  • 参数传递
  • 返回值

构建方法

使用Makefile

# 编译
make

# 编译测试
make compile-test

# 清理
make clean

使用方法

# 编译Toy C程序为RISC-V汇编
./bin/toycc <输入文件>

# 示例
./bin/toycc test/example.toyc
# 输出: example.s (RISC-V汇编文件)

输出格式

编译器会生成标准的RISC-V 32位汇编代码,包含:

  • .text 段:代码段
  • 函数标签和调用约定
  • 栈帧管理
  • 寄存器分配
  • 控制流指令

生成的汇编文件可以直接用RISC-V工具链汇编和链接。

项目结构

ToyCC/
├── include/           # 头文件
│   ├── ast.h         # 抽象语法树定义
│   ├── lexer.h       # 词法分析器
│   ├── parser.h      # 语法分析器
│   ├── codegen.h     # 代码生成器
│   └── semantic.h    # 语义分析器
├── src/              # 源文件
│   ├── main.cpp      # 主程序入口
│   ├── lexer.cpp     # 词法分析器实现
│   ├── parser.cpp    # 语法分析器实现
│   ├── codegen.cpp   # 代码生成器实现
│   ├── ast.cpp       # AST辅助函数
│   └── semantic.cpp  # 语义分析器实现
├── test/             # 测试文件
│   └── example.toyc  # 示例程序
├── Makefile          # Make构建文件
└── README.md         # 项目说明

开发计划

  • 实现词法分析器 (src/lexer.cpp)
  • 实现语法分析器 (src/parser.cpp)
  • 完善代码生成器 (src/codegen.cpp)
  • 添加优化pass

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages