www.pudn.com > YUCEFENXI.rar > YUCEFENXI.java
/***********************************************************************
*文件名:YUCEFENXI.java
*文件描叙:预测分析程序.分析如下方法:
* E ::=T|E+T|E-T
T ::=F|T*F|T/F
F ::=P|(E)
P ::=G
G ::= i
*为了方便把G ::= a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
*简化为G::= i
*输出:输出该文法的LL(1)分析表
*输入:每行输入一个表达式
*输出:输出该表达式的预测分析步骤
************************************************************************/
import java.io.*;
import java.util.*;
public class YUCEFENXI
{public static String[] wenfa={"E->TA","A->+TA","A->-TA","A->ε","T->FB","B->*FB","B->/FB","B->ε","F->P","F->(E)","P->G","G->i"};
static String s1;
static String s2;
static String[] followE={")","#"}; //下面定义E,E1,T,T1,F,P,G的FOLLOW集
static String[] followE1={")","#"};
static String[] followT={"+","-","#"};
static String[] followT1={"+","-","#"};
static String[] followF={"*","/","#"};
static String[] followP={"*","/","#"};
static String[] followG={"*","/","#"};
static String[] firstTE1={"(","i"}; //下面定义各个产生式的first集
static String[] firstTE2={"+"};
static String[] firstTE3={"-"};
static String[] firstFT1={"(","i"};
static String[] firstFT2={"*"};
static String[] firstFT3={"/"};
static String[] firstP={"i"};
static String[] firstE1={"("};
static String[] firstG={"i"};
static String[] firsti={"i"};
static String Sender;
static String biao[][]={{" ","i","+","-","*","/","(",")","#"},
{"E"," "," "," "," "," "," "," "," "},
{"A"," "," "," "," "," "," "," "," "},
{"T"," "," "," "," "," "," "," "," "},
{"B"," "," "," "," "," "," "," "," "},
{"F"," "," "," "," "," "," "," "," "},
{"P"," "," "," "," "," "," "," "," "},
{"G"," "," "," "," "," "," "," "," "}};
//**********************************************************************************************************
public static void main(String[] args)throws IOException
{
System.out.println("要分析的文法为:");//输出文法信息
System.out.println("E->T|E+T|E-T");
System.out.println("T->F|T*F|T/F");
System.out.println("F->P|(E)");
System.out.println("P->G");
System.out.println("G->i");
System.out.println("该文法的LL(1)分析表为:");
String sre=new String("该文法的LL(1)分析表是");
String sr;
JIANBIAO();
int len=biao.length;
for(int s=0;sb加至M[A,a]中,若ε属于first(b),且c属于FOLLOW(A)把A->b加至M[A,a]中
//*******************************************************************************************************
public static void JIANBIAO() //构造分析表
{
{for(int i=0;i3;t--)
{
str3=str2.substring(t-1,t);
if(str3.equals(" "))
{
System.out.println("error"); //如果对应的产生式是空字,则输出error
break p1;
}
if(!str3.equals("ε")) //如果对应的字符不是ε,则把对应的字符串反序输入符号栈
{
fuhao=fuhao.concat(str3);
}
}
con++;
System.out.print(con+"\t"+"\t"+fuhao+"\t"+"\t"+str4+"\t"+"\t"+str2);
System.out.print("\n");
}
len2=fuhao.length();
str1=fuhao.substring(len2-1,len2);
fuhao=fuhao.substring(0,len2-1);
}
p2:while(str1.equals("#")) //如果符号栈的字符与输入串里的字符都等于#时,输出accept
{if(str1.equals("#"))
{ if(str.equals("#"))
{
System.out.println("accept");
break p2;
}
}
}
}
}