编译器-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. 设计文法 以下是我的文法(引入的 ...
随机推荐
- RxJS 系列 – 实战练习
前言 这篇主要是给一些简单例子, 从中体会 RxJS 在管理上的思路. Slide Down Effect with Dynamic Content 我在这篇 CSS & JS Effect ...
- 记一次 .NET某上位机视觉程序 卡死分析
一:背景 1. 讲故事 前段时间有位朋友找到我,说他的窗体程序在客户这边出现了卡死,让我帮忙看下怎么回事?dump也生成了,既然有dump了那就上 windbg 分析吧. 二:WinDbg 分析 1. ...
- 算法学习-CDQ分治
对于二维偏序,为普通的求逆序对,只需要先排序一遍,然后树状数组或双指针即可 而三位偏序甚至更高,则需要用 CDQ 分治,简单来说,就是将树状数组和双指针结合 操作步骤如下: 1.开始将数组按第一维排序 ...
- Servlet——Tomcat8以前解决中文乱码问题
Request 请求参数中文乱码问题 // 1.解决乱码问题:POST,getReader() request.setCharacterEncoding("UTF-8&quo ...
- TS体操类型学习记录
Easy 1. Easy - 4 - Pick 从类型 T 中选出符合 K 的属性,构造一个新的类型 type MyPick<T, K extends keyof T> = { [key ...
- foobar2000 v2.1.4 汉化版(更新日期:2024.04.24)
foobar2000 v2.1.4 汉化版 -----------------------[软件截图]---------------------- -----------------------[软件 ...
- Camera 冷启动阶段分解
目录 一.Camx trace 调试开关设置 1.设置 camxoverridesettings trace开关 2. 重启后设置开启camx trace 开关 二.Camera 冷启动阶段分解分析 ...
- 2. 王道OS-操作系统的特征,发展和分类
1. 并发:宏观上是同时发生的,微观是交替发生的 :ps:并行:宏观和微观都是同时发生的 : ps:单核CPU同一时刻只能执行一个程序,各个程序只能并发的执行 : 多核CPU同一时刻可以同时执行多个程 ...
- query和params的区别
2者都是编程式路由跳转用来存放传递数据的位置,query使用path引入,数据显示在地址栏上,params使用name引入,传递的数据在页面看不见 :
- 云原生爱好者周刊:炫酷的 Grafana 监控面板集合
开源项目推荐 grafana-dashboards-kubernetes 这个项目提供了一系列比较炫酷的用于监控 Kubernetes 的 Grafana 监控面板,灵感来源于 kubernetes- ...