TinyCMips - 1 C语言子集到Mips子集编译器项目开坑

TinyCMips是我最近在写的一个编译器,就像标题所说,是一个C语言子集到Mips子集的编译器,开这个坑的目的大概是这样的

  1. 就是为了写一个完整的编译器
  2. 准备大三编译原理课拿来复用
  3. 大二他们上计组课的可以拿来将C代码编译到课程用的Mips CPU
  4. 满足个人兴趣
  5. 充实简历

之所以选择C语言并且是子集,首先是因为C标准十分庞大,其次是因为这个编译器是尝试给大二他们用在计组课上的,目标CPU只支持20余条指令,也不需要太多的功能,再次是因为C语言其中有一些糟粕的东西应当剔除,比如前后置++,连续赋值等。所以这个项目选择一个C语言的子集。因为是子集,所以所有能通过TinyCMips编译的代码理应能通过正常的Standard C编译器的编译。

语言的便宜目标是Mips,因为课程所用的Mips CPU只支持少量指令,所以并不能用市面上现成的可以编译到Mips目标的编译器,因此要自己写。

语言本身被我剔除的feature包括:

  • 所有的storage-class-specifier (auto static typedef…)
  • 所有的type-specifier (const volatile restrict)
  • 所有的function-specifier (inline)
  • 一部分type-specifier (去除enum struct union 浮点类型等,只保留signed unsigned int char)
  • 去除前后置++—运算符
  • 去除连续赋值 (a = b = c)
  • 去除成员存取运算符 (. –> 因为根本没有struct union)
  • 去除常量和字符串字面量的前后缀 (0x10u L"string"…)
  • 去除浮点常量 (因为根本没有浮点类型)
  • 去除部分语句 (只保留while和if-else)

可以看到语言本身是保留了所有数学运算符的,这也是为了面向课程需要。C语言中for和do while循环可以轻松转写为while循环,因此只保留一个,if-else与switch类似,只保留前者。

 

假期刚刚开始,所以并没有写太多,词法分析已经写好了,语法分析中declarator和type-specifier的处理已经基本写好了,刚刚整理了一下表达式的文法,发现还挺麻烦的,都写出来纯粹是苦力活,也许我该写个parser generator?

不管了先写着

祝大家春节快乐

posted on 2017-01-26 22:23  PointerSMQ  阅读(596)  评论(0编辑  收藏  举报