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

📄 heng.java

📁 编译原理课程设计LL(1)for语句设计
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				   }//for
				   
			   }//if
    		else if(Character.isLetter(zhjian[0])||zhjian[0]=='_')
    		{
    			istrue=true;//开头是下划线或者字母则是合法变量
    		    break;
    		}
    		else
    		{
    			istrue=false;
    			break;
    		}   		   			
    	}//if
    	 		
    }//for
    if(istrue)
        return true;
    else return false;
    
  }
  //分析条件表达式是不是正确的
  /*public String[] zhuan(String ss[],int chang)
  {
	  String s[]=new String[chang];
	for(int i=0;i<chang;i++)
	{
		if(ss[i].equals("<")||ss[i].equals(">")||ss[i].equals("=")||ss[i].equals("/")||ss[i].equals("*")||ss[i].equals("-")||ss[i].equals("+"))
		{
			s[i]=ss[i];
			continue;
		}
		else
			s[i]="i";
	}
	return s;
  }*/
  public String allString(String arg[]){
      String s=null;
      for(int i=0;i<arg.length;i++){
              s+=arg[i];
      }
      return s;
  }
  public int isOperate(String c){
      String s[]={"+","-","*","/","=","(",")","<",">"};
      for(int i=0;i<s.length;i++){
          if(c!=null&&c.equals(s[i])){
              //System.out.println(c);
              return 1;
          }
      }
      return 0;
  }

 public void vertify(String input,String matrix[][],String s1[],String s2[],int num){
      ArrayList list=new ArrayList();
      StringTokenizer st=new StringTokenizer(input," \n\t\r;+=-*\"\'/)(}{[]<>?:!",true);
      while(st.hasMoreTokens()){
              list.add(new String(st.nextToken()));
      }
      String ci[]=new String[list.size()+1];
      for(int e=0;e<list.size();e++){
              ci[e]=list.get(e).toString();
      }
      ci[list.size()]="#";
      String stack[]=new String[8];
      for(int k=0;k<8;k++){
          stack[k]="_";
      }
      stack[0]="E";
      int point1=0;
      int point2=0;
      int length=ci.length;
      //out.append(allString(stack)+allString(ci)+"\n");

      for(int i=0;i<length-1;i++){
          if(isOperate(ci[i])==0){
              ci[i]="i";
          }
      }
      //out.append(allString(stack)+allString(ci)+"\n");
      while(true){
          if(point1==-1&&point2==length-1){
             // out.append("success"+"\n");
        	  if(num==1)
        		  tjTrue=true;
        	  else if(num==2)
        		  fz1True=true;
        	  else if(num==3)
        		  fz2True=true;
        	  else if(num==4)
        		  fz3True=true;
        	 // out.append("suceedd");
              break;
          }
          if(point1==-1){
             // out.append(allString(stack)+allString(ci)+"\n");
              //out.append("fail"+"\n");
              break;
          }
          if(stack[point1].equals(ci[point2])){
              stack[point1]="_";
              ci[point2]="_";
              point1--;
              point2++;
              //out.append(allString(stack)+allString(ci)+"\n");
              continue;
          }
          String res=getString(stack[point1],ci[point2],matrix,s1,s2);
          if(!res.equals("error")){
              if(res.equals("0")){
                  stack[point1]="_";
                  point1--;
              }
              else{
                  char tem[] = res.toCharArray();
                  int tem2 = 0;
                  int length2 = tem.length;
                  for (int j = point1+length2-1; j > point1-1; j--) {
                      stack[j] = String.valueOf(tem[tem2]);
                      tem2++;
                  }
                  point1+= length2- 1;
              }
              //out.append(allString(stack)+allString(ci)+"\n");
          }
          if(res.equals("error")){
             // out.append("the expression is error"+"\n");
              break;
          }
      }
      ///out.append("over"+"\n");
  }
 
  public String getString(String m,String n,String matrix[][],String s1[],String s2[]){
      //int h;
      for(int i=0;i<s1.length;i++)
      {
          if(s1[i].equals(m))
          {
        	 // out.append("diyi");
              for(int j=0;j<s2.length;j++)
              {
                  if(s2[j].equals(n))
                  {
                	  //out.append("dier");
                      if(matrix[i][j]!=null)
                      {
                          return matrix[i][j];
                      }
                  }
              }
          }
      }
      return "error";
  }
  /*
  void getResult(String s){  //得到三元式
      ArrayList list=new ArrayList();
      StringTokenizer st=new StringTokenizer(s," \n\t\r;+=-*\"\'/)(}{[]<>?:!",true);
      while(st.hasMoreTokens()){
              list.add(new String(st.nextToken()));
      }
      String s1[]=new String[list.size()];
      for(int e=0;e<list.size();e++){
              s1[e]=list.get(e).toString();
      }
      String stack[]=new String[s1.length];
      int point1=-1;
      int point2=-1;
      String result[]=new String[s1.length];
      for(int l=0;l<s1.length;l++){
          result[l]="_";
      }
      for(int i=0;i<s1.length;i++){
          if(isOperate(s1[i])==0){
              result[++point2]=s1[i];
          }
          else if(s1[i].equals("=")){
              while (point1 != -1&&(stack[point1] .equals("=")  || stack[point1].equals("*") ||stack[point1].equals("/")||stack[point1].equals("+")||stack[point1].equals("-"))) {
                      result[++point2] = stack[point1--];
                  }
              stack[++point1]=s1[i];
          }
          else if(s1[i].equals("*")||s1[i].equals("/")){
                  stack[++point1] = s1[i];
              }

          else if(s1[i].equals("+")||s1[i].equals("-")){
                  while (point1 != -1&&(stack[point1] .equals("/")  || stack[point1].equals("*"))) {
                      result[++point2] = stack[point1--];
                  }
                  stack[++point1] = s1[i];
              }
          else if(s1[i].equals("(")){
              stack[++point1]=s1[i];
          }
          else if(s1[i].equals(")")){
                  while (point1 != -1&&!stack[point1] .equals("(")) {
                      result[++point2] = stack[point1--];
                  }
                  point1--;
          }
      }
      while(point1!=-1){
          result[++point2]=stack[point1--];
      }
      out.append("suffix:"+allString(result)+"\n");
      int number=-1;
      String tem6[]={"T1","T2","T3","T4","T5","T6","T7"};
          for(int r=0;r<result.length;r++){
              if(isOperate(result[r])==1){
                  int tem4=r-1;
                  int point4=0;
                  String str1=new String();
                  String str2=new String();
                  while(point4<2&&tem4>=0){
                      if(!result[tem4].equals("0")){
                          point4++;
                          if(point4==1){
                              str1=result[tem4];
                              result[tem4]="0";
                          }
                          if(point4==2){
                              str2=result[tem4];
                              result[tem4]="0";
                          }
                      }
                      tem4--;
                  }
                  number++;
                  String tem7=result[r];
                  result[r]=tem6[number];
                  out.append(result[r]+":"+"("+tem7+","+str1+","+str2+")"+"\n");
              }
          }
  }*/

public boolean isZiFu(String a)
{
	if(a.equals("+")||a.equals("-")||a.equals("*")||a.equals("/"))
		return true;
	else 
		return false; 
}
public void siyuanshi()
{
	String siyuanshi[]=new String[100];
	int qianzhui=100;//前缀标志
	int siyuanjishu=0;//四元式的个数
	int t1=1;//分别用于记录规约后的非终结符
	int t2=1;
	int t3=1;
	
	
		
	String zhi1[]=zhuanhouzhui(fzhi1,fuzhi1,1);//返回第一个赋值语句的后缀式
	String zhi3[]=zhuanhouzhui(fzhi3,fuzhi3,3);//返回第一个赋值语句的后缀式
	String zhi2[]=zhuanhouzhui(fzhi2,fuzhi2,2);//返回第一个赋值语句的后缀式
	
	String tiao=String.valueOf((tongji1+3+100));
	String tiao1=String.valueOf(tongji1+tongji2+tongji3+5+100);
	
	for(int i=0;i<temzhi1;i++)//从前往后依次将第一个赋值语句转化为四元式 
	{  
		int j=0,m=0;//用于记录找到的操作符前面的两个操作数
		if(!isZiFu(zhi1[i]))//不是操作符就往后找,直到找到操作符
		continue;
		j=i;
		while(zhi1[j-1].equals("0"))//找到一个不为0的操作数
		j--;
		String s1=zhi1[j-1];
		m=j-1;
		while(zhi1[m-1].equals("0"))
			m--;
		String s2=zhi1[m-1];
		
		siyuanshi[siyuanjishu++]="("+"T"+t1+"="+s2+zhi1[i]+s1+")";
		System.out.print(siyuanshi[siyuanjishu]);
		zhi1[m-1]="T"+t1;//将第一个操作数处置为非终结符
		zhi1[j-1]="0";//另外的操作数和操作符处置为0
		zhi1[i]="0";
		t1++;
	}//for
	siyuanshi[siyuanjishu++]="("+fzhi1[0]+"="+zhi1[0]+")";
	//System.out.print(siyuanshi[siyuanjishu]);
	
	
	//条件表达式
	siyuanshi[siyuanjishu++]="if   "+tj[0]+tj[1]+tj[2]+"  goto  "+tiao;
	siyuanshi[siyuanjishu++]="goto   "+tiao1;
	
	for(int i=0;i<temzhi3;i++)
	{
		int j=0,m=0;
		if(!isZiFu(zhi3[i]))
		continue;
		j=i;
		while(zhi3[j-1].equals("0"))
		j--;
		String s1=zhi3[j-1];
		m=j-1;
		while(zhi3[m-1].equals("0"))
		m--;
		String s2=zhi3[m-1];
		
		siyuanshi[siyuanjishu++]="("+"T"+t3+"="+s2+zhi3[i]+s1+")";
		zhi3[m-1]="T"+t2;
		zhi3[j-1]="0";
		zhi3[i]="0";
		t3++;	
	}//for
	siyuanshi[siyuanjishu++]="("+fzhi3[0]+"="+zhi3[0]+")";
	
	
	for(int i=0;i<temzhi2;i++)
	{
		int j=0,m=0;
		if(!isZiFu(zhi2[i]))
		continue;
		j=i;
		while(zhi2[j-1].equals("0"))
		j--;
		String s1=zhi2[j-1];
		m=j-1;
		while(zhi2[m-1].equals("0"))
		m--;
		String s2=zhi2[m-1];
		
		siyuanshi[siyuanjishu++]="("+"T"+t2+"="+s2+zhi2[i]+s1+")";
		zhi2[m-1]="T"+t2;
		zhi2[j-1]="0";
		zhi2[i]="0";
		t2++;	
	}//for
	siyuanshi[siyuanjishu++]="("+fzhi2[0]+"="+zhi2[0]+")";
	siyuanshi[siyuanjishu++]="(-,-,-,-,)";
	
	
	for(int m=0;m<siyuanjishu;m++)
	{
		out.append(qianzhui+++"  "+siyuanshi[m]+"\n");//输出四元式
	}
	
}
  
  public String[] zhuanhouzhui(String a[],int length,int biaozhi)
  {
	  String tem[]=new String[10];//存放得到的后缀表达式
	  int temzhi0=0; //记录后缀表达式的长度
	  String Stack[]=new String[length];//当作栈存放操作符
	  int pointer=-1;//栈指针
	  int tongji=0;
	  for(int i=2;i<length;i++)
	  {    
           if(a[i].equals("("))//如果为左括号则直接入栈
           {
           Stack[++pointer]=a[i];
           }
           else if(a[i].equals(")"))//碰到右括号 则把左括号以前的都取出来放到后缀式数组
           {
            	while(pointer!=-1&&!(Stack[pointer].equals("(")))
        	    {    
        	    	   System.out.print("dfsdfsdf");
        	    	   tem[temzhi0++]=Stack[pointer--];	
        	    	   System.out.print(tem[temzhi0-1]+" !!");
 
        	    }
        	    pointer--;//丢掉左括号
        	 
           }  
          else if(a[i].equals("+")||a[i].equals("-"))//把所有的号放到后缀式数组
            {
        	       tongji++;
	    		   while(pointer!=-1&&(Stack[pointer].equals("*")||Stack[pointer].equals("/")))
	    		   {   
	    			   tem[temzhi0++]=Stack[pointer--];	
	    			   //System.out.print(tem[temzhi0-1]+" !!");
	    		   }    		   
	    	       Stack[++pointer]=a[i];	//然后把+-放到栈里
        	 }
           else if(a[i].equals("*")||a[i].equals("/"))//如果是则直接入栈
         {
        	   tongji++;
        	   
        	   Stack[++pointer]=a[i];
    		   
     	  }
           else//否则是操作数则直接入后缀表达式数组
         {
        	 tem[temzhi0++]=a[i];
        	 System.out.print(tem[temzhi0-1]+" !!");
         }	    		 
        	    	

  }
	  
	  while(pointer!=-1)//将所有的栈里面的操作符放到后缀表达式数组中
	  {
		  tem[temzhi0++]=Stack[pointer--];
		  System.out.print(tem[temzhi0-1]+" !!");
	  }
		 
	  if(biaozhi==1)
	  { temzhi1=temzhi0;//用于判断是对哪个复制语句的后缀表达式转化
	       tongji1=tongji;}
	       
	  else if(biaozhi==2)
	  {
		  temzhi2=temzhi0;
		  tongji2=tongji;
	  }
	  else {
		  temzhi3=temzhi0;
		  tongji3=tongji;
	  }
	  return tem;
	 
	  
  }
	
}//cfPanel

	
	

	
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -