import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet; public class First {
private Map<String, Set<Character>> first = new TreeMap<String, Set<Character>>();
private Map<String, String[]> mp = null;
public First(Map<String, String[]> mp) {
super();
this.mp = mp;
}
public Map<String, Set<Character>> getFirstSet(){
return first;
}
private Set<Character> findFirst(String curNode, String[] rightNodes){
if(first.containsKey(curNode)) return first.get(curNode);
Set<Character> st = new TreeSet<Character>();
for(int i=0; i<rightNodes.length; ++i){
for(int j=0; j<rightNodes[i].length(); ++j){
String nextNode = ""+rightNodes[i].charAt(j);
if(!mp.containsKey(nextNode)){//终结点
st.add(nextNode.charAt(0));
break;
}
else{//非终结点
if(j+1<rightNodes[i].length() && rightNodes[i].charAt(j+1)=='\''){
nextNode += rightNodes[i].charAt(j+1);
++j;
}
if(mp.containsKey(nextNode)){
Set<Character> tmpSt = findFirst(nextNode, mp.get(nextNode));
st.addAll(tmpSt);
if(!tmpSt.contains('$'))
break;
}
}
}
}
first.put(curNode, st);
return st;
} public String firstKernealCode(){
String content = "";
for(String leftNode : mp.keySet()){
String[] rightNodes = mp.get(leftNode);
findFirst(leftNode, rightNodes);
}
//打印first集合
System.out.println("First集合如下:");
for(Map.Entry<String, Set<Character>> entry : first.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<String, String[]> mp = new LinkedHashMap<String, String[]>();
try{
for(int i=0; i<rightLinearGrammar.length; ++i){
String split1[] = rightLinearGrammar[i].split("->");
String split2[] = split1[1].split("\\|");
mp.put(split1[0], split2);
} } catch(Exception e){
e.printStackTrace();
System.out.println("右线性文法错误!");
}
new First(mp).firstKernealCode();
}
}

编译原理 LL1文法First集算法实现的更多相关文章

  1. 编译原理LL1文法Follow集算法实现

    import hjzgg.first.First; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set ...

  2. 编译原理LL1文法分析表算法实现

    import hjzgg.first.First; import hjzgg.follow.Follow; import hjzgg.tablenode.TableNode; import hjzgg ...

  3. 编译原理LL1文法分析树(绘图过程)算法实现

    import hjzgg.analysistable.AnalysisTable; import hjzgg.first.First; import hjzgg.follow.Follow; impo ...

  4. 编译原理LR(0)项目集规范族的构造详解

    转载于https://blog.csdn.net/johan_joe_king/article/details/79051993#comments 学编译原理的时候,感觉什么LL(1).LR(0).S ...

  5. 编译原理-First集和Follow集

    刚学first集和follow集的时候,如果上课老师没有讲明白或者自己没听明白,自己看的时候还真是有点难理解,不过结合着具体的题目可以理解的更快. 先看一下两种集合的求法: First集合的求法:   ...

  6. 编译原理 First集和Follow集的求法

    转载地址 https://blog.csdn.net/Alexander_Frank/article/details/51280798 自上而下分析: FIRST集求法 First集合最终是对产生式右 ...

  7. 《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法

    <编译原理>-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 此编译原理确定某高级程序设计语言编译原理,理论基础,学习笔记 本笔记是对教材< ...

  8. 【编译原理】LL1文法语法分析器

    上篇文章[编译原理]语法分析--自上向下分析 分析了LL1语法,文章最后说给出栗子,现在补上去. 说明: 这个语法分析器是利用LL1分析方法实现的. 预测分析表和终结符以及非终结符都是针对一个特定文法 ...

  9. 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集

    近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIR ...

随机推荐

  1. webkit内核中的一些私有的meta标签

      <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0&q ...

  2. linux ssh config

    Host code.engineering.redhat.com    HostName code.engineering.redhat.com    Port 29418    User jiall ...

  3. Largest Rectangle in a Histogram(DP)

    Largest Rectangle in a Histogram Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K ...

  4. hosts文件的一个小发现

    今天才发现原来同一个ip可以在hosts文件中配置多个域名.之间老是换一个网站就改一下,现在终于不用这么麻烦了 127.0.0.1 gg.pclady.com.cn 127.0.0.1 gg.pcon ...

  5. JAVA使用POI操作excel

    文中处理的excel是2003年以前的版本,使用HSSFworkbook,如果处理2007版本以后的excel,用XSSFworkbook,对于二者的兼容性问题,可参考 http://blog.csd ...

  6. sicily1024 Magic Island(图的遍历)

    Description There are N cities and N-1 roads in Magic-Island. You can go from one city to any other. ...

  7. Entity Framework搜索指定字段解决方案

    public class Book { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; ...

  8. 详解c#迭代器

    迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式.简单来说,迭代器模式使得你能够获取到序列中的所有元素 ...

  9. [ACM_动态规划] Alignment (将军排队)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/F 题目大意:有n个士兵排成一列,将军想从中抽出最少人数使队伍中 ...

  10. Qt 设置应用程序图标

    Qt4设置应用程序图标 将一个ico图标放在资源文件夹下; 然后建立txt,输入 IDI_ICON1 DISCARABLE "myico.ico"; 保存文件,将其后缀改为.rc; ...