Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Toyc Compiler

Toyc Compiler 是一个简易的编译器实现,用于将类 C 语言的源代码编译为 RISC-V 汇编代码。该编译器包含词法分析、语法分析、语义分析和代码生成等完整编译流程。

功能特点

  • 支持基本的类 C 语法结构(函数定义、变量声明、条件语句、循环语句等)
  • 实现完整的编译流程:词法分析 → 语法分析 → 语义分析 → 代码生成
  • 生成符合 RISC-V 架构的汇编代码
  • 支持函数调用、参数传递和返回值处理
  • 实现寄存器分配和栈管理,包括栈帧对齐和溢出处理

技术架构

编译器主要由以下几个模块组成:

  1. 词法分析器(Lexer):将源代码转换为 token 序列
  2. 语法分析器(Parser):根据 token 序列构建抽象语法树(AST)
  3. 语义分析器(SemanticAnalyzer):检查代码中的语义错误
  4. 代码生成器(CodeGenerator):将 AST 转换为 RISC-V 汇编代码
  5. 辅助组件:包括符号表管理、寄存器分配器等

支持的语法

数据类型

  • 整数类型(int)
  • 空类型(void)

语句

  • 变量声明与初始化(int a; 或 int b = 5;)
  • 赋值语句(a = b + c;)
  • 条件语句(if-else)
  • 循环语句(while)
  • 跳转语句(break、continue、return)
  • 表达式语句
  • 块语句({ ... })

表达式

  • 算术运算(+、-、*、/、%)
  • 关系运算(==、!=、<、>、<=、>=)
  • 逻辑运算(&&、||、!)
  • 函数调用表达式

函数

  • 函数定义(支持int和void返回类型)
  • 函数参数(最多支持 8 个寄存器传递参数,超过的通过栈传递)
  • 函数调用

编译与使用

编译环境

  • C++17 或更高版本编译器
  • CMake 3.28.3 或更高版本
  • 支持 RISC-V 汇编的环境(如 QEMU 模拟器)

编译步骤

  1. 克隆代码仓库

    git clone <仓库地址>
    cd compiler-gitee-master
  2. 创建构建目录并编译

    mkdir build
    cd build
    cmake ..
    make
  3. 运行编译器

    ./Toyc_Complier < input_file > output.asm
  4. 使用 RISC-V 工具链编译生成的汇编代码

    riscv64-unknown-elf-gcc -o output output.asm
  5. 使用 QEMU 运行程序

    qemu-riscv64 ./output

代码结构

compiler-gitee-master/
├── include/               # 头文件目录
│   ├── Lexer.h            # 词法分析器头文件
│   ├── Parser.h           # 语法分析器头文件
│   ├── ASTVisitor.h       # AST访问器接口
│   ├── CodeGenerator.h    # 代码生成器头文件
│   └── SemanticAnalyzer.h # 语义分析器头文件
├── src/                   # 源代码目录
│   ├── Lexer.cpp          # 词法分析器实现
│   ├── Parser.cpp         # 语法分析器实现
│   ├── Codegen.cpp        # 代码生成器实现
│   └── ...
├── main.cpp               # 主程序入口
└── CMakeLists.txt         # 构建配置文件

示例

输入代码(类 C 语言)

int add(int a, int b) {
    return a + b;
}

int main() {
    int x = 5;
    int y = 3;
    int z = add(x, y);
    return z;
}

生成的 RISC-V 汇编代码(简化版)

.data

.text
.global main

add:
    # 函数序言
    addi sp, sp, -16
    sw ra, 12(sp)
    sw fp, 8(sp)
    addi fp, sp, 16
    
    # 函数体
    lw t0, 0(sp)    # 加载参数a
    lw t1, 4(sp)    # 加载参数b
    add a0, t0, t1  # 计算a + b,结果存入a0
    
    # 函数尾声
add_epilogue:
    lw ra, 12(sp)
    lw fp, 8(sp)
    addi sp, sp, 16
    jr ra

main:
    # 函数序言(略)
    
    # 变量初始化
    li t0, 5
    sw t0, 0(sp)    # x = 5
    li t0, 3
    sw t0, 4(sp)    # y = 3
    
    # 调用add函数
    lw a0, 0(sp)
    lw a1, 4(sp)
    call add
    sw a0, 8(sp)    # z = add(x, y)
    
    # 返回
    lw a0, 8(sp)
main_epilogue:
    # 函数尾声(略)
    jr ra

限制与未来改进

当前版本的编译器存在一些限制:

  • 仅支持整数类型
  • 不支持数组和结构体
  • 不支持指针
  • 优化程度有限

未来可以考虑的改进方向:

  • 增加更多数据类型支持
  • 实现更复杂的控制流结构
  • 加入代码优化阶段
  • 支持更多的 C 语言特性

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages