📄 test.java
字号:
import java.io.*;
import java.util.*;
import java.lang.*;
public class test {
static int i; //i用来指向s的字符位置
static Stack stack;
static String ss[]=new String[100];
static int x=0;//存单词
static String s=" if ( a >= 0 ) then { i := i + i } else { i := i }";
static String h1;//h1,h2记录栈首值和ss串的首字符
static String h2;
static Stack keepstack;
static int biaozhi=0;
static int bijiaoshu;//比较栈手首与字符串首字符是否相同
static int n;//步骤n
static String keepstackzifu[]=new String[100];
static int keepstackzifushu=0;
static String pipeishi;
static int endbiaozhi=0;
static String changshengshichuan="";
//打印三地址码的相关属性变量
//static String sanarray1[]=new String[100];
//static String sanarray2[]=new String[100];
// static int sanjishu=0;
static int m1=0;
static int m2=0;
//用于输出翻译的栈
static Stack fanyizhan1;
static Stack fanyizhan2;
static int xuhao=2;
static String result[]=new String[100];
static int resultshu=2;
//static int nn=0;
static int tnumber=1;
public static void main(String[] args)
{
keepstack=new Stack();
StringTokenizer fenxi=new StringTokenizer(s," ");
while(fenxi.hasMoreTokens())
{
ss[x]=fenxi.nextToken();
x++;
}
//词法分析
System.out.println("词法分析如下:");
for(int c=0;c<x;c++)
{
if(ss[c].equals("if")||ss[c].equals("else")||ss[c].equals("then"))
{
System.out.println("关键字.."+ss[c]);
}
else if(ss[c].equals(":=")||ss[c].equals("+"))
{
System.out.println("运算符.."+ss[c]);
}
else if(ss[c].equals("0"))
{
System.out.println("数值.."+ss[c]);
}
else if(ss[c].equals("(")||ss[c].equals("(")||ss[c].equals("{")||ss[c].equals("}"))
{
System.out.println("界限符.."+ss[c]);
}
else{
System.out.println("标示符.."+ss[c]);
}
}
System.out.println("语法分析如下:");
System.out.println("步骤 分析栈 剩余输入串 推到所用产生式或匹配");
ss[x]="#";
stack=new Stack();
stack.push("#");
stack.push("S");
while( ss[i]!=null)
{
if(endbiaozhi!=1)
{
if(!stack.isEmpty()) h1=(String)stack.peek();
h2=ss[i];
bijiaoshu=compare(h1,h2);
if(bijiaoshu==1)
{
biaozhi=1;
keepstackzifushu=0;
while(!stack.isEmpty())
{
keepstackzifu[keepstackzifushu]=(String)stack.pop();
keepstackzifushu++;
}
for(int z=keepstackzifushu-1;z>=0;z--)
{
stack.push(keepstackzifu[z]);
keepstack.push(keepstackzifu[z]);
}
dayin(keepstack,ss,h2);
stack.pop();
i++;
n++;
}
else if(bijiaoshu==2)
{
biaozhi=2;
fenxi(h1,h2);
}
}
}
if(changshengshichuan.equals("#匹配"))
{
// System.out.println(" (1) if ( a >= 0 )
for(int v=8;v<=x;v++)
{
if(!(ss[v].equals("}")))
{
m1++;
}
else
{
break;
}
}
//System.out.println(m1);
for(int u=11+m1;u<=x;u++)
{
if(!(ss[u].equals("}")))
{
m2++;
}
else
{
break;
}
}
result[0]="0....if(a>=0)goto 2";
int ko1=fanyi1(m1);
int ko3=ko1+1;
result[1]="1....goto "+ko3;
int jishoushu=resultshu;
resultshu++;
xuhao++;
int ko2=fanyi2(m2);
result[jishoushu]=ko1+"....goto "+ko2;
//System.out.println(xuhao);
resultdaoyin(result);
}
}
//比较栈顶和字符串首字符是否相等
public static int compare(String s1,String s2)
{
if(s1.equals(s2))
{
return 1;
}
else{
return 2;
}
}
//分析预测表
public static void fenxi(String s1,String s2)
{
String daoxu[]=new String[100];
int daoxushu=0;
String fenxibiao[][]={{"-> if ( B ) then { S } else { S }","-> i := E","","","",""},
{"","-> T E'","","","",""},
{"","","-> + T E'","-> %","","-> %"},
{"","-> i","","","",""},
{"","","","","-> a >= 0",""}};
Map<String,Integer> suoyin1=new HashMap<String,Integer>();
suoyin1.put("S",0);
suoyin1.put("E",1);
suoyin1.put("E'",2);
suoyin1.put("T",3);
suoyin1.put("B",4);
Map<String,Integer> suoyin2=new HashMap<String,Integer>();
suoyin2.put("if",0);
suoyin2.put("i",1);
suoyin2.put("+",2);
suoyin2.put("}",3);
suoyin2.put("a",4);
suoyin2.put("#",5);
int n1=0;
int n2=0;
n1=suoyin1.get(s1);
n2=suoyin2.get(s2);
if( !(fenxibiao[n1][n2].equals("")))
{
String changshengshi=fenxibiao[n1][n2];
if(changshengshi.equals("-> %"))
{
}
else{
StringTokenizer fenxi2=new StringTokenizer(changshengshi," ");
while(fenxi2.hasMoreTokens())
{
daoxu[daoxushu]=fenxi2.nextToken();
daoxushu++;
}
}
keepstackzifushu=0;
while(!stack.isEmpty())
{
keepstackzifu[keepstackzifushu]=(String)stack.pop();
keepstackzifushu++;
}
for(int z=keepstackzifushu-1;z>=0;z--)
{
stack.push(keepstackzifu[z]);
keepstack.push(keepstackzifu[z]);
}
dayin(keepstack,ss,changshengshi);
stack.pop();
for(int j=daoxushu-1;j>=1;j--)
{
stack.push(daoxu[j]);
}
n++;
}
else{
System.out.println("输入串不是该文法的语句");
endbiaozhi=1;
}
}
//分析过程打印
public static void dayin(Stack zhan,String suru[],String changshengshi)
{
int m=0;
String g;
String zhanzifuchuan="";
String zhanchuan[]=new String[100];
String suruchuan="";
while(!zhan.isEmpty())
{
g=(String)zhan.pop();
zhanchuan[m]=g;
m++;
}
for(int k=m-1;k>=0;k--)
{
zhanzifuchuan+=zhanchuan[k];
}
for(int l=i;l<=suru.length-1;l++)
{
if(suru[l]!=null)
{
suruchuan+=suru[l];
}
}
if(biaozhi==2)
{
changshengshichuan=h1+changshengshi;
biaozhi=0;
}
else if(biaozhi==1)
{
changshengshichuan=h2+"匹配";
}
System.out.println(n+"...."+zhanzifuchuan+"...."+suruchuan+"...."+changshengshichuan);
}
//翻译
public static int fanyi1(int r1)
{
String zz;
String z1;
String z2;
String z3;
fanyizhan1=new Stack();
for(int i=8;i<8+r1;i++)
{
fanyizhan1.push(ss[i]);
}
while(!fanyizhan1.isEmpty())
{
zz="t"+tnumber;
z1=(String)fanyizhan1.pop();
z2=(String)fanyizhan1.pop();
z3=(String)fanyizhan1.pop();
if(!fanyizhan1.isEmpty())
{
result[resultshu]=xuhao+"...."+ zz+"="+z3+z2+z1 ;
resultshu++;
fanyizhan1.push(zz);
xuhao++;
tnumber++;
}
else{
result[resultshu]=xuhao+"...."+ z3+z2+z1;
xuhao++;
resultshu++;
}
}
return xuhao;
}
public static int fanyi2(int r1)
{
String zz;
String z1;
String z2;
String z3;
fanyizhan2=new Stack();
for(int i=11+m1;i<11+r1+m1;i++)
{
fanyizhan2.push(ss[i]);
}
while(!fanyizhan2.isEmpty())
{
zz="t"+tnumber;
z1=(String)fanyizhan2.pop();
z2=(String)fanyizhan2.pop();
z3=(String)fanyizhan2.pop();
if(!fanyizhan2.isEmpty())
{
result[resultshu]=xuhao+"...."+ zz+"="+z3+z2+z1 ;
resultshu++;
fanyizhan2.push(zz);
xuhao++;
tnumber++;
}
else{
result[resultshu]=xuhao+"...."+ z3+z2+z1;
xuhao++;
}
}
return xuhao;
}
//保存到数组
public static void resultdaoyin(String ok[])
{ System.out.println("语义分析如下:");
System.out.println("该语句的三地址码表示");
for(int i=0;i<ok.length;i++)
{
if( ok[i]!=null)
{
System.out.println(ok[i]);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -