Lex与Yacc学习(十)之Yacc库
Yacc库
每个实现都需要有用的例程库,在UNIX系统中,可以通过cc命令行尾端给出-ly标志(或通过其他系统下的等价物)来包含库。
库的内容在不同的实现之间是不同的,但总是包括main()和yyerror()
main()
yacc的所有版本都带有最小的主程序,该程序对于简短程序和测试有时是很有用的,它非常简单,如下所示:
main(argc,argv)
{
yyparse();
return 0;
}
和具有任何库例程一样,可以提供自己的main()。在几乎所有有用的应用软件中都可以提供main()用来接受命令参数和标志、打开文件和检查错误。
yyerror()
所有版本也都提供简单的错误报告例程,它也是非常简单:
yyerror(char *errmsg)
{
printf("%s\n",errmsg);
}
这有时能够满足要求,但是一个好的错误报告例程至少能报告行号和最近的标记(如果词法分析程序是用lex写的,那么会在yytext中),这将会对语法分析程序更有用。
YYABORT
特殊语句
YYABORT
在动作中使得语法分析例程yyparse()以一个非零值立即返回,显示失败。
当动作例程探测到错误非常严重以致于没有继续分析的点时是很有用的。
由于语法分析程序可以向前查看一个标记,所以在语法分析程序读到另一个标记前,包括YYABORT的规则动作尅不被归约。
YYACCEPT
特殊语句
YYACCEPT
在动作中使得语法分析例程yyparse()以一个零值立即返回,显示成功。
在词法分析程序不能告知输入数据何时结束而语法分析程序能告知的情况下是很有用的。
由于语法分析程序可以向前查看一个标记,所以在语法分析程序读到另一个标记前,包括YYACCEPT的规则动作尅不被归约。
YYBACKUP
宏YYBACKUP使得你可以移出当前记号并把它替换为另一个记号,该语法为:
sym:      TOKEN   {YYBACKUP(newtok,newval);}
它放弃已经被归约的符号sym,并且假装词法分析器刚刚读到记号newtok,其值为newval。如果此时存在一个向前查看的记号或者该规则在右部的符号超过一个的话,这个规则将通过调用yyerror()来宣告失败。
正确使用YYBACKUP非常困难,一般不用。
YYDEBUG
由于跟踪代码又大又慢,所以不能自动编译到目标程序中。为了包含跟踪代码,使用yacc命令行上的-t标志,或者要么在C编译程序命令行上,或者通过在定义段包含类似下面的句式,来定义C预处理程序符号YYDEBUG为非零值:
%{
       #define YYDEBUG  1
%}
YYERROR
有时动作代码能探测到上下文相关的而语法分析程序本身却不能检测到的语法错误。如果代码检测到一个语法错误,就可以调用宏YYERROR,生成的效果与语法分析程序读到一个被语法禁止的标记时完全一样。一调用YYERROR,语法分析程序就访问yyerror(),进入错误恢复模式,寻找可以移进error标记的状态。
yyerror()
只要yacc语法分析程序探测到语法错误就调用yyerror()函数,将错误报告给用户。传递单个参数即描述这个错误的字符串,yacc库中的yyerror的默认版本仅仅是在标准输出文件中打印参数。
下面是返回更多信息的版本:
yyerror(const char *msg)
{
printf("%d: %s at '%s' \n",yylineno,msg,yytext);
}
yylineno是当前行号,yytext是包含当前标记的lex标记缓冲器。
yyparse()
yacc生成的语法分析程序的入口点是yyparse(),当程序调用yyparse()时,语法分析程序就试图分析输入流。如果分析成功,语法分析程序就返回一个零值,反之,则返回一个非零值。
每次调用该函数,语法分析程序就重新开始进行分析,而忘记上次返回的状态,这与lex扫描程序十分不同,它能够获得调用后的每一次状态。
Lex与Yacc学习(十)之Yacc库的更多相关文章
- Lex与Yacc学习(九)之Yacc语法
		
Yacc语法 本文讨论yacc语法的格式并描述可用的各种特征和选项 yacc语法结构 yacc语法包括三部分:定义段.规则段和用户子例程段 ...定义段... %% ...规则段... %% ...用 ...
 - Lex与Yacc学习(四)之Lex规范
		
Lex规范的结构 lex程序由三部分组成:定义段.规则段和用户子例程序段 ...定义段... %% ...规则段... %% ...用户子例程序段... 这些部分由以两个百分号组成的行分隔开.尽管某一 ...
 - 对比深度学习十大框架:TensorFlow 并非最好?
		
http://www.oschina.net/news/80593/deep-learning-frameworks-a-review-before-finishing-2016 TensorFlow ...
 - Google之Chromium浏览器源码学习——base公共通用库(二)
		
上次提到Chromium浏览器中base公共通用库中的内存分配器allocator,其中用到了三方库tcmalloc.jemalloc:对于这两个内存分配器,个人建议,对于内存,最好是自己维护内存池: ...
 - 从Theano到Lasagne:基于Python的深度学习的框架和库
		
从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...
 - IOS学习:常用第三方库(GDataXMLNode:xml解析库)
		
IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...
 - (十)boost库之多线程
		
(十)boost库之多线程 1.创建线程 使用boost库可以方便的创建一个线程,并提供最多支持9个参数的线程函数,相对于void*来说,方便了很多,创建线程主要提供了一下3种方式: 线程库头文件:# ...
 - 强化学习(十九) AlphaGo Zero强化学习原理
		
在强化学习(十八) 基于模拟的搜索与蒙特卡罗树搜索(MCTS)中,我们讨论了MCTS的原理和在棋类中的基本应用.这里我们在前一节MCTS的基础上,讨论下DeepMind的AlphaGo Zero强化学 ...
 - 强化学习(十六) 深度确定性策略梯度(DDPG)
		
在强化学习(十五) A3C中,我们讨论了使用多线程的方法来解决Actor-Critic难收敛的问题,今天我们不使用多线程,而是使用和DDQN类似的方法:即经验回放和双网络的方法来改进Actor-Cri ...
 - 强化学习(十五) A3C
		
在强化学习(十四) Actor-Critic中,我们讨论了Actor-Critic的算法流程,但是由于普通的Actor-Critic算法难以收敛,需要一些其他的优化.而Asynchronous Adv ...
 
随机推荐
- Elasticsearch之入门知识
			
elasticsearch是一个高度可扩展得开源全文搜索和分析的引擎.可以快速.近实时的存储,搜索和分析大量数据.通常用作底层引擎技术,为具有复杂搜索功能和要求的程序提供支持. 用处: • 运行网上商 ...
 - axios 访问和返回拦截,token处理,返回异常统一处理
			
在axios文件夹中,index.js添加拦截 访问拦截: import store from '../store' axios.interceptors.request.use( config =& ...
 - [译]Understanding ECMAScript6 函数
			
函数 函数是任何编程语言的重要组成部分,而自从JavaScript被引入以来,JavaScript的函数就未有太多改变.遗留下来的积压问题及微妙行为使我们很容易犯错误,或者需要更多的代码来实现一个非常 ...
 - python_16(bootstrap)
			
素材网址: 1.1 官网 https://jquery.com/ 1.2 开源库链接: https://www.bootcdn.cn/ 1.3 网页模板 www.jq22.com 1.1 bootst ...
 - dbf 工程模式连接(vfp c# )
			
首先现在微软官网下载“Microsoft OLE DB Provider for Visual FoxPro 9.0”驱动 下载完成后得到“VFPOLEDBSetup.msi” 双击安装即可在“C:\ ...
 - Flask  学习系列(一) -登录
			
Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 .Flask使用 BSD 授权. Flask也被称为 “ ...
 - HTML中实现Table表头点击升序/降序排序
			
题目:如下图,请实现表格信息的排序功能,当点击表头的属性区域,将表格信息进行排序切换功能,即第一次点击为降序排序,再一次点击进行升序排序. 姓名 力量 敏捷 智力 德鲁伊王 17 24 13 月之骑士 ...
 - CF1025C Plasticine zebra
			
思路: 不要被骗了,这个操作实际上tm是在循环移位. 实现: #include <bits/stdc++.h> using namespace std; int main() { stri ...
 - WORD操作的问题
			
最近有个小项目主要是对文档,特别是WORD的操作,读取表格数据存到数据库: 再把数据库的数据读出来写入WORD,下载下来,诸如此类的东西,说来很是简单. 想了想是用什么开发呢? C#常用的,没话说,也 ...
 - vue+element ui项目总结点(二)table合计栏目,按照起始年份--截止年份 插入数据并向后追加数据以最后一条年份+1
			
1.oninput 事件在用户输入时触发; <template> <div class="test_box"> <p>hell,你好</p ...