LLVM平台,短短几年间,改变了众多编程语言的走向,也催生了一大批具有特色的编程语言的出现,不愧为编译器架构的王者,也荣获2012年ACM软件系统奖 —— 题记
版权声明:本文为 西风逍遥游 原创文章,转载请注明出处 西风世界 http://blog.youkuaiyun.com/xfxyy_sxfancy
函数的翻译方法
前面介绍了许多编译器架构上面的特点,如何组织语法树、如果多遍扫描语法树。今天开始,我们就要设计本编译器中最核心的部分了,如何设计一个编译时宏,再利用LLVM按顺序生成模块。
设计宏
我们的编译器可以说是宏驱动的,因为我们扫描每个语法节点后,都会考察当前是不是一个合法的宏,例如我们来分析一下上一章的示例代码:
void hello(int k, int g) {
......
}
我暂时隐藏了函数体部分,让大家先关注一下函数头
String function
String void
String hello
Node
Node
String set
String int
String k
Node
String set
String int
String g
Node
......
我们的语法树的每一层相当于是链表组织的,通过next指针都可以找到下一个元素。
而语法树的开头部分,是一个“function”的宏名称,这个部分就是提示我们用哪个宏函数来翻译用的。
接下来的节点就是: 返回类型,函数名,参数表,函数体
例如参数表,里面的内容很多,但我们扫描时,它们是一个整体,进行识别。