📄 analyze.java
字号:
/*
*author@weiβ mail:feather1190@yahoo.com.cn
*/
package complier;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import javax.swing.filechooser.*;
import java.awt.*;
import java.awt.event.*;
class Analyze extends JFrame implements ActionListener
{
//设置主界面
MenuBar mbar ;
Menu fileMenu,helpMenu;
MenuItem newItem,openItem,saveItem,exitItem,helpfileItem,aboutItem,analyItem;
JTextArea progarmArea, resultArea;
JFileChooser fc ;
JToolBar toolbar;
public Analyze(String s)
{
super("词法分析器" );
this.setSize(800,600);
this.getContentPane().setLayout(new BorderLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setBackground(Color.CYAN);
Container toolc = getContentPane();
this.addWindowListener(new WindowAdapter(){
public void WindowClosing(WindowEvent e){System.exit(0);}
});
mbar = new MenuBar();
this.setMenuBar(mbar);
//定义fileMenu菜单
fileMenu = new Menu("文件");
fileMenu.addActionListener(this);
mbar.add(fileMenu);
newItem = new MenuItem("新建");
newItem.addActionListener(this);
fileMenu.add(newItem);
openItem = new MenuItem("打开");
openItem.addActionListener(this);
fileMenu.add(openItem);
saveItem = new MenuItem("保存");
saveItem.addActionListener(this);
fileMenu.add(saveItem);
fileMenu.addSeparator();
analyItem = new MenuItem("分析");
analyItem.addActionListener(this);
fileMenu.add(analyItem);
exitItem = new MenuItem("退出");
exitItem.addActionListener(this);
fileMenu.add(exitItem);
//定义helpMenu菜单
helpMenu = new Menu("帮助");
helpMenu.addActionListener(this);
mbar.add(helpMenu);
helpfileItem = new MenuItem("帮助主题");
helpfileItem.addActionListener(this);
helpMenu.add(helpfileItem);
helpMenu.addSeparator();
aboutItem = new MenuItem("关于");
aboutItem.addActionListener(this);
helpMenu.add(aboutItem);
//定义文本域
//输入域
progarmArea = new JTextArea("program",10,46);
progarmArea.setBackground(Color.white);
progarmArea.setLineWrap(true);
progarmArea.setVisible(true);
//输出域
resultArea = new JTextArea(10,46);
resultArea.setBackground(Color.white);
resultArea.setEditable(false);
resultArea.setVisible(true);
JScrollPane p1 = new JScrollPane( progarmArea );//滚动块
p1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
p1.setVisible(true);
JScrollPane p2 = new JScrollPane(resultArea );
p2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
p2.setVisible(true);
c.add(p2,"East");
c.add(p1,"West");
this.pack();
this.show();
//文件选择
fc = new JFileChooser();
fc.setSelectedFile(new File(""));
fc.setCurrentDirectory(new File(""));
//定义工具栏
toolbar= new JToolBar();
toolbar.setOrientation(toolbar.HORIZONTAL);
toolc.add(toolbar,"North");
//button(新建)
JButton newButton = new JButton("新建");
newButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
progarmArea.setText(" ");
}
});
//button(打开)
JButton openButton = new JButton("打开");
openButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
int returnval=fc.showOpenDialog(Analyze.this);
try{
if(returnval==JFileChooser.APPROVE_OPTION)
{
String inLine;
File openfile = fc.getSelectedFile();
FileReader openfr=new FileReader(openfile);
BufferedReader openbr = new BufferedReader(openfr);
while((inLine=openbr.readLine())!=null)
{
progarmArea.append("\n"+inLine);
}
openbr.close();
}
}
catch(IOException exp){}
}
});
//button(分析)
JButton runButton = new JButton("分析");
runButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
resultArea.setText("分析结果\n");
String s1 = progarmArea.getText();
String s2 = analyzefile(s1);
resultArea.setText(s2);
}
});
toolbar.add(newButton);
toolbar.add(openButton);
toolbar.add(runButton);
this.add(toolbar,"North");
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == newItem){
progarmArea.setBackground(Color.white);
progarmArea.setText(" ");
}
else if(e.getSource() == openItem){
try{
int returnval=fc.showOpenDialog(Analyze.this);
if(returnval==JFileChooser.APPROVE_OPTION){
progarmArea.setBackground(Color.white);
String inLine;
File openfile = fc.getSelectedFile();
FileReader openfr=new FileReader(openfile);
BufferedReader openbr = new BufferedReader(openfr);
while((inLine=openbr.readLine())!=null){
progarmArea.append("\n"+inLine);
}
openbr.close();
}
}
catch(IOException exp){}
}
else if(e.getSource() == saveItem)
{
int returnval=fc.showSaveDialog(Analyze.this);
if(returnval==JFileChooser.APPROVE_OPTION){
String inLine;
File savefile = fc.getSelectedFile();
}
}
else if(e.getSource() == exitItem)
System.exit(0);
else if(e.getSource() == analyItem){
resultArea.setText("分析结果\n");
String s1 = progarmArea.getText();
String s2 = analyzefile(s1);
resultArea.setText(s2);
}
else if( e.getSource() == helpfileItem)
resultArea.setText("这是一个词法编译器,可以分析简单的cmm语言程序");
else if(e.getSource() == aboutItem)
JOptionPane.showMessageDialog(null,"weiβ 制作,mail:feather1190@yahoo.com.cn","关于", JOptionPane.INFORMATION_MESSAGE);
}
public static String analyzefile(String sfile){
String oneword=" ";
char nextchar;
int i,numchars;
String lastresult=" ";
numchars=sfile.length();
for(i =1;i<numchars;i++){
nextchar = sfile.charAt(i-1);
//读入的是空格
if(Character.isSpace(nextchar));
//读入的是字母
else if(Character.isLetter(nextchar)){
oneword = oneword +nextchar;
i++;
nextchar = sfile.charAt(i-1);
while(Character.isDigit(nextchar)||Character.isLetter(nextchar)){
oneword = oneword +nextchar;
i++;
nextchar = sfile.charAt(i-1);
}
i--;
oneword = oneword.trim();//返回字符串的副本,忽略前导空白和尾部空白.
if(iskeyword(oneword))
lastresult=lastresult+" ("+oneword+",1) 关键字\n";
else
lastresult=lastresult+" ("+oneword+",2) 标识符\n";
oneword=" ";
}
//读入的是数字
else if(Character.isDigit(nextchar)){
oneword = oneword +nextchar;
i++;
nextchar = sfile.charAt(i-1);
while(Character.isDigit(nextchar)){
oneword = oneword +nextchar;
i++;
nextchar = sfile.charAt(i-1);
}
i--;
oneword=oneword.trim();
lastresult=lastresult+" ("+oneword+",3) 数字\n";
oneword=" ";
}
//读入的是符号
else{
int signaltype;
signaltype = signal(sfile.charAt(i-1),sfile.charAt(i));
switch(signaltype){
case 1://"++,--"单目运算符
lastresult=lastresult+" ("+nextchar+sfile.charAt(i)+",4) 单目运算符\n";
i++;
break;
case 2://"+,_,*,/"双目运算符
lastresult=lastresult+" ("+nextchar+",5) 双目运算符\n";
break;
case 3://"(,),{,},;,,"分隔符
lastresult=lastresult+" ("+nextchar+",6) 分隔符\n";
break;
case 4://“//”,“/*”,和“*/”
lastresult=lastresult+" ("+nextchar+sfile.charAt(i)+",7) 注释符\n";
i++;
break;
case 5://"<>,==,<=,>=,!="判断符
lastresult=lastresult+" ("+nextchar+sfile.charAt(i)+",8) 判断符\n";
i++;
break;
case 6://"<,>"判断符
lastresult=lastresult+" ("+nextchar+",8) 判断符\n";
i++;
break;
case 0://错误字符
lastresult=lastresult+" ("+nextchar+",9) 错误字符\n";
break;
}//end of switch
}
}
return lastresult;
}
//在比较两个字符是否相等时,用equals函数,等号只判断指向相同地址的
public static boolean iskeyword(String s1){
if(s1.equals("int") )
return true;
else if(s1.equals("if"))
return true;
else if(s1.equals("while") )
return true;
else if(s1.equals("read"))
return true;
else if(s1.equals("return"))
return true;
else if(s1.equals("write"))
return true;
else if (s1.equals("else"))
return true;
else if (s1.equals("real"))
return true;
else return false;
}
public static int signal( char c1,char c2 ){
switch(c1){
case '+':
if(c2=='+')
return 1; //单目运算符
else
return 2 ;//双目运算符
case '-':
if(c2=='-')
return 1;
else
return 2 ;
case '*': if(c2=='/') return 3; //分隔符
else
return 2;
case '/': if(c2=='/'||c2=='*') return 4;//注释符
else
return 2;
case '=': if(c2=='=') return 5;//判断符1
else
return 2;
case '!':if(c2=='=')return 5;
case ';': return 3;
case '(': return 3;
case ')': return 3;
case '{': return 3;
case '}': return 3;
case '[': return 3;
case ']': return 3;
case ',': return 3;
case '<': if((c2=='=')||(c2=='>')) return 5;//判断符1
else
return 6;//判断符2
case '>': if(c2=='=') return 5;//判断符1
return 6;//判断符2
}
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -