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

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

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

program 的第三个输出让这个分析程序可以获得错误,从中搜索分号,然后继续执行(通常错误对于解析器来说都是非常严重的)。

网管网www.bitscn.com

    为了让这个例子更加有趣,规则体中的真正数学函数都是以单独函数的形式实现的。在进行高级文法分析时,我们要尽量保证规则简短,并使用函数来实现一些不会直接处理解析的过程:

中国网管论坛bbs.bitsCN.com


清单 4. 使用单独的函数来实现数学规则

| expression DIV expression
  {
    $ = ReduceDiv($1, $3);
  }
             网管有家bitscn.net 

网管有家www.bitscn.net

    最后,函数 yyerror() 必须要进行定义。这个函数是在所生成的解析器检测到语法错误时调用的,它又会调用一个小函数 PrintError(),后者会打印增强的错误消息。详细内容请参看源代码。

网管有家bitscn.net

Flex 的设置 中国网管联盟bitsCN.com

    Flex 所生成的词法分析器必须要根据语义类型提供终止符号。清单 5 定义了空格、实际值、标识符和符号所使用的语法。 网管有家www.bitscn.net


清单 5. 示例 Flex 规则

[ \t\r\n]+  {
    /* eat up whitespace */
    }
{DIGIT}+  {
    yylval.value = atof(yytext);
    return VALUE;
    }
{DIGIT}+"."{DIGIT}*        {
    yylval.value = atof(yytext);
    return VALUE;
    }
{DIGIT}+[eE]["+""-"]?{DIGIT}*        {
    yylval.value = atof(yytext);
    return VALUE;
    }
{DIGIT}+"."{DIGIT}*[eE]["+""-"]?{DIGIT}*        {
    yylval.value = atof(yytext);
    return VALUE;
    }
{ID}        {
    yylval.string = malloc(strlen(yytext)+1);
    strcpy(yylval.string, yytext);
    return IDENTIFIER;
    }
"+"       { return ADD; }
"-"       { return SUB; }
"*"       { return MULT; }
"/"       { return DIV; }
"("       { return LBRACE; }
")"       { return RBRACE; }
";"       { return SEMICOLON; }
"="       { return ASSIGN; }
             网管网www.bitscn.com 

网管u家u.bitsCN.com

    为了帮助调试,我们在程序运行的末尾把所有已知的变量及其当前内容都打印了出来。

网管u家bitscn.net

使用普通错误消息的例子 网管网www_bitscn_com

使用下面的输入(其中稍微进行了排版)来编译并运行这个示例解析器程序 ccalc:

网管网www.bitscn.com


清单 6. 数学解析器的示例输入

a = 3;
3 aa = a * 4;
b = aa / ( a - 3 );
             

网管下载dl.bitscn.com


中国网管论坛bbs.bitsCN.com

输出结果如下所示:

网管下载dl.bitscn.com


清单 7. 数学解析器的示例输出

Error 'syntax error'
Error: reference to unknown variable 'aa'
division by zero!
final content of variables
   Name------------------ Value----------
   'a                   ' 3
   'b                   ' 3
   'aa                  ' 0
             
网管u家bitscn.net

网管u家u.bitscn@com

这个输出结果并非非常有用,因为它并没有显示问题到底在什么地方。这在下一节中会进行介绍。

网管网www.bitscn.com

扩展 Bison 可以更好地处理错误消息

中国网管论坛bbs.bitsCN.com

Bison 的最主要的特性在 Bison 手册中隐藏的很深,就是它可以通过使用 YYERROR_VERBOSE 宏在产生语法错误的情况下生成更有意义的错误消息。

网管网www.bitscn.com

普通的 'syntax error' 消息如下:

网管有家www.bitscn.net

Error 'syntax error, unexpected IDENTIFIER, expecting SEMICOLON' 网管论坛bbs_bitsCN_com

这条消息对于调试更为合适。
网管网www.bitscn.com

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

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: