求一个C++或Java或者C#写的支持C89的编译器前端,如何解析C语言的声明?

作者:RednaxelaFX
链接:https://www.zhihu.com/question/36003776/answer/65878968
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最重口味的是要不要自己实现C的预处理器/宏语言;
是否支持typedef会影响到scanner/parser的结构,支持会比不支持麻烦不少;一旦C的declaration语法中type specifier被限定为int | void | struct <name>之类的固定情况,许多麻烦自然就消失了…
是否支持ISO C的指针声明语法又是一坑;
是否支持循环的break、continue又是一坑;
还有很多小地方…

之前给题主推荐了lcc,显然题主并不满意。其实我也不是特别喜欢lcc的代码风格:它写得很简洁——但对初学者而言可能过于简洁、紧凑而不容易读懂——但至少它功能是非常完整的。

类似的还有Fabrice Bellard大神的TCC : Tiny C Compiler。同样的代码写得特别紧凑,内建预处理器(tccpp.c)然后直接边parse就边生成代码了(tccgen.c)…
tcc的最新源码在这里:repo.or.cz/w/tinycc.git

如果用简化的C的话,我要继续推荐之前的回答提到的cbc编译器:aamine/cbc · GitHub
它的scanner和parser都是用JavaCC生成的,parser生成出来就是普通的递归下降式,相当直观易懂。
使用Java之类的高级语言编写C编译器,如何实现内存分配,不是Java中无法直接操作内存吗? - RednaxelaFX 的回答
学习编程语言与编译优化的一个书单 - 编程语言与高级语言虚拟机杂谈(仮) - 知乎专栏

《自己动手写编译器、链接器》里的SCC编译器所实现的SC语言比C♭又要更简单一些。

至于C4所实现的C语言子集就更简单了,连struct都不支持,而且代码的紧凑程度比lcc有过之而无不及,肯定不符合题主口味。

前面

用C#写的那个也挺有趣。不过它用了parser combinator来写parser,而且用上了许多C# 6的新功能(真好啊 >_<…),代码风格也未必满足题主的需要呢。

如果只是要parse而不要完整的编译器的话,之前回答里我提到的 shevek/jcpp + shevek/jccfe也是一种选择。
然后另一种选择,Bison系的语法文件这里有提到: 如何对C语言的FOR语句给出一个生成中间代码的语法制导定义? - RednaxelaFX 的回答

转自:https://www.zhihu.com/question/36003776/answer/65878968
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值