码迷,mamicode.com
首页 > 编程语言 > 详细

创造新语言(1)——确定架构

时间:2015-04-14 00:48:37      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:编译   c   新语言   编译原理   编译器   

最近写C代码很不爽,感觉很多地方十分冗余,希望能够改进一下,于是诞生了这个想法,利用学过的编译原理的前端知识,构建一门新语言的编译器,然后将新语言翻译成为标准的C89。

这样,即保障了可用性,同时又大大减轻了后端的工作量,何乐而不为呢?
我说明一下选择C89的原因,首先,C语言的扩展不多,主要是C++和Objective-C。编译到的目标语言平台,如果是C++,太重了,难以做操作系统级的编程,但如果想让编译器设计的十分轻巧,那么就要尽量回避重型语言。

Java也是一个不错的选择,但其平台上已经有诸多诸如Scala的良好设计的语言,再继续开发新版语言显得不是那么的迫切,所以我第一阶段的目标,选定为编译到C89。

目标

创建一个可自定义的编译器,将用户任意定义的语言按照规则,翻译成C89。

为何是可自定义呢?其实我希望用户能够自定义编程语言,语言本身就是描述逻辑的方式,如果用户了解编译技术,了解如何定义一门语言,那么我们就应该支持他对语法的修改,然后将他的语法定义文件作为脚本,一同保存在工程中。

编译成目标C代码后,也可以和已有的库进行交互,这样就扩大了重用性。

编译系统的组成

一般的编译系统是如下几个部分组成:

技术分享

一个最小的编译器,至少应该由词法分析程序,语法分析程序,代码生成器组成。

如果我们不想构建符号表的话,那么就要放弃语义检查,不过我还是希望在可能的情况下,构建栈式符号表,因为毕竟符号的处理还是十分重要的。

异常处理部分可能也比较简短,而且不使用中间代码,也省略了代码优化部分,这样,可以让我们在尽量快的情况下构建可用的编译器。

介绍词法分析程序的实现

首先,我们要编写一个词法分析程序,我们希望不同的用户定义不同的词法分析程序,那么就不能采取用lex的代码生成技术,生成C的词法分析器,我们需要自己编写一个分析程序。

为了支持正则表达式,我们会从每条正则式构建多个DFA,然后将多个DFA合并,形成我们的词法分析程序,然后我们用一个贪心的思想,去获得所以可能情况的最长匹配。

下面的章节,我们将会详细的了解,一个正则引擎是如何构建的,并且如何应用到编译系统中。

BNF范式的基础讲解

下面我们将要学会描述一门语言,我们使用扩展BNF范式来描述它,如果您还不了解什么是BNF范式,可以参考我之前的文章:【编译技术,从BNF范式到文法识别简介 】

然后将我们对语言的描述传给我们的语法分析程序,语法分析程序分析我们的BNF范式,每一条BNF范式后会跟随语义动作,通过执行语义动作,就可以实现整个编译工作。

介绍语法分析程序的实现

我们会使用非常时髦的 LALR分析法 进行语法分析,我们的语法分析程序是一个自底向上的分析程序,采用规约的思想,不断分析语法成分,构建一棵语法树的最左规约

LALR分析法需要首先分析语法定义文件,这里我们会用现成的工具bison来构建一个基本的解析器,这样也可以让大家对文法的描述有个初步的了解,然后我们将解析好的BNF范式,用作构建编译器下推自动机的基本数据。

这部分章节,我们会介绍LR分析法中的项、项集族、自动机等概念,完成一个LALR语法分析器。

为了简洁起见,我们的语言动作部分会内嵌Lua脚本,利用C和Lua的交互,完成绝大部分代码生成和翻译的工作,这时,就基本上完成了整个编译器。

Github项目仓库

这里我将词法分析器和语法分析器分开来写,分别是词法分析器Lex语法分析器LR_Parser,这段时间我会不断修改并完善两个项目,敬请期待。

创造新语言(1)——确定架构

标签:编译   c   新语言   编译原理   编译器   

原文地址:http://blog.csdn.net/xfxyy_sxfancy/article/details/45034083

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!