?? scaner.java
字號(hào):
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.util.regex.*;
public class Scaner{
private Analyser analyser;
private String fileName="C:\\";
private final String[] KEY_WORD={"byte","shor","int","long","float","double","char","boolean",
"for","do","while","if","else","switch","case","break",
"default","continue","return","void","static","class",
"public","private","protected","new","import"};
//構(gòu)造函數(shù),用于指定控制
public Scaner(Analyser analyser)
{
this.analyser=analyser;
}
public void openFile() //打開文件
{
JFileChooser jfc=new JFileChooser(fileName);
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result=jfc.showOpenDialog(analyser);
if(result==JFileChooser.CANCEL_OPTION)
return;
File file=jfc.getSelectedFile();
fileName=file.getAbsolutePath();
try{
StringBuffer buffer=new StringBuffer("");
FileInputStream fis=new FileInputStream(fileName);
int c;
while((c=fis.read())!=-1){
buffer.append((char)c);
}
analyser.outputArea.setText("");
analyser.inputArea.setText(new String(buffer));
}catch(IOException e){
e.printStackTrace();
}
}
public void scan() //掃描文件
{
analyser.outputArea.setText("");
//用正則表達(dá)式查找匹配字符
Matcher m=
Pattern.compile("/\\*.*\\*/|\'.+\'|(\\++|\\--|\\>=|\\<=)|\\d+\\.\\d*|\\w+|\".+\"|\\S").matcher(analyser.inputArea.getText());
while(m.find()){
check(m.group());
}
}
private void check(String s) //檢測匹配字符串
{
if(Character.isDigit(s.charAt(0)))
checkDigit(s);
else if(s.length()==1)
checkChar(s.charAt(0));
else
checkString(s);
}
private void checkDigit(String s) //檢測數(shù)字
{
if(s.indexOf(".")!=-1)
out("浮點(diǎn)數(shù)",Double.valueOf(s).toString());
else
out("整數(shù)",s);
}
private void checkChar(char c) //檢測單個(gè)字符
{
switch (c){
case '<':
out("小于號(hào)", c);
break;
case '>':
out("大于號(hào)", c);
break;
case '=':
out("等于號(hào)", c);
break;
case '+':
out("加號(hào)", c);
break;
case '-':
out("減號(hào)", c);
break;
case '*':
out("乘號(hào)", c);
break;
case '/':
out("除號(hào)", c);
break;
case '(':
out("左小括號(hào)", c);
break;
case ')':
out("右小括號(hào)", c);
break;
case '[':
out("左中括號(hào)", c);
break;
case ']':
out("右中括號(hào)", c);
break;
case '{':
out("左大括號(hào)", c);
break;
case '}':
out("右大括號(hào)", c);
break;
case ',':
out("逗號(hào)", c);
break;
case ';':
out("分號(hào)", c);
break;
case '!':
out("取反", c);
break;
case '.':
out("點(diǎn)號(hào)", c);
break;
case ':':
out("冒號(hào)", c);
break;
default:
out("標(biāo)識(shí)符", c);
break;
}
}
private void checkString(String s) //檢測多個(gè)字符
{
if(s.charAt(0)=='\'')
out("字符", s);
else if(s.charAt(0)=='"')
out("字符串", s);
else if(s.charAt(0)=='/')
out("注釋",s);
else if(s.equals("++"))
out("自加符", s);
else if(s.equals("--"))
out("自減符", s);
else if(s.equals(">="))
out("大于等于", s);
else if(s.equals("<="))
out("小于等于", s);
else if(isKeyWord(s))
out("關(guān)鍵字", s);
else
out("標(biāo)識(shí)符", s);
}
private boolean isKeyWord(String s) //是否是關(guān)鍵字
{
boolean b=false;
for(int i=0;i<KEY_WORD.length;i++)
if(s.equals(KEY_WORD[i]))
b=true;
return b;
}
private void out(String s,Object o) //向顯示器輸出結(jié)果
{
if(o instanceof String)
analyser.outputArea.append("( "+s+" , "+(String)o+" )\n");
else
analyser.outputArea.append("( "+s+" , "+((Character)o).charValue()+" )\n");
}
public void saveFile() //將輸出的結(jié)果保存為文件
{
JFileChooser fileChooser=new JFileChooser(fileName);
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result=fileChooser.showSaveDialog(analyser);
if(result==JFileChooser.CANCEL_OPTION)
return;
File file=fileChooser.getSelectedFile();
fileName=file.getAbsolutePath();
if(fileName==null || file.getName().equals(""))
JOptionPane.showMessageDialog(fileChooser,"Invalid File Name","Invalid File Name",JOptionPane.ERROR_MESSAGE);
else{
try{
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream(file));
String saveString=analyser.outputArea.getText().replaceAll("\n","\r\n");
osw.write(saveString);
osw.flush();
osw.close();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
public void clear() //清除輸入?yún)^(qū)域與輸出結(jié)果區(qū)域
{
analyser.inputArea.setText("");
analyser.outputArea.setText("");
}
public void help() //幫助信息
{
JOptionPane.showMessageDialog(analyser,
"<-可在\"輸入?yún)^(qū)域\"手寫或點(diǎn)擊\"打開\"按鈕打開要掃描的文件!->\n"+
"<--點(diǎn)擊\"掃描\"按鈕可對(duì)\"輸入?yún)^(qū)域\"的源程序進(jìn)行詞法掃描!-->\n"+
"<-------------掃描結(jié)果在\"輸出結(jié)果\"下列出!------------->\n","使用方法",
JOptionPane.INFORMATION_MESSAGE);
}
public void about() //“關(guān)于”信息
{
JOptionPane.showMessageDialog(analyser,
"<-----這是一個(gè)用Java編寫的詞法分析器!----->\n"+
"<------如何操作請點(diǎn)擊\" Help...\"按鈕!------>\n","關(guān)于詞法分析器",
JOptionPane.INFORMATION_MESSAGE);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -