📄 grammeranalysis.java
字号:
import java.io.*;
class GrammerAnalysis{
String STR[][]=new String[CifaAnalysis.sumKey][2];
String Table[][]=new String[130][130];
String style[]=new String[CifaAnalysis.line+1];
char stack[]=new char[20];
static int sp=0;
File CifaTemp=new File("CifaTemp.txt");
///////////////////构造方法/////////////////////////////////
GrammerAnalysis(){
char a,X;
int lastLine;
int count=0;
/////构造预测分析表////////////////
Table[(int)'S'][(int)'a']="A";
Table[(int)'S'][(int)'b']="B";
Table[(int)'S'][(int)'d']="C";
Table[(int)'S'][(int)'f']="D";
Table[(int)'A'][(int)'a']="af";
Table[(int)'B'][(int)'b']="bGcD";
Table[(int)'C'][(int)'d']="dGeD";
Table[(int)'D'][(int)'f']="fjE";
Table[(int)'E'][(int)'f']="FH";
Table[(int)'E'][(int)'g']="FH";
Table[(int)'F'][(int)'f']="f";
Table[(int)'F'][(int)'g']="g";
Table[(int)'G'][(int)'f']="fiE";
Table[(int)'H'][(int)'h']="hF";
Table[(int)'H'][(int)'#']="k";
/////////读CifaTemp.txt临时文件////////////////
readCifaTemp();
for(int m=0;m<CifaAnalysis.line+1;m++)
style[m]="Evaluate";
/////////进行每行代码的语法分析////////////////
for(int l=1,i=0;l<=CifaAnalysis.line&&i<CifaAnalysis.sumKey;l++){
lastLine=i;
System.out.println("\n@@第"+l+"行开始:@@");
stack[0]='#';
stack[1]='S';
sp=1;
while(true){
a=STR[i][1].charAt(0);
X=stack[sp];
System.out.print("\n分析栈: ");
for(int j=0;j<20;j++){
System.out.print(stack[j]);
if(stack[j]=='\0'){
System.out.print("\t");
break;
}
}
int q=i;
System.out.print("剩余输入串:");
while(q<CifaAnalysis.sumKey){
System.out.print(STR[q][1]);
if(STR[q][1].equals("#"))break;
if(l==5&&q==CifaAnalysis.sumKey-1)System.out.print('#');
q++;
}
//System.out.println();
//System.out.print("i= "+i+"\t");
System.out.print("\nsp="+sp+";");
System.out.print("a= "+a+";");
System.out.println("X= "+X);
if(X=='H'&&a!='h'){
System.out.println("使用产生式:H->k");
stack[sp]='\0';
sp--;
continue;
}
if(X>='a'&&a!='#'&&X<='k')
if(X==a){
i++;
stack[sp]='\0';
sp--;
System.out.println("\""+a+"\"匹配");
if(sp==0){
i++;
stack[sp]='\0';
System.out.println("\n分析栈: #\t剩余输入串:#");
//System.out.print("i= "+i);
System.out.print("sp="+sp+";");
System.out.print("a= #;");
System.out.println("X= #");
System.out.println("接受\n\n$$第"+l+"行语法正确!$$");
count++;
break;
}
continue;
}
else {
System.out.println("第"+l+"行,第"+(i-lastLine+1)+"个字符串的语法出错了!");
while(!STR[i-1][1].equals("#"))i++;
break;
}
else if(X=='#')
if(X==a){
System.out.println("接受\n\n$$第"+l+"行语法正确了!$$");
i++;
count++;
break;
}
else {
System.out.println("第"+l+"行,第"+(i-lastLine+1)+"个字符串的语法出错了吧!");
while(!STR[i-1][1].equals("#"))i++;
break;
}
else if(Table[(int)X][(int)a]==null){
System.out.println("第"+l+"行,第"+(i-lastLine+1)+"个字符串的语法出错了哈哈!");
while(!STR[i-1][1].equals("#"))i++;
break;
}
else{
sp--;
System.out.println("使用产生式:"+X+"->"+Table[(int)X][(int)a]);
if(Table[(int)X][(int)a].equals("af"))
style[l-1]="Define";
else if(Table[(int)X][(int)a].equals("bGcD"))
style[l-1]="Condition";
else if(Table[(int)X][(int)a].equals("dGeD"))
style[l-1]="Circle";
for(int c=0;c<Table[(int)X][(int)a].length();c++){
//System.out.println(Table[(int)X][(int)a].length());
sp++;
stack[sp]=Table[(int)X][(int)a].charAt(Table[(int)X][(int)a].length()-c-1);
}
}
if(Table[(int)X][(int)a].equals("k")){
stack[sp]='\0';
sp--;
continue;
}
if(a=='#'){
i++;
break;
}
}
}
if(count==CifaAnalysis.line){
System.out.println("\n《源程序已通过语法分析验证!》\n");
new CodeBuild();////调用代码生成程序
for(int m=0;m<CifaAnalysis.line;m++)
System.out.println("style["+m+"]= "+style[m]);
}
else System.out.println("\n《程序有错,请改正!》\n");
}
//////读词法分析的临时文件
void readCifaTemp(){
try{
int b,k=0;
StringBuffer strBuf=new StringBuffer();
String str[]=new String[200];
FileInputStream fis=new FileInputStream(CifaTemp);
while((b=fis.read())!=-1)
strBuf=strBuf.append((char)b);
str=new String(strBuf).split("\t");
for(int i=0;i<CifaAnalysis.sumKey;i++)
for(int j=0;j<2;j++,k++){
STR[i][j]=str[k];
//System.out.print(STR[i][j]+"\t");
//if(j==1)System.out.println();
}
}catch(Exception e){
System.out.println(e.toString());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -