📄 scaner.java
字号:
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"};
//构造函数,用于指定控制
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("");
//用正则表达式查找匹配字符
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) //检测数字
{
if(s.indexOf(".")!=-1)
out("浮点数",Double.valueOf(s).toString());
else
out("整数",s);
}
private void checkChar(char c) //检测单个字符
{
switch (c){
case '<':
out("小于号", c);
break;
case '>':
out("大于号", c);
break;
case '=':
out("等于号", c);
break;
case '+':
out("加号", c);
break;
case '-':
out("减号", c);
break;
case '*':
out("乘号", c);
break;
case '/':
out("除号", c);
break;
case '(':
out("左小括号", c);
break;
case ')':
out("右小括号", c);
break;
case '[':
out("左中括号", c);
break;
case ']':
out("右中括号", c);
break;
case '{':
out("左大括号", c);
break;
case '}':
out("右大括号", c);
break;
case ',':
out("逗号", c);
break;
case ';':
out("分号", c);
break;
case '!':
out("取反", c);
break;
case '.':
out("点号", c);
break;
case ':':
out("冒号", c);
break;
default:
out("标识符", c);
break;
}
}
private void checkString(String s) //检测多个字符
{
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("关键字", s);
else
out("标识符", s);
}
private boolean isKeyWord(String s) //是否是关键字
{
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) //向显示器输出结果
{
if(o instanceof String)
analyser.outputArea.append("( "+s+" , "+(String)o+" )\n");
else
analyser.outputArea.append("( "+s+" , "+((Character)o).charValue()+" )\n");
}
public void saveFile() //将输出的结果保存为文件
{
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() //清除输入区域与输出结果区域
{
analyser.inputArea.setText("");
analyser.outputArea.setText("");
}
public void help() //帮助信息
{
JOptionPane.showMessageDialog(analyser,
"<-可在\"输入区域\"手写或点击\"打开\"按钮打开要扫描的文件!->\n"+
"<--点击\"扫描\"按钮可对\"输入区域\"的源程序进行词法扫描!-->\n"+
"<-------------扫描结果在\"输出结果\"下列出!------------->\n","使用方法",
JOptionPane.INFORMATION_MESSAGE);
}
public void about() //“关于”信息
{
JOptionPane.showMessageDialog(analyser,
"<-----这是一个用Java编写的词法分析器!----->\n"+
"<------如何操作请点击\" Help...\"按钮!------>\n","关于词法分析器",
JOptionPane.INFORMATION_MESSAGE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -