《编译原理》构造 LL(1) 分析表的步骤 - 例题解析
易错点及扩展:
1、求每个产生式的 SELECT 集
2、注意区分是对谁 FIRST 集 FOLLOW 集
3、开始符号的 FOLLOW 集包含 #
4、各集合对对应的对象以及含义
集 | 对象 | 含义 |
---|---|---|
FIRST 集 | 是对产生式右部 | 右部内部的所有终结符集,可能为 ε |
FOLLOW 集 | 是对产生式左部(非终结符) | 非终结符后面紧跟的终结符,可能为 #,和该非终结符推导出的右部无关(因为LL(1)文法不包含递归,所以右部不会再有该非终结符,所以不能通过该右部判断该非终结符后跟集合) |
SELECT 集 | 是对产生式 | 需要考虑产生式右部的不同情况,进一步确定是根据 FIRST 集还是 FOLLOW 集 |
5、SELECT 集的定义
注: 注意区分 FIRST 集 FOLLOW 时是对 α 还是 A
给定文法 G,对于产生式 A→α,α ∈ V*,则可选集 SELECT(A→α) 有:
(1)若 α ≠ ε,且 α ≠+> ε,则 SELECT(A→α) = FIRST(α)
(2)若 α ≠ ε,但 α =+> ε,则 SELECT(A→α) = FIRST(α) ∪ FOLLOW(A)
(3)若 α = ε,则 SELECT(A→α) = FOLLOW(A)
描述:
- 第 1 条是,当 α ≠ ε,且通过1次或多次推不出 ε,SELECT(A→α) = FIRST(α)
- 第 2 条是,当 α ≠ ε,但 α 经有限步可推出 ε,SELECT(A→α) = FIRST(α) ∪ FOLLOW(A)
(注意是一个 α,一个 A) -
第 3 条是,当 α = ε,SELECT 集就等于左部 A 的 FOLLOW 集
解题时,先判断是否为 ε,是则用第(3)条,否则再判断能否通过1次或多次推出 ε,是则用第(2)条,否则用第(1)条
求 FIRST,FOLLOW,SELECT 集详细例题可参考:
《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法
6、LL(1) 分析表的结构
分析表是一个二维数组 M[A,a],其中 A 表示行,是非终结符,a 表式列是终结符或 #。
- M[A,a] 中若有产生式,表明 A 可用该产生式推导,以求与输入符号 a 匹配。
- M[A,a] 中若为空,表明 A 不可能推导出与 a 匹配的字符串
7、LL(1) 分析表构造方法:
- 若 a∈SELECT(A→α),则把 A→α 加至 M[A, a] 中
- 把所有无定义的 M[A, a] 标上“出错标志”。为了使表简化,表中空白处为出错
例题:
已给文法:
G[S]: S→aH
H→aMd
H→d
M→Ab
M→ε
A→aM
A→e
(1)求 SELECT 集
(2)证明文法是 LL(1) 文法
(3)构造 LL(1) 分析表
解析:
求 SELECT 集:
产生式 | FIRST 集 | FOLLOW 集 | SELECT 集 |
---|---|---|---|
S→aH 分析: 对该产生式,可知 FIRST(aH) = {a};也可知应将 FOLLOW(S) = {#} 加到 FOLLOW(H) 中 | {a} | FOLLOW(S) = {#} | SELECT(S→aH) = FIRST(aH) = {a} |
H→aMd 分析: 对该产生式,可知 FIRST(aMd) = {a};也可知应将 d 加到 FOLLOW(M) 中 | {a} | FOLLOW(H) = {#} | SELECT(H→aMd) = FIRST(aMd) = {a} |
H→d 分析: 对该产生式,可知 FIRST(d) = {d} | {d} | SELECT(H→d) = FIRST(d) = {d} | |
M→Ab 分析: 对该产生式,可知 FIRST(Ab) = {a, e};也可知应将 b 加到 FOLLOW(A) 中 | {a, e} | FOLLOW(M) = {b, d} | SELECT(M→Ab) = FIRST(Ad) = {a, e} |
M→ε | {ε} | SELECT(M→ε) = FOLLOW(M) ={d, b} 求法: 由产生式 H→aMd,所以将 d 放入 FOLLOW(M);由产生式 A→aM 所以把 FOLLOW(A) 加至 FOLLOW(M) 中。同理 求 FOLLOW(A),由产生式 M→Ab,FOLLOW(A) = {b}。故 FOLLOW(M) = {d ,b} | |
A→aM 分析: 对该产生式,可知 FIRST(aM) = {a};也可知应将 FOLLOW(A) 加到 FOLLOW(M) 中 | {a} | FOLLOW(A) = {b} | SELECT(A→aM) = FIRST(aM) = {a} |
A→e 分析: 对该产生式,可知 FIRST(e) = {e} | {e} | SELECT(A→e) = FIRST(e) = {e} |
证明文法是 LL(1) 文法(2 分)
定理:同一非终结符的 SELECT 交集为空集,则该文法是 LL(1) 文法:
SELECT(H→aMd) ∩ SELECT(H→d) = ∅
SELECT(M→Ab) ∩ SELECT(M→ε) = ∅
SELECT(A→aM) ∩ SELECT(A→e) = ∅
所以该文法是 LL(1) 文法
构造 LL(1) 分析表(1 分)
分析表是一个二维数组 M[A,a],其中 A 表示行是非终结符,a 表式列是终结符或 #。根据 SELECT 集构造分析表:
a | b | d | e | |
---|---|---|---|---|
S | S→aH | |||
H | H→aMd | H→d | ||
M | M→Ab | M→ε | M→ε | M→Ab |
A | A→aM | A→e |
《编译原理》构造 LL(1) 分析表的步骤 - 例题解析的更多相关文章
-
《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析
<编译原理>LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 笔记 直接做题是有一些特定步骤,有技巧.但也必须先了解一些基本概念,本篇会通过例题形式解释概念,会容易理解和记忆,以 ...
-
《编译原理》求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析
<编译原理>求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析 算符优先关系表的构造中涉及到求 FIRSTVT 集和 LASTVT 集. 表示及含义: FIRSTVT(T) 非 ...
-
Java 实现《编译原理》简单-语法分析功能-LL(1)文法 - 程序解析
Java 实现<编译原理>简单-语法分析功能-LL(1)文法 - 程序解析 编译原理学习,语法分析程序设计 (一)要求及功能 已知 LL(1) 文法为: G'[E]: E→TE' E'→+ ...
-
编译原理根据项目集规范族构造LR(0)分析表
转载于https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.n ...
-
编译原理实验之SLR1文法分析
---内容开始--- 这是一份编译原理实验报告,分析表是手动造的,可以作为借鉴. 基于 SLR(1) 分析法的语法制导翻译及中间代码生成程序设计原理与实现1 .理论传授语法制导的基本概念,目标代码结 ...
-
LL(1)文法分析表的构造和分析过程示例
在考完编译原理之后才弄懂,悲哀啊.不过懂了就好,知识吗,不能局限于考试. 文法: E→TE' E'→+TE'|ε T→FT ' T'→*FT'|ε F→id| (E) 一.首先判断是不是 LL(1)文 ...
-
编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解
语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...
-
LR(0)文法项目集规范族、DFA和分析表的构建实例
最近在复习编译原理,考试之前以为自己懂了,眼高手低就没去实践.结果一考试出问题了.... 学习就要脚踏实地,容不得半点模糊.凭着侥幸心理很危险的.以后要引以为戒啊. 特别写出这篇文章 :一来总结一下这 ...
-
语法设计——基于LL(1)文法的预测分析表法
实验二.语法设计--基于LL(1)文法的预测分析表法 一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证.通过对 ...
随机推荐
-
bug-android之ActivityNotFoundException
应用场景:用于安卓的短信发送功能 异常名称:Caused by: android.content.ActivityNotFoundException: No Activity found to han ...
-
[bzoj3813]奇数园
仿佛现在已经完成了做题之前先开个坑的习惯,也许是为了逼迫自己去刷一些神题吧...然并卵,该剩的好多坑还是剩着呢. [bzoj3813]一道线段树好题.已经把数论忘光光了. 欧几里德算法 扩展欧几里德算 ...
-
pdo调用
php单次调用,例题 <body> <?php //造DSN:驱动名:dbname=数据库名;host=服务器地址 $dsn = "mysql:dbname=mydb;ho ...
-
hdu 2037
PS: - -原本想的是排序开始时间和消耗时间..后来想到可以排序结束时间..后来还wa了一次,因为排序的时候溢出了 思路: 1 3 //13 4 //20 7 3 8 2 9 5 10 //36 ...
-
微信小程序官方demo学习
最近微信小程序很火,很喜欢那种轻应用,用完就走的理念.于是,下载好微信开发者工具,学习一下官方demo. 体验下来,有类似react和vue的感觉,dom类似react那种组件的,data-bindi ...
-
SICP-Elements of program
编程语言=组合简单形成复杂的工具 简单的声明和表达式 简单元素之间的组合方式 组合后元素的抽象方式 程序=数据+函数 数据是我们要处理的内容 函数是我们处理数据的方式 函数式与中缀式 函数式不会出现歧 ...
-
玲珑杯 Round #11 (1001 1004 1007)
比赛链接 直接贴代码.. #include<bits/stdc++.h> using namespace std; typedef long long LL; int main() { L ...
-
LabVIEW--好书推荐与分享
LabVIEW宝典 此书可以作为工具书,配合LabVIEW的范例程序学习可以达到事半功倍的效果. 链接:https://pan.baidu.com/s/17jm6PznLyGW8rVQ_veaGCg ...
-
ibevent 和 libev 提高网络应用性能【转】
转自:https://www.cnblogs.com/kunhu/p/3632285.html 构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接, ...
-
GitHub &;&; GitLab
1.github介绍 Git作为一个开源的分布式版本控制系统,已经被越来越多的人使用,随之需要的就是需要有个专门的地方存储.管理通过Git上传的项目,这就是gitHub gitHub是一个面向开源及私 ...