YACC的使用方法
1、用户手动写出文法说明文件(.y或者.grm文件)

2、Yacc编译器将此文法说明文件.y转换成用C编写的语法分析器文件.tab.c,使用命令bison -d yacc.y(开发环境:Ubuntu16.04),

3、用C编译器(gcc或者g++)将.tab.c编译为可执行文件,可执行文件默认为a.exe。使用命令g++ -c yacc.tab.c(开发环境:Ubuntu16.04),

4、a.exe即为可执行的语法分析器。可以直接运行查看结果。

具体操作可参考博客:参考博客点击这里

yacc说明文件的书写:

结构

 第一部分:定义段%%第二部分:规则段%%第三部分:辅助函数段

其中,第三部分可以省略,格式如下:

第一部分:定义段%%
第二部分:规则段

第一部分:定义段
定义段可以分为两部分:

第一部分以符号%{和%}包裹,里面为以C语法写的一些定义和声明:例如,包含的头文件,宏定义,全局变量定义,函数声明等。

第二部分主要是对文法的终结符和非终结符做一些相关声明。这些声明主要有如下一些:%token,%left,%right,%nonassoc,%union,%type,%start。下面分别说明它们的用法。

  • %token
    定义文法中使用了哪些终结符,终结符一般全大写。
  • %left,%right,%nonassoc
    定义文法中使用的终结符,定义形式与%token类似。
    但是他们定义的终结符具有某种优先级和结合性:%left表示左结合,%right表示右结合,%nonassoc表示不可结合(它定义的终结符不能连续出现:例如<,如果文法中不允许出现形如a<b<c的句子,则<就是不可结合的)
    优先级关系是以他们定义出现的顺序决定的,先定义的优先级低,最后定义的优先级最高,同时定义的优先级相同
  • %start:
    指定文法的开始符号(非终结符),定义形式为: %start startsym ,其中startsym为文法的开始符号。不使用%start定义文法开始符号,则默认在第二部分定义的第一条产生式规则的左部非终结符为开始符号。
  • %union和%type:
    用来处理文法中各符号所带的属性。
    记号是由记号名和记号的属性值两部分组成的,文法中的终结符和非终结符都属于记号,都有各自的属性值。
    Yacc通过维护一个栈,保存文法符号的“属性值”,这个栈与移进-归约分析中的文法符号栈是对应的:即,如果移进归约分析栈中某个位置存放文法符号X,则对应的Yacc“属性值”栈中就存放X的属性值。Yacc将这个属性值栈的栈内元素的类型定义为YYSTYPE(这是一个宏),默认状态下,YYSTYPE定义为int类型,你可以在文法说明文件第一部分定义段中重新定义YYSTYPE为其他类型,例如,用#defineYYSTYPE double 将其定义为double类型。如果你想让属性值栈可以存放多种类型的属性值,可以将属性值栈元素的类型定义为一种union类型,此时,你可以用%union来定义它。

第二部分:规则段
规则段实际上定义了文法的非终结符及产生式集合,以及当归约整个产生式时应执行的操作。例如:

 expr : expr PLUS term         {$$ = $1 + $3;}| term                  {$$ = $1;};

归约expr PLUSterm为expr时,将会做如下操作:从属性值栈中取出产生式右部expr的属性值($1)和term的属性值($3),将两者的和存入属性值栈中对应产生式左部的expr的属性值中

第三部分:辅助函数:
用C语言语法来写,一般指在规则段中用到或者在语法分析器的其他部分用到的函数。这一部分一般会被直接拷贝到yacc编译器产生的c源文件中。除了规则段用到的函数外,辅助函数段一般包括如下例程:yylex(),yyerror(),main()。

  • int yylex()是词法分析程序,它返回记号。语法分析驱动程序yyparse()将会调用yylex()获取记号。如果不使用lex生成这个函数,则必须在辅助函数段用C语言写这个程序。记号由记号名和属性值构成,记号名一般作为yylex的返回值
  • main()是主程序,主程序的主要作用是调用yyparse()函数,yyparse()是yacc生成的语法分析驱动函数,语法分析成功结束时,yyparse返回0,而发现错误时,则返回1,并且调用yyerror()函数输出错误信息。
  • yyerror()是错误报告例程。

YACC中.y文件如何注释
用C语法写的部分,可以用C语言的两类注释;如

//注释部分
/*或者这样注释*/

非C语法写的部分,可以用如下方式注释:

 /* 这里写注释,但是要注意“/*”前面要有先导空格,不能顶着行首来写*/

先学这么多,之后如果还有补充还会更新哒~

yacc语法学习-part1相关推荐

  1. Qt的.pro工程文件语法学习

    我们编写Qt应用程序时,不管使用Qt Creator还是VS或者Eclipse,不管是Qt Widgets还是Qt Quick,总会发现有.pro文件,我们称.pro文件为Qt的工程管理文件,它存在的 ...

  2. Python基础语法学习笔记

    Python基础语法学习笔记 想淘宝省钱看我简介,博客www.liangxin.name (一) 一.Print()函数 1.数字可以直接输出,无需加引号 只能理解数字,却读不懂文字.因为数字和数学运 ...

  3. [转]verilog语法学习心得

    verilog语法学习心得 1.数字电路基础知识: 布尔代数.门级电路的内部晶体管结构.组合逻辑电路分析与设计.触发器.时序逻辑电路分析与设计 2.数字系统的构成: 传感器  AD  数字处理器  D ...

  4. ElasticSearch聚合语法学习(bucket,metric,hitogram,date hitogram)

    ElasticSearch聚合语法学习 目录 bucket与metric两个核心概念 插入数据 统计哪种颜色电视销量最高 统计每种颜色电视平均价格 bucket嵌套实现颜色+品牌的多层下钻 统计每种颜 ...

  5. ElasticSearch搜索语法学习(term,filter,bool,terms,range)

    ES搜索语法学习 目录 原始数据 term,filter使用 bool组合多个filter条件来搜索数据 terms搜索多个值以及多值搜索结果优化 基于range filter来进行范围过滤 手动控制 ...

  6. android语法帮助手册_新 App 「捧读:日语语法学习与分析」的开发幕后思考

    新产品发布后,写一篇幕后思考已经是固定环节了. 为什么开发这款软件? 在开发完日语假名学习的 App 「50 音起源」 之后,便在考虑如何做一款语法相关的产品,市面上虽然有少许产品可供参考,但我觉得这 ...

  7. 【C++学习之路】第二章——C++基础语法学习(1)之黑客攻击系统

    2 C++基础语法学习(1)之黑客攻击系统 遵循原则:从实战中学习知识 法律声明:本系统仅能攻击自己搭建的网站,作为学习使用,不会触犯法律 time:2020.01.20 author:姜海天 IDE ...

  8. 正则不能输入特殊字符_正则表达式语法学习和在线练习

    标题: 正则表达式语法学习和在线练习作者: 梦幻之心星 sky-seeker@qq.com标签: [#正则表达式,#语法,#学习,#练习]目录: [语法]日期: 2021-01-26 背景说明 正则表 ...

  9. python语法学习—实现猜拳游戏

    python基础语法学习,通过实现猜拳游戏,来对python语法的学习. # python语法实现 猜拳游戏 电脑随机出拳进行比较,用户自己输入要出的拳,用户赢了就退出游戏 # 主要用到 python ...

  10. MongoDB语法学习

    MongoDB语法学习 MongoDB官方文档 mongodb语法有很多,如多列索引,查询时可以统计函数,支持多条件查询,但是目前对于多表的查询是暂不支持的,但是可以通过数据冗余来解决多表查询的问题. ...

最新文章

  1. 如何区分山寨版网管软件
  2. 复旦大学邱锡鹏教授:NLP预训练模型综述
  3. 重磅 | 数据库自治服务DAS论文入选全球顶会SIGMOD
  4. c语言表示测试结束,C语言简单测试题
  5. publiccms实现多层级选项卡效果
  6. 简单的Session案例 —— 一次性验证码
  7. 智能机器人及其应用ppt课件_一文了解!伺服系统机理及其在工业机器人等领域的应用...
  8. php 判断下载状态,php下获取http状态的实现代码
  9. MVC应用程序与单选列表
  10. 手摸手,一起整理前端小小小知识
  11. 敏捷开发“松结对编程”实践之一:人员结构篇(大型研发团队,学习型团队,139团队,师徒制度)...
  12. 联想无线键盘使用方法
  13. SQL Server【获取当前时间】
  14. 2017 Postgres大象会 TBase可靠性探究ppt
  15. 【Scrum】借由数个冲刺,实现产品的敏捷开发!
  16. excel取末尾数字_excel取后面几位数
  17. 计算机图标到桌面,显示桌面图标不见了怎么办?显示桌面图标不见了解决方法...
  18. 【jq练习】层次选择器
  19. 微前端是什么、价值、不足、典型模式
  20. 当老板让我从 Java8 升到 Java11

热门文章

  1. php浮点数用法,php中让人头疼的浮点数运算分析
  2. 华众 mysql_华众6.5虚拟主机管理系统SQL注入漏洞利用
  3. 关于iframe或document监听滑动(scroll)失败的问题
  4. typora 公式_Typora 编辑器的Vue主题类介绍
  5. vue style.css,vue * !!vue-style-loader!css-loader?
  6. CentOS 7.6 配置VNC远程访问服务器图形界面
  7. 基于java web的学生考勤带请假管理系统——计算机毕业设计
  8. iTerm2 + Fish 打造高效终端
  9. 打印准考证服务器异常显示,2020准考证打印30个常见问题汇总及解决办法
  10. sql请求失败或服务器无即使响应,SQL2005无法启动SQL Server 请求失败或服务未及时响应等问题的解决方案...