《编译原理》构造 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. 爬虫—Selenium使用

    Selenium使用 Selenium是一个自动化测试工具,可以驱动浏览器器执行特定的动作,如点击,下拉等.同时还可以获取浏览器当前呈现页面的源代码,可见即可爬. 1.准备 我们使用谷歌Chrome浏 ...

  2. justify-content属性

    justify-content 用于设置或检索弹性盒子元素在主轴方向上的对齐方式. 属性值:flex-start 属性值:flex-end 属性值:center 属性值:space-between 属 ...

  3. composer查看安装情况

    composer install --no-progress --profile -vvv

  4. Android 性能优化(15)网络优化( 11)Manipulating Broadcast Receivers On Demand

    Manipulating Broadcast Receivers On Demand This lesson teaches you to Toggle and Cascade State Chang ...

  5. PostgreSQL与MySQL比较

    特性 MySQL PostgreSQL 实例 通过执行 MySQL 命令(mysqld)启动实例.一个实例可以管理一个或多个数据库.一台服务器可以运行多个 mysqld 实例.一个实例管理器可以监视 ...

  6. micropython陀螺仪控制舵机

    2018-03-1220:14:00 import pyb import time from pyb import Pin xlights = (pyb.LED(2),pyb.LED(3)) MO = ...

  7. Discuz!伪静态原理分析

    伪静态在seo火热的时代,是每个站长都比较关注的问题,discuz!论坛如何伪静态,为什么伪静态失效了,为什么列表页无法实现伪静态,为什么有些页面不是伪静态呢?下面dz官方nxy105从两个角度入手为 ...

  8. jmeter普通的接口测试

    摘自:后知者.https://www.cnblogs.com/houzhizhe/p/6838731.html jmeter可以做接口测试,其中接口测试的简单操作包括做http脚本(发get/post ...

  9. 100 道 Linux 笔试题,能拿 80 分就算大神!

    本套笔试题共100题,每题1分,共100分.(参考答案在文章末尾) 1. cron 后台常驻程序 (daemon) 用于: A. 负责文件在网络中的共享 B. 管理打印子系统C. 跟踪管理系统信息和错 ...

  10. find命令查找和替换

    find命令查找和替换 语法: find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g' #查找替换当前目录下包含字符串并进行替换 ...