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

📄 cfpanel.java

📁 这个是采用java编写的for语句的LR分析法的翻译程序
💻 JAVA
字号:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Stack;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;


public class cfPanel extends JPanel{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	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 tongji1=0;//用于记录跳转时候的步骤
	int tongji2=0;
	int tongji3=0;
	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={"(",")","=","#","<",">"};
	
	EvaluateAna evaluate1 = new EvaluateAna();
	EvaluateAna evaluate2 = new EvaluateAna();
	EvaluateAna evaluate3 = new EvaluateAna();
	WordAna wordAna = new WordAna();
	
    int count=1;   //用来记录第几次调用赋值语句的文法
	
public  cfPanel()//界面设置
	{
		bei=new JPanel();
	    center=new JPanel();
		nan=new JPanel();
		chooser=new JFileChooser();
		
	    chose =new JButton("选 源 程 序");
		save=new JButton("保 存 结 果 ");
		qingkong=new JButton("全 部 清 空");
		fanyi=new JButton("察 看 文 法");
		jieguo=new JButton("计 算 结 果");
			
		bei.add(save);
		bei.add(chose);
		bei.add(fanyi);
		
		JLabel input=new JLabel("请输入:                      ");
		JLabel output=new JLabel("分析结果为:");
		
	    in=new JTextArea(20,20);
		out=new JTextArea(20,20);
		out.setEditable(false);
		in.setEditable(true);
					
		nan.add(input);
	    nan.add(output);
	    
	    scrollin=new JScrollPane(in);
	    scrollout=new JScrollPane(out);
		center.add(scrollin);
		center.add(scrollout);
		
		add(bei,BorderLayout.NORTH);
		add(nan,BorderLayout.SOUTH);
		add(center,BorderLayout.CENTER);
		add(qingkong,BorderLayout.EAST);
		add(jieguo,BorderLayout.EAST);	
		
		
		chose.addActionListener(new 
				ActionListener()
		{
			public void actionPerformed(ActionEvent event)
			{
		    int result=chooser.showOpenDialog(getParent());
			file=chooser.getSelectedFile();
		    in.setText("");
			BufferedReader readin = null;
			if(file != null)
	        {
	            try
	            {
	                readin = new BufferedReader(new FileReader(file));
	            }
	            catch(FileNotFoundException fe)
	            {
	            	System.out.println("File Not Found");
	                return;
			     }
	            try
	            {
	                while( (read=readin.readLine())!=null)
	                {
	                    in.append(read);
	                    in.append("\n");
	                }
	            }   
	                catch(IOException ioe)
	                {
	            	in.append("读取文件错误");
	                }
	                finally{
	                    try{
	                        if(readin != null)
	                            readin.close();
	                    }catch(IOException ioe2){}
	                }
		}}});
		
		save.addActionListener(new
				ActionListener()
		{
			public void actionPerformed(ActionEvent event)
			{
				int result=chooser.showSaveDialog(getParent());
				file = chooser.getSelectedFile();
				FileOutputStream fileOutStream = null;
				if(file != null)
	              {
	                  try
	                  {
	                     fileOutStream = new FileOutputStream(file);
	                  }catch(FileNotFoundException fe)
	                  {
	                	  System.out.println("File Not Found");
	                      return;
	                  }
	          write=out.getText();
	         try{
	        	
                 fileOutStream.write(write.getBytes());
             }catch(IOException ioe){
           	  in.append("写入文件错误");
             }
             finally{
                 try{
                     if(fileOutStream != null)
                         fileOutStream.close();
                 }catch(IOException ioe2){}
             }
			}
		}});
		fanyi.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent q)
			{
				try
				{
				Runtime.getRuntime().exec("cmd /c start D:\\help.txt");
			    }
				catch(Exception e)
				{
					
				}
				}
			});
		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 separate()
{
	  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("for"))//将第一个左括号放到第一个赋值表达式
		 {
			 pan=pan+1;
			 }
		 else if(str.equalsIgnoreCase(";"))
		 { 
			 pan=pan+1;
			 }
		 else if(str.equalsIgnoreCase(";"))
		 { 
		     pan=pan+1;
		     }
		 else if(str.equals("{"))//将{后边的放到第三个赋值语句中
		{
			 pan=pan+1;
			 }
		 else if(pan==2)
		 {
			 tj[i]=str;  
			 i++; 
			 }
		else if(pan==1)
		{
			fzhi1[m]=str;		
			m=m+1;   	   
			}
		else if(pan==3)
		{           
			fzhi2[j]=str;       
			j=j+1;
			}
		else if (pan==4)
		{
			fzhi3[k]=str;
			k++;
		}
	    else 
	    	out.append("输入有误"+"\n");
		 }//while
	  
	     lenth1=i;//条件表达式的长度
		 fuzhi1=m;//赋值语句1的长度
		 fuzhi2=j;//赋值语句2的长度
		 fuzhi3=k;//赋值语句3的长度
		 for(int a=0;a<i;a++)
			 out.append(tj[a]);
		    out.append("\n");
		 for(int b=0;b<m;b++)
			out.append(fzhi1[b]);
		     out.append("\n");
		 for(int c=0;c<j;c++)
			 out.append(fzhi2[c]);
		 
		 out.append("\n");
	}

public void fenxi()
{
	separate();
	if (fzhi1[0].equals("(")&&fzhi2[fuzhi2-1].equals(")")&&fzhi3[fuzhi3-1].equals("}"))//判断条件for是否符合要求
		{
		if(fzhi1[2].equals("=")&&fzhi2[1].equals("=")&&fzhi3[1].equals("="))//判断赋值语句是否符合要求
			{
			for(int b=0;b<fuzhi1-1;b++)
			{
				fzhi1[b]=fzhi1[b+1];
				}
			fzhi1[fuzhi1-1]="";
			fzhi2[fuzhi2-1]="";
			fzhi3[fuzhi3-1]="";
			fuzhi1--;
			fuzhi2--;
			fuzhi3--;
			
			if(wordAna.has(tj,operatorOftj,i)&&wordAna.has(fzhi1,operatorOffz,1)&&wordAna.has(fzhi2,operatorOffz,j-1)&&wordAna.has(fzhi3,operatorOffz,k-1))
			{  
				out.append("整个输入语句的词法是正确的"+"\n");
				if(tjTrue&&fz1True&&fz2True&&fz3True)
				{
					String s1=evaluate1.evuAna(allString(fzhi1),count,0,0,0,0);
					int m1 = evaluate1.getValue();
					String s2=evaluate1.evuAna(allString(fzhi2),++count,0,0,0,0);
					int m2 = evaluate1.getValue();
					String s3=evaluate1.judAna(allString(tj),count,0,0,0,0);
					int m3 = evaluate1.getValue1();
					String s4=evaluate1.evuAna(allString(fzhi3),++count,0,0,0,0);
					int m4 = evaluate1.getValue();
					out.append("整个输入语句的语法是正确的"+"\n"+"下面的是输出的三地址码"+"\n");
					String result = "for "+s1+" to "+s2+" until "+s3+" do "+s4;
				//	out.append(result);
					String s5=evaluate1.forAna(result, count,m1,m2,m3,m4);
				//	out.append("\n"+s5+"\n");
				//	out.append(m1+" "+m2+" "+m3+" "+m4+"\n");
					}  
				else 
					out.append("您的句子语法有错误,无法翻译"+"\n");
				}//if  
			else 
			{
				if(!wordAna.has(tj,operatorOftj,i))
					System.out.print("输入的条件表达式的词法有错误"+"\n");
				else if (!wordAna.has(fzhi1,operatorOffz,fuzhi1-1))
					System.out.print("输入的第一个赋值表达式的词法有错误"+"\n");
				else if (!wordAna.has(fzhi2,operatorOffz,fuzhi2-1))
					System.out.print("输入的第二个赋值表达式的词法有错误"+"\n");
    			else if (!wordAna.has(fzhi3,operatorOffz,fuzhi3-1))
    				System.out.print("输入的第三个赋值表达式的词法有错误"+"\n");
				}//else
			}//if(fzhi1[1].equals("=")&&fzhi2[1].equals("="))
		else
			out.append("赋值表达式不符合要求,应该有=号"+"\n");
		}//if (tj[0]=="("&&tj[i-1]==")")
	else 
		out.append("输入的条件表达式的词法有错误,应该有括号"+"\n");
	}

  public String allString(String arg[]){
      String s="";
      for(int i=0;i<arg.length;i++){
    	  if(arg[i]!=null)
              s+=arg[i];
      }
      return s;
      }
  
  }//cfPanel

⌨️ 快捷键说明

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