05语法分析——自下而上分析

news2024/12/23 18:32:02

文章目录

  • 一、自下而上分析基本问题
  • 二、算符优先分析
    • 构造FIRSTVT(P)的算法
    • 构造LASTVT(P)的算法
    • 构造优先表的算法
  • 三、LR分析法
    • 1.LR(0)
      • 构造LR(0)项目集规范族
      • 构造识别活前缀的DFA
      • 构造LR(0)分析表
    • 2.SLR
      • SLR解决冲突办法
      • SLR(1)分析表的构造算法
    • 3.LR(1)【规范LR】
      • LR(1)项目集I的闭包
      • 状态转换函数GO
      • LR(1)项目集规范族构造
      • LR(1)分析表的构造算法
    • 4.LALR
      • LALR分析表的构造算法
    • 例题
    • 结论

一、自下而上分析基本问题

归约
本章讨论的自下而上分析法是一种“移进-归约”法。
即:利用一个栈来存放符号,首先把输入符号一个一个移进栈中,当栈顶的若干字符形成某个产生式的候选式时,则把这部分替换成该产生式的左部符号。

“可归约串”的定义有多种方法:
(1) 算符优先分析法: “最左素短语”
(2) 规范归约分析法: “句柄”

自下而上的分析过程也可用一棵语法树来表示,即先建子树,随着归约的完成,连成一棵语法树。

规范归约简述

在这里插入图片描述
一个句型的句柄是这个句型的语法树中最左深度为2的子树的叶子从左到右排列。

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

在形式语言中,最右推导常称为规范推导。由规范推导所得的句型称为规范句型。
若文法是无二义的,则规范推导的逆过程,必是规范归约。

对于规范句型,句柄的后面不会出现非终结符,即只能全是终结符。(原因:对于移进-归约来说,这是由句柄的“最左”特征决定的。)

规范归约的实质:
在移进的过程中,当发现栈顶呈现句柄时,就用相应的产生式的左部符号来替换。

符号栈的使用与语法树的表示
例如5.3 写出输入串i*i+i的规范归约过程:

步骤       栈         输入串               动作
0          #         i*i+i#               预备
1          #i         *i+i#               进栈
2          #F         *i+i#               归约
3          #T         *i+i#               归约
4          #T*         i+i#               进栈
5          #T*i         +i#               进栈
6          #T*F         +i#               归约
….
12         #E+T           #               归约
13         #E             #               归约
14         #E             #               接受

二、算符优先分析

它是一种简单、广为使用的自下而上分析法。特别有利于表达式的分析过程。
算符优先分析法不是一种规范归约法。

算符优先分析(Operator Precedence Parsing)
定义算符之间(即终结符之间)的某种优先关系,借助这种优先关系来寻找“可归约串”和进行归约。

基本思想

算符优先分析法是一种简单、直观、广为使用的自下而上语法分析方法,它是依据算术表达式的四则运算过程而设计的一种方法,也适用于对一般的高级语言程序的分析。

算符优先分析法的基本思想是,首先确定运算符(确切地说是终结符)之间的优先关系和结合性质,然后借助这种关系,比较相邻运算符之间的优先级来确定句型的可归约串,并进行归约。

值得注意的是,算符优先分析过程虽然是自下而上归约过程,但它的可归约串未必是句柄,也就是说,算符优先分析过程不是一种规范归约。

算法优先关系有三种:
a < b a的优先性低于b
a = b a的优先性等于b
a > b a的优先性高于b

注意
a > b 并不意味着 b < a,即不满足对称性

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

构造FIRSTVT§的算法

有两条规则:
(1)若有产生式 P->a……或 P->Qa……
      则 a∈ FIRSTVT(P)
 (2) 若有产生式 P->Q…… 
     则对任意a∈ FIRSTVT(Q),
       都有a∈ FIRSTVT(P)

构造LASTVT§的算法

有两条规则:
 (1)若有产生式 P->……b 或 P->……bQ
      则 b∈ LASTVT(P)
  (2) 若有产生式 P-> ……Q
      则对任意 b∈ LASTVT(Q),
        都有b∈ LASTVT(P)

构造优先表的算法

For  每个P->x1X2 …Xn    do
 for  i:=1 to n  do  begin
   if Xi和Xi+1都是终结符 then Xi = Xi+1if Xi和Xi+2都是终结符,且Xi+1是非终结符,
        then  Xi = Xi+2 ;  (i<=n-2if Xi是终结符,Xi+1是非终结符 then
          for FirstVT(Xi+1)的每个a  do Xi < a ;  
        if Xi是非终结符,Xi+1是终结符 then
          for LastVT(Xi)的每个a  do a > Xi+1 ;  end.

在这里插入图片描述
在这里插入图片描述
素短语:至少含有一个终结符的短语,且除它自身外不再含有任何更小的素短语。
最左素短语:句型中最左边的素短语。
在算符优先文法中,用“最左素短语”来刻画可归约串。

在这里插入图片描述

算符优先分析算法

   k=1;     
   S[k]=‘#’;
  Repeat
       读一个输入字符a
       if  S[k] ∈VT    then   j:=k   else   j:=k-1 ;
       while    S[j] > a   do
                  {   从栈中取出最左素短语->归约到某个N;
                      N进栈  }
       if  S[j] < a  or  S[j] = a   then    {   a进栈   }     
       else   error;
  Until    a=‘#’                   

算法工作完毕后,符号栈S呈现#N#
某个非终结符号N是指那样一个产生式的左部符号,此产生式的右部和S[j+1]…S[k]构成如下一 一对应关系:自左向右,终结符对终结符,非终结符对非终结符,而且对应的终结符相同。

例5.4:对 P90 文法(5.3),
(1)E->E+T|T
(2)T->T*F|F
(3)F->P↑F|P
(4)P->(E)|i
分析句子 i+i

0    #         i+i#     预备
1    #i         +i#     进栈 (∵ # < i )
2    #P         +i#     归约 (∵ i > + )
3    #P+         i#     进栈 (∵ # < + ) 
4    #P+i         #     进栈 (+ < i )
5    #P+P         #     归约 (∵ i > # )
6    #E           #     归约 (+ > # )
7    #E#                接受 (∵ # = # )

若输入串正确,则符号栈里为#S#;
比规范归约分析要快得多( 跳过所有的单非产生式所对应的归约步骤,单非产生式:右部仅含一个非终结符的产生式,例如P->Q)
可能把不是句子的输入串误认为是句子(忽略了非终结符的作用) 适用于分析各类表达式的正确性。

优先函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

优先函数:
优点: 便于作比较运算,且节约存储空间(n^2->2n);
缺点: 原来不存在优先关系的两个终结符,由于与自然数相对应,变成可比较了。

注意 一个优先关系表的优先函数不是唯一的; 有的优先关系表可能不存在其对应的优先函数。

三、LR分析法

LR分析法是一种有效的自下而上的分析技术,可用于很大一类上下文无关文法(包括LL(1))的语法分析。
L:表示从左到右扫描输入串;
R:表示构造一个最右推导的逆过程。

本章讨论四种LR分析表的构造方法:
LR(0) SLR
规范LR LALR

LR分析法的优缺点
1.能识别几乎所有能用CFG描述的程序设计语言的结构;
2.目前最一般的无回溯移进规约语法分析法,可以有效的实现;
3.是LL文法类的真超集;
4.在自左向右扫描输入串时,能准确发现出错位置;
5.用手工构造分析程序时,工作量太大,主要体现在分析表的构造。

1.LR(0)

LR(0)项目:在文法的每个产生式的右部添加一个点就称为一个LR(0)项目。
例如:产生式 A->XYZ 对应四个项目:

 A->. XYZ
 A->X .YZ
 A->XY. Z 
 A->XYZ. 

一个项目指明了在分析过程中的某时刻,我们看到了产生式的多大部分。

注意:对于A->ε,只对应一个项目  A-> .

LR(0)文法
对文法G的拓广文法G’,若识别所有活前缀的DFA的每个状态不含有冲突,则称G是一个LR(0)文法
即:它的LR(0) 规范族C中的每个项目集都不是冲突项目集。
在这里插入图片描述

构造LR(0)项目集规范族

LR(0)项目集规范族:
构成识别一个文法所有活前缀的DFA的状态(项目集)的全体,称为这个文法的LR(0)项目集规范族。

项目集I的闭包closure(I)定义和构造
在这里插入图片描述
在这里插入图片描述
状态转换函数GO的定义
在这里插入图片描述
在这里插入图片描述

LR(0)项目集规范族 C 的构造算法

Procedure   itemset(G’)
  begin  C:={   Closure(S’.S)  };
         repeat   
           for  I ∈ C and x∈Vt∪VN  do
               if GO(I , x) not in C then 
                  把 GO(I , x)加入到C 
                 until  C不再增大
End;

冲突项目集
若一个项目集里,既含有移进项目又含有归约项目,或含有多个不同的归约项目,则说该项目集含有冲突。
在这里插入图片描述

构造识别活前缀的DFA

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

构造LR(0)分析表

在这里插入图片描述
在这里插入图片描述
LR(0)分析表:按上述算法构造的分析表,若没有多重定义入口,则称为LR(0)分析表。
LR(0)文法:具有LR(0)分析表的文法。
LR(0)分析器:使用LR(0)分析表的分析器。

例如 对文法(5.7),
S’->.E
E->aB|bB
A->cA|d
B->cB|d
写出输入串 accd 的LR(0)分析过程。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.SLR

SLR(1)分析表:按上述算法构造的分析表若没有多重定义入口,则称为SLR分析表。 SLR(1)文法:具有SLR分析表的文法。
SLR(1)分析器:使用SLR(1)分析表的分析器。

在这里插入图片描述

SLR解决冲突办法

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

SLR(1)分析表的构造算法

在这里插入图片描述
在这里插入图片描述
若一个文法是LR(0)的,则一定是SLR(1)的;
每个SLR(1)文法都是无二义的。
当然,无二义的文法未必是SLR(1)的。

3.LR(1)【规范LR】

在SLR方法中,可能会存在无效的归约。
解决办法:
希望每个状态含更多的“展望”信息,以便能消除动作冲突 或 排除无效归约。
必要时,将状态进行分裂,使得LR分析器的每个状态能确切指出,当一个归约项目后跟哪些终结符时,才允许归约。

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

LR(1)项目集I的闭包

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

状态转换函数GO

在这里插入图片描述

LR(1)项目集规范族构造

Procedure   itemset(G’)
  begin   C:={   I0=Closure(  [S’.S , #] )  };
          repeat   
            for  I∈ C and X∈Vt∪VN     do
               if   GO(I , X) not in C   then 
                 把 GO(I , X)加入到C 
                 until  C不再增大
End;

在这里插入图片描述

LR(1)分析表的构造算法

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

规范LR分析表:按上述算法构造的分析表,若没有多重定义入口,则称为规范的LR(1)分析表。
LR(1)文法:具有规范LR(1)分析表的文法。
LR(1)分析器:使用规范LR(1)分析表的分析器。

4.LALR

LALR方法,是一种折中方法。
它的分析表比LR(1)分析表要小,能力也差一点,但它能解决一些SLR所不能对付的情形。
对同一个文法而言,LALR分析表和SLR分析表的状态个数相同。

两个LR(1)项目集是同心的:若除了搜索符外,这两个集合是相同的。

我们试图将所有同心的LR(1)项目集,合并为一个项目集。目的是希望能减少些状态个数。
但可能会存在这种现象:有一个LR(1)文法,它的所有LR(1)项目集都不存在冲突,但同心集合并后会存在“归约-归约”冲突 。
在这里插入图片描述
合并同心集后对某些错误发现的时间会产生推迟现象;
当输入串有误时,LR(1)能够及时发现错误,而 LALR 则可能还继续执行一些多余的归约动作,但决不会执行新的移进。
这意味着 LALR(1) 分析表比 LR(1) 分析表对同一输入串的分析可能会有多余归约
但错误的出现位置仍是准确的。

LALR分析表的构造算法

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

LALR分析表:按上述算法构造的分析表,若没有多重定义入口,则称为LALR分析表。
LALR(1)文法:具有LALR分析表的文法。

例题

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

结论

●若文法是LR(0)的,则一定是SLR(1)的。反之不一定
●若文法是LALR(1)的,则一定是LR(1)的。反之不一定
●所有LR文法都是无二义的。

四种 LR 文法的判别方法:

首先判别文法是否为二义性文法,任何二义性文法都不是 LR 类文法。然后根据项目集中是否含冲突项目或相应分析表中是否含多重定义元素进行判断:
(a)LR(0) 文法是所有 LR(0) 项目集中没有“移进-归约”或“归约-归约”冲突(或 LR(0)分析表中不含多重定义)。
(b)SLR(0) 文法是 **LR(0) 项目集中含有冲突的项目都能用 SLR 规则解决(**或 SLR(0)分析表中不含多重定义)。
(c)LR(1) 文法是所有 LR(1) 项目集中 没有移进-归约”或“归约-归约”冲突(或LR(1)分析表中不含多重定义)。
(d)LALR(1) 项目集中 无“归约-归约”冲突(或LALR(1)分析表中不含多重定义)。注意搜索符只对归约项目起作用。

四种文法的关系:
一个文法是 LR(0) 文法,一定也是 SLR(1) 文法,也是 LR(1) 文法和 LALR(1) 文法。
在这里插入图片描述

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

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

相关文章

【MySQL基础】运算符及相关函数详解

序号系列文章3【MySQL基础】MySQL基本数据类型4【MySQL基础】MySQL表的七大约束5【MySQL基础】字符集与校对集详解6【MySQL基础】MySQL单表操作详解文章目录前言MySQL运算符1&#xff0c;算术运算符1.1&#xff0c;算术运算符的基本使用1.2&#xff0c;常用数学函数的基本使用2…

iOS:OpenGLES 实验室之2D篇 第一弹 の 智能弹幕

本文字数&#xff1a;3046字预计阅读时间&#xff1a;15 分钟iOS&#xff1a;OpenGLES 实验室之2D篇 第一弹 の 智能弹幕笔者之前发表的音视频文章&#xff0c;有图像的处理&#xff0c;音频的重采样等等&#xff0c;都属于入门级别。通过阅读它们&#xff0c;读者能对音视频有…

【复习 自用】JavaScript知识汇总(DOM)

注&#xff1a;之前学过JavaScript&#xff0c;本贴仅用于复习(自用)&#xff0c;建议没基础的朋友先学基础。会混入typescript&#xff01; 更新中~~~~~ Dom核心内容 创建节点 ① document.write() 是直接将内容写入页面的内容流&#xff0c;但是文档流执行完毕&#xff0c…

云原生技能树-docker caontainer 操作

运行 一个Docker镜像(image)运行后&#xff0c;就是一个容器实例&#xff0c;称为container 以镜像hello-world为例&#xff0c;启动容器&#xff1a; docker container run -it hello-world 可以看到输出了Hello World 信息&#xff1a; 以下描述错误的是&#xff1f; 答…

数字逻辑理论——从卡诺图到门电路

卡诺图化简 卡诺图化简 第一步&#xff1a;在卡诺图中圈出相邻为1的小方格&#xff08;方格的个数为2m2^{m}2m&#xff09;&#xff0c;圈里面的1越多越好&#xff0c;并且这个小方格可以重复使用。 第二步&#xff1a;上一步中的方格或者圈出来的方框——每一个都代表一个与…

Linux软件安装及管理程序

Linux安装及管理程序Linux软件安装及管理程序一、Linux应用程序基础二、RPM软件包管理工具2.1、RPM介绍2.2、RPM命令三、源码编译安装四、yum安装Linux软件安装及管理程序 一、Linux应用程序基础 应用程序与系统命令的关系 角色系统命令应用程序文件位置般在/bin和/sbin目录…

linux系统中实现智能家居的基本方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;智能家居物联网的基本实现与操作方法。 目录 第一&#xff1a;智能家居基本简介 第二&#xff1a;测试WIFI模块功能 第三&#xff1a;智能家居物联UI界面开发 第四&#xff1a;核心代码的具体实现 第五&#xff1a;最…

【阅读笔记】《重构》 第三四章

第三章 代码的味道 DuplicatedCode(重复代码) 同一个类的两个函数含有相同的表达式两个互为兄弟的子类含有相同表达式两个毫不相干的类出现重复代码 LongMethod(过长函数) 函数不宜过长&#xff0c;函数越长越难理解如果想利用单个类做太多事情&#xff0c;其内往往就会出现…

联合证券|港股再融资“春江水暖” 资本争购热门赛道企业

进入2023年&#xff0c;港股再融资商场有所回暖。到1月18日&#xff0c;已有27家港股上市公司发布拟配售股份&#xff08;简称“配股”&#xff09;再融资&#xff0c;募资总额164.01亿港元&#xff0c;较上一年同期增加148.16%。其间&#xff0c;微盟集团的配股再融资吸引了众…

fpga实操训练(lcd测试)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面我们测试过vga输出,当时是找了一个老式的显示器来完成的,也就是本身自带vga接口的显示器。但是,现在市面上大部分显示器都是默认支持hdmi接口的。所以说,如果真的想用fpga测…

都说InnoDB好,那还要不要使用Memory引擎?

我在上一篇文章末尾留给你的问题是:两个 group by 语句都用了 order by null,为什么使用内存临时表得到的语句结果里,0 这个值在最后一行;而使用磁盘临时表得到的结果里,0 这个值在第一行? 今天我们就来看看,出现这个问题的原因吧。 内存表的数据组织结构 为了便于分…

如何在SpringBoot项目中访问静态资源

在springboot项目中如果要在不集成templates的情况下访问静态资源需要做以下配置 1.在项目的application.yml文件中做如下配置 spring:profiles:active: devmvc:view:prefix: /suffix: .html 重点在 配置后生成为WebMvcProperties 配置类。该配置类中有一个内部类View Conf…

各式各样图标的特点

笔者近期在翻看各种样式的图标&#xff0c;逛了下 Iconfont、IconFinder 等图标网站&#xff0c;现根据自己的经验&#xff0c;总结了一些图标特点的描述用语 线性/面性/线面组合平面/立体无层次感&#xff08;或阴影&#xff09;/有层次感&#xff08;或阴影&#xff09;无填…

Oracle强制加了hint实效三种连接方式使用场合判断

开发写了一个语句使用了connect by level函数 SELECT DISTINCT CTMID FROM ( SELECT CTMID, REGEXP_SUBSTR(FLTUSERIDSTR, ‘[^;]’, 1, l) AS userid FROM s_userinfo,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<300) b WHERE l < LENGTH(FLTUSERIDSTR) - LENGTH(rege…

链表的算法题

目录 题型一、克隆含有rand指针的链表 笔试&#xff1a;哈希表 面试&#xff1a;不用容器&#xff0c;模拟哈希表的功能 题型二、给一个单链表头节点Head&#xff0c;判断是否构成回文 题型三、将单链表按某值划分为左边小&#xff0c;中间相等&#xff0c;右边大 6个变量…

Allegro如何设置创建Pin Pair的快捷键操作指导

Allegro如何设置创建Pin Pair的快捷键操作指导 在做PCB设计的时候需要做一组信号的等长,需要使用到创建Pin Pair的功能,如下图,如果每个网络都右键去选择添加比较浪费时间,如下图 Allegro支持给创建一个Create Pin Pair的快捷键位 具体操作如下 打开规则管理器选择Tools

单调栈与单调队列

单调栈与单调队列一、单调栈1.1 思路1.2 例题&#xff1a;单调栈二、单调队列2.1 思路2.2 例题&#xff1a;滑动窗口一、单调栈 1.1 思路 单调栈主要解决以下问题&#xff1a; 1️⃣ 寻找下一个更大元素 2️⃣ 寻找前一个更大元素 3️⃣ 寻找下一个更小元素 4️⃣ 寻找前一个…

理性和感性 - 如何对待错误

上次的博客&#xff0c; 我写了一些关于 软件开发中的理性和感性决定 的故事。 不论是感性还是理性&#xff0c;我们的目的就是要把软件交给用户去用&#xff0c; 在软件行业中有这样一句俗话&#xff1a; 当你把产品交给用户的时候&#xff0c;你的学习才刚刚开始。 当然每个团…

【设计模式】结构型模式·桥接模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一.概述 将抽象与实现分离&#xff0c;使它们可以独立变化。用组合关系代替继承关系&#xff0c…

华为数字化转型之道 结语 数字化转型的8个成功要素

结语 数字化转型的8个成功要素 华为开展数字化转型的过程中,积累了一些经验和教训,总结起来有如下成功要素。 1. 一把手担责 要做好数字化转型,企业家就要有战略决心、信心、耐心。数字化转型一定是企业“一把手工程”,需要企业家自上而下地推动并在企业内达成广泛共识。…