?? heng.java
字號:
package by;
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 heng
{
public static void main(String args[])
{
cfFrame frame=new cfFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setResizable(false);
}
}
class cfFrame extends JFrame
{
public cfFrame()
{
LookAndFeelInfo[] infos=UIManager.getInstalledLookAndFeels();
setTitle("for循環");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
cfPanel panel=new cfPanel();
add(panel);
}
public static final int DEFAULT_WIDTH=500;
public static final int DEFAULT_HEIGHT=550;
}
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 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()//界面設置
{
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];
System.out.print(fzhi1[b]);
}
fzhi1[m-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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -