首页 / 软件开发 / Flex / 使用Flex和Bison更好地进行错误处理
使用Flex和Bison更好地进行错误处理2010-11-23 IBM Christian Hagen尽管使用 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:简单的 makefiledefs.txt:示例输入文件这 个程序接收两个参数:-debug:产生调试输出filename:输入文 件名;默认值为 defs.txtBison 使用的设置为了处理变量名和 实际值,Bison 的语义类型必须进行增强:清单 1. 更好的 Bison 语义 类型/* generate include-file with symbols and types */
%defines
/* a more advanced semantic type */
%union {
double value;
char *string;
}