U4_2 语法分析-自底向上分析-算符优先分析

news2024/9/29 9:23:08

文章目录

  • 一、回顾
    • 1、推导 vs 规约
    • 2、句型、短语、简单短语、句柄
  • 二、自底向上(移进-规约)分析方法
    • 1、基本思想
    • 2、分析过程
    • 3、移进—归约分析(Shift-Reduce Parsing)
  • 三、算符优先分析
    • 1、概念
    • 2、分析流程
      • 1)先确定终结符之间的优先关系
    • 3、算符优先文法
      • 1)概念
      • 2)优先关系的定义
      • 3)确定关系的步骤
      • 4)求“ <. . ”、“ > ”
      • 5)构造优先表的算法
      • 6)小总结
    • 4、总结

一、回顾

1、推导 vs 规约

  1. 自顶向下(Top-Down)分析:推导(Derivations)
    Z = > + S     则 S ∈ L ( G [ Z ] )    否则 S ∉ L ( G [ Z ] ) Z =>^+ S \ \ \ \ 则 S \in L(G[Z]) \ \ \ 否则 S \notin L(G[Z]) Z=>+S    SL(G[Z])   否则S/L(G[Z])
  2. 自底向上(Bottom-Up)分析:规约(Reductions)
    Z < = + S     则 S ∈ L ( G [ Z ] )    否则 S ∉ L ( G [ Z ] ) Z <=^+ S \ \ \ \ 则 S \in L(G[Z]) \ \ \ 否则 S \notin L(G[Z]) Z<=+S    SL(G[Z])   否则S/L(G[Z])

2、句型、短语、简单短语、句柄

句型 Z = > x , 且 x ∈ V ∗ Z => x , 且 x∈V^* Z=>x,xV

给定文法 G [ Z ] , w = x u y ∈ V + ,为该文法的句型 给定文法G[Z], w = xuy∈V+,为该文法的句型 给定文法G[Z],w=xuyV+,为该文法的句型

若 Z = = > ∗ x U y , 且 U = = > + u , 则 u 是句型 w 相对于 U 的 若 Z ==>^* xUy, 且U ==>^+u, 则u是句型w相对于U的 Z==>xUy,U==>+u,u是句型w相对于U短语

若 Z = = > ∗ x U y , 且 U = = > u , 则 u 是句型 w 相对于 U 的 若 Z ==>^* xUy, 且U ==>u, 则u是句型w相对于U的 Z==>xUy,U==>u,u是句型w相对于U简单短语

其中 U ∈ V n , u ∈ V + , x , y ∈ V ∗ 其中U ∈V_n,u ∈V^+,x , y ∈V^* 其中UVnuV+x,yV

任一句型的最左简单短语称为该句型的 任一句型的最左简单短语称为该句型的 任一句型的最左简单短语称为该句型的句柄

二、自底向上(移进-规约)分析方法

1、基本思想

采用自左向右分析输入串,那么自底向上分析:

  1. 从输入符号串开始,通过不断查找当前句型的句柄(最左简单短语),并利用有关规则进行归约
    若句子能归约为文法的识别符号,则表示分析成功,输入符号串是文法的合法句子。
    若不能规约成功,否则有语法错误。

2、分析过程

  1. 找出当前句型的句柄 x (或句柄的变形)
  2. 找出以 x 为右部的规则 X::= x
  3. 把 x 归约为X,(自下而上)产生语法树的一枝
    关键:找出当前句型的句柄 x (或其变形)

3、移进—归约分析(Shift-Reduce Parsing)

建立符号栈,用来记录分析的历史和现状,并根据所面临的状态,确定下一步动作是移进还是归约。
在这里插入图片描述

  1. 把输入符号串按扫描顺序一一地移进符号栈(一次移一个)
  2. 移进过程中,检查栈中符号,当在栈顶的若干符号形成当前句型的句柄时,就根据规则进行归约:
    将句柄从符号栈中弹出,并将相应的非终结符号压入栈内(即规则的左部符号)。
    然后再检查栈内符号串是否形成新的句柄,若有就再进行归约,否则移进符号。
  3. 分析一直进行到读到输入串的右界符为止。最后,若栈中仅含有左界符号和识别符号,则表示分析成功,否则失败。
    例子:
    在这里插入图片描述
    这个流程的关键就是确定当前的句柄

三、算符优先分析

1、概念

这是一种经典的自底向上分析法,简单直观,并被广泛使用,开始主要是对表达式的分析,现在已不限于此。可以用于一大类上下无关的文法。

称为算符优先分析是因为这种方法是仿效算术式的四则运算而建立起来的,作算术式的四则运算时,为了保证计算结果 和过程的唯一性,规定了一个统一的四则运算法则,规定运 算符之间的优先关系。

运算规则:

  1. 乘除的优先级大于加减
  2. 同优先级的运算符左大于右
  3. 括号内的优先级大于括号外

算符优先分析的特点:仿效四则运算过程,预先规定相邻终结符之间的优先关系,然后利用这种优先关系来确定句型的“句柄”,并进行归约

分析器结构:
在这里插入图片描述

2、分析流程

1)先确定终结符之间的优先关系

定义:设 a, b 为可能相邻的终结符

  1. a = b a = b a=b      a的优先级等于b (栈内a、栈外b抵消)
  2. a < b a< b a<b       a的优先级小于b (栈外b移进)
  3. a > b a > b a>b       a的优先级大于b (栈内a规约)

相邻的意思很宽泛,越过非终结符看也可以
在这里插入图片描述

3、算符优先文法

1)概念

若文法中无形如 U ∷ = ⋅ ⋅ ⋅ V W ⋅ ⋅ ⋅ U∷= ···VW··· U::=⋅⋅⋅VW⋅⋅⋅的规则,这里 V , W ∈ V n V,W∈Vn V,WVn则称 G G G O G OG OG文法,也就是算符文法。
中间一定要有终结符间隔

2)优先关系的定义

  1. a = b     i f f 文法中有形如 U ∷ = ⋅ ⋅ ⋅ a b ⋅ ⋅ ⋅ 或 U ∷ = ⋅ ⋅ ⋅ a V b ⋅ ⋅ ⋅ 的规则。 a=b \ \ \ iff 文法中有形如 U∷= ···ab···或U∷= ···aVb···的规则。 a=b   iff文法中有形如U::=⋅⋅⋅ab⋅⋅⋅U::=⋅⋅⋅aVb⋅⋅⋅的规则。
  2. a < b     i f f 文法中有形如 U ∷ = ⋅ ⋅ ⋅ a W ⋅ ⋅ ⋅ 的规则,其中 W = > b ⋅ ⋅ ⋅ 或 W = > V b ⋅ ⋅ ⋅ a<b \ \ \ iff 文法中有形如 U∷=···aW···的规则,其中W=> b···或W=> Vb··· a<b   iff文法中有形如U::=⋅⋅⋅aW⋅⋅⋅的规则,其中W=>b⋅⋅⋅W=>Vb⋅⋅⋅
  3. a > b     i f f 文法中有形如 U ∷ = ⋅ ⋅ ⋅ W b ⋅ ⋅ ⋅ 的规则 , 其中 W = > ⋅ ⋅ ⋅ a 或 W = > ⋅ ⋅ ⋅ a V a>b \ \ \ iff 文法中有形如 U∷=···Wb···的规则, 其中W=> ···a或W=> ···aV a>b   iff文法中有形如U::=⋅⋅⋅Wb⋅⋅⋅的规则,其中W=>⋅⋅⋅aW=>⋅⋅⋅aV

3)确定关系的步骤

  1. 先看有没有 = = =的出现,即两个终结符夹着非终结符或者两个终结符同时出现。
  2. 找到每个非终结符,比较左右两边的非终结符

4)求“ <. . ”、“ > ”

需定义两个集合:
F I R S T V T ( U ) = FIRSTVT( U ) = FIRSTVT(U)={ b ∣ U = > + b … 或 U = > + V b … , b ∈ V t , V ∈ V n b|U=>^+b…或U=>^+Vb…,b∈V_t, V∈V_n bU=>+bU=>+Vb,bVt,VVn}

L A S T V T ( U ) = LASTVT( U ) = LASTVT(U)= { a ∣ U = > + … a 或 U = > + … a V , a ∈ V t , V ∈ V n a|U=>^+…a或U=>^+…aV,a∈V_t, V∈V_n aU=>+aU=>+aV,aVt,VVn}

则:
W ∷ = . . . a U . . . ,对任何 b , b ∈ F I R S T V T ( U ) , a < b W∷=...aU... ,对任何b, b∈FIRSTVT(U),a<b W::=...aU...,对任何b,bFIRSTVT(U)a<b
W ∷ = . . . U b . . . ,对任何 a , a ∈ L A S T V T ( U ) , a > b W∷=...Ub... ,对任何a, a∈LASTVT(U),a>b W::=...Ub...,对任何a,aLASTVT(U)a>b

构造 F I R S T V T ( U ) FIRSTVT(U) FIRSTVT(U)的算法

  1. 若有规则 U ∷ = b … 或 U ∷ = V b … ( 存在 U = > + b … 或 U = > + V b … ) 则 b ∈ F I R S T V T ( U ) 若有规则U∷= b…或U∷= Vb…(存在U=>^+b…或U=>^+Vb…)则b∈FIRSTVT(U) 若有规则U::=bU::=Vb(存在U=>+bU=>+Vb)bFIRSTVT(U)
  2. 若有规则 U ∷ = V … 且 b ∈ F I R S T V T ( V ) , 则 b ∈ F I R S T V T ( U ) 若有规则U∷= V…且b∈FIRSTVT(V), 则b∈FIRSTVT(U) 若有规则U::=VbFIRSTVT(V),bFIRSTVT(U)

构造 L A S T V T ( U ) LASTVT(U) LASTVT(U)的算法原理一样
3. 若有规则 U : : = … a 或 U : : = … a V , 则 a ∈ L A S T V T ( U ) 若有规则U::=…a或U::=…aV,则a∈LASTVT(U) 若有规则U::=aU::=aV,aLASTVT(U)
4. 若有规则 U : : = … V , 且 a ∈ L A S T V T ( V ) , 则 a ∈ L A S T V T ( U ) 若有规则U::=…V,且a∈LASTVT(V), 则a∈LASTVT(U) 若有规则U::=V,aLASTVT(V),aLASTVT(U)

5)构造优先表的算法

  1. 扫描每一条规则,如果有 U::=…ab… |…aVb… 设置 a=b
  2. 扫描,如有 U : : = . . a V U::=..aV U::=..aV , 设置 a < b a<b a<b, 对 b ∈ F I R S T V T b∈ FIRSTVT bFIRSTVT{ V V V}
  3. 扫描,如有 U : : = . . V a U::=..Va U::=..Va , 设置 b > a b>a b>a, 对 b ∈ L A S T V T b∈ LASTVT bLASTVT{ V V V}
  4. 对#特殊处理,横行#小于,纵行大于,碰到等号不填(出错)
    在这里插入图片描述

6)小总结

算符优先文法(OPG)的定义
设有一OG文法,如果在任意两个终结符之间,至多只有上述关系中的一种,则称该文法为算符优先文法(OPG)。即不会出现二义性,两个终结符之间有两个优先级关系

算符优先分析算法的实现
本质上就是先定义优先级,在分析过程中通过比较相邻运算符之间的优先级来确定**句型的“句柄”**并进行归约。

但是根据运算优先级确定的句柄和之前所定义的句柄不同,因此必须要有终结符从中间参与,因此定义素短语:
素短语:文法G的句型的素短语是一个短语,它至少包含有一个终结符号,并且除它自身以外不再包含其他素短语。
在这里插入图片描述
只有TF和i为素短语,其中TF为最左素短语,而该句型句柄为T。

在这里插入图片描述
画出优先级图,找到最左素短语
在这里插入图片描述

4、总结

每次归约最左子串,确实是当前句型的最左素短语(语法树)。
归约的不都是真句柄(仅i归约为F是句柄,但它是最左素短语)。
没有完全按规则进行归约,因为素短语不一定是简单短语。

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

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

相关文章

Codeforces Round 917 (Div. 2)(A~D)(又是数学题)

A - Least Product 题意&#xff1a; 思路&#xff1a;若有奇数个负数&#xff0c;则不需要任何操作。若存在0&#xff0c;也不需要任何操作。其余情况将任意一个数改为0即可。 #include <bits/stdc.h> using namespace std; void solve() {int n;cin >> n;int …

CUMT--Java复习--网络编程

目录 一、Java网络API 1、InetAddress类 2、URL类 3、URLConnection类 4、URLDecoder类和URLEncoder类 二、基于TCP的网络编程 1、Socket类 2、ServerSocket类 三、网络通信过程 一、Java网络API Java中有关网络方面的功能都定义在java.net中。 1、InetAddress类 Jav…

MySQL undo日志精讲3-从回滚段中申请 Undo 页面链表

回滚段-Rollback Segment Header 页面 回滚段的概念 我们现在知道一个事务在执行过程中最多可以分配4个 Undo 页面链表&#xff0c;在同一时刻不同事务拥有的 Undo 页面链表是不一样的&#xff0c;所以在同一时刻系统里其实可以有许许多多个 Undo 页面链表存在。为了更好的管…

工业互联网:数字化制造的未来

引言 在当今的数字化时代&#xff0c;制造业正经历着革命性的变革。工业互联网&#xff08;Industrial Internet of Things"&#xff0c;简称 IIoT&#xff09;作为这一变革的核心引擎&#xff0c;正在重新定义现代工业和制造。本文将探讨工业互联网的基础、关键技术、应…

论文润色的原理是什么 PaperBERT

大家好&#xff0c;今天来聊聊论文润色的原理是什么&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文润色的原理――探究论文润色背后的科学依据 一、…

第十五节TypeScript 接口

1、简介 接口是一系列抽象方法的声明&#xff0c;是一些方法特征的集合&#xff0c;这些方法都应该是抽象的&#xff0c;需要有由具体的类去实现&#xff0c;然后第三方就可以通过这组抽象方法调用&#xff0c;让具体的类执行具体的方法。 2、接口的定义 interface interface_…

利用STM32和可控硅控制220V加热电路

利用STM32和可控硅控制220V加热电路 Chapter1 利用STM32和可控硅控制220V加热电路一、错误原理图二、正确原理图 Chapter2 可控硅驱动芯片MOC3081/3061Chapter3 一个MOC3061的可控硅触发电路的分析Chapter4 可控硅的两种触发方式&#xff1a;移相触发和过零触发1、过零触发2、移…

C++面试宝典第9题:找出第K大元素

题目 给定一个整数数组a,同时给定它的大小N和要找的K(1 <= K <= N),请根据快速排序的思路,找出数组中第K大的数(保证答案存在)。比如:数组a为[50, 23, 66, 18, 72],数组大小N为5,K为3,则第K大的数为50。 解析 这道题主要考察应聘者对于快速排序的理解,以及实…

​【C语言】乘法表

题目要求&#xff1a; 实现一个函数&#xff0c;打印乘法口诀表&#xff0c;口诀表的行数和列数自己指定 如&#xff1a;输入9&#xff0c;输出9 * 9口诀表&#xff0c;输出12&#xff0c;输出12 * 12的乘法口诀表。 题目分析&#xff1a; 我们观察乘法口诀表可以发现&#x…

【重点!!!】【堆】215.数组中的第K个最大元素

题目 法1&#xff1a;小根堆 最大的K个元素 > 小根堆&#xff08;类似上窄下宽的梯形&#xff09; 最小的K个元素 > 大根堆&#xff08;类似倒三角形&#xff09; 必须掌握&#xff01;&#xff01;&#xff01; class Solution {public int findKthLargest(int[] nu…

4.3 媒资管理模块 - Minio系统上传图片与视频

文章目录 一、上传图片1.1 需求分析1.2 数据模型1.2.1 media_files 媒资信息表 1.3 准备Minio环境1.3.1 桶环境1.3.2 连接Minio参数1.3.3 Minio配置类 1.4 接口定义1.4.1 上传图片接口请求参数1.4.2 上传图片接口返回值1.4.3 接口代码 1.5 MediaFilesMapper1.6 MediaFileServic…

解决log4j多个日志都写到一个文件

之前客户端程序由于Websockt包依赖的log4j&#xff0c;就用log4j写日志了&#xff0c;Web用的log4j2没毛病。用log4j的多个logger的日志都写到一个文件里了&#xff0c;查了很多资料都没解决。今天闲了解决一下。 最后好使的配置 # 设置日志根 log4j.rootLogger INFO,Except…

uni-app之HelloWorld实现

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

选择排序(java)

选择排序 选择排序是默认前面都是已经排序好的&#xff0c;然后从后面 选择最小的放在前面排序好的的后面&#xff0c;首先第一轮循环的时候默认的排序好的为空&#xff0c;然后从后面选择最小的放到数组的第一个位置&#xff0c;第二轮循环的时候默认第个元素是已经 排序好的…

深度学习中的Dropout

1 Dropout概述 1.1 什么是Dropout 在2012年&#xff0c;Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。当一个复杂的前馈神经网络被训练在小的数据集时&#xff0c;容易造成过拟合。为了防止过拟合&#xff…

光耦继电器

光耦继电器(光电继电器) AQW282SX 282SZ 280SX 280SZ 284SX 284SZ 212S 212SX 21 2SZ 文章目录 光耦继电器(光电继电器)前言一、光耦继电器是什么二、光耦继电器的类型三、光电耦合器的应用总结前言 光耦继电器在工业控制、通讯、医疗设备、家电及汽车电子等领域得到广泛应…

基于鸢尾花数据集的逻辑回归分类实践

基于鸢尾花数据集的逻辑回归分类实践 重要知识点 逻辑回归 原理简介&#xff1a; Logistic回归虽然名字里带“回归”&#xff0c;但是它实际上是一种分类方法&#xff0c;主要用于两分类问题&#xff08;即输出只有两种&#xff0c;分别代表两个类别&#xff09;&#xff0c…

Flutter windows 环境配置

Flutter windows 环境配置 从零开始&#xff0c;演示flutter环境配置到启动项目&#xff0c;同时支持 vscode 和 android studio 目录 Flutter windows 环境配置一、环境配置1. Flutter SDK2. Android Studio3. JDK4. 拓展安装5. Visual Studio 2022二、项目创建和启动1. vsco…

Spark集群部署与架构

在大数据时代&#xff0c;处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具&#xff0c;可以在集群中高效运行&#xff0c;处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群&#xff0c;以满足大规模数据处理的需求。 Spark集群架构…

小狐狸ChatGPT付费创作系统小程序端开发工具提示打开显示无法打开页面解决办法

最新版2.6.7版下载&#xff1a;https://download.csdn.net/download/mo3408/88656497 很多会员在上传小程序前端时经常出现首页无法打开的情况&#xff0c;错误提示无法打开该页面&#xff0c;不支持打开&#xff0c;这种问题其实就是权限问题&#xff0c;页面是通过调用web-v…