Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

a toy compiler that compiles SysY (a subset of C) to RISC-V

License

NotificationsYou must be signed in to change notification settings

CuWO4/SysY-Compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

C 的子集SysY 编译为RISC-V 的玩具编译器.

参考文档:北大编译实践在线文档.


简述

实现SysYKoopa IRRISC-V 的编译.

SysYC 的子集. 详见SysY 标准概述.

Koopa IR 是北大编译实践课模仿LLVM IR 设计的中间表示. 详见Koopa IR 标准概述.

RISC-V 是由加州大学伯克利分校设计并推广的第五代 RISC 指令系统体系结构. 详见RISC-V手册.

项目支持了部分原版SysY 不支持的C 语法. 此外, 项目未使用北大编译实践课程提供的Koopa IR 框架.

编译

make

make release

Windows 平台若因为sysy.lex.cpp 缺少unistd.h 头文件导致编译失败, 可尝试下载MinGW 提供的flex 依赖后, 将makefile 中的CXX := clang++ 替换为CXX := g++.

运行

sysyc [MODE] -o [TARGET] [DBG-FLAGS]
  • [MODE] 指定编译模式, 可选值:

    • -koopa: 生成Koopa IR;

    • -riscv: 生成RISC-V;

    • -test: 向控制台打印AST.

  • [TARGET] 指定目标文件.

  • [DBG-FLAGS] 指定DEBUG 模式, 可选值(可同时启用):

    • -dbg-k: 生成的Koopa IR 代码中会包含类型信息;

    • -dbg-r: 生成的RISC-V 代码中会包含Koopa IR 原句.

测试

本节内容依赖Docker 镜像maxxing/compiler-dev, 须在相应容器中运行.

自动测试

test.py [STAGE] [TARGET-LANG]
  • STAGE: 指定测试样例阶段; 当未指定时, 测试所有阶段. 可选值:lv1,lv2, ... ,lv9,perf.

  • TARGET-LANG: 指定测试语言; 当未指定时, 测试所有语言. 可选值:koopa,riscv.

手动测试

test.py hello [MODE] [DBG-FLAGS]

以指定的MODEDBG-FLAGS 编译testcases/hello/hello.c, 详见运行.

示例

主题CKoopa IRRISC-V
斐波那契数列fib.cfib.koopafib.S
归并排序msort.cmsort.koopamsort.S
快速傅里叶变换fft.cfft.koopafft.S

历史版本

v1.0 2024-5-5. 实现无优化的编译.

作者

CuWO4,邮箱.

环境

  • Unbuntu 20.04.6 LTS;

  • Ubuntu clang version 13.0.1;

  • flex 2.6.4;

  • bison (GNU Bison) 3.5.1;

  • GNU Make 4.2.1.

TODO LIST

  • 寄存器分配.

  • 支持更多语法.

    • 函数声明;

    • 自增, 自减, 算术赋值, 位运算, 三目运算符;

    • 指针运算;

    • 字符串常量;

    • 结构体;

    • 预处理命令;

    • 更多类型;

    • do-while 语句,switch 语句,goto 语句.

  • 编译优化.

    • DCE;

    • 常量传播;

    • 控制流化简;

    • 窥孔优化;

    • 强度削弱.

SysY 概述

支持的全局语句: 不隐去形参名的函数声明, 函数定义, 全局变量定义.

支持的子句: 变量定义, 表达式语句,return,if,else,while,for,break,continue.

支持的类型:int,void, 数组, 形如T[]的指针.

支持的运算符:

  • 算术:+,-,*,/,%,+(单目),-(单目);

  • 逻辑:!,||,&&;

  • 比较:==,!=,<,>,<=,>=;

  • 赋值:=;

  • 其它:()1,[]2,,.

运行时库:无需包含头文件, 自动声明以下八个函数:

intgetint();intgetch();intgetarray(int[]);voidputint(int);voidputch(int);voidputarray(int,int[]);voidstarttime();voidstoptime();

规范详见SysY 运行时库.


Footnotes

  1. 函数调用.

  2. 数组解引用.

About

a toy compiler that compiles SysY (a subset of C) to RISC-V

Topics

Resources

License

Stars

Watchers

Forks


[8]ページ先頭

©2009-2025 Movatter.jp