文章目录

  • 第四章 语法分析——自上而下分析
    • 语法分析的任务与分类
    • 自上而下分析面临的问题
    • 自上而下分析的问题如何解决
      • 区分三种类型的左递归
      • 直接左递归的消除
      • 间接和潜在左递归的消除
      • 消除一个文法一切左递归的算法
      • 消除回溯、提左因子
    • 递归下降分析程序构造
    • 预测分析程序
      • 预测分析程序的工作过程
        • 预测分析程序有四部分
        • 分析程序的动作
        • 分析表格式
        • 举例说明
      • 分析表的构造[考点]
        • ✅举例1✅
        • ✅举例2✅
    • LL(1)文法
      • LL(1)文法
      • LL(1)文法的条件
    • 参考资料

第四章 语法分析——自上而下分析

语法分析的前提

对语言的语法结构进行描述

采用正规式和有限自动机描述和识别语言的单词符号

用上下文无关文法来描述语法规则

语法分析的任务:分析一个文法的句子的结构

语法分析器的功能:按照文法的产生式(语言的语法规则),识别输入符号串是否为一个句子(合式程序)

语法分析的方法

1️⃣ 自上而下Top-down

从文法的开始符号出发,反复使用各种产生式,寻找"匹配"的推导

推导:根据文法的产生式规则,把串中出现的产生式的左部符号替换成右部

从树的根开始,构造语法

递归下降分析法、预测分析程序

2️⃣ 自下而上Bottom-up

从输入串开始, 逐步进行归约,直到文法的开始符

归约:根据文法的产生式规则,把串中出现的产生式的右部替换成左部符号

从树叶节点开始,构造语法树

算符优先分析法、LR分析法

语法分析的任务与分类

语法分析的任务:对任一给定w∈VT∗,判断w∈L(G)对任一给定w\in V_T^*,判断w\in L(G)对任一给定w∈VT∗​,判断w∈L(G)

w表示终结符串

句子的全体是一个语言,记作L(G)

语法分析器是一个程序,它按照P,做识别w的工作

自上而下分析面临的问题

主旨:从文法开始符号出发,自上而下地为输入串建立一棵语法树。

举例:文法G1: S -> cAd A -> ab|a,输入串:w=cad,为它建立语法树

上述分析方法的实现:

1️⃣ 每一非终结符对应一个递归子程序,在只生成两个串的文法中过程无须递归;但是,对于生成无数个串的文法而言,递归不可避免。

2️⃣ 递归子程序是一个布尔过程,一旦它发现自己的某个候选式与输入串匹配,它就按此式扩充语法树,返回true,指针移过已匹配子串;否则,返回false,保持原来的语法树和指针不变。

程序实现

使用两个过程: S()和A(), 它们送回true or false,决定于它们是否在输入串中找到相应的终结符所构成的串。

使用记号

input_ symbol:当前符号内容
input_ pointer: 输入字符指针

使用过程

ADVANCE():把input_ pointer移 到下一输入符号位置,置input_symbol是当前符号内容。

procedure S();
begin if input_symbol = 'c' thenbeginADVANCE();if A() then//A扩展if input_symbol = 'd'then beginADVANCE();//指针后移return true;end;end;return false;
end;procedure A();
beginisave := input_pointer;//记录输入指针,防止回滚if input_symbol = 'a' thenbeginADVANCE();if input_symbol = 'b' thenbeginADVANCE();return true;end;end;
/* 匹配ab失败,则匹配a*/input_pointer := isave//将之前记录的输入指针赋值给输入指针if input_symbol = 'a' thenbeginADVANCE();return true;end;elsereturn false;
end;

困难和问题

  • 文法的左递归
  • 回溯
  • 使用候选式的顺序会影响所接受的语言: 如: A -> ab|a改为A->a|ab
  • 难以报告出错的确切位置
  • 穷举试探法一 低效的分析方法

自上而下分析的问题如何解决

消除文法左递归以及回溯问题

区分三种类型的左递归

1️⃣ 直接左递归

形如:N->Nα

2️⃣ 间接左递归

形如:N->Aα A->Bβ B->Nγ

3️⃣ 潜在左递归

形如:N->α N β,而α⇒+ε\alpha\overset{+}{\Rightarrow}εα⇒+ε

直接左递归的消除

候选式:A->Aα|β,可以得到文法符号串:βα、βαα、βααα……

​ A->βA’ A’->α A’|ε,也可以得到文法符号串:βα、βαα、βααα……

一般化可以得到直接左递归的消除方法

若:A->Aα|β,其中β不以A开头,则修改规则为A->βA’ A’->α A’|ε

可以进行推广:假定P的全部产生式为
P→Pα1∣Pα2∣...∣Pαm∣β1∣β2∣...∣βnP\rightarrow P\alpha_1|P\alpha_2|...|P\alpha_m|\beta_1|\beta_2|...|\beta_n P→Pα1​∣Pα2​∣...∣Pαm​∣β1​∣β2​∣...∣βn​
每个α都不等于ε,每个β都不以P开头

则将左递归变为右递归如下
P→β1P′∣β2P′∣...∣βnP′P′→α1P′∣α2P′∣...∣αmP′∣εP\rightarrow\beta_1P'|\beta_2P'|...|\beta_nP'\\ P'\rightarrow\alpha_1P'|\alpha_2P'|...|\alpha_mP'|ε P→β1​P′∣β2​P′∣...∣βn​P′P′→α1​P′∣α2​P′∣...∣αm​P′∣ε

举例:文法:E->E+T|T T->T*F|F F->(E)|i

消除直接左递归后

E->TE’

E’->+TE’|ε

T->FT’

T’->*FT’|ε

F->(E)|i

间接和潜在左递归的消除

一个文法消除左递归的条件:不含以ε为右部的产生式;不含回路P⇒+PP\overset{+}{\Rightarrow}PP⇒+P

代入法

将一个产生式规则右部的a中的非终结符N替换为“N的候选式”。如果N有n个候选式,则右边的a重复n次,而且每一次重复都用N的不同候选式来代替N。

举例:(改写之后的)N->a|Bc|ε在S->pNq中的代入结果:S->paq|pBcq|pq

消除一个文法一切左递归的算法

1️⃣ 对文法G的所有非终结符进行排序;

2️⃣ 按上述顺序对每一个非终结符Pi依次执行:

for(j=1;j< i-1;j++)将Pj代入Pi的产生式(若可代入的话);
消除关于Pi的直接左递归;

3️⃣ 化简上述所得文法。

举例

对于文法:S->Qc|c Q->Rb|b R->Sa|a

虽然没有直接左递归,但是S,Q,R都是左递归的,比如有S=>Qc=>Rbc=>Sabc

1️⃣ 将非终结符排序为:R、Q、S

2️⃣ 对于R,不存在直接左递归,将R带入到Q的有关候选后,我们把Q的规则变为Q->Sab|ab|b

现在的Q同样不含有直接左递归,把它带入到S的有关候选后,S变为S->Sabc|abc|bc|c,消除S的直接左递归,可以得到整个文法

S->abcS’|bcS’|cS’

S’->abcS’|ε

Q->Sab|ab|b

R->Sa|a

其中Q和R的规则已经多余,化简以后可以得到

S->abcS’|bcS’|cS’

S’->abcS’|ε

由于排序不同,最后得到的文法在形式上可能不一样,但是都是等价的

消除回溯、提左因子

回溯原因

若当前符号 = a,对 A 展开,而 A -> α1|α2|…|αm那么,要知道哪一个αi是获得以a开头的串的唯一替换式。

即:选择哪一个αi,亦即通过查看第一个(当前)符号来发现合适的替换式α。

如何选择αi?

以a为开头的αi

如果有多个αi以a开头,则这是文法的问题

举例

有产生式

语句->if 条件 then 语句 else 语句|while 条件 do 语句|begin 语句表 end

若要寻找一个语句,那么关键字if,while,begin就提示我们哪一个替换式是最右可能成功的替换式

若要求不得回溯,文法G(不含有左递归)的必要条件是什么?

若由αi⇒+a...\alpha_i\overset{+}{\Rightarrow}a...αi​⇒+a...(某个文法符号串经过若干步推导可以得到以a(终结符)开头的串),选该αi必中,但若αj⇒+a...\alpha_j\overset{+}{\Rightarrow}a...αj​⇒+a...,就会导致无法百发百中。解决办法是对文法本身提出要求:不要出现以上情况”。把上述要求阐明清楚可以采用如下定义的FIRST(α),即α的首符集。由于空串的存在,不能称为首终结符集。

首符集定义FIRST(α)
FIRST(α)={a∣α⇒∗a…,a∈VT}ifα⇒∗ε,defineε∈FIRST(α)FIRST(\alpha)=\{a|\alpha\overset{*}{\Rightarrow}a…,a\in V_T\}\\ if\ \alpha\overset{*}{\Rightarrow}ε,define\ ε\in FIRST(\alpha) FIRST(α)={a∣α⇒∗a…,a∈VT​}if α⇒∗ε,define ε∈FIRST(α)

定理

若一个A∈VNA∈V_NA∈VN​有许多FIRST(αi)FIRST(\alpha_i)FIRST(αi​)。如果A的任何两个候选式αi\alpha_iαi​和αj\alpha_jαj​之间均满足
FIRST(αi)∩FIRST(αj)=∅FIRST(\alpha_i)\cap FIRST(\alpha_j)=\empty FIRST(αi​)∩FIRST(αj​)=∅
意味着,A的每一候选式α推导后所得的字符串第一个VTV_TVT​均不同。

于是,对输入符号α,如果α∈FIRST(αi), 则α not∈FIRST(αj), (j≠i)。因此,对A的展开无疑应选候选式αi,否则无法命中。

消除回溯目的

使非终结符A所有候选式的首符集两两不相交

方法:提取公共因子

若:A−>δβ1∣δβ2∣...∣δβn∣γ1∣γ2∣...∣γmA->\delta \beta_1|\delta \beta_2|...|\delta \beta_n|γ_1|γ_2|...|γ_mA−>δβ1​∣δβ2​∣...∣δβn​∣γ1​∣γ2​∣...∣γm​,其中每个γ不以δ开头

那么可以把这些规则改写成
A→δA′∣γ1∣γ2∣...∣γmA′→β1∣β2∣...∣βnA\rightarrow \delta A'|γ_1|γ_2|...|γ_m\\ A'\rightarrow \beta_1|\beta_2|...|\beta_n A→δA′∣γ1​∣γ2​∣...∣γm​A′→β1​∣β2​∣...∣βn​

递归下降分析程序构造

不含左递归每个非终结符的所有候选式的首符集都两两不相交条件下,构造一个不带回溯的自上而下分析程序,该分析程序由一组递归过程组成,每个过程对应文法的一个非终结符。这样的一个分析程序称为递归下降分析器。

举例

文法G:

E->TE’

E’=>+TE’|ε

T->FT’

T’->*FT’|ε

F->(E)|i

每个非终结符对应的递归子程序如下:

面临输入:i1+i2*i3的分析步骤如下

构造语法树时,注意点

有ε,自动匹配,不会失败

无成功/失败消息返回

出错位置不确切

构造递归下降分析程序时,它由一组递归过程组成。每个递归过程对应文法的一个非终结符

预测分析程序

❓ 问题:
用递归子程序描写递归下降分析器,要求实现该编译程序的语言(高级或汇编)允许递归。

[XJTUSE编译原理]第四章 语法分析——自上而下分析相关推荐

  1. 编译原理第四章练习题

    目录 编译原理第四章作业 课本习题 补充习题 编译原理第四章作业 自己写的不包对,有错请指正 BY hllinyu 2023年3月31日 课本习题 编译原理 第三版 王生原- 清华大学出版社 的那本 ...

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

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

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

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

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

    第四章语法分析和语法分析程序 4.1_自顶向下的语法分析 4.1.1_自顶向下分析过程的基本特点 ①消除文法直接左递归 ②回溯的消除及LL(1)文法 4.1.2_递归下降法 4.1.3_预测分析法(也 ...

  5. 计算机操作系统原理第四章习题

    计算机操作系统原理第四章习题 1.什么是静态链接.装入时动态链接和运行时的动态链接? 2.简述分页系统和分段系统的异同点 3.什么情况下需要重定位?为什么要引入重定位? 4.在具有快表的段页式存储管理 ...

  6. 微型计算机原理答案第四章,微机原理第四章习题答案.doc

    微机原理第四章习题答案 1.8086语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快? 答:数据操作数的寻址方式有七种,分别为:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对 ...

  7. 编译原理实验:自下而上语法分析

    编译原理实验:自下而上语法分析 1. 实验题目:自下而上语法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3. 算法流程 4. 源程序 5. 调试数据 1. 实验题目:自下而上语法分析 ...

  8. 编译原理中词法分析的递归下降分析法实例--能被5整除的二进制数---c语言实现

    一.前言 又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能-写实验报告.行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路.作 ...

  9. lr1分析器c语言实验报告怎么写,编译原理课程的设计构造LR分析法语法分析器.doc...

    编译原理课程的设计构造LR分析法语法分析器 太 原 学 院 课程设计报告书 课程名称 设计题目 构造LR(0)分析法语法分析器 专业班级 学 号 姓 名 指导教师 2016年 12 月 15日 目 录 ...

  10. 第四章css总结,第四章CSS层叠样式表分析.doc

    第四章CSS层叠样式表分析 第章CSS层叠样式表CSS的" " color=" ">这样的标签以及与标签搭配的显示属性(如"background ...

最新文章

  1. 论文《城市大脑的定义与建设规范探讨》在IEEE(ICBAIE)发表
  2. Android开发之使用Preferences设计软件设置界面(源代码分享)
  3. java实现随机抽取试题组成试卷
  4. 前端学习(3191):react中案例
  5. 从生产故障解锁RocketMQ集群部署的最佳实践
  6. mtk android 设置默认铃声,[转载]MTK修改铃声资源
  7. java 包结构 枚举类_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...
  8. Win11进桌面闪屏,亲测恢复正常
  9. [转载]Win7微软官方正式版原版镜像下载总汇(附win7 OEM KEY密钥)
  10. 【中软杯国二开源】基于PaddleOCR和深度学习的企业实体识别
  11. 世界上都有哪些常用的聊天软件?
  12. 每一天的邂逅......
  13. 程序员如何选择未来的职业路线
  14. 龙芯软件开发 10 --龙芯2E指令
  15. docker 安装kafka
  16. 走马观花之bug预防
  17. 计算银行利息上机实践5实验2
  18. 基于SAE特征融合的合成孔径雷达图像的目标识别
  19. 网赚平台Clixsense+手机号邮箱短信提醒调查实现轻松网赚
  20. 丰田pcwin是什么软件_Windows有哪些软件建议不要安装?

热门文章

  1. Keil MDK5的安装及破解详细步骤
  2. maven引入阿里云镜像源(Maven下载加速)
  3. IT行业适合去的城市
  4. 电子招投标系统解决方案
  5. Vue导出excel文件
  6. eplan2022启动报错存储空间不够或者提示没有settings权限
  7. 客户跟进中的一些小技巧
  8. 最全,从小白到交互设计大牛的105条设计原则-附PDF资料
  9. CentOS8-Tomcat7安装并设置开机自启动
  10. 地理空间数据可视分析综述笔记