第四章语法分析和语法分析程序

第四章语法分析和语法分析程序

  • 4.1_自顶向下的语法分析
    • 4.1.1_自顶向下分析过程的基本特点
      • ①消除文法直接左递归
      • ②回溯的消除及LL(1)文法
    • 4.1.2_递归下降法
    • 4.1.3_预测分析法(也叫LL1法,注意分析过程中非终结符号逆序入栈)
  • 4.2_自底向上的语法分析
    • 4.2.1_算符优先分析法
    • 4.2.2_LR分析法
      • (1)LR分析器由四部分组成(分析表):
      • (2)主程序分析过程:
      • 4.2.2.1_LR(0)文法
        • (1)LR(0)项目
        • (2)识别所有的规范句型全部活前缀的DFA
        • (3)LR(0)分析表的构造
      • 4.2.2.2_SLR(1)文法
        • (1)LR(0)可能发生的冲突
        • (2)SLR(1)分析表的构造
      • 4.2.2.3_LR(1)文法
        • (1)SLR(0)的冲突
        • (2)LR(1)的解决方法及DFA的构建

自顶向下:递归下降法、LL(1)分析法
自底向上:算符优先法、LR分析法

4.1_自顶向下的语法分析

自顶向下:递归下降法、LL(1)分析法

4.1.1_自顶向下分析过程的基本特点

自顶向下分析过程的基本特点:
①如果文法是左递归的,则自顶向下分析会陷入无限循环;(消除左递归
②每步推到的试探会形成大量的回溯;(消除回溯LL1文法
③分析失败难于指出错误的具体情况(错误位置和错误类型);(LL1文法

①消除文法直接左递归

方法:将A→Aα|β形式的产生式改写为A→βA’和A’→αA’|ε的形式

例题:E->EAT|T
消除左递归:E->TE’,E’->ATE’|ε

②回溯的消除及LL(1)文法

对于一个已化简且不含左递归的文法G,当进行自顶向下的语法分析时,不会出现回溯的充要条件是,对G中形如A→γ1|γ2|…|γm的产生式,若其候选式γi 和γj 满足:(其中1≤i,j≤m;i≠j)
(1) FIRST(γi)∩FIRST(γj)=Φ
(2) 若ε∈FIRST(γj),则
FIRST(γi)∩FOLLOW(A)=Φ
则称G为LL(1)文法。

  • FIRST(γ):γ可以退出的开头的终结符号(或ε)

(1)若x∈VT,则FIRST(x)={x};
(2)若X∈VN,且G中有形如 X->aα (a∈VT)或(和)X->ε 的产生式,
则把 a 或(和)ε 添加到FIRST(X)中;
(3)设G中有形如 X->Y1Y2…Yi…Yk 的产生式,
若Y1∈VN,则将FIRST(Y1)中一切非 ε 符号加入到FIRST(X)中;
若Y1、Y2、… 、Yi (1≤i≤k-1)均为非终结符,且其FIRST集中均有ε ,
则将FIRST(Y1)、FIRST(Y2) 、… 、FIRST(Yi+1)中一切非 ε 终结
符加入FIRST(X)中;
若Y1、Y2、… 、Yk的FIRST集中均有ε,则将ε加入FIRST(X)中。

  • FOLLOW(A):在所有句型中可能直接跟在A之后的终结符号

(1)对文法的开始符S,#∈FOLLOW(S);
(2)若G中有形如B->αAβ的产生式,
则将FIRST(β)中一切非ε符号加入FOLLOW(A);
(3)若G中有形如B->αAβ的产生式,并且ε∈FIRST(β),
或者有形如B->αA的产生式,
则将FOLLOW(B)中一切符号加入FOLLOW(A)。
图一
图一

4.1.2_递归下降法

  • 思路:为文法的每一非终结符号,依相应的候选式结构,编写一子程序识别其表示的语法范畴。

    例:
    在这里插入图片描述

4.1.3_预测分析法(也叫LL1法,注意分析过程中非终结符号逆序入栈)

若一文法为LL(1)文法,进行最左推导时,当一非终结符A有多个候选式时,只需检查当前正扫视的输入符号α属于那个候选式的首符集;或若某候选式yi的首字符集含e,且当前输入符号α属于FOLLOW
(A),便可准确的选取候选式。这种分析方法称为预测分析法。
若一文法为LL(1)文法,可以为之构造一无回溯的语法分析程序,称为LL(1)分析程序或LL(1)分析器。

例如:使用预测分析法推导图一文法

①构造First和Follow表
在这里插入图片描述
②构造此文法对应的预测分析表
在这里插入图片描述
③分析过程

分析开始,将栈底符号#和文法开始符S入栈,各指示器置初值:
在这里插入图片描述
分析中,设某一时刻的分析格局为:
在这里插入图片描述
根据栈顶Xm的不同情况,分别作如下处理:
a)Xm->VT(Xm是终结符号) ,若Xm=ai,则Xm出栈,输入串指针移到下一位置;若Xm ≠ ai,则进行语法错误处理。
b) Xm->VN (Xm是非终结符号),以(Xm,ai)查分析表: 若表元素为ERROR转出错处理;若表元素为Xm->Y1Y2…Yk,则Xm退栈,Y1Y2…Yk反向入栈。
c)Xm=ai=#,分析成功。

假若输入的字符串为“i+i*i”
在这里插入图片描述

参考分析表(后面简述表),判断余留输入串的第一个,首先是i,那么通过表知道分析栈中的E通过E->TE’才能得到i,所以E出栈,E’T入栈,继续分析通过表发现T通过T->FT’才能得到i,那么T出栈,T’F入栈,通过表知F通过F->i可以直接得到i,所以F出栈,到此余留输入串第一个字符识别完毕,开始下一个字符的识别

4.2_自底向上的语法分析

4.2.1_算符优先分析法

定义4.2:若文法中不含有两个非终结符相邻的产生式,则称为算符文法。(广义运算符: 文法的终结符号 广义运算对象: 非终结符)
定义4.6:对一算符文法G,若任何一对终结符号间至多只有一种优先关系,
则称G为算符优先文法。

步骤:
①构造算符优先矩阵
算符优先矩阵的构造方法
根据以下三种优先关系的定义,找全优先关系,构造优先关系矩阵。
定义4.3 a=b :存在产生式 U→…ab… 或 U→…aAb… 时。
定义4.4 a<b :存在产生式 U→…aA… 且 A 能推导出以 b 为第一个终结符号的符号串。
定义4.5 a>b :存在产生式 U →…Ab… 且 A 能推导出以 a 为最后一个终结符号的符号串。
注意是第一个/最后一个 终结符号
在这里插入图片描述

例如:
在这里插入图片描述

(1)首先看“=”有哪些,因为相等的两个终结符号满足形式“U→…aAb…”,所以找“aAb”形式的发现只有"(E)",所以“(” = “)”
(2)其次找“<”的有哪些,因为若终结符号a<b满足形式“U→…aA…且A-+->b”,所以先找“aA”形式的,再找A的FirstVT(A)集合(第一个终结符号,不是LL1中的first集),则a<FirstVT(A)
在这里插入图片描述
FirstVT(T) = {“(”,“i”,“”},FirstVT(F)= {“(”,“i”},FirstVT(E)= {“+”,“(”,“i”,“”}
(3)找“>”
(4)#<firstVT(E) #>lastVT(E)
在这里插入图片描述

②规约过程

1)寻找最左素短语:w = #N1a1N2a2…NnanNn+1#(ai VT , Ni VN∪{})从左到右扫描 w,找到第一个ai > ai+1,再回扫找到第一个aj-1 < aj此时 Nj aj Nj+1 aj+1 … Ni ai Ni+1 就是应被归约的最左素短语。
2)归约策略:在文法中找形如 A Uj aj Uj+1 aj+1 …Ui ai Ui+1 的产生式,其中 Ui 与 Ni 不一定相同,但每个 ai 必须相同, 若存在这样的产生式,则按此产生式归约;否则报错。
在这里插入图片描述

4.2.2_LR分析法

LR(K)文法的特性
每一LR(K)文法都是无二义性文法
某一由LR(K)文法产生的语言也可由某一LR(1)文法产生

LR分析器的逻辑结构及工作原理:
在这里插入图片描述

(1)LR分析器由四部分组成(分析表):

①分析栈:其中状态和符号顺序一致(换言之数量也一致)
②分析表:分析表由不同的LR(k)文法特制
action表
其中行名S1,S2…Sn为分析器的各个状态,列名a1,a2…al是全部终结符号和句子界符(句子界符即#)
goto表:
其中行名S1,S2…Sn为分析器的各个状态,列名X1,X2…Xp是全部文法符号(终结符号、非终结符号等,所以p>l)
两个表合并:
其中行名S1,S2…Sn为分析器的各个状态,列名a1,a2…al是全部终结符号和句子界符(句子界符即#)列名Xl,Xl+1…Xp是非终结符号
在这里插入图片描述

③输入符号串
④主程序

(2)主程序分析过程:

在这里插入图片描述

以上算法主要是(1)(2),其中(1)是不能规约的情况,直接将分析的输入符号ai推入栈,并且将新状态同时入栈
(2)其实就是已经入栈的有一部分已经可以规约了,按照指定的产生式进行规约并出栈,同时选择下一状态

在这里插入图片描述

4.2.2.1_LR(0)文法

(1)LR(0)项目

①规范句型的活前缀:指规范句型中不含句柄之右的符号的前缀。(如A→xBz的活前缀是ε和x)
② LR(0)项目:指右部某位置上标有圆点的产生式。
LR(0)项目可分为四类:
归约项目(A→ a.) 因为A的产生式全部在“.”前面(即都分析完毕了),所以可以规约
接受项目(S→ a.)因为从开始符已经将终结符号推出完了,所以归约成功
移进项目(A→ a.xβ 其中x为终结符)因为后面还有终结符,所以不能规约,要继续移进
待约项目(A→ a.Xβ其中X为非终结符)

产生式A→xyz对应有四个项目:

A→·xyz   活前缀不含句柄符号(意味着还没有识别出来A产生式右部的任何的一个符号)
A→x·yz   活前缀含部分句柄符号(已经识别出来一个符号x)
A→xy·z
A→xyz·   活前缀含句柄所有符号
特别的:A→ε产生式的项目为A→.

(2)识别所有的规范句型全部活前缀的DFA

在这里插入图片描述
在这里插入图片描述

(3)LR(0)分析表的构造

在这里插入图片描述

在这里插入图片描述

4.2.2.2_SLR(1)文法

(1)LR(0)可能发生的冲突

冲突种类:移进规约项目、归约归约冲突
I8同时出现了移进项目和规约项目(移进规约冲突),进而其LR(0)分析表出现以下冲突
在这里插入图片描述
在这里插入图片描述

(2)SLR(1)分析表的构造

SLR(1)的DFA构造与LR(0)一模一样,接下来重点讨论其分析表的构造

消除冲突:
如果集合{a1, a2 ……, am},FOLLOW(B1), ………… FOLLOW(Bn)两两不相交,则隐含在I中的动作冲突可通过检查现行输入符号a属于上述n+1个集合中的哪一个而得到解决:
若a是某个ai ,i=1,2,………,m,则移进;
若a ∈ FOLLOW(Bi),i=1,2,……………,n,则用产生式Bi ->α归约;
此外报错

SLR(1)分析表构造步骤(标黄字段是与LR(0)构表过程的不同之处)
(1)将文法拓广
(2)构造识别文法全部规范句型活前缀的DFA
(3)求非终结符号Follow( )集合
(4)对每个项目集按以下四条规则填表:
① 若项目集Ii中有S’->S ·置[i,#]=acc
② 若项目集Ii中有A-> α· 的项目, A-> α 为第j个产生式,则将Follow(A)元素所在列置归约动作为rj
③ 若项目集Ii中形如A-> α·xβ的项目,若Go(Ii,x)=Ij,x为终结符,置[i,x]为Sj,x为非终结符,置[i,x]为j
④ 分析表中无定义的元素均表示”出错”
在这里插入图片描述

4.2.2.3_LR(1)文法

(1)SLR(0)的冲突

在这里插入图片描述
在这里插入图片描述

(2)LR(1)的解决方法及DFA的构建

方法:将Follow集合按属性拆分为最小单位
①重新定义项目:使每个项目后面附带一个终结符a [A->α·β,a ]。这样的项目称为LR(1)项目,a称为向前搜索符号a的求法如下

【注意:向前搜索符号仅对归约项目有意义,对移进/待约项目无作用】
向前搜索符号解法:
 对S’->.S,向前搜索符号为#;
 对**[A->α·Bβ,a ]** ∈Closure(I),
[B-> ·η,first(βa)] ∈ Closure(I)
【注意“,”只是分隔符,用来分开搜索符号,搜索符号为βa的first集】

②识别LR(1)文法全部活前缀的DFA构造方法

对LR(1)项目集的Closure(I)定义如下: •I中任何LR(1)项目都属于Closure(I);
•若项目[A->α·Bβ,a ]属于Closure(I),B->η是一产生式,则 对FIRST(βα)中每个终结符b,若[B->· η,b ]不在Closure(I)中则加入之;
•重复2直到Closure(I)不再增大为止。

在这里插入图片描述
③LR(1)分析表的构造(标黄为不同之处)
若项目[S’->S·,#] ∈Ii,则置ACTION[i,#]=acc
若归约项目[A->α ·,a ] ∈Ii,A->α为文法第j个产生式,则置ACTION[i,a] =rj
 对每个项目集Ii中形如[A->α ·xβ,a ]的项目,若GO(Ii,x) =Ij,且x为一终结符b时,置ACTION[i,b]=Sj,若x为一非终结符,则置GOTO[I,x]=j
其余error
对给定文法用上述方法构造的LR(1)分析表,不含多重定义元素,称G为LR(1)文法。
【注意:向前搜索符号仅对归约项目有意义,对移进/待约项目无作
用】
在这里插入图片描述

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

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

相关文章

实战:RediSearch 高性能的全文搜索引擎

RediSearch 是一个高性能的全文搜索引擎,它可以作为一个 Redis Module(扩展模块)运行在 Redis 服务器上。 RediSearch 主要特性如下: 基于文档的多个字段全文索引高性能增量索引文档排序(由用户在索引时手动提供)在子查询之间使用 AND 或 NOT 操作符的复杂布尔查询可选的…

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.…

java线程的5个使用技巧

Java线程的5个使用技巧 Published: 21 Jan 2015 Category: java Java线程有哪些不太为人所知的技巧与用法&#xff1f; 萝卜白菜各有所爱。像我就喜欢Java。学无止境&#xff0c;这也是我喜欢它的一个原因。日常工作中你所用到的工具&#xff0c;通常都有些你从来没有了解过的东…

算法复习第五章贪心法

算法复习第五章贪心法概述TSP最近邻点策略最短连接策略图着色问题最小生成树&#xff08;Prim算法、Kruskal&#xff09;0-1bag问题活动安排问题多机调度概述 TSP 最近邻点策略 最短连接策略 图着色问题 最小生成树&#xff08;Prim算法、Kruskal&#xff09; 0-1bag问题 活动…

c语言putchar函数_C语言中的putchar()函数与示例

c语言putchar函数C语言中的putchar()函数 (putchar() function in C) The putchar() function is defined in the <stdio.h> header file. putchar()函数在<stdio.h>头文件中定义。 Prototype: 原型&#xff1a; int putchar(const char *string);Parameters: co…

算法复习第六章第七章

算法复习第六章第七章第六章回溯法TSP问题0-1bag问题图着色问题八皇后问题第七章分支限界法0-1bag问题TSP问题第六章回溯法 TSP问题 0-1bag问题 图着色问题 八皇后问题 第七章分支限界法 0-1bag问题 TSP问题

扫描识别系统

扫描识别系统&#xff0c;是指能够利用扫描仪进行扫描的相关文件&#xff0c;比方普通文档&#xff0c;政府公文&#xff0c;二代身份证&#xff0c;条码……等等。通过扫描仪扫描后不单单生成常见的JPG&#xff0c;PDF等格式的图像。而是利用先进的OCR技术&#xff0c;进行相关…

Python正则表达式指南上半部

本文介绍了Python对于正则表达式的支持&#xff0c;包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式&#xff0c;这些主题请查看其他教程。注意&#xff1a;本文基于Python2.4完成&#xff…

算法复习第三章分治法

算法复习第三章分治法循环日程表最近点对快速排序&#xff1a; 循环日程表 最近点对

算法复习第四章动态规划

算法复习第四章动态规划动态规划TSP问题0-1bag动态规划 TSP问题 0-1bag 最长公共子序列不考&#xff1a;

操作系统Ubuntu(实验三四)

实验三四3._实验三&#xff1a;Linux进程/线程的异步并发执行3.1_fork()函数创建子进程3.2_创建线程pthread_create();4._实验四&#xff1a;使用信号量进行互斥与同步4.1_信号量初使用&#xff08;1&#xff09;信号量简单介绍&#xff08;2&#xff09;信号量以及P、V操作的使…

实战:Redis哨兵模式(上)

上一篇我们讲了主从复制模式,它是属于 Redis 多机运行的基础,但这种模式本身存在一个致命的问题,当主节点奔溃之后,需要人工干预才能恢复 Redis 的正常使用。 例如,我们有 3 台服务器做了主从复制,一个主服务器 A 和两个从服务器 B、C,当 A 发生故障之后,需要人工把 B…

计算机网络(第四章网络层)

第四章网络层4.1_网络层提供的两种服务&#xff08;1&#xff09;虚电路服务&#xff08;2&#xff09;数据报服务4.2_网络协议4.2.1_虚拟互连网络4.2.2_分类的IP地址&#xff08;1&#xff09;分类IP地址三种分类方法IP 地址的一些重要特点4.2.3_IP地址与硬件地址4.2.4_地址解…

实战:Redis 主从同步

主从同步(主从复制)是 Redis 高可用服务的基石,也是多机运行中最基础的一个。我们把主要存储数据的节点叫做主节点 (master),把其他通过复制主节点数据的副本节点叫做从节点 (slave),如下图所示: 在 Redis 中一个主节点可以拥有多个从节点,一个从节点也可以是其他服务…

idea连接sqlserver及数据库操作

idea连接sqlserver及操作一、在连接过程中遇到的问题&#xff1a;&#xff08;1&#xff09;数据库登录失败&#xff08;2&#xff09;登录成功之后数据库端口号怎么查看二、代码连接数据库①加载驱动和连接数据库三、数据库操作连接详解链接 总体流程链接 操作实例链接 一、…

实战:Redis 集群模式(上)

Redis Cluster 是 Redis 3.0 版本推出的 Redis 集群方案,它将数据分布在不同的服务区上,以此来降低系统对单主节点的依赖,并且可以大大的提高 Redis 服务的读写性能。 Redis 将所有的数据分为 16384 个 slots(槽),每个节点负责其中的一部分槽位,当有 Redis 客户端连接集…

案例:Redis 问题汇总和相关解决方案

本文收集了一些 Redis 使用中经常遇到的一些问题,和与之相对应的解决方案,这些内容不但会出现在实际工作中,也是面试的高频问题,接下来一起来看。 缓存雪崩 缓存雪崩是指在短时间内,有大量缓存同时过期,导致大量的请求直接查询数据库,从而对数据库造成了巨大的压力,严…

加餐:Redis 的可视化管理工具

因为 Redis 官方只提供了命令行版的 Redis 客户端 redis-cli,以至于我们在使用的时候会比较麻烦,通常要输入一堆命令,而且命令行版的客户端看起来也不够直观,基于以上两个原因我们需要找一个可视化的 Redis 客户端,下面是我这些年使用过的一些 Redis 可视化客户端,分享给…

第一次创建springboot框架项目

第一次创建springboot框架项目1.1_创建步骤2.1_启动时遇到的问题2.2_启动响应网页测试2.3_连接数据库尝试1.1_创建步骤 &#xff08;1&#xff09;创建spring项目 &#xff08;2&#xff09; &#xff08;3&#xff09; 加入引擎 下一步即可 2.1_启动时遇到的问题 &a…

springboot工程的热部署

springboot工程的热部署&#xff08;1&#xff09;第一步配置pom.xml&#xff08;2&#xff09;第二步更改IDEA设置什么是热部署配置呢&#xff1f; 我们在开发中反复修改类、页面等资源&#xff0c;每次修改后都是需要重新启动才生效&#xff0c;这样每次启动都很麻烦&#xf…