网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > linux > 新手入门 > 软件使用 > 使用Flex和Bison 更好地进行错误处理  

使用Flex和Bison 更好地进行错误处理

2006-08-30  作者:网管整理  来源:bitsCN.com  点评 投稿 收藏

    尽管使用 Flex 和 Bison 生成程序非常简单,但是要让这些程序产生用户友好的语法和语义错误消息却很困难。本文将介绍 Flex 和 Bison 的错误处理特性,并展示如何使用它们,然后详细介绍它们的一些缺陷。 网管联盟bitsCN_com

简介

中国网管联盟bitsCN.com

    正如 UNIX® 开发人员所了解的那样,Flex 和 Bison 的功能非常强大,非常适合开发词法和语法解析器,尤其是语言编译器和解释器。如果我们不熟悉它们所实现的工具 —— 分别是 Lex 和 Yacc —— 可以参考一下本文 参考资料 一节中有关 Flex 和 Bison 文档的链接,以及其他介绍这两个程序的文章。

网管u家u.bitsCN.com

    本文介绍了更高级的一些主题:用来在编译器和解释器中更好地实现错误处理能力的特性和技术。为了展示这些技术,我使用了一个示例程序 ccalc,它基于 Bison 手册中的计算机实现了一个增强的计算器。我们可以从本文后面 下载 一节下载 ccalc 和相关文件。 网管下载dl.bitscn.com

    增强包括使用了很多变量。在 ccalc 中,变量是通过在初始化中首次使用时定义的,例如 a = 3。如果变量是在初始化之前使用的,那就会产生语义错误,使用值为 0 来创建这个变量,并打印一条消息。 网管网www_bitscn_com

示例源文件 网管u家u.bitsCN.com

示例源代码中包括 7 个文件: 网管联盟bitsCN_com

  • ccalc.c:主程序,以及一些进行输入、输出和错误处理的函数
  • ccalc.h:包括了对所有模块的定义
  • cmath.c:数学函数
  • parse.y:Bison 使用的输入文法
  • lex.l:Flex 的输入
  • makefile:简单的 makefile
  • defs.txt:示例输入文件

这个程序接收两个参数: 网管bitscn_com

  • -debug:产生调试输出
  • filename:输入文件名;默认值为 defs.txt

Bison 使用的设置

网管联盟bitsCN@com

为了处理变量名和实际值,Bison 的语义类型必须进行增强: 网管网www.bitscn.com


清单 1. 更好的 Bison 语义类型

/* generate include-file with symbols and types */
%defines
/* a more advanced semantic type */
%union {
  double      value;
  char        *string;
}
             

中国网管论坛bbs.bitsCN.com


网管论坛bbs_bitsCN_com

    有些文法规则可以产生特定的语义类型,这需要像清单 2 中一样对 Bison 进行声明。要获得一个可移植性更好的 Bison 文法版本,我们需要重新定义 +-*/() 符号。下面这个例子没有使用左括号 (,而是使用了结束符符号 LBRACE,这是由词法分析提供的。另外,操作符的优先顺序也必须进行声明。

网管u家u.bitsCN.com

     对于 Flex 来说,所生成的代码通常都依赖于平台所使用的代码页(codepage)。尽管我们可以使用其他代码页,但是必须要对输入进行转换。因此与 Bison 代码不同,Flex 代码尚不能进行移植。

网管联盟bitsCN_com


清单 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
             

网管网www.bitscn.com


网管联盟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
    ;
             
中国网管论坛bbs.bitsCN.com
网管网www.bitscn.com


TAGs   错误   处理   进行   更好   使用   我们   可以   Bison   位置   这个      
 上一篇:Fedora 2 简单美化及设置方法   下一篇:使用 GStreamer 进行多用途的多媒体处理
使用Flex和Bison 更好地进行错误处理 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户