博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译原理LL1文法Follow集算法实现
阅读量:6673 次
发布时间:2019-06-25

本文共 2989 字,大约阅读时间需要 9 分钟。

import hjzgg.first.First;import java.util.LinkedHashMap;import java.util.Map;import java.util.Set;import java.util.TreeMap;import java.util.TreeSet;public class Follow {    private Map
> first = null; private Map
> follow = new TreeMap
>(); private Map
mp = null; public Follow(Map
mp, Map
> first) { super(); this.first = first; this.mp = mp; } public Map
> getFollowSet(){ return follow; } private void getFirstSet(Set
st, String node, int k){ if(k >= node.length()) return; if(node.charAt(k)=='\'') --k; String nextNode = "" + node.charAt(k); if(k+1
st = null; for(String leftNode : mp.keySet()){ String rightNodes[] = mp.get(leftNode); for(int i=0; i
@B if(follow.get(leftNode) == null) findFollow(leftNode); if(follow.get(curNode) == null){ st = new TreeSet
(); st.addAll(follow.get(leftNode)); follow.put(curNode, st); } else follow.get(curNode).addAll(follow.get(leftNode)); } else { String nextNode = ""+rightNodes[i].charAt(index); if(index+1 < rightNodes[i].length() && rightNodes[i].charAt(index+1)=='\''){ nextNode += '\''; ++index; } if(mp.containsKey(nextNode)){ //非终结符 if(first.get(nextNode).contains(new Character('$'))){ //A->@B&, 而 &->$ if(follow.get(leftNode) == null) findFollow(leftNode); if(follow.get(curNode) == null){ st = new TreeSet
(); st.addAll(follow.get(leftNode)); follow.put(curNode, st); } else follow.get(curNode).addAll(follow.get(leftNode)); } //好特殊的情况啊.... { //A->@B&, First(&)^$ 放入follow(B) Set
tmpSt = new TreeSet
(); getFirstSet(tmpSt, rightNodes[i], index); tmpSt.remove('$'); if(follow.get(curNode) == null){ st = new TreeSet
(); st.addAll(tmpSt); follow.put(curNode, st); } else follow.get(curNode).addAll(tmpSt); } } else { //终结符 if(follow.get(curNode) == null){ st = new TreeSet
(); st.add(nextNode.charAt(0)); follow.put(curNode, st); } else follow.get(curNode).add(nextNode.charAt(0)); } } index = rightNodes[i].indexOf(curNode, nextIndex); } } } } public String followKernealCode(){ String content = ""; boolean flag = true; for(String leftNode : mp.keySet()){ if(flag){ Set
st = new TreeSet
(); st.add('#'); follow.put(leftNode, st); flag = false; } findFollow(leftNode); } //打印first集合 System.out.println("Follow 集合如下:"); for(Map.Entry
> entry : follow.entrySet()){ content += entry.getKey() + " : " + entry.getValue() + "\n"; System.out.println(entry.getKey() + " : " + entry.getValue()); } return content; } public static void main(String[] args) { String[] rightLinearGrammar = { "E->TE\'", "E\'->+TE\'|$", "T->FT\'", "T\'->*FT\'|$", "F->(E)|i" }; // String[] rightLinearGrammar = {// "S->ABc",// "A->a|$",// "B->b|$"// }; Map
mp = new LinkedHashMap
(); try{ for(int i=0; i
"); String split2[] = split1[1].split("\\|"); mp.put(split1[0], split2); } } catch(Exception e){ e.printStackTrace(); System.out.println("右线性文法错误!"); } First first = new First(mp); first.firstKernealCode(); new Follow(mp, first.getFirstSet()).followKernealCode(); }}

 

转载地址:http://odgxo.baihongyu.com/

你可能感兴趣的文章
实战案例解析电商对抗羊毛党的策略与技术
查看>>
Vivado开发工具熟悉之工具使用杂记
查看>>
spin_lock &amp; mutex_lock的差别?
查看>>
Egret Engine(白鹭引擎)介绍及windows下安装
查看>>
一个小巧的C++Log输出到文件类 (转)
查看>>
Javascript动态操作CSS总结
查看>>
ZeroMQ接口函数之 :zmq_msg_init_size - 使用一个指定的空间大小初始化ZMQ消息对象...
查看>>
Linux 配置网络
查看>>
Effective JavaScript Item 21 使用apply方法调用函数以传入可变參数列表
查看>>
ViewPager中Fragment无法显示的问题
查看>>
FarBox--另类有趣的网站服务【转】
查看>>
可显示Android设备选择列表,并进入指定Android设备Console的Shell脚本
查看>>
HDU 2831 (贪心)
查看>>
遍历js的obj中所有属性得key
查看>>
lua demo
查看>>
iOS开发-UITapGestureRecognizer手势
查看>>
在QTreeWidget中删除QTreeWidgetItem
查看>>
网页引导:jQuery插件实现的页面功能介绍引导页效果
查看>>
【CSS】使用CSS改变超链接样式
查看>>
HTC T328W刷机包 仿三星S5 UI美化 精简 S5落下
查看>>