2011-01-18 117 views
11

我想编写自己的编程语言作为c编程语言的扩展。我正在发明的整个编程语言只是简单的转换为有效c代码的简写。例如:使用gcc扩展c编程语言

namespace TcpConnection { 
    void* connect(char *addr) 
} 

将转化:

void* TcpConnection_connect(char *addr) 

所有这一切都做的是一个简单的名称更换。这只是我想提供的扩展的一个例子。另一个简单的扩展是函数重载(这将连接到函数名称末尾的参数类型)。

在任何情况下,结果都是完全有效的C代码。是否有任何方法可以不进入gcc代码?

回答

13

你可以编写一个预处理程序来解析你的语言,然后将它编译成C语言,然后传递给gcc,这就是C++早期实现的工作方式,但是你可能更喜欢使用LLVM的clang,其设计用于支持多种C系列语言,并且作为LLVM的一部分,也被设计为更模块化,更易于扩展。

2

对于原型设计,也许只需要使用预处理器用您选择的语言(C,Perl,Python ...)编写,然后将其构建到您的Makefile规则中。只是为了获得一种简单,低成本的方式来尝试一切...

使用不同的文件扩展名,并将.foo转换为.c。

0

你可以砍的东西上的http://cil.sourceforge.net/

顶锵是另一种选择,但它不是最有用的代码重写工具,并修改其解析器前端并不容易。

1

我做了一些类似于嵌入汇编语言的自定义字节码格式,使用一些C99宏魔法和Perl。

#define x3_pragma_(...) _Pragma(#__VA_ARGS__) 
#define x3_asm(...) ((const struct x3instruction []){ \ 
    x3_pragma_(X3 ASM __VA_ARGS__) \ 
}) 

变换

x3_asm(exit = find val(0)) 

((const struct x3instruction []){ 
#pragma X3 ASM exit = find val(0) 
}) 

其获得通过一个Perl脚本,管道获得

((const struct x3instruction []){ 
{ { { X3_OPFINDVAL, { .as_uint = (0) } }, { X3_OPEXIT, { 0 } } } }, 
}) 

GCC和Perl的样本调用是这样的:

gcc -E foo.c | perl x3pp.pl | gcc -o foo.o -x c - 

它比stricly需要更复杂,但我认为是有益的C预处理我的自定义预处理程序运行之前,我也很喜欢,通过使用杂记,源码保持合法C.