2 介绍
PLY 是纯粹由 Python 实现的 Lex 和 yacc(流行的编译器构建工具)。PLY 的设计目标是尽可能的沿袭传统 lex 和 yacc 工具的工作方式,包括支持 LALR(1)分析法、提供丰富的输入验证、错误报告和诊断。因此,如果你曾经在其他编程语言下使用过 yacc,你应该能够很容易的迁移到 PLY 上。
2001 年,我在芝加哥大学教授“编译器简介”课程时开发了的早期的 PLY。学生们使用 Python 和 PLY 构建了一个类似 Pascal 的语言的完整编译器,其中的语言特性包括:词法分析、语法分析、类型检查、类型推断、嵌套作用域,并针对 SPARC 处理器生成目标代码等。最终他们大约实现了 30 种不同的编译器!PLY 在接口设计上影响使用的问题也被学生们所提出。从 2001 年以来,PLY 继续从用户的反馈中不断改进。为了适应对未来的改进需求,PLY3.0 在原来基础上进行了重大的重构。
由于 PLY 是作为教学工具来开发的,你会发现它对于标记和语法规则是相当严谨的,这一定程度上是为了帮助新手用户找出常见的编程错误。不过,高级用户也会发现这有助于处理真实编程语言的复杂语法。还需要注意的是,PLY 没有提供太多花哨的东西(例如,自动构建抽象语法树和遍历树),我也不认为它是个分析框架。相反,你会发现它是一个用 Python 实现的,基本的,但能够完全胜任的 lex/yacc。
本文的假设你多少熟悉分析理论、语法制导的翻译、基于其他编程语言使用过类似 lex 和 yacc 的编译器构建工具。如果你对这些东西不熟悉,你可能需要先去一些书籍中学习一些基础,比如:Aho, Sethi 和 Ullman 的《Compilers: Principles, Techniques, and Tools》(《编译原理》),和 O’Reilly’ 出版的J ohn Levine 的《lex and yacc》。事实上,《lex and yacc》和 PLY 使用的概念几乎相同。