📄 wordanalysis.java
字号:
//---------------------------------------------------
//单位:华南农业大学信息学院2003级计算机科学与技术1班
//作者:魏 燕 怀
//学号:2003374126
//日期:2006年4月3日
//内容: C 语言词法分析器
//---------------------------------------------------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
class WordAnalysis implements ActionListener
{
JFrame f = null;//主窗口
JTextArea textarea1 = null;//源代码窗口
JTextArea textarea2 = null;//分析结果窗口
JFileChooser filechooser = null;//文件对话框
String str2="";//存放读入的文件内容
public WordAnalysis()
{
f = new JFrame("C 语言词法分析器");
Container c = f.getContentPane();
textarea1 = new JTextArea();//源代码窗口
textarea1.setEditable(false);//设置为不可编辑
textarea1.setBorder(BorderFactory.createLineBorder(Color.pink,2));
textarea1.setBackground(Color.LIGHT_GRAY);
textarea1.setForeground(Color.red);
textarea2 = new JTextArea();//源代码窗口
textarea2.setEditable(false);//设置为不可编辑
textarea2.setBorder(BorderFactory.createLineBorder(Color.pink,2));
textarea2.setBackground(Color.LIGHT_GRAY);
textarea2.setForeground(Color.blue);
JScrollPane scrollpane1 = new JScrollPane(textarea1);//滚动模式
scrollpane1.setPreferredSize(new Dimension(320,160));
scrollpane1.setBorder(BorderFactory.createTitledBorder("源代码窗口"));
JScrollPane scrollpane2 = new JScrollPane(textarea2);
scrollpane2.setPreferredSize(new Dimension(320,160));
scrollpane2.setBorder(BorderFactory.createTitledBorder("分析结果窗口"));
JPanel panel = new JPanel();
JButton b1 = new JButton("打开文件");//按纽
b1.setIcon(new ImageIcon(".\\open.jpg"));
b1.addActionListener(this);//注册时间监听
JButton b2 = new JButton("词法分析");//按纽
b2.setIcon(new ImageIcon(".\\glass.jpg"));
b2.addActionListener(this);//注册时间监听
JButton b3 = new JButton("保存结果");
b3.setIcon(new ImageIcon(".\\save.jpg"));
b3.addActionListener(this);
panel.add(b1);//加入按纽
panel.add(b2);//加入按纽
panel.add(b3);
filechooser = new JFileChooser("E:\\");//默认磁盘
c.add(scrollpane1,BorderLayout.NORTH);//布局,代码窗口在上
c.add(scrollpane2,BorderLayout.CENTER);//分析结果在中间
c.add(panel,BorderLayout.SOUTH);//操作按纽在下面
f.pack();
f.setVisible(true);
f.setLocation(200,100);//窗口在屏幕的位置
f.setResizable(false);//设置窗口不能拉动
f.addWindowListener(new WindowAdapter()//窗口关闭处理
{
public void windowClosing(WindowEvent e1)
{
System.exit(0);//退出
}
}
);
}
public static void main(String[] args)//main()方法开始
{
new WordAnalysis();
}
public void actionPerformed(ActionEvent e2)
{
File file = null;//文件对象
int result;
if(e2.getActionCommand().equals("打开文件"))//如果按下代开分析文件按纽
{
filechooser.setApproveButtonText("确定");
filechooser.setDialogTitle("打开文件");
result = filechooser.showOpenDialog(f);
textarea1.setText("");
if(result==JFileChooser.APPROVE_OPTION)//如果按下确定
{
file = filechooser.getSelectedFile();//获得选中的文件
}
else if(result==JFileChooser.CANCEL_OPTION)//否则撤消
{
return;
}
FileReader fr = null;
BufferedReader br = null;
if(file!=null)
{
try
{
fr = new FileReader(file);//文件
br = new BufferedReader(fr);//读入缓冲
}
catch(FileNotFoundException e3)
{
return;
}
String str1;//存放读入文件的每一行
try
{
while((str1=br.readLine())!=null)//读入文件
{
textarea1.append("\n\t"+str1);//在代码窗口显示
str2 +=(str1+" ");//存进str2,以便分析
}
}
catch(IOException e4)
{
return;
}
finally
{
try{
fr.close();//关闭文件读
br.close();//关闭缓冲
}
catch(IOException e5)
{
}
}
}
}
if(e2.getActionCommand().equals("词法分析"))//如果按下词法分析按纽
{
FileInputStream fin=null;//字节流
Properties pt = new Properties();//哈希表子类,用来读入关键字
try
{
fin = new FileInputStream("KeyWord.txt");//打开关键字文件
}
catch(FileNotFoundException e)
{
System.out.println("文件打不开");
}
try
{
if(fin!=null)//文件存在
{
pt.load(fin);//将关键字文件内容装进哈希表
fin.close();//关闭文件
}
}
catch(IOException e)
{
System.out.println("文件读入错误.");
}
char input_char[] = str2.toCharArray();//将文件读入的字符串转换为数组
String strToken="";//存分析的字符
for(int j=0;j<input_char.length;j++)//词法分析开始,把数组中的字符一一分析
{
if(Character.isLetter(input_char[j]))//如果是字母开头
{
strToken+=input_char[j];//将该字母存进符号串
//如果字母后面是数字或者字母或者下划线,则把数字或者字母或者下划线追加在后面
while(Character.isDigit(input_char[j+1])||Character.isLetter(input_char[j+1])||input_char[j+1]=='_')
strToken+=input_char[++j];
if(!Character.isLetter(input_char[j+1]))//如果下一个字符不是字母
{
if(pt.get(strToken)!=null)//如果是关键字,则输出其关键字编码
{
textarea2.append("\n\t<"+(String)pt.get(strToken)+",->");
strToken="";//将字符串重新设置为空
}
else
{
textarea2.append("\n\t<$标识符,"+strToken+">");//不是关键字则输出是标识符
strToken="";
}
}
if(Character.isWhitespace(input_char[j]))//如果是空格,则下标加1
j++;
}
else if(Character.isDigit(input_char[j]))//如果是数字开头
{
strToken+=input_char[j];//将数字存进字符串
//如果数字后面是小数点并且小数点后是数字,或者数字后面是数字则追加在后面
while(((input_char[j+1]=='.')&&Character.isDigit(input_char[j+2]))||Character.isDigit(input_char[j+1]))
strToken+=input_char[++j];
if(!Character.isDigit(input_char[j+1]))//如果数字后面不是数字
{
if(Character.isLetter(input_char[j+1])||input_char[j+1]=='_')//向后搜索
{
while(Character.isLetter(input_char[j+1])||Character.isDigit(input_char[j+1])||input_char[j+1]=='_')
strToken+=input_char[++j];
textarea2.append("\n\t<$错误,不能识别>");//如果不能构成数值,出错
}
else textarea2.append("\n\t<$数值,"+strToken+">");//否则输出数值
strToken="";
}
if(Character.isWhitespace(input_char[j]))//如果是空格,则下标加1
j++;
}
else
switch(input_char[j])//处理分隔符和运算符
{
case '('://处理圆括号
textarea2.append("\n\t<$左圆括号,->");
break;
case ')'://处理圆括号
textarea2.append("\n\t<$右圆括号 ,->");
break;
case '{'://处理花括号
textarea2.append("\n\t<$左花括号,->");
break;
case '}'://处理花括号
textarea2.append("\n\t<$右花括号,->");
break;
case '['://处理中括号
textarea2.append("\n\t<$左中括号,->");
break;
case ']'://处理中括号
textarea2.append("\n\t<$右中括号,->");
break;
case ',':
textarea2.append("\n\t<$逗号 ,->");
break;
case ';'://处理分号
textarea2.append("\n\t<$分号 ,->");
break;
case ':'://处理冒号
textarea2.append("\n\t<$冒号 ,->");
break;
case '\"'://处理双引号
textarea2.append("\n\t<$双引号,->");
break;
case '\''://处理单引号以及字符常量
int n=0;
String tempstr="";
if(Character.isLetter(input_char[j+1]))
{ j++;
tempstr+=input_char[j];
n++;
if(input_char[j+1]=='\'')
{
textarea2.append("\n\t<$字符常量,"+tempstr+">");
j++;
}
else
{ textarea2.append("\n\t<$单引号,->");
j=j-n;
}
}
else
textarea2.append("\n\t<$单引号,->");
break;
case '\\':
if(input_char[j+1]=='n')
{
j=j+1;
textarea2.append("\n\t<$换行,->");//处理换行
}
else if(input_char[j+1]=='t')//处理制表
{
j=j+1;
textarea2.append("\n\t<$制表,->");
}
break;
case '+'://处理加号
if(input_char[j+1]=='+')
{
textarea2.append("\n\t<$自加,->");
j++;
}
else
textarea2.append("\n\t<$加号 ,->");
break;
case '-'://处理减号
if(input_char[j+1]=='-')
{
textarea2.append("\n\t<$自减,->");
j++;
}
else
textarea2.append("\n\t<$减号 ,->");
break;
case '*'://处理乘号
textarea2.append("\n\t<$乘号 ,->");
break;
case '/':
if(input_char[j+1]=='*')//处理注释
{
textarea2.append("\n\t<$注释,->");
j++;
while(!((input_char[j+1]=='*')&&(input_char[j+2]=='/')))//如果没有连续出现*/则循环
j++;
j=j+3;//下标移动到*/后面
}
else
textarea2.append("\n\t<$斜杆或除号 ,->");//不是注释则输出为斜杆
break;
case '=':
textarea2.append("\n\t<$等号 ,->");
break;
case '!'://处理逻辑非或者不等于号
if(input_char[j+1]=='=')
{
j=j+2;
textarea2.append("\n\t<$不等于号,->");
}
else
textarea2.append("\n\t<$逻辑非,->");
break;
case '>'://处理大于号或者大于等于号
if(input_char[j+1]=='=')
{
j=j+1;
textarea2.append("\n\t<$大于等于号,->");
}
else if(input_char[j+1]=='>')
{
j=j+1;
textarea2.append("\n\t<$右移位符,->");
}
else textarea2.append("\n\t<$大于号,->");
break;
case '<'://处理小于号或者小于等于号
if(input_char[j+1]=='=')
{
j=j+1;
textarea2.append("\n\t<$小于等于号,->");
}
else if(input_char[j+1]=='<')
{
j=j+1;
textarea2.append("\n\t<$左移位符,->");
}
else textarea2.append("\n\t<$小于号,->");
break;
case '|'://处理逻辑非
if(input_char[j+1]=='|')
{
j=j+1;
textarea2.append("\n\t<$逻辑或,->");
}
else textarea2.append("\n\t<$按位或,->");
break;
case '&'://处理逻辑与
if(input_char[j+1]=='&')
{
j=j+1;
textarea2.append("\n\t<$逻辑与,->");
}
else textarea2.append("\n\t<$按位与,->");
break;
case '?':
textarea2.append("\n\t<$条件运算符,->");
break;
default:
if(Character.isWhitespace(input_char[j]))
;
else textarea2.append("\n\t<$错误,不能识别>");
break;
}
}//end for
}//end if
if(e2.getActionCommand().equals("保存结果"))//保存分析结果
{
result = filechooser.showSaveDialog(f);
file = null;
if(result==JFileChooser.APPROVE_OPTION)//按下保存
{
file = filechooser.getSelectedFile();
}
else if(result==JFileChooser.CANCEL_OPTION)//那下撤消
{
return;
}
FileWriter fw =null;//文件对象
if(file!=null)
{
try
{
fw = new FileWriter(file);
}
catch(IOException e6)
{
}
String content = textarea2.getText();//将textarea2的内容获取出来
try
{
fw.write(content);//写进文件
}
catch(IOException e7)
{
return;
}
finally
{
try
{
fw.close();//关闭文件写操作
}
catch(IOException e8)
{
}
}
}
}//end if
}//end performed
}//类体结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -