U4_1 语法分析之自顶向下分析

文章目录

  • 一、定义
    • 1、任务
    • 2、对比
    • 3、方法
    • 4、自顶向下面临问题
  • 二、自顶向下分析
    • 1、概念
    • 2、特点
    • 3、二义性问题
    • 4、左递归问题
      • 1)概念
      • 2)消除
      • 3)间接左递归
    • 5、回溯问题
      • 1)概念
      • 2)消除
      • 3)解决方法
    • 6、总结
  • 三、递归子程序法(递归下降分析法)
    • 1、概念
    • 2、具体做法
  • 四、LL(1)文法
    • 1、预备知识
      • 1)FIRST集的计算
      • 2)FOLLOW的算法
    • 2、LL(1)文法的概念
    • 3、分析
      • 1)组成
      • 2)分析表
      • 3)符号栈
      • 4)执行程序
  • 五、LL(k)文法

一、定义

1、任务

根据语法规则(即语言的文法),分析并识别出各种语法成分,如表达式、各种说明、各种语句、过程、函数等,并进行语法正确性检查

2、对比

词法分析:3型(正则文法) 词法分析:字符串
语法分析:2型(上下文无关文法) 语法分析:符号串

3、方法

  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])

本节主要分析自顶向下方法

4、自顶向下面临问题

推导顺序:有多个“非终结符”,优先用哪个?
避免二义性:避免文法有多个可用规则。

问题:左递归问题+回溯问题
常见方法:递归子程序法+LL分析法

二、自顶向下分析

1、概念

给定符号串S,若预测是某一语法成分,则可根据该语法成分的文法,设法为S构造一棵语法树,若成功,则S最终被识别为某一语法成分,即 S ∈ L ( G [ Z ] ) S\in L(G[Z]) SL(G[Z]),其中G[Z]为某语法成分的文法。若不成功, 则 S ∉ L ( G [ Z ] ) S \notin L(G[Z]) S/L(G[Z])

2、特点

  1. 分析过程是带预测的,对输入符号串要预测属于什么语法成分,然后根据该语法成分的文法建立语法树。
  2. 分析过程是一种试探过程,是尽一切办法(选用不同规则) 来建立语法树的过程, 由于是试探过程, 难免有失败, 所以分析过程需进行回溯, 因此也称这种方法是带回溯的自顶向下分析方法
  3. 最左推导可以编写程序来实现, 但带溯的自顶向下分析方法在实际上价值不大, 效率低。

3、二义性问题

若对于一个文法的某一句子(或句型)存在两棵不同的语法树,则该文法是二义性文法,否则是无二义性文法。

若一个文法的某句子存在两个不同的规范推导,则该文法是二义性的,否则是无二义性的。

若一个文法的某规范句型的句柄不唯一,则该文法是二义性的,否则是无二义性的。

PS:正则文法也会有二义性,但是可判定的(通过转换为自动机)

文法的二义性是不可判定的,因此解决方法是提出一些限制条件,称为无二义性的充分条件,当文法满足这些条件时,就可以判定文法是无二义性的。

4、左递归问题

1)概念

令U是文法的任一非终结符,文法中有规则 U ∷ = U ⋅ ⋅ ⋅ ⋅ 或者 U = > U ⋅ ⋅ ⋅ U∷=U····或者U => U··· U::=U⋅⋅⋅⋅或者U=>U⋅⋅⋅

自顶向下分析的基本缺点是:不能处理具有左递归性的文法。
(如果在匹配输入串的过程中,假定正好轮到要用非终结符U直接匹配输入串,即要用U的右部符号串U¨¨去匹配,为了用U¨¨去匹配,又得用U去匹配,这样无限的循环下
去将无法终止。)

2)消除

  1. 使用扩充的BNF表示来改写文法
    (1) E ∷ = E + T ∣ T = > E ∷ = T E∷=E+T|T \ \ \ \ => E∷=T E::=E+TT    =>E::=T{ + T +T +T}
    (2) T ∷ = T ∗ F ∣ T / F ∣ F = > T ∷ = F T∷=T*F|T/F|F \ \ \ \ => T ∷=F T::=TFT/FF    =>T::=F{ ∗ F ∣ / F *F|/F F∣/F}

具体规则
提因子:若: U ∷ = x y ∣ x w ∣ … . ∣ x z 则可改写为: U ∷ = x ( y ∣ w ∣ … . ∣ z ) U∷=xy|xw|….|xz则可改写为:U∷=x(y|w|….|z) U::=xyxw.∣xz则可改写为:U::=x(yw.∣z)

若有文法规则: U ∷ = x ∣ y ∣ … … ∣ z ∣ U v 可以改写为 U ∷ = ( x ∣ y ∣ … … ∣ z ) U∷=x|y|……|z|Uv可以改写为U∷=(x|y|……|z) U::=xy……zUv可以改写为U::=(xy……z){ v v v}
其特点是:具有一个直接左递归的右部并位于最后,这表明该语法类U是由x或y……或z其后随有零个或多个v组成。
通过以上两条规则,就能消除文法的直接左递归,并保持文法的等价性。

  1. 将左递归规则改为右递归规则
    若: P ∷ = P a ∣ b P∷=Pa| b P::=Pab 则可改写为: P ∷ = b P ’     P ’ ∷ = a P ’ ∣ ε P ∷= bP’ \ \ \ \ P’ ∷= aP’| ε P::=bP    P::=aP’∣ε
    在这里插入图片描述

3)间接左递归

在这里插入图片描述
此时需要代入成直接左递归后再处理
在这里插入图片描述

  1. 检查规则R是否存在直接左递归 R ∷ = S a ∣ a R∷=Sa|a R::=Saa
  2. 把R代入Q的有关选择,改写规则Q Q ∷ = S a b ∣ a b ∣ b Q∷=Sab|ab|b Q::=Sababb
  3. 检查Q是否存在直接左递归
  4. 把Q代入S的右部选择 S ∷ = S a b c ∣ a b c ∣ b c ∣ c S∷=Sabc|abc|bc|c S::=Sabcabcbcc
  5. 消除S的直接左递归 S ∷ = ( a b c ∣ b c ∣ c ) S∷=(abc|bc|c) S::=(abcbcc){ a b c abc abc}

5、回溯问题

1)概念

概念:分析工作要部分地或全部地退回去。

造成回溯的条件:文法中,对于某个非终结符号的规则其右部有多个选择,并根据所面临的输入符号不能准确地确定所要的选择时,就可能出现回溯。

2)消除

对于 U : : = α 1 ∣ α 2 ∣ α 3 U::= α_1 | α_2 | α_3 U::=α1α2α3
定义: F I R S T ( α i ) = FIRST(α_i) = FIRST(αi)={ a ∣ α i = > ∗ a … , a ∈ V t a | α_i =>^* a…, a \in V_t aαi=>a,aVt}
为了避免回溯,对文法的要求是: F I R S T ( α i ) ∩ F I R S T ( α j ) = φ ( i ≠ j ) FIRST(α_i) ∩ FIRST(α_j)=φ (i\neq j) FIRST(αi)FIRST(αj)=φ(i=j)

3)解决方法

  1. 改写文法
    判断后若有相交,则需要把相交的部分提出放到高一级的文法中,如下例子:
    在这里插入图片描述
  2. 超前扫描(偷看)
    当文法不满足避免回溯的条件时,即各选择的首符号相交时,可以采用超前扫描的方法,即向前侦察各输入符号串的第二个、第三个符号来确定要选择的目标。

这种方法是通过向前多看几个符号来确定所选择的目标,从本质上来讲也有回溯的味道,因此比第一种方法费时,但是假读仅仅是向前侦察情况,不作任何语义处理工作

6、总结

为了在不采取超前扫描的前提下实现不带回溯的自顶向下分析,文法需要满足两个条件:

  1. 文法是非左递归的
  2. 对文法的任一非终结符,若其规则右部有多个选择时, 各选择所推出的终结符号串的首符号集合要两两不相交。

在上述条件下,就可以根据文法构造有效的、不带回溯的自顶向下分析器。

对于第二点,我们只有 F I R S T FIRST FIRST集合是不够的:
定义 F O L L O W ( A ) = FOLLOW(A)= FOLLOW(A)={ a ∣ Z = > ∗ … A a … , a ∈ V t a| Z=>^*…Aa…,a∈V_t aZ=>AaaVt}
A ∈ V n A \in V_n AVn 该集合称为A的后继符号集合
特殊地: 若 Z = > ∗ . . . A 若Z =>^*...A Z=>...A 则 # ∈ F O L L O W ( A ) ∈FOLLOW(A) FOLLOW(A)

不带回溯的充分必要条件是:对于G的
每一个非终结符A的任意两条规则 A : : = α ∣ β A::=α|β A::=αβ,下列条件成立:

  1. F I R S T ( α ) ∩ F I R S T ( β ) = Ф FIRST(α) ∩ FIRST(β) = Ф FIRST(α)FIRST(β)=Ф
  2. 若 β = = > ∗ ε , 则 F I R S T ( α ) ∩ F O L L O W ( A ) = Ф 若β==>^* ε, 则FIRST(α) ∩ FOLLOW(A) = Ф β==>ε,FIRST(α)FOLLOW(A)=Ф

三、递归子程序法(递归下降分析法)

1、概念

具体做法:对语法的每一个非终结符都编一个分析程序,当根据文法和当时的输入符号预测到要用某个非终结符去匹配输入串时,就调用该非终结符的分析程序

2、具体做法

在这里插入图片描述

  1. 检查并改写文法
    在这里插入图片描述
  2. 检查文法的递归性
    在这里插入图片描述
    因此,Z和U的分析程序要编成递归子程序
  3. 算法框图
    非终结符号的分析子程序的功能是:用规则右部符号串去匹配输入串
    在这里插入图片描述
    在这里插入图片描述

要注意子程序之间的接口,在程序编制时进入某个非终结符的分析程序时其所要分析的语法成分的第一个符号已读入sym中

递归子程序法对应的是最左推导过程

四、LL(1)文法

1、预备知识

1)FIRST集的计算

F I R S T ( α i ) = FIRST(α_i) = FIRST(αi)={ a ∣ α i = > ∗ a … , a ∈ V t a | α_i =>^* a…, a \in V_t aαi=>a,aVt}
α = > ∗ ε ,则 ε ∈ F I R S T ( α ) α=>^*ε,则ε \in FIRST(α) α=>ε,则εFIRST(α)

α = X 1 X 2 . . . X n , X i ∈ V n U V t (即 X i ∈ V ) α=X_1X_2...X_n, X_i∈V_n \ \ U \ \ V_t (即 X_i ∈V) α=X1X2...Xn,XiVn  U  Vt(即XiV)
首先求出组成α的每一个符号 X i X_i Xi的FIRST集合
在这里插入图片描述
在这里插入图片描述
注意:要顺序往下做,一旦不满足条件,过程就要中断进行
得到 F I R S T ( X i ) ,即可求出 F I R S T ( α ) FIRST(X_i),即可求出FIRST(α) FIRST(Xi),即可求出FIRST(α)

2)FOLLOW的算法

算法:连续使用以下规则,直至FOLLOW集合不再扩大
在这里插入图片描述

2、LL(1)文法的概念

第一个L:从左向右分析 (Left to right)
第二个L:产生“最左推导”(Left-most derivation)
k=1:向前查看“k=1”个符号,通过向前看1个符号就能够有效分析
无二义,无左递归,且能够消除回溯
因此判断LL(1)文法的条件就是为了在不采取超前扫描的前提下实现不带回溯的自顶向下分析所满足的条件
无左递归且
在这里插入图片描述

3、分析

1)组成

由三部分组成

  1. 分析表
  2. 执行程序 (总控程序)
  3. 符号栈 (分析栈)
    在这里插入图片描述
    在实际语言中,每一种语法成分都有确定的左右界符,为了研究问题方便,统一以‘#’表示。

2)分析表

在这里插入图片描述
在这里插入图片描述
算法:
在这里插入图片描述

3)符号栈

四种状态
在这里插入图片描述
在这里插入图片描述

4)执行程序

主要实现如下操作

  1. 把#和文法识别符号E推进栈, 读入下一个符号,重复下述过程直到正常结束或出错。
  2. 测定栈顶符号X和当前输入符号a,执行如下操作:
    KaTeX parse error: Expected 'EOF', got '#' at position 5: X=a=#̲,分析成功,停止。E匹配输入串成功。
    KaTeX parse error: Expected 'EOF', got '#' at position 5: X=a≠#̲,把X推出栈,再读入下一个符号。
    X ∈ V n X∈V_n XVn,查分析表M。
    注意a)中U在栈顶!

在这里插入图片描述
PS:文法没有 x→ε,则不需要计算 FOLLOW 集!!!!

五、LL(k)文法

LL(k)是无二义性的文法,其识别的语言都是确定型下推自动机所识别的语言,但反之不能保证一个确定型下推自动机与LL(k)等价。因此关系图如下:
一个无二义的CFG文法不一定能得到LL(k)文法
在这里插入图片描述

LL(k)文法总是一个LR(k)文法

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

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

相关文章

【Proteus仿真】【51单片机】光照强度检测系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;PCF8591 ADC模块、光敏传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示光传感器采集光照强度值&#xff…

Gitzip插件【Github免翻下载】

今天给大家推荐一个github下载的插件&#xff0c;平常大家下载应该无外乎就是以下两种&#xff1a; Download zip利用git clone 但是这两种各有各的弊端&#xff0c;前者一般需要科学上网才可以&#xff0c;后者下载不稳定经常中途断掉。 今天给推荐一个款浏览器插件-Gitzip.大…

基于SSM的java衣服商城

基于SSM的java衣服商城 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java EE项目 项目名称&#xff1a;基于SSM的美衣商城 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;Layui等 后端技术…

Flask和Vue框架实现WebSocket消息通信

1 安装环境 1.1 安装Flask环境 主要的安装包 Flask、Flask-SocketIO&#xff0c;注意Python版本要求3.6 # Flask-SocketIO参考地址 https://flask-socketio.readthedocs.io/en/latest/ https://github.com/miguelgrinberg/flask-socketio更新基础环境 # 更新pip python -m …

以太坊虚拟机EVM介绍,智能合约详解

以太坊为例&#xff1a;什么是智能合约&#xff1f;智能合约怎么部署、调用、执行&#xff1f;智能合约的原理&#xff1f;智能合约存在哪儿&#xff1f;如何区分调用的是智能合约&#xff1f;世界状态数据库、EVM、智能合约它们之间的关系&#xff1f; 什么是智能合约 指的是…

【Hive】启动beeline连接hive报错解决

1、解决报错2、在datagrip上连接hive 1、解决报错 刚开始一直报错&#xff1a;启动不起来 hive-site.xml需要配置hiveserver2相关的 在hive-site.xml文件中添加如下配置信息 <!-- 指定hiveserver2连接的host --> <property><name>hive.server2.thrift.bin…

机器人与3D视觉 Robotics Toolbox Python 二 空间位姿描述

空间位姿描述 二维空间位姿描述 二维空间位姿表示方法 from spatialmath.base import * from spatialmath import * T1 SE2(x3,y3,theta30,unit"deg") trplot2(T1.A,frame"T1",dims[0, 5, 0, 5]) T2transl2(3, 4) trplot2(T2,frame"T2",dims…

如何理解 RPC 远程服务调用?

本文主要讲解 RPC 远程服务调用相关的知识。 RPC 远程服务调用是分布式服务架构的基础&#xff0c;无论微服务设计上层如何发展&#xff0c;讨论服务治理都绕不开远程服务调用&#xff0c;那么如何理解 RPC、有哪些常见的 RPC 框架、实现一款 RPC 框架需要哪些技术呢&#xff…

解决electron修改主进程后需要重启才生效

nodemon 是一种工具&#xff0c;可在检测到目录中的文件更改时通过自动重新启动节点应用程序来帮助开发基于 node.js 的应用程序 nodemon 特性 自动重新启动应用程序。检测要监视的默认文件扩展名。默认支持 node&#xff0c;但易于运行任何可执行文件&#xff0c;如 python、…

自动驾驶学习笔记(十七)——视觉感知

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 分类 目标检测 语义分割 实例分割 …

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解&#xff1f; 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别&#xff0c;对于编写高效、可靠的SQL代码至关重要。今天&#xff0c;让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…

【unity实战】一个通用的FPS枪支不同武器射击控制脚本

文章目录 前言模型素材文章用到的粒子火光特效射击效果换弹瞄准开枪抖动效果设置显示文本最终代码不同武器射击效果1. 手枪2. 机枪3. 狙击枪4. 霰弹枪5. 加特林 其他感谢完结 前言 实现FPS枪支不同武器效果&#xff0c;比如手枪&#xff0c;喷子&#xff0c;狙击枪&#xff0c…

《使用ThinkPHP6开发项目》 - 创建应用

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 根据前面的步骤&#xff0c;我们现在就可以开发我们的项目开发了&#xff0c;根据项目开发的需要…

【数据挖掘】国科大苏桂平老师数据库新技术课程作业 —— 第四次作业

云数据库研究 云计算与云数据库背景 云计算&#xff08;cloud computing&#xff09;是 IT 技术发展的最新趋势&#xff0c;正受到业界和学术界的广泛关注。云计算是在分布式处理、并行处理和网格计算等技术的基础上发展起来的&#xff0c;是一种新兴的共享基础架构的方法。它…

[足式机器人]Part4 南科大高等机器人控制课 Ch05 Instantaneous Velocity of Moving Frames

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch05 Instantaneous Velocity of Moving Frames 1.Instantanenous Velocity of Rotating Frames2.Instantanenous Veloc…

最新Redis7持久化(权威出版)

首先我们要知道什么是持久化&#xff1a;持久化是指将数据保存到磁盘上&#xff0c;以确保在Redis服务器重启时数据不会丢失。 Redis支持两种主要的持久化方式&#xff1a;RDB持久化和AOF持久化 下面让我依次给你介绍一下&#xff1a; RDB持久化 作用 这是将Redis数据保存…

Java语言概述及保姆级入门教程(JDK 17版本)

笔记来自尚硅谷老师-康老师 学习教程&#xff1a;https://www.bilibili.com/video/BV1PY411e7J6/?spm_id_from333.337.search-card.all.click 1、Java基础全程脉络图 1.1 本章专题与脉络 2. 抽丝剥茧话Java 2.1 当前大学生就业形势 麦可思研究院发布了《2022年中国大学生就业…

C#图像处理OpenCV开发指南(CVStar,09)——边缘识别之Scharr算法的实例代码

1 边缘识别之Scharr算法 算法文章很多&#xff0c;不再论述。 1.1 函数原型 void Cv2.Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType&#xff09; 1.2 参数说明 src 代表原始图像。dst 代表目标图像。ddepth 代表输出图像的深度。CV_16Sdx 代表x方向上的求导阶数…

uniApp应用软件在运行时,不符合华为应用市场审核标准。解决方案合集!

&#xff08;暂时用不到的也建议收藏一下&#xff0c;因为文章持续更新中&#xff09; 最新更改时间&#xff1a;20023-12-10 第一次做App应用开发相信大家一定都遇到过华为应用市场审核的“驳回”&#xff01; 有些问题一看就明白可以立马修改&#xff0c;而有一些问题修改意…

Dubbo入门直接上手,结合微服务详解

Dubbo 高性能、轻量级的 Java RPC 框架 RPC&#xff1a; Remote Procedure Call 远程过程调用&#xff0c;简单来说就是它允许一个计算机程序通过网络请求调用另一个计算机上的程序&#xff0c;就像本地调用一样。有非常多的协议和技术来都实现了RPC的过程&#xff0c;比如&a…