尽管使用 Flex 和 Bison 生成程序非常简单,但是要让这些程序产生用户友 好的语法和语义错误消息却很困难。本文将介绍 Flex 和 Bison 的错误处理特 性,并展示如何使用它们,然后详细介绍它们的一些缺陷。
简介
正如 UNIX 开发人员所了解的那样,Flex 和 Bison 的功能非常强大,非 常适合开发词法和语法解析器,尤其是语言编译器和解释器。如果我们不熟悉它 们所实现的工具 —— 分别是 Lex 和 Yacc —— 可以参 考一下本文 参考资料 一节中有关 Flex 和 Bison 文档的链接,以及其他介绍 这两个程序的文章。
本文介绍了更高级的一些主题:用来在编译器和解 释器中更好地实现错误处理能力的特性和技术。为了展示这些技术,我使用了一 个示例程序 ccalc,它基于 Bison 手册中的计算机实现了一个增强的计算器。 我们可以从本文后面 下载 一节下载 ccalc 和相关文件。
增强包括使用 了很多变量。在 ccalc 中,变量是通过在初始化中首次使用时定义的,例如 a = 3。如果变量是在初始化之前使用的,那就会产生语义错误,使用值为 0 来创 建这个变量,并打印一条消息。
示例源文件
示例源代码中包括 7 个文件:
ccalc.c:主程序,以及一些进行输入、输出和错误处理的函数
ccalc.h:包括了对所有模块的定义
cmath.c:数学函数
parse.y:Bison 使用的输入文法
lex.l:Flex 的输入
makefile:简单的 makefile
defs.txt:示例输入文件
这 个程序接收两个参数:
-debug:产生调试输出
filename:输入文 件名;默认值为 defs.txt
Bison 使用的设置
为了处理变量名和 实际值,Bison 的语义类型必须进行增强:
清单 1. 更好的 Bison 语义 类型
/* generate include-file with symbols and types */
%defines
/* a more advanced semantic type */
%union {
double value;
char *string;
}