编译器-FOLLOW集合
语法分析器的两个重要函数 FIRST和FOLLOW
一、FOLLOW的定义
在句型中紧跟在A右边的终结符号的集合
如果A是某些句型的最右符号,那么$在FOLLOW(A)中
A:非终结符
二、计算方法
循环应用下面的规则
1)将$放到FOLLOW(S)中,S是开始符号,$是输入右端的结束标记
2)如果存在一个产生式A->αBβ,那么FIRST(β)中除ε之外的所有符号都在FOLLOW(B)中
3)如果存在一个产生式A->αB,或A->αBβ且FIRST(β)包含ε,那么FOLLOW(A)中的所有符号都在FOLLOW(B)中
三、代码实现
/**
* P141 FOLLOW(A)集合
* @param symbol
* @return
*/
public Set<Terminal> follow(Nonterminal symbol) {
Set<Terminal> result = new HashSet<>(); // 将$放到FOLLOW(S)中,S是开始符号,$是输入右端的结束标记
if (symbol.equals(start)) {
result.add(Terminal.dollar);
} // 遍历所有产生式
for (Production production : this.productions) {
if (!production.getBody().contains(symbol)) {
continue;
} for (int i=0; i<production.getBody().size(); i++) {
Symbol tmp = production.getBody().get(i);
if (!tmp.equals(symbol)) {
continue;
}
if (i + 1 == production.getBody().size()) {
if (production.getHead().equals(symbol)) {
continue;
}
//如果存在一个产生式A->αB,那么FOLLOW(A)中的所有符号都在FOLLOW(B)中
Set<Terminal> headFollow = follow(production.getHead());
result.addAll(headFollow);
} else {
List<Symbol> tokens = new ArrayList<>();
for (int j=i+1; j<production.getBody().size(); j++) {
tokens.add(production.getBody().get(j));
}
Set<Terminal> afterBFirst = first(tokens); //如果存在一个产生式\A->αBβ且FIRST(β)包含ε,那么FOLLOW(A)中的所有符号都在FOLLOW(B)中
if (afterBFirst.contains(Terminal.epsilon)) {
if (!production.getHead().equals(symbol)) {
Set<Terminal> headFollow = follow(production.getHead());
result.addAll(headFollow);
}
} //如果存在一个产生式A->αBβ,那么FIRST(β)中除ε之外的所有符号都在FOLLOW(B)中
afterBFirst.remove(Terminal.epsilon);
result.addAll(afterBFirst);
}
}
} return result;
}
编译器-FOLLOW集合的更多相关文章
- FIRST集合、FOLLOW集合、SELECT集合以及预测分析表地构造
FIRST集合.FOLLOW集合.SELECT集合以及预测分析表地构造 FIRST集合的简单理解就是推导出的字符串的开头终结符的集合. FOLLOW集合简单的理解就对于非终结符后面接的第一个终结符. ...
- FIRST集合、FOLLOW集合及LL(1)文法求法
FIRST集合 定义 可从α推导得到的串的首符号的集合,其中α是任意的文法符号串. 规则 计算文法符号 X 的 FIRST(X),不断运用以下规则直到没有新终结符号或 ε可以被加入为止 : (1)如果 ...
- first集合及follow集合
前面那片文章生成的语法分析表并不是最优的,因为有些项在遇到错误输入的时候,并不是采取报错,而是执行规约,直到不能再规约的时候才报错.这是不科学的,我们需要在得到错误输入的时候立马报错,为了实现这个功能 ...
- first集合follow集的求法
FIRST集的定义 : 设G=(VT,VN,P,S)是上下文无关文法 FIRST(a)={a|a=>*ab,a∈VT, a,b∈V*} 若a=>*ε则规定ε∈FIRST (a) FIRST ...
- PL/0编译器(java version)–Praser.java
1: package compiler; 2: 3: import java.io.IOException; 4: import java.util.BitSet; 5: 6: /** 7: ...
- atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结
atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结 1. 建立AST 抽象语法树 Abstract Syntax Tree,AST) 1 ...
- 编译原理LL1文法Follow集算法实现
import hjzgg.first.First; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set ...
- 简单的FOLLOW集演示程序
/* * 该程序用于计算某个非终结符的 FOLLOW 集合 * RexfieldVon * 2013年6月30日16:02:47 */ #include <stdio.h> #includ ...
- 怎样求FIRST集、FOLLOW集和SELECT集
一,要知道什么是终结符和非终结符. 终结符:通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行推导. 非终结符:不是终结符的都是非终结符.(非男即女,呵呵) 如:A-->B,则 ...
- 简单的C语言编译器--语法分析器
语法分析算是最难的一部分了.总而言之,语法分析就是先设计一系列语法,然后再用设计好的语法去归约词法分析中的结果.最后将归约过程打印出来,或者生成抽象语法树. 1. 设计文法 以下是我的文法(引入的 ...
随机推荐
- Bit, Byte, ASCII, Unicode, UTF, Base64
前言 做项目偶尔会接触到 stream 这个感念,不管是 memory stream 还是 file stream,它们又会提到 bytes. 还有像 Identity – 安全基础知识 中提到的 S ...
- MyBatisPlus——DML编程控制——乐观锁
乐观锁 业务并发现象带来的问题:秒杀最后一单 用于中小型项目(2000请求以下) 添加一个数据库字段,使每次请求修改数据时,这个字段就加一,当有多人同时请求时,这些人同时获取到的都是相同的该字段,但当 ...
- 【赵渝强老师】在MongoDB中使用游标
一.什么是游标? 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标实际上是一种能从包括多条数据记录的结果集 ...
- 4.3.2 等比数列的前n项和公式
\({\color{Red}{欢迎到学科网下载资料学习 }}\) [ [基础过关系列]高二数学同步精品讲义与分层练习(人教A版2019)] ( https://www.zxxk.com/docpack ...
- C++第五节课 函数默认值 函数重载
#include <iostream> using namespace std; // C++的函数默认值和函数重载 // 函数参数的入栈规则从右往左开始入栈 // 函数重载机制(第一种静 ...
- 过滤器 多少时间之前发布 dayjs relative'TrelativeTime
import dayjs from "dayjs"; import relativveTime from "dayjs/plugin/relativeTime" ...
- 如何解决token过期问题 ?
首先 token 过期会导致请求不到数据 , 就不能准确渲染页面 ,此时的错误配置项的token是过期的,只要更新了token 拿着原先的配置项重新请求数据即可 :但是如果更新token的时候请求错误 ...
- 16 Transformer 的编码器(Encodes)——我在做更优秀的词向量
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- LeetCode题目练习记录 _数组和链表02 _20211008
LeetCode题目练习记录 _数组和链表02 _20211008 11. 盛最多水的容器 难度中等2834 给你 n 个非负整数 a1,a2,...,a``n,每个数代表坐标中的一个点 (i, ai ...
- att&ack学习笔记4
初识ATT&CK框架前言:ATT&CK这一概念自2014年提出时起,作为安全分析领域中的前沿研究一直在默默地发挥着自己的影响,但是由于其概念在当时过于超前以至于并没有引起多大反响,直至 ...