| 网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 |
![]() |
| Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道 |
尽管使用 Flex 和 Bison 生成程序非常简单,但是要让这些程序产生用户友好的语法和语义错误消息却很困难。本文将介绍 Flex 和 Bison 的错误处理特性,并展示如何使用它们,然后详细介绍它们的一些缺陷。 网管联盟bitsCN_com
简介
中国网管联盟bitsCN.com
正如 UNIX® 开发人员所了解的那样,Flex 和 Bison 的功能非常强大,非常适合开发词法和语法解析器,尤其是语言编译器和解释器。如果我们不熟悉它们所实现的工具 —— 分别是 Lex 和 Yacc —— 可以参考一下本文 参考资料 一节中有关 Flex 和 Bison 文档的链接,以及其他介绍这两个程序的文章。
本文介绍了更高级的一些主题:用来在编译器和解释器中更好地实现错误处理能力的特性和技术。为了展示这些技术,我使用了一个示例程序 ccalc,它基于 Bison 手册中的计算机实现了一个增强的计算器。我们可以从本文后面 下载 一节下载 ccalc 和相关文件。 网管下载dl.bitscn.com
增强包括使用了很多变量。在 ccalc 中,变量是通过在初始化中首次使用时定义的,例如 a = 3。如果变量是在初始化之前使用的,那就会产生语义错误,使用值为 0 来创建这个变量,并打印一条消息。 网管网www_bitscn_com
示例源文件 网管u家u.bitsCN.com
示例源代码中包括 7 个文件: 网管联盟bitsCN_com
这个程序接收两个参数: 网管bitscn_com
Bison 使用的设置
为了处理变量名和实际值,Bison 的语义类型必须进行增强: 网管网www.bitscn.com
清单 1. 更好的 Bison 语义类型
/* generate include-file with symbols and types */
%defines
/* a more advanced semantic type */
%union {
double value;
char *string;
}
|
有些文法规则可以产生特定的语义类型,这需要像清单 2 中一样对 Bison 进行声明。要获得一个可移植性更好的 Bison 文法版本,我们需要重新定义 +-*/() 符号。下面这个例子没有使用左括号 (,而是使用了结束符符号 LBRACE,这是由词法分析提供的。另外,操作符的优先顺序也必须进行声明。
网管u家u.bitsCN.com
对于 Flex 来说,所生成的代码通常都依赖于平台所使用的代码页(codepage)。尽管我们可以使用其他代码页,但是必须要对输入进行转换。因此与 Bison 代码不同,Flex 代码尚不能进行移植。
清单 2. Bison 声明
/* terminal symbols */
%token <string> IDENTIFIER
%token <value> VALUE
%type <value> expression
/* operator-precedence
* top-0: -
* 1: * /
* 2: + -
*/
%left ADD SUB
%left MULT DIV
%left NEG
%start program
|
网管联盟bitsCN@com
这段文法与 Bison 手册非常类似,不同之处在于它使用了名字作为终端符号和标识符的简写形式。标识符是在赋值语句中进行定义和初始化的,并且可以在任何允许使用的地方使用。清单 3 给出了一个示例文法: 网管论坛bbs_bitsCN_com
清单 3. 示例 Bison 文法
网管u家u.bitsCN.com
program
: statement SEMICOLON program
| statement SEMICOLON
| statement error SEMICOLON program
;
statement
: IDENTIFIER ASSIGN expression
| expression
;
expression
: LBRACE expression RBRACE
| SUB expression %prec NEG
| expression ADD expression
| expression SUB expression
| expression MULT expression
| expression DIV expression
| VALUE
| IDENTIFIER
;
|
|
0
|
评论加载中…