| 网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 |
![]() |
| Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道 |
program 的第三个输出让这个分析程序可以获得错误,从中搜索分号,然后继续执行(通常错误对于解析器来说都是非常严重的)。
网管网www.bitscn.com
为了让这个例子更加有趣,规则体中的真正数学函数都是以单独函数的形式实现的。在进行高级文法分析时,我们要尽量保证规则简短,并使用函数来实现一些不会直接处理解析的过程:
中国网管论坛bbs.bitsCN.com
清单 4. 使用单独的函数来实现数学规则
| expression DIV expression
{
$ = ReduceDiv($1, $3);
}
网管有家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家bitscn.net
使用普通错误消息的例子 网管网www_bitscn_com
使用下面的输入(其中稍微进行了排版)来编译并运行这个示例解析器程序 ccalc:
清单 6. 数学解析器的示例输入
a = 3;
3 aa = a * 4;
b = aa / ( a - 3 );
|
输出结果如下所示:
清单 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
|
这个输出结果并非非常有用,因为它并没有显示问题到底在什么地方。这在下一节中会进行介绍。
网管网www.bitscn.com
扩展 Bison 可以更好地处理错误消息
Bison 的最主要的特性在 Bison 手册中隐藏的很深,就是它可以通过使用 YYERROR_VERBOSE 宏在产生语法错误的情况下生成更有意义的错误消息。
普通的 'syntax error' 消息如下:
网管有家www.bitscn.net
Error 'syntax error, unexpected IDENTIFIER, expecting SEMICOLON' 网管论坛bbs_bitsCN_com
这条消息对于调试更为合适。
网管网www.bitscn.com
|
0
|
评论加载中…