编译原理FIRST、FOLLOW、SELECT集の通俗解释

简介:

1.为什么要引入FIRST集的概念?

  • 因为有公共左因子的问题,公共左公因子是指在文法的产生式集合中,某个非终结符的多个候选式具有相同的前缀。
  • 一般来说,公共左公因子的产生式为 
    A α β 1 α β 2
  • 如果有公共左因子的问题,那么只能采取试探的方法来分析每一个候选式,分析的过程很可能产生回溯,回溯分析法是一种不确定的方法。
  • 若所有候选式都没有公共左因子就可以选择惟一匹配的候选式,不会产生(公共左公因子引起的)回溯。
  • 为了消除回溯,对任何一个非终结符和当前的待匹配符号,期望 
    • 要么只有一个候选式可用
    • 要么没有候选式可用

因此引入以下FIRST集合的概念:

  • α ( V T V N ) ,有 
    F I R S T ( α ) { a | α a , a V T }

    特别地,若 α ε ,则 ε F I R S T ( α )

因此对于每一文法符号  X V T V N ,构造 F I R S T ( X ) 的方法为: 
使用下列规则,直至每个FIRST集不再增大为止:

  • X V T ,则 F I R S T ( X ) = { X } (意思是如果 X 是终结符,则其 F I R S T 集合为其自身);
  • 若  X V N ,那么 X 的产生式分以下三种情况:

    • X ε
    • ε F I R S T ( X )
    • X a
    • a F I R S T ( X )
    • X Y ,且 Y V N
    • F I R S T ( Y ) { ε } F I R S T ( X )

    • 特例:  X Y 1 Y 2 Y i 1 Y i Y k  
      且  Y 1 , Y 2 , Y i 1 V N  
      Y 1 , Y 2 , Y i 1 ε

      • F I R S T ( Y j ) { ε } F I R S T ( X ) ( 1 j i 1 ) F I R S T ( Y i ) F I R S T ( X )
    • 特别地,当 Y 1 Y 2 Y i 1 Y i Y k ε

      • 则  ε F I R S T ( X )

结论:针对无空产生式的文法G,同一非终结符的任两个产生式的右部符号串的FIRST集无交集,即可进行确定的自顶向下分析。

2.为什么要引入FOLLOW集的概念?

考虑文法G[S]: 
S a A  
S d  
A b A S  
A ε  
求得各终结符和符号串的FIRST集合如下: 
F I R S T ( S ) = { a , d }  
F I R S T ( A ) = { b , ε }  
F I R S T ( a A ) = { a }  
F I R S T ( d ) = { d }  
F I R S T ( b A S ) = { b }  
F I R S T ( ε ) = { ε }  
若输入串 W = a b d ,则试图推导出abd串的推导过程为 S a A a b A S a b S a b d  
从以上推导过程中可以看到,在第2步到第3步的推导中,即 a b A S a b S 时,因为当前面临的输入符号为 d ,但是最左非终结符 A 的产生式右部的开始符号集都不包含 d ,但有 ε ,因此对于 d 的匹配自然认为只能依赖于在可能的推导过程中 A 的后面的符号,所以这时候选用产生式 A ε 向下推导。而当前 A 后面的符号为 S S 产生式右部的开始符号集包含了 d ,所以例子中可用 S d 推导得到匹配。 
语法树如下所示: 
这里写图片描述 
很显然,我们从以上叙述中可以得出: 
当某一非终结符的产生式中含有空产生式时,它的非空产生式右部的开始符号集两两不相交,并与在推导过程中紧跟该非终结符右部可能出现的终结符集也不相交,则仍可构造确定的自顶向下分析。因此,引入了一个文法符号的后跟符号集合。 
引入以下FOLLOW集的概念:

  • A V N ,有 
    F O L L O W ( A ) = { a | S A a a V T }  
    S A ,则规定 # F O L L O W ( A )  
    这里用#作为输入串的结束符,也称为输入串括号。

因此对于每一文法符号  A V N ,实际上求 F O L L O W ( A )  
就是考察A在产生式右端的出现情况,哪些终结符号可以跟随在A后面?

使用下列规则,直至每个FOLLOW集不再增大为止:

  • 首先,设S为文法的开始符号,把 { # } 加入 F O L L O W ( S ) 中(这里#为句子括号)
  • B α A β 是一个产生式,则  F I R S T ( β ) { ε } F O L L O W ( A )
  • 如果 B α A 或者 B α A β β ε ,则  F O L L O W ( B ) F O L L O W ( A )  
    • 解释: 因为在推导过程中可能出现如下的句型序列:
    • S α 1 B β 1 α 1 α A β β 1 α 1 α A β 1

例题: 
A B C c   |   g D B  
B b C D E   |   ε  
C D a B   |   c a  
D d D   |   ε  
E g A f   |   c

非终结符 FIRST FOLLOW
A {a, b, c, d, g} {f, #}
B {b,  ε } {a, c, d, g, f, #}
C {a, c, d} {c, d, g}
D {d,  ε } {a, b, c, g, f, #}
E {c, g} {a, c, d, g, f, #}

对于FIRST集合,解释其中的FIRST(A)的求解。

  • A B C c 属于上述产生式的特例情况,很显然 B ε C ε ,因此 
    ( F I R S T ( B ) { ε } ) F I R S T ( C ) F I R S T ( A )
  • A g D B 属于上述产生式的第二种情况,因此 g F I R S T ( A )
  • 最后得出: 
    F I R S T ( A ) = ( F I R S T ( B ) { ε } ) F I R S T ( C ) { g }
  • F I R S T ( B ) = { b , ε } F I R S T ( C ) = { a , c , d }
  • F I R S T ( A ) = { a , b , c , d , g }

对于FOLLOW集合,有如下的计算情况:

F O L L O W ( A ) = ( F I R S T ( f ) { ε } ) { # } = { f , # }

F O L L O W ( B ) = ( F I R S T ( C c ) { ε } ) F O L L O W ( A ) F O L L O W ( C )   = { a , c , d } { f , # } F O L L O W ( C )   = { a , c , d } { f , # } { c , d , g }   = { a , c , d , g , f , # }

F O L L O W ( C ) = ( F I R S T ( c ) { ε } ) ( F I R S T ( D E ) { ε } )   = { c } ( F I R S T ( D ) { ε } ) F I R S T ( E )   = { c , d , g }

F O L L O W ( D ) = ( F I R S T ( B ) { ε } ) F O L L O W ( A ) ( F I R S T ( E ) { ε } ) ( F I R S T ( a B ) { ε } )   = { b } { f , # } { c , g } { a }   = { a , b , c , g , f , # }

F O L L O W ( E ) = F O L L O W ( B )   = { a , c , d , g , f , # }

3.为什么要引入SELECT集的概念?

由于从2中我们得出结论: 
当某一非终结符的产生式中含有空产生式时,它的非空产生式右部的开始符号集两两不相交,并与在推导过程中紧跟该非终结符右部可能出现的终结符集也不相交,则仍可构造确定的自顶向下分析。 
因此当文法中含有形如: 

A α A β

的产生式时,其中 A V N , α β V ,若 α β 不能同时推导出空,假定 α ε β ε ,则当 
F I R S T ( α ) F O L L O W ( A ) =   F I R S T ( β ) F O L L O W ( A ) =

也即是 F I R S T ( α ) ( F I R S T ( β ) F O L L O W ( A ) ) = 时,对于非终结符A的替换仍可唯一地确定候选。为了表示和分析方便,因此引入了SELECT集合。 
SELECT集合定义如下:

  • 一个产生式的选择符号集SELECT。给定上下文无关文法的产生式 A α , A V N , α V ,若 α ε ,则 S E L E C T ( A α ) = F I R S T ( α )

  • 如果 α ε ,则 S E L E C T ( A α ) = ( F I R S T ( α ) { ε } ) F O L L O W ( A )

因此一个上下文无关文法是LL(1)文法的充分必要条件是,对每个非终结符A的两个不同产生式, A α A β ,满足 

S E L E C T ( A α ) S E L E C T ( A β ) =

其中 α β 不同时能 ε

再次回到上述例题

A B C c   |   g D B  
B b C D E   |   ε  
C D a B   |   c a  
D d D   |   ε  
E g A f   |   c


非终结符 FIRST FOLLOW
A {a, b, c, d, g} {f, #}
B {b,  ε } {a, c, d, g, f, #}
C {a, c, d} {c, d, g}
D {d,  ε } {a, b, c, g, f, #}
E {c, g} {a, c, d, g, f, #}


右部产生式 FIRST
BCc {a, b, c, d}
gDB { g }
bCDE { b }
ε { ε }
DaB {a, d}
ca { c }
dD { d }
gAf { g }
c { c }

  因此根据以上所求得的FIRST集和FOLLOW集,可求得各产生式的SELECT集合如下: 

S E L E C T ( A B C c ) = { a , b , c , d }   S E L E C T ( A g D B ) = { g }   S E L E C T ( B b C D E ) = { b }   S E L E C T ( B ε ) = { a , c , d , g , f , # }   S E L E C T ( C D a B ) = { a , d }   S E L E C T ( C c a ) = { c }   S E L E C T ( D d D ) = { d }   S E L E C T ( D ε ) = { a , b , c , g , f , # }   S E L E C T ( E g A f ) = { g }   S E L E C T ( E c ) = { c }

由上可知,有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
自然语言处理 算法 编译器
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
1227 0
|
4月前
|
机器学习/深度学习 人工智能 JSON
AI应用工程师面试问题清单
本内容涵盖AI与大语言模型(LLM)基础原理、Prompt工程设计及实战项目经验。详解LLM预测机制、Transformer架构、Embedding应用,介绍Prompt优化策略如Zero-shot、Few-shot、RAG技术,并结合实际项目展示AI应用全流程开发与落地能力。
1031 4
|
7月前
|
机器学习/深度学习 算法 数据可视化
基于Qlearning强化学习的机器人迷宫路线搜索算法matlab仿真
本内容展示了基于Q-learning算法的机器人迷宫路径搜索仿真及其实现过程。通过Matlab2022a进行仿真,结果以图形形式呈现,无水印(附图1-4)。算法理论部分介绍了Q-learning的核心概念,包括智能体、环境、状态、动作和奖励,以及Q表的构建与更新方法。具体实现中,将迷宫抽象为二维网格世界,定义起点和终点,利用Q-learning训练机器人找到最优路径。核心程序代码实现了多轮训练、累计奖励值与Q值的可视化,并展示了机器人从起点到终点的路径规划过程。
349 0
|
存储 关系型数据库 MySQL
MySQL数据库碎片化:隐患与解决策略
UUID作为主键可能导致MySQL存储碎片,影响性能。频繁的DML操作、字段长度变化和非顺序插入(如UUID)都会造成碎片。碎片增加磁盘I/O,降低查询效率,浪费空间,影响备份速度。建议使用自增ID,固定长度字段,并适时运行OPTIMIZE TABLE来减少碎片。
|
人工智能 自然语言处理 安全
千行百业,“义”不容辞:通义技术创新与商业实践
千行百业,“义”不容辞:通义技术创新与商业实践。本次分享分为两部分,首先介绍大模型的快速迭代与普及,探讨通义千问在精度和复杂任务执行上的突破;其次聚焦企业级落地,解决安全性、部署路径及模型调优三大问题。通过多模态理解(视觉、语音)和更强的生成控制力,携手伙伴服务各行业,推动技术向生产力转化,并关注公益应用,助力社会进步。
|
Java Android开发
如何确定抛出`NoSuchFieldError`异常的字段
当Java程序运行时,如果尝试访问一个不存在的字段,就会抛出`NoSuchFieldError`异常。要确定引发此异常的字段,可以通过检查异常堆栈跟踪中的类名和字段名来定位问题所在。此外,确保所使用的类版本一致,避免因类文件不匹配导致的此类错误。
591 8
|
机器学习/深度学习 数据采集 算法
机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用
医疗诊断是医学的核心,其准确性和效率至关重要。本文探讨了机器学习在医疗诊断中的前沿应用,包括神经网络、决策树和支持向量机等方法,及其在医学影像、疾病预测和基因数据分析中的具体应用。文章还讨论了Python在构建机器学习模型中的作用,面临的挑战及应对策略,并展望了未来的发展趋势。
840 1
编译原理(1)----LL(1)文法(首符号集,后跟符号集,选择符号集)
编译原理(1)----LL(1)文法(首符号集,后跟符号集,选择符号集)
417 5
编译原理----0型,1型,2型,3型文法
编译原理----0型,1型,2型,3型文法
585 1
|
项目管理 敏捷开发 Cloud Native
带你读《软件项目管理案例教程(第4版)》之一:软件项目管理概述
本书以案例形式讲述软件项目管理过程,借助路线图讲述项目管理的理论、方法及技巧,覆盖项目管理十大知识域的相关内容,重点介绍软件这个特殊领域的项目管理。本书综合了多个学科领域,包括范围计划、成本计划、进度计划、质量计划、配置管理计划、风险计划、团队计划、干系人计划、沟通计划、合同计划等的制定,以及项目实施过程中如何对项目计划进行跟踪控制。该书取材新颖,注重理论与实际的结合,通过案例分析帮助读者消化和理解所学内容,既适合作为高等院校计算机、软件及相关专业高年级本科生和研究生的教材,也适合作为广大软件技术人员和项目经理培训的教材,还可作为软件开发项目管理人员的参考书。