基本信息
- 原书名:Compiler Construction Using Java, JavaCC, and Yacc
- 原出版社: Wiley-IEEE Computer Society Pr
内容简介
目录
第1章 字符串、语言和编译器 1
1.1 概述 1
1.2 语言的基本概念 1
1.3 编译器的基本概念 2
1.4 集合论中的基本概念 4
1.5 空串 6
1.6 连接 6
1.7 指数记法 6
1.8 星运算符(也称为0次或多次运算符) 7
1.9 串集合的连接 8
1.10 加运算符(也称为1次或多次运算符) 9
1.11 问号运算符(也称为0次或1次运算符) 10
1.12 包含单独一个串的集合的简便记法 10
1.13 运算符优先级 11
1.14 正规表达式 11
1.15 正则表达式的局限性 13
问题 ... 14
第2章 上下文无关文法(一) 16
2.1 概述 16
译者序
国内外关于编译原理与技术的教材已有不少,也有几部堪称经典之作。然而,如果你是一位想要为本科生开设编译原理与技术相关课程的教师,那么你会发现,选择适合的教材其实是相当不容易的。分析其原因,主要是因为选材非常广泛,不同理念的书籍之间内容差异较大。一些书籍的篇幅过长,它们或者在某些方面过于细节化,或者涉及到许多编译高级话题,有些作者甚至根据个人的研究兴趣选择了某些专题内容。另有一些书籍过于技术化,涉及到的原理部分不成体系,其理念主要是强调如何设计出可用的编译器。还有一些书籍认为基于编译前端的技术已经非常成熟,所以将前端所涉及到的原理和技术完全弱化,主要篇幅是关于编译优化以及后端设计的内容。此外,计算机技术几乎天天都在发展变化,这伴随着编译器技术也在不断的发展变化。那么,本科阶段应该学些什么,应该如何理顺相关理论和技术的脉络,既能使学生轻松掌握相关知识和技能的精髓,又能使教学安排条理有序,并且对学生完成的编译器项目能有一套比较合理的评价体系?这些问题对任何一位相关课程教师来说,都会有不同程度的困惑。
Anthony J. Dos Reis教授编写的本书能够较好地回答上述问题,为编译器的理论、应用以及编程技术的学习和课程教学设计了一套较为科学的体系,既独特又新颖,或许是符合您开课理念的书籍。该书涵盖了从相关基础到实践技能学习的各个方面,配套有功能强大且灵活的项目评价和辅导材料的软件包、精心设计的项目以及测试用例。在我们看来,这本书很适合作为计算机科学与技术相关专业本科阶段的编译原理与技术课程的教材。该书对于基本原理的讲解易于理解,篇幅也适中,但内容很到位,与书中编译器设计和相关技能的学习紧密关联。本书对于自上而下分析与翻译的原理、方法与技术介绍的十分详细,包含手工构造方法和自动构造方法。本书中使用JavaCC自动构造自上而下的分析与翻译程序,对于JavaCC的综合性介绍是本书的特色之一,目前其他教科书中还没有相关内容。对于自下而上的分析与翻译,本书的介绍比较简洁,但也涵盖了基本分析原理以及自下而上分析与翻译程序的自动构造工具Yacc等重要内容。本书的内容具有很强的实践性,学生可以渐增地实践不同层次编译器的构造。本书的教学支撑软件包特意提供的关于编译器项目的正确性、运行时间以及代码尺寸等的评价功能,有助于增强实践项目的可操作性。
限于译者水平,译文中难免出现各种错误和疏漏,欢迎广大读者批评指正。
前言
主要特点
* 提供了若干精心准备的实验项目及其测试用例。这些实验项目能使学生不光懂得理论,而且懂得如何去应用理论。实验项目与课本有机结合,使得教师可以摆脱项目设计的负担。
* 实验项目开始于本书较早章节,学生可以边学理论边去应用。
* 编译器工具(JavaCC、Yacc和Lex)为可选主题。
* 整个书是面向Java的。实现语言是Java,主要目标语言类似Java bytecode,编译器工具生成Java代码,以及所用的属性文法在形式上采用了类Java的语法。
* 目标语言(一个是面向堆栈的,类似Java bytecode;另一个是面向寄存器的)非常易学,但功能足以支持现代编译器工程。
* 软件包对于学生和老师来说是梦想成真。它可以自动评估学生的编译器实验项目,包括正确性、运行时间和代码尺寸。它的伟大之处,对于学生来说在于:可以立刻获得关于项目工作的反馈信息;对于教师来说在于:可以容易和准确地评估学生的工作。教师用一条命令就可以生成一份整个班级的报告。软件可运行于三个平台:Microsoft Windows、Linux和Macintosh OS X。
* 具体展示了编译技术不仅仅只是用于编译器。在一个实验项目的目标里,将要求学生使用编译技术设计和实现grep工具。
* 包含一章解释器相关内容,适用于本书后续章节。
* 包含一章优化的内容,作为入门性课程来说恰到好处。学生不只是简单读懂优化技术——而是去实现各种技术,例如,常量合并,窥孔优化,以及寄存器分配。
* 本书使用类Java格式的文法,学生可以容易理解和使用。该格式与JavaCC所采用的一致。这样,学生可以快捷、容易地切换到JavaCC。
* 本书含足够多的理论知识,这使得本书适用于将编译/自动机/形式语言等知识混合起来的课程。本书涵盖了自动机/形式语言课程的多数主题:有穷自动机,栈分析器,正规表达式,正规文法,上下文无关文法,上下文有关文法,非受限文法,Chomsky层次,以及泵引理。下推自动机,图灵机,可计算性,以及复杂性等在软件包中作为补充讨论。软件包中还包括下推自动机模拟器和图灵机模拟器。
* 覆盖了第一次课或编译方面唯一课程应该涉及的各方面话题。学生不仅要学习理论知识和编译器设计的实践技能,而且还要学习重要的系统概念。
软件包
本教材的软件包具有一些不同寻常的特性。当学生运行编译器所生成的程序时,该软件会产生一个日志文件。日志文件包括时间戳,学生姓名,编译器所生成程序的输出,以及针对编译器所生成程序的评价指标(含正确性、程序大小和执行时间等)。如果输出不正确(表明学生的编译器生成了不正确代码),日志文件用NOT CORRECT标记。如果编译后的程序太大,或运行时间太长,日志文件将标记OVER LIMIT。
日志文件的名字中包括学生的姓名。例如,对于姓Dos Reis学生的S3项目,日志文件名是S3.dosreis.log。因为每个日志文件名是唯一的,所以指导老师可以将整个班的所有日志文件存储在同一个目录下。仅一条命令便可以生成全班的报告。
该软件支持两种指令集:栈指令集和寄存器指令集。栈指令集是默认的指令集。要使用寄存器指令集,则要在汇编语言源程序中加入一条指导命令。然后,该软件就会自动更新配置,就变成使用寄存器指令集了。
软件包的三个主要程序是a(汇编程序/链接程序),e(运行程序),和I(库make程序)。软件包中还包括p(下推自动机模拟程序)和t(图灵机模拟程序)。