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

📄 cfpanel.java

📁 LR法FOR语句的循环
💻 JAVA
字号:
package com;

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.ArrayList;
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;

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 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={">","<","=","#"};
	

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

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 keshe\\help.doc");
			    }
				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 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("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");
		
		 
		
	
    if (fzhi1[0].equals("(")&&fzhi2[j-1].equals(")")&&fzhi3[k-1].equals("}"))//判断条件for是否符合要求
     {
    	 if(fzhi1[2].equals("=")&&fzhi2[1].equals("=")&&fzhi3[1].equals("="))//判断赋值语句是否符合要求
    	 {
    		 for(int b=0;b<m-1;b++)
			 {
				 fzhi1[b]=fzhi1[b+1];	 
	    	}//去掉其前面的(
    		fzhi2[j-1]="";//去掉其后面的)
    		fzhi3[k-1]="";//去掉其后面的}
			fuzhi1--;
			fuzhi2--;
			fuzhi3--;
		    if(has(tj,operatorOftj,i)&&has(fzhi1,operatorOffz,1)&&has(fzhi2,operatorOffz,j-1)&&has(fzhi3,operatorOffz,k-1))
    		 {  
    			
    			 out.append("整个输入语句的词法是正确的"+"\n");
  
    			/* vertify(allString (tj),matrix1,hei1,len1,1);
    			 vertify(allString (fzhi1),matrix2,hei2,len2,2);
    			 vertify(allString (fzhi2),matrix2,hei2,len2,3);
    			 vertify(allString (fzhi3),matrix2,hei2,len2,4);*/
    			 if(tjTrue&&fz1True&&fz2True&&fz3True)
    			 {
    				 out.append("整个输入语句的语法是正确的"+"\n"+"下面的是输出的四元式"+"\n");
    				// siyuanshi();
	    	 
    			 }  
    			 else 
    				 out.append("您的句子语法有错误,无法翻译"+"\n");
    		 }//if  
    		 else 
    		 {
    			 if(!has(tj,operatorOftj,i))
    				 System.out.print("输入的条件表达式的词法有错误"+"\n");
    			 else if (!has(fzhi1,operatorOffz,fuzhi1-1))
    				 System.out.print("输入的第一个赋值表达式的词法有错误"+"\n");
    			 else if (!has(fzhi2,operatorOffz,fuzhi2-1))
    				 System.out.print("输入的第二个赋值表达式的词法有错误"+"\n");
    			 else if (!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 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;
					   }
					   else istrue=true;
				   }//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 allString(String arg[]){
      String s=null;
      for(int i=0;i<arg.length;i++){
              s+=arg[i];
      }
      return s;
  }

public boolean isZiFu(String a)
{
	if(a.equals("+")||a.equals("-")||a.equals("*")||a.equals("/"))
		return true;
	else 
		return false; 
}

}//cfPanel

	
	

	
	

⌨️ 快捷键说明

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