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

📄 程国磊0507.txt

📁 WHILE条件语句的翻译程序设计(LL(1)法、输出四元式)。。按照课程设计的要求
💻 TXT
📖 第 1 页 / 共 2 页
字号:

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.filechooser.FileFilter;

import java.util.*;

public class cheng
{ 
	public static void main(String args[])
    {
    	cfFrame frame=new cfFrame();
    	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	frame.setSize(400, 200);
    	frame.setVisible(true);
    	frame.setResizable(true);
    	
    }
}
class cfFrame extends JFrame 
{
	public cfFrame()
	{
		LookAndFeelInfo[] infos=UIManager.getInstalledLookAndFeels();
		setTitle("while循环");
		setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
		cfPanel panel=new cfPanel();
		add(panel);
		
		
	}
	public static final int DEFAULT_WIDTH=600;
	public static final int DEFAULT_HEIGHT=650;
}
class cfPanel extends JPanel
{
	JPanel bei,center,nan;
	JButton chose,save,start,qingkong,wenfafenxi,fanyi,jieguo;
	JFileChooser chooser;
	JScrollPane scrollin,scrollout;

	JTextArea in,out;//输入输出文本区
	File file;
	String read,write;//保存输入输出
	String tj[],fzhi1[],fzhi2[],fzhi3[];//分别保存源程序中的条件表达式,和赋值语句
	int i=0,j=0,m=0;
	int k=0;
	 int temzhi1=0;//记录赋值语句一的后缀表达式的长度
	 int temzhi2=0;//记录赋值语句二的后缀表达式长度
	 int temzhi3=0;////记录赋值语句三的后缀表达式长度
	//翻译时记录赋值语句一要翻译的个数
	int tongji;
	final int N=100;
	public int lenth1,fuzhi1,fuzhi2,fuzhi3;
	boolean tjTrue=true,fz1True=true,fz2True=true,fz3True=true;
	//String s1[],s2[],s3[],s4[];
	private final String[] operatorOffz={"+","-","*","/","(",")","=","#"};
	private final String[] operatorOftj={"(",")","=","#","<",">"};
	String matrix1[][]={{"D","","","" },
            {"iRi","","",""},
            {"","<",">","="}
};
String matrix2[][]={{"","","","","","","","","i=A"},
            {"","","","","BC","","","","BC"},
            {"+BC","-BA","","","","0","","0",""},
            {"","","","","FD","","","","FD"},
            {"0","0","*FD","/FD","","0","","0",""},
            {"","","","","(A)","","","","i"}

};
String hei1[]={"E","D","R"};
String len1[]={"i","<",">","="};
String hei2[]={"E","A","C","B","D","F"};
String len2[]={"+","-","*","/","(",")","=","#","i",};

public  cfPanel()//界面设置
	{
	    this.setLayout(new BorderLayout());
	    center=new JPanel(new GridLayout());
		qingkong=new JButton("清 空");
		jieguo=new JButton("翻 译");
		
	    in=new JTextArea();
		out=new JTextArea();
		out.setEditable(false);
		in.setEditable(true);
	    
	    scrollin=new JScrollPane(in);
	    scrollout=new JScrollPane(out);
		center.add(scrollin);
		center.add(scrollout);
		add(center,BorderLayout.CENTER);
		JPanel penel=new JPanel(new GridLayout(2,1));
		penel.add(qingkong);
		penel.add(jieguo);
		add(penel,BorderLayout.EAST);
		//add(qingkong,BorderLayout.SOUTH);
		//add(jieguo,BorderLayout.SOUTH);	
		
		jieguo.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent q)
			{
				tjTrue=true;
				fz1True=true;
				fz2True=true;
				fenxi();
				
			}
		});
		qingkong.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent q)
			{
				in.setText("");//清空两个文本框
				out.setText("");
			}
		});
	}

public void fenxi()
    {
	  int pan=0;//pan是用来表示把当前字符放到哪一个部分中,fen是用来匹配括号的
	  int i=0,j=0,m=0,k=0;//分别表示条件,赋值语句一,语句二的长度
	  fzhi1=new String[N] ;//存放第一个赋值语句部分
	  fzhi2=new String[N] ;//存放第二个赋值语句部分
	  fzhi3=new String[N];//存放第三个赋值语句部分
	  tj=new String[N] ;//存放条件表达式 
	  String s=in.getText();//获得输入源程序
	  StringTokenizer fenxi=new StringTokenizer(s," \n\t\r;+=/-*\"\')(}{[]<>?:!",true);
	  //用来把输入串分割为单词
	  while(fenxi.hasMoreTokens())//将输入的源程序截取为三个几个部分
	 {   
		 String str=fenxi.nextToken();
		 if (str.equals(" ")||str.equals("\n"))//如果是空格或者回车则分析下一个
			 continue;
		 if(str.equalsIgnoreCase("while"))//将第一个左括号放到第一个赋值表达式
		 {
			 pan=pan+1;
		 }
		 else if(str.equalsIgnoreCase(")")&&pan!=2)
		 { 
			 tj[i++]=str;
			 
		     pan=pan+1;
		 }
		 else if(pan==1)
			 
		        { 
			       tj[i]=str;  
		    	    i++; 
		        }
		else if(pan==2)
			    {
			    	     fzhi1[m]=str;		
			    	     m=m+1;   	   
			     }
	    else 
	    	out.append("输入有误"+"\n");
		    	 
	 }//while
	     lenth1=i;//条件表达式的长度
		 fuzhi1=m;//赋值语句1的长度
	
    if (tj[0].equals("(")&&tj[i-1].equals(")"))//判断条件for是否符合要求
     {
    	 if(fzhi1[1].equals("="))//判断赋值语句是否符合要求
    	 {
    		 for(int b=0;b<i-1;b++)
			 {
				 tj[b]=tj[b+1];
			 }
    		 lenth1--;
			
    		 if(has(tj,operatorOftj,lenth1)&&has(fzhi1,operatorOffz,1))
    		 {   
    			 out.append("词法分析通过");
    			 vertify(allString (tj),matrix1,hei1,len1,1);
    			 vertify(allString (fzhi1),matrix2,hei2,len2,2);
    			 if(tjTrue&&fz1True)
    			 {
    				 out.append("语法分析通过"+"\n"+"四元式为:"+"\n");
    				 siyuanshi();
    			 }  
    			 else 
    				 out.append("您的句子语法有错误,无法翻译"+"\n");
    		 }//if  
    		 else 
    		 {out.append("词法有错误,请重新输入 ");
    		 }//else
    	 	}//if(fzhi1[1].equals("=")&&fzhi2[1].equals("="))
    	 else
    		 out.append("赋值表达式不符合要求"+"\n");
    	 }//if (tj[0]=="("&&tj[i-1]==")")
     else 
     {
    	 out.append("条件表达式应该在括号内"+"\n");
     }
    }

 public boolean has(String  aaa[],String operator[],int num)
 //判断条件表达式中是否有非法字符。其中的参数分别代表要判断的字符串,要参照的符号表,和字符的长度
 { int b,d;
   boolean isOperator=true,isfu=true; 
  for( b=0;b<num;b++)
  { 
  	for( d=0;d<operator.length;d++)
	{
		if(aaa[b].equals(operator[d]))
			{
			isOperator=true;
			isfu=true;
		    break;
		    }
		else
		{
	     isfu=false;
		continue;
		}
	}//for
	 if (!bianliangpan(aaa[b])&&!isfu)//如果不是合法变量并且不是字符则出错 
		  {
			isOperator=false;
			System.out.print("错了"+aaa[b]);
			break;
		  }
		else if(bianliangpan(aaa[b])&&!isfu)//如果是合法变量
		{
			continue;
		}	
	
  }//for
  if(isOperator==false)
  	{
	  out.append("输入了非法标志符!");
	  return false;
  	}
  else 
  	return true;
 }

 //判断是不是合法的变量
  public boolean bianliangpan(String a)
  { int c;
    char zhjian[];
    boolean istrue=false;
    String ss=a; 
    int f=a.toCharArray().length;
    zhjian=new char[f];
    zhjian=ss.toCharArray();//将当前字符串转化为字符数组来分析

    for( c=0;c<f;c++)
    {
    	if(c==0)
    	{ 
    		if(Character.isDigit(zhjian[0]))
			   {
				   if(f==1)
				   {
				   istrue=true;
				   break;
				   }
				   for(int ii=1;ii<f;ii++)
				   {
					   if(Character.isLetter(zhjian[ii]))
					   {
						   istrue=false;//开头有数字,后面的有一个是字母则就是非法的变量
						   break;
					   }

⌨️ 快捷键说明

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