编译原理——自顶向下分析中FOLLOW集的计算

2023-11-15

一、FOLLOW集的定义

对于非终结符号A,FOLLOW(A)被定义为:可能在某些句型中紧跟在A右边的终结符号的集合(为什么说是可能?因为在一些推导出来的文法符号串中,该非终结符号A可能在最右边,比如:A—>+TA)。
如果存在S=>αAaβ(推导若干次)这样的推导,终结符号a就在FOLLOW(A)中,其中α和β是文法符号串。
如果A和a之间存在一些文法符号,这样的话这些符号会推导得到ε并消失。
另外,如果A是某些句型的最右符号,那么$也在FOLLOW(A)中。

二、FOLLOW集的计算方式

计算所有非终结符号A的FOLLOW(A)集合时,应不断应用下面的规则,知道再没有新的终结符号可以被加入到任意FOLLOW集合中为止。
1)将$放到FOLLOW(S)中,其中S是开始符号,而$是输入右端的结束标记
2)如果存在一个产生式A—>αBβ,那么FIRST(β)除了ε之外的所有符号都在FOLLOW(B)中
3)如果存在一个产生式A—>αB,或存在产生式A—>αBβ且FIRST(β)包含ε,那么FOLLOW(A)中的所有符号都在FOLLOW(B)中(同时FOLLOW(B)中也有FOLLOW(A)的所有符号)。

三、FOLLOW集实例分析

我们给出一个文法G(E):
①E → TE’
②E’ → +TE’
③E’ →ε
④T → F T’
⑤T’ → *F T’
⑥T’ →ε
⑦F → (E)
⑧F → id

左侧非终结符号分别为:E、E’、T、T’、F
我们先给出他们的FIRST集:

N FIRST(N)
E {(,id }
E’ {+,ε }
T {(,id }
T’ {*,ε }
F {(,id }




我们先来看E,我们发现E在第⑦条产生式中出现,
E的后跟符号为 ),并且E为开始符号,因此 :

N FOLLOW(N)
E {),$ }




我们再来看E’,该非终结符号出现在①、②条产生式中,
我们先来看第①条:E → TE’
此时,根据第3)条规则,FOLLOW(E’) U= FOLLOW(E),即:FOLLOW(E’) = { ),$ }
我们再来看第②条产生式:E’ → +TE’ ,由于左侧文法符号也是E’,而根据第3)条规则,FOLLOW(E’) U= FOLLOW(E’),没有什么实际的意义。综上:

N FOLLOW(N)
E’ {),$ }




接着是T,T出现在①、②的产生式右侧,而①、②两条产生式中T的后跟符号都是E’ ,因此,根据第2)条规则:FIRST(E’ )中除ε之外的所有符号都在FOLLOW(T)中。所以:

N FOLLOW(N)
T { + }

但是根据第3)条规则,因为FIRST(E’)中包含ε,所以FOLLOW(T)中也有FOLLOW(E)的元素,综上:

N FOLLOW(N)
T { +,),$ }




我们再来看T’,在右侧的产生式中T’出现在第④、⑤条产生式中。
对于第④条产生式,我们可以根据第3)条规则可知:FOLLOW(T’) U= FOLLOW(T),
对于第⑤条产生式,我们可以得到:FOLLOW(T’) U= FOLLOW(T’),但这并没有什么意义。
因此:

N FOLLOW(N)
T’ { +,),$ }




最后,我们来看F。
我们观察第④、⑤条产生式:
对于第④条产生式,由第2)条规则可知:FOLLOW(F) U= FIRST(T’ ),

N FOLLOW(N)
T’ { * }

同时,因为FIRST(T’ )中包含ε,所以根据第3)条规则可知:FOLLOW(F) U= FOLLOW(T)

N FOLLOW(N)
T’ { *,+,),$ }

对于第⑤条产生式,与上面同理,没有什么意义。
综上:

N FOLLOW(N)
T’ { *,+,),$ }




现在我们得到了所有的FOLLOW集:

N FOLLOW(N)
E { ),$ }
E’ { ),$ }
T { +,),$ }
T’ { +,),$ }
F { *,+,),$ }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译原理——自顶向下分析中FOLLOW集的计算 的相关文章

  • 4.2.5 预测分析法与预测分析表的构造

    4 2 5 预测分析法与预测分析表的构造 预测分析法也称为 LL 1 分析法 这种分析法是确定的自上而下分析的另一种方法 采用这种方法进行语法分析要求描述语言的文法是 LL 1 文法 一个预测分析器由一张预测分析表 也称为 LL 1 分析表
  • assemble language学习(-)

    不容易 终于将第一个简单的arm assemble Language程序跑通了 1 创建project 选择stm32407ve 2 添加汇编启动文件start s STACK TOP EQU 0x20002000 AREA RESET C
  • 控制流分析之循环

    最近做科研碰到了如何识别程序热对象的问题 解决这个问题的一般思路是做静态分析 主要是分支概率和基本块频率的分析 目前 LLVM 里已经添加了这两种分析 然而 直接看相关的代码效率很低 主要原因是缺乏控制流分析方面的基础 导致代码中出现的许多
  • LLVM Language Reference Manual

    摘要 该文档是LLVM汇编语言的参考指南 LLVM是基于表示的静态单赋值 SSA 该表示提供类型安全 低层级操作 灵活性 及简洁表示所有高层级语言的能力 这是贯穿各方面LLVM编译策略的通用代码表示 简介 LLVM代码表示用于三个不同形式
  • 编译实验(三)目标代码生成

    通过词法分析 语法分析 语义分析 最后产生了四元式 而代码生成则是通过四元式来完成 我们先从简单开始做起 编译实验项目下载链接 http download csdn net download supersmart dong 10224159
  • 编译原理笔记

    目录 序章 编译原理 编译器 程序设计语言 第一章 概述 机器语言 第一代语言 特点 汇编语言 高级程序设计语言 鼻祖 时期 特点 翻译程序 汇编语言 解释语言 编译程序 编译过程 词法分析 语法分析 语义分析 中间代码生成 之前三步都是编
  • 深入浅出编译原理-5-一个简单语法分析器的C语言实现

    引言 前面已经介绍了编译器的预处理 词法分析 词法分析器的实现 也在其中说到了语法分析的任务和过程 语法分析的输入是词法单元序列 然后根据语言的文法表示 展开式 利用有限状态机理论 生成抽象语法树 然后遍历得到中间代码 即 三地址码 本节就
  • FLEX & BISON 联合使用

    flex是词法分析器 bison是语法分析器 基本原理就是flex解析出token后 让bison来使用 实际上 一般是先编写bison脚本 里面的token就是一个定义 没有实现 里面的yylex也是没有实现 只有定义 为什么先做biso
  • 编译执行与解释执行的区别

    今天在看到一篇关于分层编译优化的文章时 看到了解释执行与编译执行两个专业词汇 看着熟悉 但不甚理解 然后在网上搜索了一下 说一下自己的理解 对于我们平时写的代码 一般计算机是没办法直接识别的 需要相应的编译器将其编译层机器代码 一些计算机可
  • LLVM里的寄存器分配 - 准备工作(一)

    1 背景介绍 本文档是基于 LLVM 的寄存器分配系列科研笔记第一篇 以一个 C 语言程序为主干介绍 LLVM 在寄存器分配前做的一些主要工作 分析在寄存器分配前期可能的写操作来源 并记录了我在研究 LLVM 后端中 SSA 形式的中间表示
  • 简单的递归下降语法分析程序

    简单递归分析程序 其代码如下 include
  • [学习flex] 1.利用flex实现文字和谐小程序

    灵感来自于09平台dota1 游戏选手对喷时经常互飙国粹 问候对方全家 后来09平台进行了聊天和谐 不和谐的文字都会被 替换 今天我就就用flex实现类似的效果 话不多说上flex代码 脏话 printf 国粹 printf printf
  • 【编译原理】LALR(1)语法分析方法(c++实现)

    前文回顾 编译原理 LR 0 分析方法 c 实现 编译原理 SLR 1 分析方法 c 实现 编译原理 LR 1 分析方法 c 实现 这几个程序的代码大部分是一样的 根据不同算法特点做了部分修改而已 代码 LALR 1 的代码就是在LR 1
  • 【编译原理】课程一:编译原理入门

    目录 1 为什么要学习编译原理 2 什么是编译原理 3 编译与计算机程序设计语言的关系 3 1 程序设计语言的转换方式 3 2 编译的转换过程 3 3 编译器在语言处理系统中的位置 3 4 编译系统的结构 3 4 1 词法分析 扫描 3 4
  • LLVM SSA 介绍

    最近做研究碰到了一个难题 需要对程序变量按生命期进行重命名 考虑到 SSA 中一个变量在不同的程序分支中赋值时会进行重命名 因此打算以此作为参考 看看能否采取同样的方法达到目的 由于之前看到的文档中都说 LLVM IR 是 SSA 形式的
  • 程序语言翻译器的设计与实现----算术表达式转换四元式(编译原理)

    此篇博客是将前面的内容进行整合并进一步提升 真正实现一个简单表达式语法的编译器 如果有不了解的地方请查看下面链接 词法分析 LR 1 分析 一 LR 1 分析 二 这里说的程序语言编译器是指将算术表达式部分进行翻译 暂时不包括优化以及目标语
  • 编译原理实验:使用C/C++语言编写C-语言的词法分析器

    文章目录 实验目的 实验任务 实验内容 实验步骤 分析c 的词法规则 算法基本思想 Step1 find token Step2 DFA状态图构建 Step3 使用while switch双循环将DFA代码化 主程序流程 各程序模块之间层次
  • LLVM是如何编译指令的

    本文将会通过一条指令在LLVM中的不同阶段 从源程序语言中的语义结构到成为机器二进制码来研究LLVM的工作原理 本文不会介绍LLVM是如何工作的 这需要理解LLVM的设计以及code以及各种细节 输入代码 我们从一段C代码开始探险 如下 i
  • LL(1)文法的预测分析表以及对某输入串的分析过程

    举例说明LL 1 文法的预测分析 以及对 a a 的分析过程 文法G S S gt a S gt S gt T T gt SN N gt SN N gt 是否 gt First集 Follow集 S 否 a T 否 a N 是 Select
  • 编译原理_计算器_flex、bison实现(详细辅助理解)

    编译原理 计算器 flex bison实现 详细辅助理解 个人博客 https www yuque com ngp blog tuanh6 https www yuque com ngp blog tuanh6 P S 这篇文章只能助你理解

随机推荐