一、实验目的

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“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语言词法分析器的更多相关文章

  1. Java编写的C语言词法分析器

    Java编写的C语言词法分析器 这是java编写的C语言词法分析器,我也是参考很多代码,然后核心代码整理起来,放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手改进.这个词法分析器实现的功能有 ...

  2. 用Java语言实现简单的词法分析器

    编译原理中的词法分析算是很重要的一个部分,原理比较简单,不过网上大部分都是用C语言或者C++来编写,笔者近期在学习Java,故用Java语言实现了简单的词法分析器. 要分析的代码段如下: 输出结果如下 ...

  3. Java语言的词法分析器的Java实现

    一.实验目的 1. 学会针对DFA转换图实现相应的高级语言源程序. 2. 深刻领会状态转换图的含义,逐步理解有限自动机. 3. 掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理. 二.实验内 ...

  4. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  5. Atitit onvif协议获取rtsp地址播放java语言 attilx总结

    Atitit onvif协议获取rtsp地址播放java语言 attilx总结 1.1. 获取rtsp地址的算法与流程1 1.2. Onvif摄像头的发现,ws的发现机制,使用xcf类库1 2. 调用 ...

  6. AVL树原理及实现(C语言实现以及Java语言实现)

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...

  7. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  8. JAVA语言搭建白盒静态代码、黑盒网站插件式自动化安全审计平台

    近期打算做一个插件化的白盒静态代码安全审计自动化平台和黑盒网站安全审计自动化平台.现在开源或半开源做黑盒网站安全扫描的平台,大多是基于python脚本,安全人员贡献python脚本插件增强平台功能.对 ...

  9. 关于Java语言和面向对象记录

    本科时常用的c语言是面向过程的语言,而Java是面向对象的语言 Java语言的11个关键术语 简单性.可移植性.面向对象.分布式.高性能.解释型.健壮性.多线程.安全性.动态性.体系结构中立 面向对象 ...

随机推荐

  1. 快速解决mysql Lost connection to MySQL server at 'reading initial communication packet及can't connect to mysql server on 'localhost'

    今天在使用Navicat连一个远程mysql时,总是提示连接不成功,提示Lost connection to MySQL server at 'reading initial communicatio ...

  2. jsp 单机和双击事件

    公司要求给一个按钮加一个双击和单机事件  整理了一下   做个笔记 HTML  单机和双击事件 <a href="javascript:void(0)" ondblclick ...

  3. linux搭建一个配置简单的nginx反向代理服务器 2个tomcat

    1.我们只要实现访问nginx服务器能跳转到不同的服务器即可,我本地测试是这样的, 在nginx服务器里面搭建了2个tomcat,2个tomcat端口分别是8080和8081,当我输入我nginx服务 ...

  4. [编]IoT The Internet of Things (IoT) 物联网

    物联网是新一代信息技术的重要组成部分.其英文名称是“The Internet of things”.由此,顾名思义,“物联网就是物物相连的互联网”.这有两层意思:第一,物联网的核心和基础仍然是互联网, ...

  5. 自定义input[type="radio"]的样式

    对于表单,input[type="radio"] 的样式总是不那么友好,在不同的浏览器中表现不一. 为了最大程度的显示出它们的差别,并且为了好看,首先定义了一些样式: <fo ...

  6. iOS使用Core Graphics和UIBezierPath绘画

    通过UIView的子类的- (void)drawRect:(CGRect)rect 函数可用对视图进行重新绘画: 要重新绘画可以通过Core Graphics和UIBezierPath来实现. 1.通 ...

  7. fullpage.js 结合固定导航栏—实现定位导航栏

    开始制作自己的个人简历啦,决定要使用固定导航栏,又打算使用fullpage.js做全屏滚动. 仔细看了fullpage文档之后,发现不用额外写js代码就可以实现以下效果: 1.当滚动翻页时,导航栏也自 ...

  8. Django项目中model增加了新字段怎样更新?

    Django是不直接支持syncdb更新数据库的字段的,必须重新建立. 或者改一个表名新建一个表... 刚刚想出来一招: 自己在表上面先加一个字段,然后再在model上面改,貌似是可以的.

  9. POJ 1845 Sumdiv 【逆元】

    题意:求A^B的所有因子之和 很容易知道,先把分解得到,那么得到,那么 的所有因子和的表达式如下 第一种做法是分治求等比数列的和  用递归二分求等比数列1+pi+pi^2+pi^3+...+pi^n: ...

  10. Android网络之数据解析----使用Google Gson解析Json数据

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...