和简明教程 LexYacc 作者 :Thomas Niemann 翻译:傅惠忠目录序言3 导言4 Lex6 理论6 练习7 YACC11 理论11 练习,第一部分12 练习,第二部分15 计算器18 描述18 包含文件20 输入文件 Lex21 输入文件 Yacc22 解释器26 编译器27 图28 进阶 Lex34 字符串34 保留字35 的调试 lex35 进阶 Yacc37 递归37 歧义 IfElse37 错误信息38 继承属性39 内含动作39 调试Yacc39 参考书目40序言本书将教会你如何使用和构造一个编译器。和是两个用来生成词汇分析器和 lexyacclexyacc 剖析器的工具。我假设你能够运用语言编程,并且理解数据结构的含义,例如“链表”和 C “树”。导言部分描写了构建编译器所需的基本部分,以及和之间的互动关系。后面两章更加 lexyacc 详细的描写了和。以此为背景,我们构建了一个经典的计算器程序。这个计算器支持常用 lexyacc 的算术符号和控制结构,例如实现了像和这样的控制结构。经过小小的修改,我们就 ifelsewhile 把这个计算器转换成一个可以运行在基于栈的计算机上的编译器。后面的间节讨论了在编写编译器是经常发生的问题。本书中使用的例程的源代码可以从下面列出的网站上下载到。允许下面列出的网站复制本书的一部分内容,没有任何附加限制。例程中的源代码可以自由的用于任何一个软件中,而无需通过作者的授权。 THOMAS NIEMANN 波特兰,俄勒冈州网站:epaperpress.com 译者序 : 找不到好的中文资料,所以自己翻译了一个,如发现错误,请不吝赐教。电子邮件:fuhuizn@hotmail.com 傅惠忠导言在年之前,编写编译器一直是一个非常费时间的工作。这一年和 1975Lesk[1975]Johson 发表了关于和的论文。这些工具极大地简化了编写编译器的工作。在中 [1975]lexyaccAho[1986] 描写了关于如何具体实现和的细节。从下列地方可以等到和工具: lexyacclexyacc ,在, Mortice Kern System (MKS) ●和,在, GNU flex bison ●,在, Ming ●,在,还有 Cygwin ●我的和版本,在 LexYaccepaperpress.com ●的版本是一个高质量的商业产品,零售价大约是美元。软件是免费的。的 MKS300GNUflex 输出数据也可以被商业版本所用,对应的商业版本号是,也一样。和是 1.24bisonMingCygwin 软件在某些位系统上的移植产物。事实上是操作系统在 GNU32WindowsCygwinUNIXWindows 上的一个模拟接口,其中包括了和编译器。 gccg++ 我的版本是基于的,但量是使用编译的并且包含一个改善文件操作程序的小 MingVisual C++ 补丁。如果你下载我的版本,请记住解压缩的时候一定要保留文件夹结构。图:编译顺序 1 为词法分析器或扫描器生成C程序代码。它使正则表达式匹配输入的字符串并且把它们转 Lex换成对应的标记。标记通常是代表字符串或简单过程的数值。图1说明了这一点。当发现了输入流中的特定标记,就会把它们输入一个特定的符号表中。这个符号表也会包 Lex 含其它的信息,例如数据类型(整数或实数)和变量在内存中的位置。所有标记的实例都代表符号表中的一个适当的索引值。为语法分析器或剖析器生成C程序代码。使用特定的语法规则以便解释从得到的标 YaccYaccLex 记并且生成一棵语法树。语法树把各种标记当作分级结构。例如,操作符的优先级和相互关系在语法树中是很明显的。下一步,生成编译器原代码,对语法树进行一次第一深度历遍以便生成原代码。有一些编译器直接生成机器码,更多的,例如上图所示,输出汇编程序。图2:用构建一个编译器 Lex/Yacc 图2显示了和使用的命名约定。我们首先要说明我们的目标是编写一个编译 LexYaccBASIC 器。首先我们要指定的所有的模式匹配规则()和的全部语法规则()。下面列 Lexbas.lYaccbas.y 举了产生我们的编译器,,的命令。 bas.exe 生成 yacc d bas.y # y.tab.h, y.tab.c 生成 lex bas.l # lex.yy.c 编译/连接 cc lex.yy.c y.tab.c o bas.exe # 读入中的语法描述而后生成一个剖析器,即中的函数。中包含 Yaccbas.yy.tab.cyyparsebas.y 的是一系列的标记声明。“”选项使生成标记声明并且把它们保存在中。读入 dYaccy.tab.cLex 中