《编译原理》构造 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) 分析表的步骤 - 例题解析的更多相关文章

  1. 《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析

    <编译原理>LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 笔记 直接做题是有一些特定步骤,有技巧.但也必须先了解一些基本概念,本篇会通过例题形式解释概念,会容易理解和记忆,以 ...

  2. 《编译原理》求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析

    <编译原理>求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析 算符优先关系表的构造中涉及到求 FIRSTVT 集和 LASTVT 集. 表示及含义: FIRSTVT(T) 非 ...

  3. Java 实现《编译原理》简单-语法分析功能-LL(1)文法 - 程序解析

    Java 实现<编译原理>简单-语法分析功能-LL(1)文法 - 程序解析 编译原理学习,语法分析程序设计 (一)要求及功能 已知 LL(1) 文法为: G'[E]: E→TE' E'→+ ...

  4. 编译原理根据项目集规范族构造LR(0)分析表

    转载于https://blog.csdn.net/Johan_Joe_King/article/details/79058597?utm_medium=distribute.pc_relevant.n ...

  5. 编译原理 | 构造LR(1)自动机的注意事项

    在画图之前,有时候要先对产生式集合进行某些操作. 下图所示的情况,不需要补一条拓广产生式,因为开始符Z没有出现在某条产生式的右侧. 即,如果开始符出现在某条产生式的右部,需要增加拓广产生式.

  6. 编译原理实验之SLR1文法分析

    ---内容开始--- 这是一份编译原理实验报告,分析表是手动造的,可以作为借鉴. 基于  SLR(1) 分析法的语法制导翻译及中间代码生成程序设计原理与实现1 .理论传授语法制导的基本概念,目标代码结 ...

  7. LL(1)文法分析表的构造和分析过程示例

    在考完编译原理之后才弄懂,悲哀啊.不过懂了就好,知识吗,不能局限于考试. 文法: E→TE' E'→+TE'|ε T→FT ' T'→*FT'|ε F→id| (E) 一.首先判断是不是 LL(1)文 ...

  8. 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解

    语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...

  9. LR(0)文法项目集规范族、DFA和分析表的构建实例

    最近在复习编译原理,考试之前以为自己懂了,眼高手低就没去实践.结果一考试出问题了.... 学习就要脚踏实地,容不得半点模糊.凭着侥幸心理很危险的.以后要引以为戒啊. 特别写出这篇文章 :一来总结一下这 ...

随机推荐

  1. bzoj4269

    http://www.lydsy.com/JudgeOnline/problem.php?id=4269 裸线性基,一个数取多次就是没取... 又有了些新的理解:a数组的前now个元素是基底,也就是可 ...

  2. maven中的三种工程,以及在idea中构建父子工程。

    1.pom工程:用在父级工程或聚合工程中.用来做jar包的版本控制.主要是定义POM文件,将后续各个子模块公用的jar包等统一提出来,类似一个抽象父类 2.war工程:将会打包成war,发布在服务器上 ...

  3. 01_c++下jni开发说明

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  4. CodeForces 731B Coupons and Discounts (水题模拟)

    题意:有n个队参加CCPC,然后有两种优惠方式,一种是一天买再次,一种是买两天,现在让你判断能不能找到一种方式,使得优惠不剩余. 析:直接模拟,如果本次是奇数,那么就得用第二种,作一个标记,再去计算下 ...

  5. C#结构体+结构体与类的区别

    C# 结构(Struct) 在 C# 中,结构是值类型数据结构.它使得一个单一变量可以存储各种数据类型的相关数据.struct 关键字用于创建结构. C# 结构的特点 您已经用了一个简单的名为 Boo ...

  6. 题解报告:poj 1094 Sorting It All Out(拓扑排序)

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  7. spring-redis-data的一个坑

    事故原因: 运维报告redis内存直线上升,然后查询发现都是setrange操作,review代码,没法发现setrange操作 代码如下: redisTemplate.opsForValue().s ...

  8. 生成清除某个数据库下的所有表的SQL语句

    方法1:重建库和表 用mysqldump --no-data把建表SQL导出来,然后drop database再create database,执行一下导出的SQL文件: 方法2:生成清空所有表的SQ ...

  9. [ USACO 2017 FEB ] Why Did the Cow Cross the Road III (Gold)

    \(\\\) \(Description\) 给定长度为\(2N\)的序列,\(1\text ~N\)各出现过\(2\)次,\(i\)第一次出现位置记为\(a_i\),第二次记为\(b_i\),求满足 ...

  10. tp登陆注册(转)

    登录时,更新用户数据,登录ip和登录时间,以及登录次数+1,此实现方便不知是否合适,待验证.源码地址:https://github.com/grh0812/thinkphp-login-registe ...