文章目录

  • 计算文法符号X的FIRST(X)
  • 计算非终结符A的FOLLOW(A)
  • 表达式文法各产生式的SELECT集
    • 预测分析表
  • LL(1)文法的分析方法
    • ==预测分析法实现步骤==

参考哈工大课件

计算文法符号X的FIRST(X)

FIRST ( X ):可以从X推导出的所有串首终结符构成的集合
如果 X =>* ε,那么 ε∈FIRST ( X )

  • 如果X是一个终结符或者 X→ε∈P,那么FIRST ( X ) = { X }或者将ε加入到FIRST( X )中
  • 如果X是一个非终结符,且 X→Y1…Yk∈P (k≥1),那么如果对于某个i,a在FIRST (Yi ) 中且ε 在所有的FIRST(Y1) , … , FIRST(Yi-1)中(即Y1…Yi-1 =>* ε ),就把a加入到FIRST( X )中。如果对于所有的 j =1,2, . . . , k,ε在FIRST(Yj)中,那么将ε加入到FIRST( X )

计算非终结符A的FOLLOW(A)

FOLLOW(A):可能在某个句型中紧跟在A后边的终结符a的集合
FOLLOW(A)={a| S =>* αAaβ, a∈VT,α,β∈(VT∪VN)*}
如果A是某个句型的的最右符号,则将结束符“#”添加到FOLLOW(A)中

First Follow
① E → TE’ E { ( id } { # )}
② E’ → +TE’ or ε E’ { + ε } { # )}
③ T → FT’ T { ( id } { + # )}
④ T’ → *FT’ or ε T’ { * ε } { + # )}
⑤ F → (E) or id F { ( id } { * + # )}

首先,E是句型的开始符号,也是某个句型的最右符号,所以将“#”加入follow集中。然后开始逐个分析每一条产生式。
根据①,E’的first集的所有终结符可以跟在T的后面,所以将firstE中所有终结符+,加入到E的follow集中。由于E’的first集中包含空串,因此所有能够跟在E后面的符号都能跟在T后面。所以将followE中的符号#加到followT中。E’是产生式①的最后一个符号,也就是说能够跟在E后的终结符也能跟在E’后。所以将followE中的符号#加到followE’中。
根据②,firstE’中+加入followT,因为E’可以为空串,因而followE’需要加入followT,因为E’是最后一个符号,又是句型的开头符号所以不变。由于产生式右边有空串,所以要将#加入followE’。
根据③,firstT’中*加入followF,因为firstT’含有空串,所以followT也要加入followF中,因为T’是右部的最后一个符号,所以能跟在T后面的符号也能跟在T’中,将followT加入followT’。
根据⑤,(E),将)加入followE。
不断应用规则,直到没有新的终结符可以被加入到任何FOLLOW集合中为止。

表达式文法各产生式的SELECT集

X FIRST( X ) FOLLOW( X )
E ( id # )
E ’ + ε # )
T ( id + ) #
T ’ * ε + ) #
F ( id * + ) #

(1) E → T E ’ SELECT (1)= { ( id } 产生式右部第一个非终结符T的first集中的终结符
(2) E '→ + T E ’ SELECT (2)= { + } 产生式右部是以非终结符开头的,所以只有这个非终结符
(3) E '→ε SELECT (3)= { # ) } 空产生式,取E’follow集合中间的元素
(4) T → F T ’ SELECT (4)= { ( id } 同1,右部第一个非终结符F的first集合的终结符
(5) T ’ → * F T ’ SELECT (5)= { * } 同2
(6) T ’ →ε SELECT (6)= { + ) # } 同3
(7) F → ( E ) SELECT (7)= { ( } 同3
(8) F → id SELECT (8)= { id } 同3
由于2、3&5、6&7、8 产生式具有相同左部,其select集互不相交,所以这个文法是LL1文法。

预测分析表

根据上述分析构造预测分析表
select集中有( id + # ) *这几个符号,由此构造分析表:
第一个产生式的select集有 ( 和 id,也就是说当E遇到( 和 id 时,可以选用第一个产生式。
E’有两个产生式,分别对应+和 # ),分别填入表中

LL(1)文法的分析方法

递归的预测分析法
递归的预测分析法是指:在递归下降分析中,根据预测分析表进行产生式的选择
非递归的预测分析法
非递归的预测分析不需要为每个非终结符编写递归下降过程,而是根据预测分析表构造一个自动机,也叫表驱动的预测分析

表驱动的预测分析法
输入:一个串w和文法G的分析表M
输出:如果w在L(G )中,输出w的最左推导;否则给出错误指示
方法:最初,语法分析器的格局如下:输入缓冲区中是w#,G的开始符号位于栈顶,其下面是#。下面的程序使用预测分析表M生成了处理这个输入的预测分析过程
设置ip使它指向w的第一个符号,其中ip 是输入指针;
令X=栈顶符号;
while ( X ≠#){ /* 栈非空 */ if ( X 等于ip所指向的符号a) 执行栈的弹出操作,将ip向前移动一个位置;else if ( M是一个终结符号) error ( ) ;else if ( M[X,a]是一个报错条目) error ( ) ; else if ( M[X,a] = X → Y1Y2 … Yk){输出产生式 X → Y1Y2 … Yk ;弹出栈顶符号;将 Yk,Yk-1…,Yi 压入栈中,其中Y1位于栈顶。 }令X=栈顶符号
}

递归的预测分析法vs.非递归的预测分析法

递归的预测分析法 非递归的预测分析法
程序规模 程序规模较大, 不需载入分析表
直观性 较好
效率 较低
自动生成 较难

预测分析法实现步骤

1)构造文法
2)改造文法:消除二义性、消除左递归、消除回溯
3)求每个变量的FIRST集和FOLLOW集,从而求得每个候选式的SELECT集
4)检查是不是 LL(1) 文法。若是,构造预测分析表
5)对于递归的预测分析,根据预测分析表为每一个非终结符编写一个过程;对于非递归的预测分析,实现表驱动的预测分析算法

预测分析中的错误检测
两种情况下可以检测到错误:

  • 栈顶的终结符和当前输入符号不匹配
  • 栈顶非终结符与当前输入符号在预测分析表对应项中的信息为空

预测分析中的错误恢复
恐慌模式

  • 忽略输入中的一些符号,直到输入中出现由设计者选定的同步词法单元(synchronizing token)集合中的某个词法单元

其效果依赖于同步集合的选取。集合的选取应该使得语法分析器能从实际遇到的错误中快速恢复
例如可以把FOLLOW(A)中的所有终结符放入非终结符A的同步记号集合

  • 如果终结符在栈顶而不能匹配,一个简单的办法就是弹出此终结符

分析表的使用方法

  • 如果M[A,a]是空,表示检测到错误,根据恐慌模式,忽略输入符号a
  • 如果M[A,a]是synch,则弹出栈顶的非终结符A,试图继续分析后面的语法成分
  • 如果栈顶的终结符和输入符号不匹配,则弹出栈顶的终结符

FIRST集和 FOLLOW集的计算相关推荐

  1. 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理

    本次笔记内容: 4-4 FIRST集和FOLLOW集 4-5 递归的预测分析法 4-6 非递归的预测分析法 4-7 预测分析法中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析 ...

  2. FIRST集和FOLLOW集的计算

    文章目录 `FIRST`集的计算 计算`FIRST(x)` 具体算法 计算`$X_21,X_2,X_3,...,X_n$`的`FIRST`集 FOLLOW集的计算 算法 FIRST集的计算 计算FIR ...

  3. FIRST集和FOLLOW集的构造

    FIRST集和FOLLOW集的定义 注意:1:FIRST集的定义中\(\alpha和\beta\)可以是终结符也可以是非终结符.2:FOLLOW集的定义中\(\mu和\beta\)可以是终结符也可以是 ...

  4. 编译原理-First集和Follow集

    刚学first集和follow集的时候,如果上课老师没有讲明白或者自己没听明白,自己看的时候还真是有点难理解,不过结合着具体的题目可以理解的更快. 先看一下两种集合的求法: First集合的求法:   ...

  5. 【编译原理】FIRST集和FOLLOW集构造法速学

    编译原理速成大法 FIRST集和FOLLOW集构造法速成 FIRST FOLLOW FIRST集和FOLLOW集构造法速成 例:对于文法G(E) 首先像E,T,E',F这样的就是非终结符 +,*, ε ...

  6. 【编译原理】First集和Follow集简易解释(偏人话)

    \ε:非ε元素 First集和Follow集是集合 First集规则(相应字母在->左边,查找->右边第一个东西) ①A->aB,a加进First(A): (->右边第一个是终 ...

  7. LL(1)文法中FIRST集和FOLLOW集的计算方法

    文章目录 深入理解 FIRST集的定义 FIRST集的实际意义 FIRST集的计算方法 FOLLOW集的定义 FOLLOW集的实际意义 FOLLOW集的计算方法 预测分析表的实质 LL(1)文法的判断 ...

  8. 编译原理中LL(1)文法求FIRST集和FOLLOW集的方法

    一.求FIRST集 1.右部首个字符是终结符则加入左部字符的FIRST集中,比如对形如U->a-的产生式(其中a是终结符),把a收入到FIRST(U)中. 2.右部首个字符是非终结符, 若此非终 ...

  9. 编译原理 First集和Follow集的求法

    转载地址 https://blog.csdn.net/Alexander_Frank/article/details/51280798 自上而下分析: FIRST集求法 First集合最终是对产生式右 ...

  10. FIRST和FOLLOW集的计算

    最近马上要步入考试周了,编译原理的这个Follow集一直令我头大啊,今天百度了下下,找到一篇文章,看了以后我瞬间就明白了如何求解Follow集~~哈哈,如果你也不知道如何求解Follow集,请看看下面 ...

最新文章

  1. 谷歌 Fuchsia 上手体验,将取代Android/win10
  2. 实用的bit 位操作
  3. SessionID 的本质
  4. android跳转到打电话,Android 应用跳转到拨打电话界面或qq进行聊天(qq咨询)
  5. 备战实习求职的一些感想(已拿阿里offer)
  6. HDU 4893 线段树
  7. Live Migrate 操作 - 每天5分钟玩转 OpenStack(42)
  8. [JavaWeb-Servlet]Servlet的体系结构
  9. 《南方都市报》:中国互联网“公共性”正在变形或流失
  10. 【来自项目的技术点】— 聊聊键盘长按的时候解决卡顿方案
  11. 学计算机专业的需要买电脑吗,高三党升级“准大一生”,有必要买电脑吗?学长的回答可以参考...
  12. SpringBoot项目整合Retrofit最佳实践,这才是最优雅的HTTP客户端工具!
  13. 在linux系统下挂接(mount)光盘镜像文件、移动硬盘、U盘以及Windows网络共享和UNIX...
  14. Excel中 对「对话气泡(吹き出し)」中的文字添加删除线 等操作
  15. sql 获取当前之后某天的日期
  16. 二分法求函数零点:(递归方法和非递归方法)
  17. word怎么竖向选中,word怎么文字竖排的两种方法
  18. eth入门之web2 与 web3 的对比
  19. 网络安全之KALI使用
  20. redis-使用Java代码操作

热门文章

  1. 【bug】修复YYC松鼠短视频系统V2.7版本bug 注册输入验证码提示邀请码,输入邀请码提示错误
  2. IAT HOOK、EAT HOOK和Inline Hook
  3. Homekit智能开关/定时控制
  4. SuperSU下载 | SuperSU Download
  5. MySQL安装教程 + 安装包
  6. fastlane二开java_从入门开始使用Fastlane
  7. spring boot中使用websocket实现点对点通信与服务器推送
  8. debian 修改桌面背景
  9. 西湖论剑2021 MISC部分(LSB,取证)
  10. esxi虚拟化是基于linux吗,虚拟化 – 如何在虚拟机中运行VMWare ESX或ESXi?