前文概述:

前阵子弄完词法分析后,这一周开始语法分析的课程。

语法分析:在计算机科学和语言学中,语法分析(英语:syntactic analysis,也叫 parsing)是根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程。
(摘自维基百科)

其实学习语法分析,并不是一上来就看其算法应该怎么做,而是需要一些概念进行铺垫。

语法分析方式:

语法分析方式分为两种,一种是自顶向下分析,一种是自底向上分析。这篇博文要讲的是自顶向下分析。

自顶向下分析法:

概念1:推导方式

在推导过程中,有最左推导和最右推导。
最左推导:每次选择最左非终结符进行替换。
最右推导:每次选择最右非终结符进行替换。

而自顶向下选择的是最左推导。

概念2:回溯

回溯现象:同一个非终结符的多个候选式存在共同前缀,将导致回溯现象。
比如:A —> aBd | aCd。那么这个将会产生回溯,因为假如选了aBd这个之后,程序发现不对,那么就得重新回来,选择aCd这个,这样子是不好的,效率很低。

既然这样的话,如何消除回溯现象呢?

A —> aBd | aCd

还是以这个为例,我们可以改造成下面这个:

A —> aD
D —> Bd | Cd

也就是通过改写产生式来推迟决定,等读入了足够多的输入,获得足够信息后再做出正确的决定。

概念3:LL(k)文法:
预测分析:

预测分析是递归下降分析技术的一个特例,通过在输入中向前看固定个数(通常为1)符号来选择正确的产生式。

LL(k)文法:

可以对某些文法构造出向前看k个输入符号的预测分析。

文法转换:

并不是所有的文法都适用于自顶向下的分析,我们有时候需要对文法进行改造,使之适合。

概念4:左递归

如果一个文法中有一个非终结符A使得对某个字符串a存在一个推导:A —> *Aa,那么这个文法就是左递归的。
如:

A —> Aa
E —> E + T | E - T

左递归分为两种:

直接左递归:

如:

A —> Aa | b
E —> E + T | E - T

A和E都可以直接推出A和E。

那么如何消除左递归呢?
如A —> Aa | b
则其r = ba*。
令 A —> bC, C —> aC | e。(这里e代表空字符串)。

间接左递归:

如:

S —> Aa | b
A —> Ac | Sd | e (这里e代表空字符串,下同)

上面那个可以推出:
S —> Aa —> Sda,即经过两步及两步以上推出了左递归。
那么如何消除呢?
还是以上面为例:
将S的定义代入A的产生式得:
A —> Ac | Aad | bd | e
消除A的直接左递归:
A —> bd | C
C —> cC | adC | e

LL(1)文法:

在了解LL(1)文法之前,我们需要来了解一下以下几个概念:

FIRST(X)集:

可以从X推导出的所有串首终结符构成的集合,如果式空串e,也要加入。
如:A —> bd | C C —> cC | adC | e
那么FIRST(A) = {b, c, a, e}。
这个应该不是很难理解?那就过了。

FOLLOW(A)集:

可能在某个句型中紧跟在A后面的终结符a的集合。如果A是某个句型的最右符号,则将结束符“#"添加到FOLLOW(A)中。
如何求解:
①设S为文法中开始符号,把{#}加入FOLLOW(S)中(这里“#” 为句子括号)。
②若A→αBβ是一个产生式,则把FIRST(β)的非空元素加入FOLLOW(B)中。如果β能够推导出ε则把FOLLOW(A)也加入FOLLOW(B)中。
③反复使用②直到每个非终结符的FOLLOW集不再增大为止。

例子可以看一下这篇文章

SELECT(A —> b):产生式的可选集

产生式 A —> b的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为SELECT(A —> b)。
例如:
SELECT(A —> aB) = {a}.
SELECT(A —> e) = FOLLOW(A).

LL(1) 文法:

当同个非终结符推出的SELECT集不相交时,则是LL(1)文法。
如SELECT(A —> aB) = {a}. SELECT(A —> e) = FOLLOW(A).演示a和FOLLOW不相交的话,那么A —> aB,A —> e构成的文法就是LL(1)文法。

LL(1) 文法分析方法:
递归的预测分析法:

在递归下降分析中,编写没有给非终结符对应的过程时,根据预测分析表进行产生式的选择。

非递归的预测分析法:

不需要为每一个非终结符编写递归下降过程,而是根据预测分析表构造一个自动机,也叫驱动的预测分析。

一般写语法分析器代码就是依照上面其中一中方法来。

总结:

上面讲的其实是一个大概,其中的细节并没有深挖,推荐这个教程,老师讲的很不错。看了几遍应该就可以了。

语法分析——自顶向下分析方法相关推荐

  1. 语法分析 自顶向下分析

    语法分析 自顶向下分析 一.确定的自顶向下分析思想 : 确定的自顶向下分析方法,首先要解决从某文法的开始符号出发,对给定的输入符号串如何根据当前的输入符号(单词符号)唯一地确定选用哪个产生式替换相应非 ...

  2. 文法分析小结:自底向上的分析方法和自顶向下的分析方法有哪些

    首先注意一点:无论是那种语法分析,语法都是从左至右的读入符号! 自底向上分析法,也称移进-归约分析法. 它的实现思想是对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一 ...

  3. 自顶向下分析消除左递归的方法

    左递归产生的原因是产生式的左右有相同的非终结符,具体来说就是形如 A→Aα | β 这时自顶向下分析将成为死循环,消除左递归的方法是引入符号A'和ε A→βA' A'→αA' | ε 以上是直接左递归 ...

  4. 利用递归下降分析方法完成语法分析

    一. 程序设计题目与说明 利用递归下降分析方法完成语法分析. 递归下降分析法是一种自顶向下的分析方法,文法的每个非终结符对应一个递归过程(函数).分析过程就是从文法开始符出发执行一组递归过程(函数), ...

  5. 编译原理复习(4)语法分析--自上而下分析

    语法分析--自上而下分析 语法分析器的功能 语法分析方法分类 自上而下分析法 自下而上分析法 LL(1)分析法 左递归的消除 消除回溯,提取公共左因子 求法,例FIRST(X): FOLLOW集构造方 ...

  6. 软件工程与计算II-6-需求分析方法

    06-需求分析方法 1. 用例文档的格式情况 2. 需求分析基础 2.1. 为什么要需求分析 需求不是属于用户的,是应该是需求人员提出来的 2.2. 需求分析的任务 建⽴分析模型,达成开发者和用户对需 ...

  7. 算符优先文法编写java语法分析器,编译原理课程设计实验报告——基于算符优先分析方法的表达式语法分析器...

    内容简介: 一.设计目的 了解用算符优先法对表达进行语法分析的方法,掌握自顶向下的预测语法分析程序的手工构造方法. 二.设计内容 对简单表达式文法构造算符优先分析器. 三.设计要求 1.对下列简单表达 ...

  8. 编译原理 自顶向下分析

    从顶部的根节点到底部的叶节点分析方法叫做自顶向下分析.我们知道顶部的根节点可以表示成一个文法的开始符号S,所以说,自顶向下分析可以看成是从文法的开始符号S推导出词串w的过程. 例如,我们以输入id + ...

  9. 从上到下的系统架构分析方法 - Intel PMU

    来源:内核月谈 layout: Top-down Microarchitecture Analysis Method 原文链接 1,https://www.intel.com/content/dam/ ...

  10. 第五章 语法分析——自上而下分析

    一.知识总结 本章介绍自下而上语法分析方法.所谓自下而上分析法就是从输入串开始,逐步进行"归约",直至鬼月到文法的开始符号.或者说,从语法树的末端开始,步步向上"归约&q ...

最新文章

  1. OpenGL材质和光照(转)part2
  2. nginx 400状态码排查
  3. 什么是android刷机包,什么是安卓RAM?安卓RAM和安卓ROM有什么区别?
  4. 子窗体菜单合并到父窗体菜单的解决办法
  5. bash执行mysql的warning怎么屏蔽_使用mysql从终端禁止警告消息,但密码写在bash脚本...
  6. python安装scipy数次失败,之后安装Anaconda后使用sublime切换python解释器后解决pip无法安装scipy问题
  7. kmeans算法中的sse_《Kmeans的K值确定》
  8. Controller中servletFileUpload.parseRequest(request)解析为空
  9. 无线路由器和无线网卡的普及知识贴及选择(2019.05更新802.11AX网卡,3T3R wave2路由器推荐)
  10. php 繁体自动转简体,php 繁体字转化为简体字
  11. 深度学习服务器?深度了解一下!
  12. 程序包清单签名验证失败
  13. IDEA 闪退,并在C盘生成文件java_error_in_idea_****.log
  14. vite:vue中引入图片报错require is not defined
  15. 计算机解题的过程实际上是实施某种算法,计算机等级考试二级C考点.doc
  16. django中cookie模板引用
  17. wifi的 2.4G 和5G
  18. Tar打包 压缩与解压缩到指定目录的方法
  19. FPGA+DSP编码过程
  20. office2017官方正版

热门文章

  1. 使用 SCTP 优化网络
  2. 边缘检测——sobel索伯算子 数学原理和应用
  3. 4.1深度优先遍历的迭代方式
  4. cdrx4自动排版步骤_coreldraw x4怎么排版 coreldraw书册杂志的排版方法 - 电脑常识 - 服务器之家...
  5. cass小插件集合_CAD面积插件大全_CAD插件大全_CASS插件大全_小懒人CAD插件老妈砂锅串串香加盟...
  6. 菜鸟教程 linux c,C 基本语法 | 菜鸟教程
  7. win10无线信号强度测试软件,一款改善Win10 WiFi 信号的小工具
  8. lora网关软件设计_LoRa网关 - 舜为互联
  9. Silvaco_VP_INIT
  10. 期权、期货及其他衍生品 Chapter14 维纳过程与伊藤引理