当前位置:文档之家› 编译原理JAVA求First集Follow集

编译原理JAVA求First集Follow集

import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;

/**
*@author 胡伟江

*
* 2012/5/20
*
*/

public class Firstop {
public ArrayList in = new ArrayList();// 这数据结构真是逼人绝路才去想到绝处逢生,哈哈,关键实现了可变长度文法接收,在这存放的是拆分后最简单的文法,也是由用户输入
public ArrayList first = new ArrayList();// 包括左推导符和其First集

public Firstop() {
Scanner sc = new Scanner(System.in);
System.out.println("请分行输入一个完整文法:(end结束)");
String sline = "";
sline = sc.nextLine();
while (!sline.startsWith("end")) {
String s[] = sline.split("->");// 左推导符
if (s.length == 1)
s = sline.split("→");// 考虑到输入习惯和形式问题
if (s.length == 1)
s = sline.split("=>");
if (s.length == 1) {
System.out.println("文法有误");
System.exit(0);
}


if (!Character.isUpperCase(s[0].charAt(0))) {
System.out.println("文法有误");
System.exit(0);
}


;
StringTokenizer fx = new StringTokenizer(s[1], "|︱");// 按英文隔符拆开产生式或按中文隔符拆开
while (fx.hasMoreTokens()) {
String[] one = new String[2];// 对于一个语句只需保存两个数据就可以了,语句左部和语句右部的一个简单导出式,假如有或符,就按多条存放
one[0] = s[0];// 头不变,0位置放非终结符
one[1] = fx.nextToken();// 1位置放导出的产生式,就是产生式右部的一个最简单导出式
in.add(one);
}
sline = sc.nextLine();
}

this.process();
System.out.println("\nFirst集:");
for (int i = 0; i < first.size(); i++) {
String[] r = first.get(i);
System.out.print("First(" + r[0] + ")={");
for (int j = 1; j < r.length; j++) {
System.out.print(r[j]);
if (j < r.length - 1)
System.out.print(",");
}
System.out.println("}");
}
}

public void process() {
for (int i = 0; i < in.size(); i++) {
boolean bool = true;
for (int j = 0; j < i; j++)
if (in.get(j)[0].equals(in.get(i)[0]))
bool = false;
if (bool) {
ArrayList a = null;
a = this.getFirst(in.get(i)[0]);
String[] sf = new String[a.size() + 1];
sf[0] = in.get(i)[0];
for (int j = 0; j < a.size(); j++) {
sf[j + 1] = a.get(j);
}
first.add(sf);// first集
}
}
}

public ArrayList getFirst(String s) {// s表示左推导,track表示寻找路径,避免循环查找
ArrayList result = new ArrayList();
ArrayList middle = new ArrayList();
if (Character.isUpperCase(s.charAt(0))) {// 如果是非终结符,大写
for (int i = 0; i < in.size(); i++) {
String[] one = in.get(i);
if (s.equals(one[0])) {
// if(one[1].equals("ε"

))
// {
// result.add("ε");
// for (int j = 0; j < getFirst(one[1+1].charAt(0) + "").size(); j++)
// result.add(getFirst(one[1+1].charAt(0) + "").get(j));
//
// }

int k=0;

middle=getFirst(one[1].charAt(k) + "");
for (int j = 0; j < middle.size(); j++)
{

result.add(middle.get(j));

while(middle.get(j).equals("ε")&&one[1].length()>++k){

middle=getFirst(one[1].charAt(k) + "");
for (int o = 0; o< middle.size(); o++){
if(!middle.get(o).equals("ε"))
result.add(middle.get(o));

}
}

}
}
}
} else {

result.add(s);
}
return result;
}

public static void main(String[] args) {
new Firstop();
}
}

相关主题
文本预览
相关文档 最新文档