import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Ex3 {
public List<String[]> in = new ArrayList<String[]>();
public List<String[]> result = new ArrayList<String[]>();
public void start() {
this.preprocess();
this.process();
this.output();
}
private void preprocess() {
Scanner sc = new Scanner(System.in);
System.out.println("请分行输入一个完整文法:(end结束)");
String sLine = "";
sLine = sc.nextLine();
while (!sLine.startsWith("end")) {
String[] strings = sLine.split("->");
if (strings.length == 1)
strings = sLine.split("→");
if (strings.length == 1) {
System.out.println("文法有误");
System.exit(0);
}
if (!Character.isUpperCase(strings[0].charAt(0))) {
System.out.println("文法有误");
System.exit(0);
}
StringTokenizer fx = new StringTokenizer(strings[1], "|");
while (fx.hasMoreTokens()) {
String[] sub = new String[2];
sub[0] = strings[0];
sub[1] = fx.nextToken();
in.add(sub);
}
sLine = sc.nextLine();
}
}
public void process() {
for (int i = 0; i < in.size(); i++) {
boolean isFirstSub = true;
for (int j = 0; j < i; j++)
if (in.get(j)[0].equals(in.get(i)[0]))
isFirstSub = false;
if (isFirstSub) {
ArrayList<String> firstSet;
firstSet = this.getFirst(in.get(i)[0]);
firstSet.add(0, in.get(i)[0]);
String[] vn_firstSet = firstSet.toArray(new String[0]);
result.add(vn_firstSet);
}
}
}
public ArrayList<String> getFirst(String s) {
ArrayList<String> result = new ArrayList<String>();
ArrayList<String> middle = new ArrayList<String>();
if (Character.isUpperCase(s.charAt(0))) {
for (int i = 0; i < in.size(); i++) {
String[] sub = in.get(i);
if (s.equals(sub[0])) {
int k = 0;
middle = getFirst(sub[1].charAt(k) + "");
for (int j = 0; j < middle.size(); j++) {
result.add(middle.get(j));
while (middle.get(j).equals("ε") && (++k < sub[1].length())) {
middle = getFirst(sub[1].charAt(k) + "");
for (int l = 0; l < middle.size(); l++) {
if (!middle.get(l).equals("ε"))
result.add(middle.get(l));
}
}
}
}
}
} else {
result.add(s);
}
return result;
}
private void output() {
System.out.println("\nFirst Set:");
for (int i = 0; i < result.size(); i++) {
String[] vn_firstSet = result.get(i);
System.out.print("First(" + vn_firstSet[0] + ")={");
for (int j = 1; j < vn_firstSet.length; j++) {
System.out.print(vn_firstSet[j]);
if (j < vn_firstSet.length - 1)
System.out.print(",");
}
System.out.println("}");
}
}
public static void main(String[] args) {
Ex3 ex3 = new Ex3();
ex3.start();
}
}