woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

YACC的几个函数

YACC 只是一个语法分析器,它需要一个词法分析器对其进行分析的。如果你想要用 yacc 进行语法分析,除了 yacc 自己之外,还需要如下几个函数:

1. int yylex();
这个函数提供的是语法分析器,它的返回值必须是一个 token,也就是 %token 定义的那些非终结符对应的编号(由 yacc 生成,并输出到 y.tab.h 里,使用的时候记得在 yylex() 函数的实现文件中包含 y.tab.h)。

2. int yyerror(const char* msg);
这个函数负责在发现语法错误的时候打印错误信息,它的形式说明了一切,我就不多说了。

3. int yywrap();
这个函数通常是在你使用 flex 生成词法分析器的时候需要提供的,我记得是用来给 flex 设置调试信息的开关。如果其返回真值则关闭调试信息,反之,如果返回假值则打开调试信息。如果你是用自己写的 yylex(),那么这个函数就不需要了。
另外需要注意的是,上面三个函数中的 yy 前缀实际上是与 yacc 中的 yyparse()等函数的前缀保持一致的。如果你在命令行上使用 -p 选项把 yy 前缀给改了(比如说,xx),那么以上三个函数的前缀也要改掉(xxlex()、xxerror()、xxwrap())。
如果你打算写一个语法分析器,并且其词法非常复杂,那么最好使用 flex 和 yacc 搭配,用 flex 处理词法问题(虽然 flex 2.5.4 生成的代码好象有一个内存泄漏错误,不过不妨事)。如果词法很简单,那么可以自己写 yylex() 处理词法分析。关于 yylex() 的规范嘛,请参考 flex 文档。

posted on 2008-09-20 01:42 肥仔 阅读(728) 评论(0)  编辑 收藏 引用 所属分类: LEX & YACC


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理