Flex and Bison 阅读与学习笔记

news2024/11/15 23:33:56

本文的内容来源于本人阅读 flex & bison的笔记和项目工程学习中遇到的问题。如果你能从中获得一丝丝帮助,本人将不胜荣幸。

文章目录

    • Ⅰ、目录与批注
      • 前四章 引言和使用介绍
      • flex 规范参考
      • bison 参考规范
      • 其余内容
    • Ⅱ、相关练习代码
      • 学习历程
      • 代码实例
    • 参考文献

Ⅰ、目录与批注

前四章 引言和使用介绍

页 码批注备注
19各部分通过%% 分割,其分别为 声明;模式与动作 和 C代码
24atoi :ascii to integer yylval:这个变量用来储存记号值,定义为整型
25yacc:yet another compiler compiler
antlr:another tool for language recognition
java 的一个自定义语法编译器 和 bison 前身的全称
26上下文无关文法 CFG 巴克斯范式 31BNF
31如果一种文法是有歧义的,bison会报告在冲突(conflicts),而且标示出针对给定的输入哪里会有两种不同的分析。优先级 和 分组会解决二义性 还有 GLR处理二义性和任意的向前看符号
ChapterⅡflex 的 使用
35正则表达式使用元语言??与对象语言相对,指描写和分析某种语言所使用的一种语言或符号集合;《语言与语言学词典》对语言学的解释是:纯理语言,指用来分析和描写另一种语言的语言或一套符号
36正则表达式字符
38flex如何处理二义性尽可能多地匹配字符;匹配更早出现的模式
40开头设定%option noyywarp 来要求其不使用yywarp
yyrestart(f)读取输入输出文件 f;
42flex有灵活的三层输入结构
yyin 来读取所需文件
输入缓冲区
重定义yy_input
其使用yy_buffer_state的数据结构来处理输入
43unput(c)的调用可以把字符 c 退回输入流
44所有没有被匹配的输出都将拷贝到yyout中
设置%option nodefault,使其不添加默认的规则,这样当输入无法被给定的模式匹配时,词法分析器可以报告一个错误。
起始状态:其运行在特定时刻哪些状态被匹配 %x %s
47flex 提供一个叫yylineno的变量,其被用来记录行号。我们可以直接使用它。
49case_insensitive 其要求flex生成一个大小写无关的词法分析器
51符号表 名字的查找:线性探索的哈希法。每个字符用 9 承之前的哈希值,让后再异或这个值。
52yytext中的字符串被在下一个词法记号被分析时替换掉。
58fiFL的作用
字符常量 单引号 开始 ,单引号结尾 ‘ ’
问题
Chapter Ⅲbison 的 使用
63flex讲输入流分解成若干个片段,bison则分析这些记号并基于逻辑进行组合。
左部:LHS
右部:RHS
64bison不会自动地为我们创建语法分析树,需要我们自己实现。
65bison处理时,其创建一组状态,每个状态都反映出一个或多个分析过的规则在可能的位置
移进:当语法分析器读取记号,无法结束一条规则时,将其压入一个堆栈,让后切换到一个新的状态,此状态反映了刚刚读取的记号。
规约:如果压入的符号可以组成规则的右部,将其全部从堆栈弹出,让后左部符号压入堆栈。
(例子)
66LALR(1):LALR(1)全称为lookahead-LR(1),是由LR(1)语法分析器变来的,其中L(Left Scan)表示自左向右处理输入,R(Right Reduce)表示生成最右推导,而数字1表示使用先行1个符号。
第三章 LALR(1)的构造_lalr(1)_Bash_linux的博客-CSDN博客
而LALR(1)简化了LR(1),采用合并同心集方法,大大缩小了LR(1)的自动机状态规模,功能介于SLR(1)与LR(1)之间,但应用于目前的语言,已经绰绰有余。YACC就是使用这种分析方法。
67三部分组成:定义;语法分析器的规则;C代码
bison定义的规则会被编译成数组的形式,其内容代表了可以匹配输入记号的状态机。
69%union定义符号值的类型,定义完后要声明%type <>
没有显示的语义动作时,规则默认语义$$ = $1;
70文字字符记号:记号的ASCII 就是记号的编号。
71yyval 现在是联合类型,双精度浮点数的值不不给yyval.d
72eval(调用计算)和 free是都采用深度优先
73flex 的 -o 参数
76声明优先级:%left %right %noassoc
负数规则%prec
77一个高级计算器的flex bison 代码实现(错误恢复机制)
79用户自定义的函数 ufcall 节点;
控制流使用 flow节点。
81list的 定义是右递归的,否则使用更麻烦。
83简单的错误恢复:放弃错误后续的语法符号,直到达到一个记号为error为有效的点;接着开始忽略后续的输入,直到找到一个可以被移进的记号,让后从此处继续开始分析。
Chapter Ⅳ分析 SQL
96MySql的输入是bison分析的。
100逆波兰式的优点
105btwode 的切换(因为 and 有 &&的意思 还有 between and的意思)
107问题:mysql中的 = 号除了比较
109语法分析器
匹配长度可变的项目列表
113子代码是基于位编码的
114函数
116select 语句的 语法规则**(可选的)** 这个对我的项目很重要

flex 规范参考

页 码批注备注
20flex 基础命名 在这里插入图片描述
133结构规范在这里插入图片描述
134BEGIN 宏 在这里插入图片描述
135上下文相关性
特殊的行首模式 ^ $ ;起始状态;显示代码;
2.07 Flex如何处理上下文相关性_如何做上下文相关性处理_ronnie88597的博客-CSDN博客 在这里插入图片描述定义 替换 在这里插入图片描述
137echo 在这里插入图片描述
137标准输入文件链
yyrestart(file)来使得词法分析器读取任意标准输入文件
137输入缓冲区
139使用c++编辑 input 改为 yy_input 避免冲突
140交互 和 批处理模式下的 词法分析器
141文字块 在这里插入图片描述
142多重词法分析器
143在这里插入图片描述144字符集
EBCDIC
146可重入词法分析器 嵌套文件 多重词法分析器 在这里插入图片描述
150yylex 的返回值 在这里插入图片描述
%s 共享模式 %x 独占模式
yylex
flex 的变量 与 函数在这里插入图片描述
151unput()返回字符给输入流;
yyless 和 unput 效果一样,但yyless 通常更快
152yyleng () = strlen(yytext)
153问题 yy_decl
154/第四部分 函数 function/ int yywrap()
{ /此函数必须由用户提供,或者声明 %option noyywrap当词法分析程序遇到文件结尾时,它调用例程yywrap()来找出下一步要做什么如果返回0,扫描程序继续扫描,如果返回1,扫描程序就返回报告文件结尾/ return 1; }
yywarp 的 作用在这里插入图片描述

bison 参考规范

页 码批注备注
155三部分组成 定义 %% 规则 %% 用户子例程 在这里插入图片描述
156 在这里插入图片描述在这里插入图片描述定义;动作
157嵌入动作
159移进 规约冲突 输入字符存在两种可能的语法分析器 一般bison选择移进
归约 归约冲突 一个记号可以结束两条不同规则的时候 选择先出现的那条规则进行归约
当GLR语法分析器遇到冲突时,理论上其会分裂出并行的两种可能的分析
%expect
161
bison 列表中一个结束标记 伪符号 $end 在这里插入图片描述
%code
162bison从 错误分析中恢复,其从分析器堆栈中 抛弃符号 和 符号值在这里插入图片描述错误恢复
163继承属性 ($0)
164词法反馈 :从语法分析器反馈上下文信息 给 词法分析器
166位置 %location
168优先级声明在这里插入图片描述在这里插入图片描述
170bison 处理左递归 要比 右递归 (如果列表中的元素个数很少而且你需要把他们存到一个链表中时,右递归更有用)更有效率。
规则堆栈大小 TTINITDEPTH
173特殊字符
$ 引入一个值引用
@ 引入一个位置引用
174%start 声明 在这里插入图片描述
声明符号类型 %union
176记号 编号 -d生成的文件内 查看
tab.h包含了与语法分析器相关的声明、常量和数据结构。其他源文件(如Flex的源文件)需要包含此头文件,以便正确地使用语法分析器生成的标记(tokens)和语法规则。
177%union %type
178可变语法和多重语法;合并的语法分析器
179%name-prefix 或者 -p标志 注意在运行项目的时候,编译器对我进行警告,这个已经过时,最新的用法应该是 %define api.prefix { xxx }
180y.output文件
--report = all
181bison 库文件
yyabort
yyaccept
yybackup 移出当前符号并替换为 另一个记号
yyclearin 放弃预读符号
yydebug
yyerrork 其用来让语法分析器回到正常
yyerror
yyparse

其余内容

页 码批注备注
CHAPTER Ⅶ二义性冲突
187指针模型:一个指针将会在每次读到一个记号时在bison语法中移动。
188在这里插入图片描述
189冲突类型
191语法分析器状态 -v 生成 output文件(其内为所有状态机的)
1926A 的归约问题(解决)
193归约 归约冲突:在冲突发生时,未被选择的规则在方括号中,其总是选择更早出现的规则来解决 归约 归约冲突
195移进 归约冲突:
在这里插入图片描述bison 总是选择移进来解决 冲突
198常见的三种 冲突情况 表达式语句(语法是递归的);if/then/else;嵌套列表(嵌套循环) 移进归约 冲突;规则的重叠 (归约 归约 -> GLR语法)
大多数的移进 归约冲突来源于 bison有限的向前查看
CHAPTER Ⅷ错误报告 与 恢复
213为语法分析器添加位置信息 使用了yyloc内的位置 信息 和一个新的 lyyerror
215带有文件名的位置信息
218错误恢复技巧:尝试在输入流中向前移进足够远,这样新的输入就不会被旧的输入所影响
219%destructor 声明:让bison知道弹出一个具体语义值符号时应该做什么 在这里插入图片描述
220交互式语法分析器 的 恢复;先用yyclearin 放弃预读的内容;再用yyerrok 重新开始正常的分析;
CHAPTER Ⅸ两者的进阶
223纯 词法 语法 分析器的概念: <> 把所有静态数据结构替换为参数传递给词法分析器和语法分析器中的例程
224纯 flex 在这里插入图片描述
225将原本的静态数据改为 指向我们的实例数据
228%option bison-bridge bison-location reentrant
244GLR分析
247设定GLR语法分析器
249c版 的 flex 和 C++的bison联合

Ⅱ、相关练习代码

学习历程

在学习过程中,根据龙书的前几个章节又重新了解了一下编译原理,这个方向还是比较难理解的。我是由于工程的原因需要去使用flex and bison。因此我的工作停留在应用层面应该是足够了的。想深度理解编译原理这个课题龙书应该是最专业的入门了,有需求的同学可以去看一下。这些教材的中文版github都是可以找到pdf版本的。

我的学习历程是先阅读了两本书才接触的代码,虽然在阅读过程中也结合着例子进行代码编写,但理解程度远不如去看工作中的一整个项目理解的快和好。在接触工程代码前,推荐先认真去看一下flex and bison 第三章的那个两者结合的例子,代码包含在下方代码链接的bison文件夹下。

代码实例

这个算是flex 和 bison一起使用来进行一个计算机程序的编写,从中可以理解如何运用flex进行词法分析,使用bison进行语法分析并且两者结合起来后的一些规范,如重命名,flex的c代码在bion中进行使用。对于初学者建议注意bison -d 生成的 tab.h 文件,对理解会有所帮助。

额外提一点,虽然编译器是先进行词法分析,在进行语法分析。但对于flex 和 bison的编译则是先进行bison -d 的选项,详细看上文行。因为bison文件内含有预先定义好的 token 等一些列关键字,而flex的作用就是去识别他们。具体也可去看下方flex-bison-code内的makefile文件。
在这里插入图片描述
参考文献的第三篇也可以好好读一下,可以更好地理解两者的工作原理和他们在工程中的应用。
flex-bison-code

参考文献

  1. flex & bison
  2. Compilers: Principles, Techniques, and Tools
  3. Flex(scanner)/Bison(parser)词法语法分析工作原理
  4. 第三章 LALR(1)的构造_lalr(1)_Bash_linux的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1110888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【文章摘要-20231019】Any-to-Any Generation via Composable Diffusion

论文链接 代码链接 作者提出了一个可组合的扩散模型&#xff0c;该模型体现为能够处理任何输入模态的组合&#xff0c;进而输出任何模态组合的新型生成模型&#xff0c;如语言、图像、视频或音频。不同于已经存在的生成式人工智能系统&#xff0c;该算法能够并行生成多个模态并…

Java基础 :内部类、枚举、泛型

内部类 概念 是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;这个类就是内部类。 场景 当一个类的内部&#xff0c;包含了一个完整的事物&#xff0c;且这个事物没有必要单独…

工作之余Happy一下(实现时钟特效)

样式 测试代码&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>时钟特效</title><style> body{background: #000;}.content{width: 400px;margin: auto;color: #fff;}#title…

openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换

文章目录 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换104.1 操作场景104.2 前提条件104.3 注意事项104.4 操作步骤 openGauss学习笔记-104 openGauss 数据库管理-管理数据库安全-客户端接入之SSL证书管理-证书替换 openGaus…

工业企业网络推广解决方案 | 网络营销专家分享 | 上海添力

在国内&#xff0c;工业企业如果想在线上做推广&#xff0c;其主要途径就是做搜索引擎推广&#xff0c;在几个常用的搜索引擎&#xff08;百度、360、搜狗、必应&#xff09;中&#xff0c;一般都是从百度开始做起。但不少工厂做百度广告&#xff0c;钱花了不少&#xff0c;就是…

做PPT或制作表情包时,不会把视频转成gif动图?5分钟学会

一、背景 当我们在做PPT时&#xff0c;不可避免的需要放一些视频&#xff0c;但视频占用空间太大&#xff0c;而且比较烦的是需要点一下才能播放。因此需要将视频转成gif动态&#xff0c;以自动播放。 GIF的全称是Graphics Interchange Format&#xff0c;可译为图形交换格式…

SQL题目记录

1.商品推荐题目 1.思路&#xff1a; 通过取差集 得出要推荐的商品差集的选取&#xff1a;except直接取差集 或者a left join b on where b null 2.知识点 1.except selectfriendship_info.user1_id as user_id,sku_id fromfriendship_infojoin favor_info on friendship_in…

ATE测试工程师的前景待遇如何?薪资天花板有多高?

在芯片行业&#xff0c;ATE测试工程师扮演着至关重要的角色。 他们不仅需要理解电路和芯片内部的工作原理&#xff0c;还需要利用各种测试工具和方法对芯片进行精确的测试和分析。那么ATE测试工程师前景如何&#xff1f;需要具备哪些技能要求呢&#xff1f; 首先来了解什么是…

【数据库范式】实际案例分析

前言 在日常业务研发过程中&#xff0c;我们常常需要与数据库表打交道。设计范式是数据表设计的基本原则&#xff0c;对于数据表的设计范式&#xff0c;我们特别容易忽略它的存在。很多时候&#xff0c;当数据库运行了一段时间之后&#xff0c;我们才发现数据表设计上有问题。然…

2023年中国润滑油分散剂市场需求量及行业竞争现状分析[图]

润滑油分散剂是一种两亲性化学品&#xff0c;可以增加油性部分以及水性部分在同一体系中的相容性&#xff0c;能降低分散体系中固体或液体粒子聚集的物质。换油时&#xff0c;可将有害的悬浮物从油中清除。 国内从60年代末开始试制丁二酰亚胺型分散剂&#xff0c;并于80年代初在…

93. 递归实现组合型枚举

题目&#xff1a; 93. 递归实现组合型枚举 - AcWing题库 思路&#xff1a; 1.从n个数中选择m个数&#xff0c;问有多少种选法。---->抽象为有m个坑位&#xff08;设置kenway[N]表示&#xff09;&#xff0c;其中填入编号为1~n的萝卜&#xff0c;问有几种填法。这里我们可…

二叉树题目:从中序与后序遍历序列构造二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;从中序与后序遍历序列构造二叉树 出处&#xff1a;106. 从中序与后序遍历序列构造二叉树 难度 5 级 题目描述 要…

互联网行业汇总

互联网行业汇总&#xff0c;全网最全&#xff01;选行业不愁 从事互联网选什么行业&#xff1f;这似乎是很多朋友的困惑。 所以这里给大家把互联网行业做个细致的汇总&#xff0c;每个行业列举几个典型的APP&#xff0c;简单拆解下各自的盈利模式&#xff0c;希望能给大家提供参…

了解Netty,从IO开始

java程序员要想升级高级工程师或者成为架构师&#xff0c;绕不开Netty的学习&#xff0c;就算你不做IM即时通信&#xff0c;也不是网络编程的工作岗位&#xff0c;仅仅只是CRUD程序员&#xff0c;当你想要了解一下Dubbo、Redis、kafka、rabbitMQ、ES、zookeeper、nginx等等的底…

群硕与Microsoft Dynamics全球团队密切协作,加速ERP产品迭代

群硕具备强大的软件研发能力&#xff0c;搭建自动化测试平台&#xff0c;保证高质量交付。 ERP系统的引入被视为企业走向数字化转型的关键一步。 此系统有助于实现企业内部资源与外部资源的整合&#xff0c;通过软件把人、财、物、产、供、销及相应的物流、信息流、资金流、管…

大数据之LibrA数据库系统部署方案

组网方案 基本概念 FusionInsight LibrA集群的组网方案中包含如下节点&#xff0c;如表1所示。 网络平面类型 FusionInsight LibrA整个系统网络划分为2个平面&#xff0c;即业务平面和管理平面&#xff0c;两个平面之间采用物理隔离的方式进行部署&#xff0c;保证业务、管理…

Lua快速入门教程

文章目录 1、Linux安装Lua2、语法练习2.1、变量2.2、循环2.3、函数2.4、数组2.5、迭代器2.6、Table操作2.7、Lua 模块与包2.8、加载机制2.9、Lua 元表(Metatable) 3、Lua 协同程序(coroutine)4、文件IO操作4.1、简单模式4.2、完全模式 5、错误处理 内容来源菜鸟教程&#xff0c…

软考-访问控制技术原理与应用

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 访问控制概念 访问控制是计算机安全的一个重要组成部分&#xff0c;用于控制用户或程序如…

Linux | gdb的基本使用

目录 前言 一、调试文件的生成 二、调试指令 1、选择调试文件 2、查看代码 3、运行代码 4、断点 5、打印与常显示 6、其他 总结 前言 前面我们学习了如何使用gcc/g来进行对代码进行编译&#xff0c;本章我们将使用gdb来对代码进行调试&#xff0c;学习本章的前提是有…

实验室用超声波清洗机哪家好

随着超声波清洗机在实验室得到广泛应用&#xff0c;超声波清洗机厂家也随之增多&#xff0c;品牌、型号更是数不胜数&#xff0c;价格相差也是十分悬殊。那么面对纷繁复杂的实验室超声波清洗机市场&#xff0c;实验室用超声波清洗机哪家好&#xff1f;小编推荐国内知名超声波清…