📄 cfpanel.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 + -