求一个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
链接: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
相关文章推荐
- java中如何声明一个十六进制的字符串,或者说,怎么发送一个十六进制数据?
- C++或者C#中如何拿到一个窗口的标题
- 如何用C语言或者C++解析8486公交数据离线文件?
- 图解Linux下如何搭建C#开发环境(还能写C/C++/Java等程序,只要安装相应的插件和编译器即可)
- 如何在iOS中使用ZXing库(ZXing是一个开源的条码生成和扫描库,开源协议为Apache2.0。它持众多条码格式和语言,比如Java、 C++、 C#、 Objective-C以及Act )
- JAVA如何把一个float四舍五入到小数点后2位,4位,或者其它指定位数.
- 【总结】java命令解析以及编译器,虚拟机如何定位类
- 请教:如何实现UDDI,利用C++或者C#?
- C++与java在编译器上一个不同
- 如何用c++或者C#打开特殊的系统窗口,如power options
- 为什么 C,C++ 与 Java,C# 的 一个隐晦的表面 区别
- JAVA如何把一个float四舍五入到小数点后2位,4位,或者其它指定位数.
- 如何在C#中调用C++或者VB中的命名空间
- (基于Java)编写编译器和解释器-第9章:解析声明-第一部分(连载)
- JAVA如何把一个float四舍五入到小数点后2位,4位,或者其它指定位数.
- 介绍一个 C/C++ 、C#、JAVA 代码美化工具
- NET面试题:在C#中如何声明一个类不能被继承
- 如何声明一个C++全局类对象
- JAVA如何把一个float四舍五入到小数点后2位,4位,或者其它指定位数.
- 【总结】java命令解析以及编译器,虚拟机如何定位类