您的位置:首页 > Web前端

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

2018-02-06 10:34 676 查看
作者: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的最新源码在这里:http://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有过之而无不及,肯定不符合题主口味。

前面

@phisiart

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

如果只是要parse而不要完整的编译器的话,之前回答里我提到的shevek/jcpp +

shevek/jccfe也是一种选择。

然后另一种选择,Bison系的语法文件这里有提到:如何对C语言的FOR语句给出一个生成中间代码的语法制导定义? - RednaxelaFX 的回答

转自:https://www.zhihu.com/question/36003776/answer/65878968
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐