Java语言词法分析器
一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示).
二、实验准备工作
1、词法分析器的功能和输出格式
词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。
2、Java程序语言的单词符号的种别.
识别java的关键字:
boolean,byte,char,double,false,float,int,long,new,null,short,true,void,instanceof,break,case,catch,continue,default,do,else,for,if,return,switch,try,while,finally,throw,this,super,abstract,final,namtive,private,protected,public ,static,synchronized,transient,volatile,class,extends,implements,interface,package,import,throws;单词识别码为1;
标识符:标识符必须是以字母,下划线,美元符号开始,单词识别码为2;
常量:常数为无符号整形数;单词种别码为3;
运算符:+、-、*、/、=、>、<、>=、<=、==、!= 、++、--、%、&&、||、!单词识别码为4;
分隔符:,、;、{、}、(、); 单词种别码为5
4.单元模块

//业务代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Vector; public class JavaAnaylsis
{
private static String[] keyword =
{ "boolean", "byte", "char", "double", "false", "float", "int", "long",
"new", "null", "short", "true", "void", "instanceof", "break",
"case", "catch", "continue", "default", "do", "else", "for", "if",
"return", "switch", "try", "while", "finally", "throw", "this",
"super", "abstract", "final", "namtive", "private", "protected",
"public", "static", "synchronized", "transient", "volatile",
"class", "extends", "implements", "interface", "package", "import",
"throws" };
static String string;
static String wordString;
static Vector vc; public JavaAnaylsis(String str) throws Exception
{
File inFile = new File(str);
if (inFile.exists())
{
System.out.println("文件打开成功!!!");
try
{
FileReader reader = new FileReader(inFile);
BufferedReader br = new BufferedReader(reader);
vc = new Vector();
while ((string = br.readLine()) != null)
{
// 预处理 将一行的字符串连续的空格换成一个空格或将连续的制表符换成一个空格
string = string.trim().replace(" +", " ")
.replaceAll("\\t+", " ");
// System.out.println(string);
judgement();
}
br.close();
} catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} } else
{
System.out.println("文件打开失败");
}
} /*
* 判断读入的字符是否为字母
*/
public static boolean isLetter(char c)
{
if ((c >= 'a' && c <= 'z') || (c > +'A' && c <= 'Z'))
{
return true;
} else
return false;
} /*
* 判断读入的字符是否为数字
*/
public static boolean isDigit(char c)
{
if (c >= '0' && c <= '9')
{
return true;
} else
return false;
} /*
* 判断是否为关键字
*/
public static boolean isKey(String ss)
{
int flag = 0;
for (int i = 0; i < keyword.length; i++)
{
if (ss.equals(keyword[i]))
{
flag = 1;
break;
}
}
if (flag == 1)
{
return true;
}
return false;
} /*
* 判断是否为运算符
*/
public static boolean isSpilt(char ch)
{
if (ch == '+' || ch == '-' || ch == '|' || ch == '=' || ch == '&')
{
return true;
} else
return false;
} /*
* 判断输入的字符并输出单词符号
*/
public static void judgement() throws Exception
{ char ch = 0;
int m = 0;
String str = null;
for (int i = 0; i < string.length(); i++)
{
switch (m)
{
case 0:
ch = string.charAt(i);
// 判断是否为运算符使用超前搜索
if (ch == '+' || ch == '-' || ch == '*' || ch == '/'
|| ch == '=' || ch == '>' || ch == '<' || ch == '!'
|| ch == '%' || ch == '|')
{
str = "";
str += ch;
if (ch == '+' || ch == '-' || ch == '>' || ch == '<'
|| ch == '!' || ch == '|' || ch == '&')
{
ch = string.charAt(i + 1); // 对下一个字符进行判断是否为运算符
if (isSpilt(ch))
{
str += ch;
m = 4;
} else
{
ch = string.charAt(i - 1); // 不是运算符则进行回退操作
m = 4;
} }
}
// 判断是否为界符
else if (ch == ',' || ch == ';' || ch == '{' || ch == '}'
|| ch == '(' || ch == ')')
{
m = 5;
}
// 判断是否数字
else if (isDigit((ch = string.charAt(i))))
{
str = "";
str += ch;
m = 3;
}
// 判断是否字母
else if (isLetter(ch = string.charAt(i)))
{
str = "";
str += ch;
m = 2;
}
// 判断是否下划线或美元符号
else if (ch == '_' || ch == '$')
{
str = "";
str += ch;
m = 2;
} else
{
}
break; case 4:
i--;
System.out.println(("( 4 " + "“ " + str + " ” )"));
wordString = ("( 4 " + "“ " + str + " ” )");
vc.add(wordString);
m = 0;
break; case 5:
i--;
System.out.println(("( 5 " + "“ " + ch + " ” )"));
wordString = ("( 5 " + "“ " + ch + " ” )");
vc.add(wordString);
m = 0;
break; case 2:
if (isLetter(ch = string.charAt(i)))
{
str += ch;
} else
{
if (isKey(str))
{
System.out.println("( 1 " + "“ " + str + " ” )");
wordString = ("( 1 " + "“ " + str + " ” )");
vc.add(wordString);
} else
{
System.out.println(("( 2 " + "“ " + str + " ” )"));
wordString = ("( 2 " + "“ " + str + " ” )");
vc.add(wordString);
}
i--;
m = 0;
}
break; case 3:
if (isDigit((ch = string.charAt(i))))
{
str += ch;
} else
{
System.out.println("( 3 " + "“ " + str + " ” )");
wordString = "( 3 " + "“ " + str + " ” )";
vc.add(wordString);
i--;
m = 0;
}
break;
}
}
} public static Vector getVector()
{
return vc; }
}
//界面代码:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Vector; import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants; public class JavaFrame extends JFrame
{
private JTextArea textArea, textArea2;
private JButton anaylisbButton;
static String filename;
static Vector vcVector; public JavaFrame()
{
super();
setTitle("Java词法分析器");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 设置"关闭"按钮处理事件
Toolkit tool = Toolkit.getDefaultToolkit(); // 创建工具栏
Dimension screenSize = tool.getScreenSize(); // 获得屏幕大小
setSize(800, 500); // 设置窗体大小
setLocation((screenSize.width - getWidth()) / 2,
(screenSize.height - getHeight()) / 2);
JPanel scollJPanel = (JPanel) getContentPane(); // 获得内容面板
setResizable(false); // 设置最大化按钮不能用
JMenuBar menuBar = createMenu(); // 设置菜单项
this.setJMenuBar(menuBar);
// textArea=new TextArea();
JScrollPane jScrollPane = new JScrollPane(textArea = new JTextArea(
"源代码:" + "\n", 1000, 35));
JScrollPane jScrollPane2 = new JScrollPane(textArea2 = new JTextArea(
"词法分析后:" + "\n", 1000, 35));
scollJPanel.add(jScrollPane2, BorderLayout.EAST);
scollJPanel.add(jScrollPane, BorderLayout.WEST);
JPanel buttonJPanel = new JPanel();
anaylisbButton = new JButton("开始词法分析");
anaylisbButton.addActionListener(new start());
buttonJPanel.add(anaylisbButton);
scollJPanel.add(buttonJPanel, "South");
setVisible(true);
} private JMenuBar createMenu()
{
// TODO Auto-generated method stub
JMenuBar menuBar = new JMenuBar();// 初始化菜单栏
JMenu menu = new JMenu(" 文件 ");
JMenu menu2 = new JMenu(" 窗口 ");
menu2.setEnabled(false);
JMenu menu3 = new JMenu(" 帮助 ");
menu3.setEnabled(false);
JMenu menu4 = new JMenu(" 格式 ");
menu4.setEnabled(false);
JMenuItem meun1 = new JMenuItem(" 打开 ");
JMenuItem meun2 = new JMenuItem(" 保存 ");
JMenuItem meun3 = new JMenuItem(" 另存为 ");
JMenuItem meun4 = new JMenuItem(" 退出 ");
meun4.addActionListener(new ActionListener()
{ @Override
public void actionPerformed(ActionEvent arg0)
{
// TODO Auto-generated method stub
JavaFrame.this.dispose();
}
});
meun1.addActionListener(new ActionListener()
{ @Override
public void actionPerformed(ActionEvent arg0)
{
// TODO Auto-generated method stub
// 初始化文件选择框
textArea.setText("源代码:" + "\n");
JFileChooser fDialog = new JFileChooser("d:/");
// 设置文件选择框的标题
fDialog.setDialogTitle("请选择文件");
// 弹出选择框
int returnVal = fDialog.showOpenDialog(null);
// 如果是选择了文件
if (JFileChooser.APPROVE_OPTION == returnVal)
{
// 打印出文件的路径,你可以修改位 把路径值 写到 textField 中
System.out.println(fDialog.getSelectedFile());
filename = fDialog.getSelectedFile().toString();
File inFile = new File(filename);
try
{
FileReader reader = new FileReader(inFile);
BufferedReader br = new BufferedReader(reader);
String strings;
while ((strings = br.readLine()) != null)
{
textArea.append(strings + "\n"); }
br.close();
} catch (Exception e)
{
// TODO: handle exception
} }
}
});
meun2.addActionListener(new ActionListener()
{ @Override
public void actionPerformed(ActionEvent arg0)
{
// TODO Auto-generated method stub JFileChooser jf = new JFileChooser("d:/");
int value = jf.showSaveDialog(null); if (value == JFileChooser.APPROVE_OPTION)
{ // 判断窗口是否点的是打开或保存 File getPath = jf.getSelectedFile(); // 取得路径
System.out.println(getPath);
try
{
FileWriter fWriter = new FileWriter(getPath);
BufferedWriter out = new BufferedWriter(fWriter);
Iterator iterator = vcVector.iterator();
while (iterator.hasNext())
{
// textArea2.append(iterator.next().toString()+"\n");
out.write(iterator.next().toString());
out.newLine();
}
out.close();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
{
// 没有选择,即点了窗口的取消
} }
});
menu.add(meun1);
menu.add(meun2);
menu.add(meun3);
menu.addSeparator();
menu.add(meun4);
menuBar.add(menu);
menuBar.add(menu2);
menuBar.add(menu4);
menuBar.add(menu3);
return menuBar;
} private class start implements ActionListener
{ @Override
public void actionPerformed(ActionEvent arg0)
{
// TODO Auto-generated method stub
textArea2.setText("词法分析后:" + "\n");
try
{
new JavaAnaylsis(filename);
vcVector = new Vector();
vcVector = JavaAnaylsis.getVector();
Iterator iterator = vcVector.iterator();
while (iterator.hasNext())
{
textArea2.append(iterator.next().toString() + "\n");
}
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} public static void main(String[] args)
{
new JavaFrame();
}
}

实验总结:我在编程的过程中一共花了一天的时间,而在纸上设计就大概花了半个小时吧,花了半天的时间去上机输入和调试,在这次的实验过程中花了近半天的时间去思考问题,也遇到了编程的过程的问题,主要在逻辑错误问题较多,开始时我以为我的逻辑无错误,还以为是其他的问题,最后静下来理清自己的逻辑,还是发现了出现了较严重的逻辑问题,通过在网上查阅相关的资料来解决问题.到最后还是基本完成了这个java词法分析器的实验.对于我自己的程序我认为还是可以应对基本的词法分析,能编出这个程序我感觉到有那么一点成就感,这次的实验让我进一步地熟悉了java语言,提高了我的编程思维能力,增大了我的兴趣爱好,巩固了我的知识.还有好......
Java语言词法分析器的更多相关文章
- Java编写的C语言词法分析器
Java编写的C语言词法分析器 这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有 ...
- 用Java语言实现简单的词法分析器
编译原理中的词法分析算是很重要的一个部分,原理比较简单,不过网上大部分都是用C语言或者C++来编写,笔者近期在学习Java,故用Java语言实现了简单的词法分析器. 要分析的代码段如下: 输出结果如下 ...
- Java语言的词法分析器的Java实现
一.实验目的 1. 学会针对DFA转换图实现相应的高级语言源程序. 2. 深刻领会状态转换图的含义,逐步理解有限自动机. 3. 掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理. 二.实验内 ...
- JAVA语言中的修饰符
JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...
- Atitit onvif协议获取rtsp地址播放java语言 attilx总结
Atitit onvif协议获取rtsp地址播放java语言 attilx总结 1.1. 获取rtsp地址的算法与流程1 1.2. Onvif摄像头的发现,ws的发现机制,使用xcf类库1 2. 调用 ...
- AVL树原理及实现(C语言实现以及Java语言实现)
欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- JAVA语言搭建白盒静态代码、黑盒网站插件式自动化安全审计平台
近期打算做一个插件化的白盒静态代码安全审计自动化平台和黑盒网站安全审计自动化平台.现在开源或半开源做黑盒网站安全扫描的平台,大多是基于python脚本,安全人员贡献python脚本插件增强平台功能.对 ...
- 关于Java语言和面向对象记录
本科时常用的c语言是面向过程的语言,而Java是面向对象的语言 Java语言的11个关键术语 简单性.可移植性.面向对象.分布式.高性能.解释型.健壮性.多线程.安全性.动态性.体系结构中立 面向对象 ...
随机推荐
- hping3
[root@zxserver104 ~]# hping3 -c -d -S -w -p --flood --rand-source 115.236.6x.19x 1. hping3 = 应用程序二进制 ...
- 如何在CALayer设置滤镜
网上有很多关于CALayer中设置filtes属性的相关资料比如如何设置一个带滤镜的layer,代码如下: NSImage* image = [NSImage imageNamed:@"IM ...
- JavaScript中点号“.”的多义性
点号「.」在JavaScript中有两种语义 语义1.表示算术中的小数点(浮点数),如 2.5 语义2.取对象属性.方法,如 [].push(2) 这几乎没有任何难理解的地方,但下面这个问题则很有趣. ...
- 数据结构--线段树--lazy延迟操作
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 53749 ...
- ACM竞赛高手比其他程序员水平高很多吗?
1. ACM是一种很直接的评价程序员水平的体系 2. ACM竞赛会带来很多机遇(深造or工作),同时又是一个不小的挑战 3. 为竞赛而竞赛的事情不可取 详细点击这里
- Java 集合介绍
1, Set :集合中对象不按特定的方式排序,并且没有重复对象,它有些实现类能对集合按特定方式排序 List :集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索独享,Li ...
- dev/shm time in linux
统计文件夹大小: du -hx --max=1 : du -sk :du -hsc 重新组织行分隔符进行显示: echo "abc,dd,bach,dong,jing,shang,china ...
- [转]设定version 更新js缓存
http://zhenggm.iteye.com/blog/680600 遇到的问题: 在访问量比较大的系统中,我们需要将一些静态的文件在客户端缓存,以减少下载的流量,从而加快客户端访 ...
- java在url传输前更改字符编码
几种方式 1. String s = "sds"; s = new String(data_id.getBytes("UTF-8")); 2. 使用get请求 ...
- 边工作边刷题:70天一遍leetcode: day 84-2
要点:这题是combination的应用,从左向右想比从右向左容易. 因为有结果从小到大的要求,暗示用combintion而不是permutation 其实就是从小到大验证因子,每个因子和其对称因子立 ...