一、实验目的

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

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“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. Windows环境下maven 安装与环境变量配置

    Maven是一个项目管理的Java 工具,在JavaEE中,我们可以使用Maven方便地管理团队合作的项目,现在我们在学习JavaEE框架,使用Maven可以管理类库,有效方便地供团队中的其他人员使用 ...

  2. 入门 ARM 汇编(一)—— 知识铺垫

    我读着史铁生的散文,零碎的牵扯起我生命中不曾出现过的记忆,一如北方的黄山厚土之中悠忽而来的忧伤的信天游,那些灿若信仰一样的阳光以及阳光下虔诚的子民.我想有一次远行,于细碎流淌的时光与路途之中,观察所有 ...

  3. Microsoft Community

    一.简介 Microsoft Community 是一个免费社区和讨论论坛,项目开发遇到的问题可以在这里进行提出和解答. 二.地址 http://answers.microsoft.com/zh-ha ...

  4. 字符串长度函数strlen()

    如下是我的测试文件: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { ...

  5. Android+Sqlite 实现古诗阅读应用(一)

    不说网络app,很多本地的app都有一些随机的内容推送,比如随机推送一些小知识,古诗,名言名画什么的,界面制作的好看一点就能看起来特别的文艺范, 最近就是看了这样的一些应用,就想自己实现一下,这种方法 ...

  6. 票据OCR前预处理 (附Demo)

    发一个去年做的一个去除票据干扰项的demo,核心处理是移除红色印章,不破坏红印叠加处的文字. 只是一个小小demo,还没具体进行进一步优化. 也不知道什么时候才有精力继续优化它. 现在放出来给大家试用 ...

  7. 你知道的display的值有多少?用了多少?

    它的语法如下: display:none | inline | block | list-item | inline-block | table | inline-table | table-capt ...

  8. 紧接上篇,jQuery调用jsonp,并且在页面上展示

    在上篇中提到了spring4.1+支持jsonp的调用,做了个例子,用来在页面上展示jsonp: (js写的丑了点,本人后端出生,前端大侠们轻拍~) var Menu = function () { ...

  9. Blend Tree Type

    1D 只有一个参数,用于控制状态之间的切换 2D Simple Directional 2D Simple Directional   :具有方向性的动画片段,同一方向上最好不要有多个动画片段 2D ...

  10. UICollectionView移动

    collectionView在iOS9中发布了一个可以移动cell的新特性,实现如下: 1.创建collectionView并设置代理 - (UICollectionView *)collection ...