《lex与yacc》(第二版)是惟一一本专门介绍这两个重要的UNIX编程工具的书。这本新版本是完全的修订版,并以很多新的扩充示例代替了旧的示例。几个介绍性章节已经完全重写,还有一章专门介绍实现SQL语法,给出了有经验的程序员希望看到的各种细节。
本书对lex和yacc的重要主题提供了详尽的参考。对所有主要的lex和yacc的MS-DOS和UNIX版本,本书都进行了介绍,包括AT&T lex和yacc、Berkeley yacc、Berkeley/Gnu flex、 Gun bison、MKS lex和yacc、Abraxas PCYACC等等。
◆“太棒了!我已经读完《lex与yacc》的第二版……总而言之,这是一件伟大的作品——这本书比第一版充实很多,详实而透彻。阅读的过程中,我经历了无数次的惊喜,心里总想‘可惜了,他们已经错过了也许是细微而精妙的地方,我先做个注释’,然而随后在下一个句子或段落就看到对该问题的阐释。”
◆“[John Levine]做了大量的工作来完善这本书。我很高兴最终有一本好书推荐给人们。”
——Vern Paxson,flex的开发者
第一章 lex和yacc
最简单的lex程序
用lex识别单词
语洁
运行lex和yacc
lex和手写的词法分析程序
练习
第二章 使用lex
正则表达式
单词计数程序
分析命令行
C源代码分析程序
小结
练习
第三章 使用yacc
语法
移进/归约分析
yacc语法分析程序
词法分析程序
算术表达式和歧义性
变量和有类型的标记
符号表
函数和保留字
用make构建语法分析程序
小结
练习
第四章 菜单生成语言
MGL的概述
开发MGL
构建MGL
屏幕处理
结束
MGL代码示例
练习
第五章 分析SQL
SQL的要点概述
语法检查程序
语法分析程序
嵌入式SQL
练习
第六章 lex规范参考
lex规范的结构
BEGIN
程序错误
字符变换
上下文相关
定义(替换)
ECHO
包含操作(文件的逻辑嵌套)
从字符串中输入
input()
内部表(%N声明)
lex库
行号和yylineno
文字块
一个程序中的多个词法分析程序
output()
lex词法分析程序的可移植性
正则表达式语法
REJECT
从yylex()中返回值
起始状态
unput()
yyinput(). yyoutput. yyunput()
yyleng
yxless()
yylex()
yymore()
yytext
yywrap()
第七章 yacc语法参考
yacc语法的结构
动作
歧义和冲突
yacc中的程序错误
结束标记
错误标记和错误恢复
%ident声明
继承的属性($0)
词汇的反馈
文字块
文字标记
yacc语法分析程序的可移植性
优先级. 结合性和操作符声明
递归规则
规则
特殊字符
开始声明
符号值
标记
%type声明
%union声明
变体和多重语法
y.output文件
yacc库
YYABORT
YYACCEPT
YYBACKUP
yyclearin
yydebug和YYDEBUG
yyerrok
YYERROR
yyerror()
yyparse()
YYRECOVERING()
第八章 yacc歧义和冲突
指针模型和冲突
冲突的普通示例
如何修复冲突
小结
练习
第九章 错误报告和恢复
错误报告
错误恢复
练习
附录一 AT&T 1ex
附录二 AT&T yacc
附录三 Berkeley yacc
附录四 GNU bison
附录五 flex
附录六 MKS lex和yacc
附录七 Abraxas lex和 yacc
附录八 POSIX lex和 yacc
附录九 MGL编译程序代码
附录十 SQL分析程序代码
参考文献
词汇表
lex和yacc是特意为编写编译程序和解释程序的人设计的工具, 它对非编译程序编写人员所感兴趣的许多应用程序也非常有用. 在输入中查找模式或者拥有输入或命令语言的任何应用程序都适于采用lex和yacc. 而且, 它们允许快速应用程序原型设计, 容易修改, 而且程序的维护简单. 为了激发读者的想像力, 下面给出了几个用lex和yacc开发的应用:
台式计算器bc.
工具eqn和pic, 用于数学公式和复杂图片的排版预处理器.
PCC和GCC, PCC是和许多UNIX系统一起使用的可移植C编译程序, GCC是GNU C编译程序.
菜单编译程序.
SQL数据库语言语法检查程序.
lex程序本身.
第二版的新特点
在第二版中, 我们已经做了大量的修正. 主要变化包括:
完全重写的介绍性的第一章到第三章.
全新的第五章介绍了完整的SQL语法.
全新的详细的参考性的第六章和第七章.
包含了lex和yacc的所有主要的MS-DOS和UNIX版本的完整介绍, 包括AT&T lex和yacc. Berkeley yacc. flex. GNU bison. MKS lex和yacc. Abraxas PCYACC.
包含了lex和yacc的新的POSIX 1003. 2标准版本的介绍.
本书范围
第一章"lex和 yacc"介绍了如何以及为什么使用lex和yacc来创建编译程序和解释程序, 并且演示了一些小的lex和yacc应用程序. 还介绍贯穿全书的基本术语.
第二章"使用lex"描述了如何使用lex. 开发了几个lex应用程序, 它们分别用于计算文件中单词的个数, 分析程序命令开关和参数和计算C程序上的统计数据.
第二章"使用yacc"给出了使用lex和yacc开发功能完整的台式计算器的完整示例.
第四章"菜单生成语言"演示了如何使用lex和yacc开发菜单生成程序.
第五章"分析SQL"开发了针对完整的SQL关系数据库语言的分析程序. 首先, 我们将分析程序作为一个语法检查程序, 然后将它扩展为内置于C程序中的SQL的简单预处理程序.
第六章"lex规范参考"和第七章"yacc语法参考"详细描述了lex和yacc程序设计人员呼用的特性和选项. 当开发新的lex和yacc应用程序时, 这两章以及随后的两章为有经验的lex和yacc程序设计人员提供了丰富的技术信息.
第八章"yacc歧义和冲突"解释了yacc歧义和冲突, 它们是造成yacc不能正确分析语法的原因. 然后介绍了定位和纠正这些问题的方法.
第九章"错误报告和恢复"讨论了编译程序和解释程序设计人员定位. 识别和报告编译程序输入中的错误的技术.
附录一"AT&t lex"描述了AT&T lex的命令行语法. 报告的错误消息以及建议的解决方案.
附录二"AT&T yacc"描述了AT&T yacc的命令行语法, 并且列出了由 yacc报告的错误, 提供了能导致这种错误的代码示例和建议的解决方案.
附录三"Berkeley yacc"描述了Berkeley yacc的命令行语法, 以及随Berkeley UNIX一起发布的. 已广泛使用的免费版本的yacc, 并且列出了由Berkeley yacc报告的错误及其建议的解决方案.
附录四"GNU bison"讨论了bison中的不同之处. bison是自由软件基金会实现的yacc.
附录五"flex"讨论了flex(广泛使用的免费版本的lex), 列出了它与其他版本的区别, 以及由flex报告的错误及其解决方案.
附录六"MKS lex和yacc"讨论了来自Mortice Kern Systems的lex和yacc的MS-DOS以及OS/2版本.
附录七"Abraxas lex和yacc"讨论了来自Abraxas Software的lex和yacc的MS-DOS以及OS/2版本PCYACC.
附录八"POSIX lex和yacc"讨论了由IEEE POSIX 1003. 2标准定义的lex和yacc版本.
附录九"MGL编译程序代码"为第四章讨论的菜单生成语言编译程序提供了完整的源代码.
附录十"SQL分析程序代码"提供了第五章讨论的SQL分析程序的完整的源代码和交叉引用.
词汇表列出了关于语言和编译理论的技术术语.
参考文献列出了有关lex和yacc的其他文档, 以及对编译程序设计有帮助的书籍.
我们假定读者都熟悉C语言, 因为大多数示例都是用C. lex或yacc编写的, 书中有些示例是用特殊目的语言开发的.
lex和yacc的可用性
lex和yacc都是在20世纪70年代由贝尔实验室开发的. yacc的开发早于lex, 它是由Stephen C. Johnson开发的. 为了与yacc一起工作, Mike Lesk和Eric Schmidt开发了lex. 自第7版UNIX以来, lex和yacc已经成为标准的UNIX实用程序. System V和老式的BSD版本使用原始的AT&T版本, 而最新版本的BSD使用flex(见下文)和Berkeley yacc. 开发者撰写的文章是lex和yacc的主要信息源.
自由软件基金会的 GNU工程组发布了bison, 即yacc的替代品, bison是由RobertCorbett和Richard Stallman编写的. Charles Donnelly和Richard Stallman编写的bison手册特别好, 尤其是特殊特性参考部分. 附录四论述了bison.
BSD和GNUI程组还发布了flex(快速词法分析发生器, Fast Lexical AnalyzerGenerator), 其参考页中称:"lex的重写纠正了那个工具的部分不足". flex最初由Jef Poskanzer编写, Vern Paxson和Van Jacobson又对它进行了重大改善, 而且Vern目前仍在维护它. 附录五概述了有关flex的特定主题.
至少有两种版本的lex和yacc可用于MS-DOS和OS/2计算机. MKS(MorticeKern Systems Inc. )是MKS工具包的出版商, 他将lex和yacc作为一种独立的产品提出来以满足许多 PC的 C语言编译. MKS lex和yacc有一本非常好的手册. 附录六概述了MKS lex和yacc. Abraxas Software公司发布了PCYACC, 它是
另一种lex和yacc版本, 该版本带有许多广泛使用的编程语言的示例分析程序. 附录七概述了Abraxas的lex和yacc版本.
示例程序
本书的程序可以从UUNET上免费得到(指的是除了UUNET普通连接时间费用之外免费). 如果访问UUNET, 就可以使用UUCP或FTP检索到源代码. 对于UUCP, 只需找到一种能直接访问UUNET的机器, 并且键入下面的命令:
uucp uunet\!-/nutshell/lexyacc/progs. tar. Z yourhost\!~/yourname/如果用Bourne shell(sh)代替C shell(sh), 可以省略反斜线. 等一段时间(一天或更长时间)后, 文件就会出在/usr/spool/uncppublic/yourname目录下. 如果你还没有账户, 但是却想要一个账户接收电子邮件, 则可以打电话703-2048000与UUNET联系.
要使用ftp, 就要找到一种能直接访问Internet的机器. 下面是一个示例会话, 黑体字表示命令.
% ftp ftp. oreilly. com
Connected to ftp. oreilly. com.
220 FTP server(Version 5. 99 Wed May 23 14:40:19 EDT 1990) ready.
Name(ftp. oreilly. com:yourname):anonymous
331 Guest login ok, send ident as password.
Password:ambar@ora. com(use your user name and host here)
230 Guest login ok, access restrictions apply.
ftp>cd published/oreilly/nutshell/lexyacc
250 CWD command successful.
ftp>binary(you must specde binary transfer for compressed files)
200 Type set to I.
ftp>get progs.tar.z
200 PORT command successful.
150 opening BINARY mode data connection for progs. tar. z.
226 Transfer complete.
ftp>quit
221 Goodbye.
%
该文件是一个压缩的tar档案文件. 一旦得到这个档案文件就要进行解压缩, 键入:
%zcat progs. tar. z | tar xf-system V系统需要换用下面的 tar命令:
%zcat progs. tar. z | tar xof-
排版约定
本书使用下列排版约定:
黑体(Bold)
用干语句. 函数. 标识符和程序名.
斜体(Italic)
在段落中表示文件. 目录和命令名以及数据类型, 当介绍新的术语和概念时也用斜体来强调.
等宽(Constant Width)
用在示例中表示文件的内容或命令的输出.
等宽黑体(constant Bold)
用在示例中表示逐字键人的命令行和选项.
引号
用干标识解释性文本中的代码段. 系统消息. 记号和符号也用引号引起.
%
shell提示符.
[]
在程序语法描述中用来表示可选的元素(不要键入括号本身).
致谢
本书的第一版是基于Tony Mason的MGL和SGL编译程序编写的. Tony提供了本书的大多数素材, 而一起工作的Dale Dougherty对其进行了总结. Doug Brown编写了第八章"yacc歧义和冲突". Dale编排和修订了本书的部分内容. TimO'Reilly为使本书成为一本更好的书, 对该书进行了多次编校. 感谢Butch Anton.
Ed Engler和Mike Loukides对技术内容的注释. 还要感谢John W. Lockhart阅读了草稿并查找文体上的问题. 并且感谢Chris Reilley对本书插图所做的工作. 最后, Ruth Terry辛勤地打印本书, 并目光敏锐地检查每个编辑细节(虽然她努力地兼顾家庭及工作, 但她还是为本书牺牲了许多照顾家人的时间). 在第二版中, Tony重写了第一章和第二章, 而Doug更新了第八章, John Levine编写了第三. 五. 六. 七章及大多数附录, 并且编辑了本书的其他部分. 感谢技术评论者Bill Burke. Warren Carithers. Jon Mauney. Gary Merrill. EugeneMiya. Andy Oram和Bill Torcaso, 尤其是Vern Paxson, 他逐页给出了很好的. 非常清晰的建议. Margaret Levine Young的蓝色铅笔(实际上是粉红色的)使文章更加紧凑, 并保证了编辑的一致性. 她还汇编了大部分索引. Chris Reilly再次处理了图形, 而且Donna Woonteiler进行了最后的编辑, 并引导本书通过生产流程.