1.啥也不说了,上才艺
自己用改两个Set()函数和NonTer非终结符数组
package main;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class FL {
static Map<String,String> map = new HashMap<String,String>();//保存文法的map
static String[] NonTer= {"E","T","F","P"};//文法的非终结符
static String[] First=new String[20];//First保存的数组
static String[] Last=new String[20];//Last保存的数组
public static void Set(){//定义文法
map.put("E","T+E|T");
map.put("T","FT|F");
map.put("F","P*F|P");
map.put("P","(E)|a|b|^");
}
public static void Firstvt(){//求非终结符的First
//求p-a&p-Qa
for (int i=0;i<NonTer.length;i++) {
String[] a=map.get(NonTer[i]).split("\\|");
First[i]="";
for (int j=0;j<a.length;j++) {
if (!Character.isUpperCase(a[j].charAt(0))) {
First[i]=First[i]+a[j].charAt(0)+',';
}else if(a[j].length()>2) {
if (Character.isUpperCase(a[j].charAt(0))&&!Character.isUpperCase(a[j].charAt(1))) {
First[i]=First[i]+a[j].charAt(1)+',';
}
}
}
}
//求p-Q First(P)= First(P)+ First(Q)
for (int i=NonTer.length-1;i>=0;i--) {
String[] a=map.get(NonTer[i]).split("\\|");
for (int j=0;j<a.length;j++) {
for (int k=0;k<NonTer.length;k++)
if (a[j].charAt(0)==NonTer[k].charAt(0)) {//去重
if (First[i].indexOf(First[k])==-1)
First[i]=First[i]+First[k];
}
}
}
for (int i=NonTer.length-1;i>=0;i--) {//去掉末尾逗号
if (First[i].length()>0)
First[i] = First[i].substring(0,First[i].length()-1);
}
}
public static void Lastvt(){
for (int i=0;i<NonTer.length;i++) {
String[] a=map.get(NonTer[i]).split("\\|");
Last[i]="";
for (int j=0;j<a.length;j++) {
if (!Character.isUpperCase(a[j].charAt(a[j].length()-1))) {
Last[i]=Last[i]+a[j].charAt(a[j].length()-1)+',';
}else if(a[j].length()>2) {
if (Character.isUpperCase(a[j].charAt(a[j].length()-1))&&!Character.isUpperCase(a[j].charAt(a[j].length()-2))) {
Last[i]=Last[i]+a[j].charAt(a[j].length()-2)+',';
}
}
}
}
for (int i=NonTer.length-1;i>=0;i--) {
String[] a=map.get(NonTer[i]).split("\\|");
for (int j=0;j<a.length;j++) {
for (int k=0;k<NonTer.length;k++)
if (a[j].charAt(a[j].length()-1)==NonTer[k].charAt(0)) {//去重
if (Last[i].indexOf(Last[k])==-1)
Last[i]=Last[i]+Last[k];
}
}
}
for (int i=NonTer.length-1;i>=0;i--) {//去掉末尾逗号
if (Last[i].length()>0)
Last[i] = Last[i].substring(0,Last[i].length()-1);
}
}
public static void main(String[] args) {
Set();//定义文法
Firstvt();//求First
Lastvt();
for (int i=0;i<NonTer.length;i++) {
System.out.println("First("+NonTer[i]+")="+"{"+First[i]+"}");//输出First
}
for (int i=0;i<NonTer.length;i++) {
System.out.println("Last("+NonTer[i]+")="+"{"+Last[i]+"}");//输出Last
}
//String[] a=map.get("E").split("\\|");
}
}
输出结果如下: