⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.java

📁 对if else 语句采用LL(1)文法分析实现过程及翻译过程
💻 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 + -