一、实验目的

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

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

//业务代码:

  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.util.Vector;
  6.  
  7. public class JavaAnaylsis
  8. {
  9. private static String[] keyword =
  10. { "boolean", "byte", "char", "double", "false", "float", "int", "long",
  11. "new", "null", "short", "true", "void", "instanceof", "break",
  12. "case", "catch", "continue", "default", "do", "else", "for", "if",
  13. "return", "switch", "try", "while", "finally", "throw", "this",
  14. "super", "abstract", "final", "namtive", "private", "protected",
  15. "public", "static", "synchronized", "transient", "volatile",
  16. "class", "extends", "implements", "interface", "package", "import",
  17. "throws" };
  18. static String string;
  19. static String wordString;
  20. static Vector vc;
  21.  
  22. public JavaAnaylsis(String str) throws Exception
  23. {
  24. File inFile = new File(str);
  25. if (inFile.exists())
  26. {
  27. System.out.println("文件打开成功!!!");
  28. try
  29. {
  30. FileReader reader = new FileReader(inFile);
  31. BufferedReader br = new BufferedReader(reader);
  32. vc = new Vector();
  33. while ((string = br.readLine()) != null)
  34. {
  35. // 预处理 将一行的字符串连续的空格换成一个空格或将连续的制表符换成一个空格
  36. string = string.trim().replace(" +", " ")
  37. .replaceAll("\\t+", " ");
  38. // System.out.println(string);
  39. judgement();
  40. }
  41. br.close();
  42. } catch (FileNotFoundException e)
  43. {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47.  
  48. } else
  49. {
  50. System.out.println("文件打开失败");
  51. }
  52. }
  53.  
  54. /*
  55. * 判断读入的字符是否为字母
  56. */
  57. public static boolean isLetter(char c)
  58. {
  59. if ((c >= 'a' && c <= 'z') || (c > +'A' && c <= 'Z'))
  60. {
  61. return true;
  62. } else
  63. return false;
  64. }
  65.  
  66. /*
  67. * 判断读入的字符是否为数字
  68. */
  69. public static boolean isDigit(char c)
  70. {
  71. if (c >= '0' && c <= '9')
  72. {
  73. return true;
  74. } else
  75. return false;
  76. }
  77.  
  78. /*
  79. * 判断是否为关键字
  80. */
  81. public static boolean isKey(String ss)
  82. {
  83. int flag = 0;
  84. for (int i = 0; i < keyword.length; i++)
  85. {
  86. if (ss.equals(keyword[i]))
  87. {
  88. flag = 1;
  89. break;
  90. }
  91. }
  92. if (flag == 1)
  93. {
  94. return true;
  95. }
  96. return false;
  97. }
  98.  
  99. /*
  100. * 判断是否为运算符
  101. */
  102. public static boolean isSpilt(char ch)
  103. {
  104. if (ch == '+' || ch == '-' || ch == '|' || ch == '=' || ch == '&')
  105. {
  106. return true;
  107. } else
  108. return false;
  109. }
  110.  
  111. /*
  112. * 判断输入的字符并输出单词符号
  113. */
  114. public static void judgement() throws Exception
  115. {
  116.  
  117. char ch = 0;
  118. int m = 0;
  119. String str = null;
  120. for (int i = 0; i < string.length(); i++)
  121. {
  122. switch (m)
  123. {
  124. case 0:
  125. ch = string.charAt(i);
  126. // 判断是否为运算符使用超前搜索
  127. if (ch == '+' || ch == '-' || ch == '*' || ch == '/'
  128. || ch == '=' || ch == '>' || ch == '<' || ch == '!'
  129. || ch == '%' || ch == '|')
  130. {
  131. str = "";
  132. str += ch;
  133. if (ch == '+' || ch == '-' || ch == '>' || ch == '<'
  134. || ch == '!' || ch == '|' || ch == '&')
  135. {
  136. ch = string.charAt(i + 1); // 对下一个字符进行判断是否为运算符
  137. if (isSpilt(ch))
  138. {
  139. str += ch;
  140. m = 4;
  141. } else
  142. {
  143. ch = string.charAt(i - 1); // 不是运算符则进行回退操作
  144. m = 4;
  145. }
  146.  
  147. }
  148. }
  149. // 判断是否为界符
  150. else if (ch == ',' || ch == ';' || ch == '{' || ch == '}'
  151. || ch == '(' || ch == ')')
  152. {
  153. m = 5;
  154. }
  155. // 判断是否数字
  156. else if (isDigit((ch = string.charAt(i))))
  157. {
  158. str = "";
  159. str += ch;
  160. m = 3;
  161. }
  162. // 判断是否字母
  163. else if (isLetter(ch = string.charAt(i)))
  164. {
  165. str = "";
  166. str += ch;
  167. m = 2;
  168. }
  169. // 判断是否下划线或美元符号
  170. else if (ch == '_' || ch == '$')
  171. {
  172. str = "";
  173. str += ch;
  174. m = 2;
  175. } else
  176. {
  177. }
  178. break;
  179.  
  180. case 4:
  181. i--;
  182. System.out.println(("( 4 " + "“ " + str + " ” )"));
  183. wordString = ("( 4 " + "“ " + str + " ” )");
  184. vc.add(wordString);
  185. m = 0;
  186. break;
  187.  
  188. case 5:
  189. i--;
  190. System.out.println(("( 5 " + "“ " + ch + " ” )"));
  191. wordString = ("( 5 " + "“ " + ch + " ” )");
  192. vc.add(wordString);
  193. m = 0;
  194. break;
  195.  
  196. case 2:
  197. if (isLetter(ch = string.charAt(i)))
  198. {
  199. str += ch;
  200. } else
  201. {
  202. if (isKey(str))
  203. {
  204. System.out.println("( 1 " + "“ " + str + " ” )");
  205. wordString = ("( 1 " + "“ " + str + " ” )");
  206. vc.add(wordString);
  207. } else
  208. {
  209. System.out.println(("( 2 " + "“ " + str + " ” )"));
  210. wordString = ("( 2 " + "“ " + str + " ” )");
  211. vc.add(wordString);
  212. }
  213. i--;
  214. m = 0;
  215. }
  216. break;
  217.  
  218. case 3:
  219. if (isDigit((ch = string.charAt(i))))
  220. {
  221. str += ch;
  222. } else
  223. {
  224. System.out.println("( 3 " + "“ " + str + " ” )");
  225. wordString = "( 3 " + "“ " + str + " ” )";
  226. vc.add(wordString);
  227. i--;
  228. m = 0;
  229. }
  230. break;
  231. }
  232. }
  233. }
  234.  
  235. public static Vector getVector()
  236. {
  237. return vc;
  238.  
  239. }
  240. }

//界面代码:

  1. import java.awt.BorderLayout;
  2. import java.awt.Dimension;
  3. import java.awt.Toolkit;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.io.BufferedReader;
  7. import java.io.BufferedWriter;
  8. import java.io.File;
  9. import java.io.FileReader;
  10. import java.io.FileWriter;
  11. import java.io.IOException;
  12. import java.util.Iterator;
  13. import java.util.Vector;
  14.  
  15. import javax.swing.JButton;
  16. import javax.swing.JFileChooser;
  17. import javax.swing.JFrame;
  18. import javax.swing.JMenu;
  19. import javax.swing.JMenuBar;
  20. import javax.swing.JMenuItem;
  21. import javax.swing.JPanel;
  22. import javax.swing.JScrollPane;
  23. import javax.swing.JTextArea;
  24. import javax.swing.WindowConstants;
  25.  
  26. public class JavaFrame extends JFrame
  27. {
  28. private JTextArea textArea, textArea2;
  29. private JButton anaylisbButton;
  30. static String filename;
  31. static Vector vcVector;
  32.  
  33. public JavaFrame()
  34. {
  35. super();
  36. setTitle("Java词法分析器");
  37. setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); // 设置"关闭"按钮处理事件
  38. Toolkit tool = Toolkit.getDefaultToolkit(); // 创建工具栏
  39. Dimension screenSize = tool.getScreenSize(); // 获得屏幕大小
  40. setSize(800, 500); // 设置窗体大小
  41. setLocation((screenSize.width - getWidth()) / 2,
  42. (screenSize.height - getHeight()) / 2);
  43. JPanel scollJPanel = (JPanel) getContentPane(); // 获得内容面板
  44. setResizable(false); // 设置最大化按钮不能用
  45. JMenuBar menuBar = createMenu(); // 设置菜单项
  46. this.setJMenuBar(menuBar);
  47. // textArea=new TextArea();
  48. JScrollPane jScrollPane = new JScrollPane(textArea = new JTextArea(
  49. "源代码:" + "\n", 1000, 35));
  50. JScrollPane jScrollPane2 = new JScrollPane(textArea2 = new JTextArea(
  51. "词法分析后:" + "\n", 1000, 35));
  52. scollJPanel.add(jScrollPane2, BorderLayout.EAST);
  53. scollJPanel.add(jScrollPane, BorderLayout.WEST);
  54. JPanel buttonJPanel = new JPanel();
  55. anaylisbButton = new JButton("开始词法分析");
  56. anaylisbButton.addActionListener(new start());
  57. buttonJPanel.add(anaylisbButton);
  58. scollJPanel.add(buttonJPanel, "South");
  59. setVisible(true);
  60. }
  61.  
  62. private JMenuBar createMenu()
  63. {
  64. // TODO Auto-generated method stub
  65. JMenuBar menuBar = new JMenuBar();// 初始化菜单栏
  66. JMenu menu = new JMenu(" 文件 ");
  67. JMenu menu2 = new JMenu(" 窗口 ");
  68. menu2.setEnabled(false);
  69. JMenu menu3 = new JMenu(" 帮助 ");
  70. menu3.setEnabled(false);
  71. JMenu menu4 = new JMenu(" 格式 ");
  72. menu4.setEnabled(false);
  73. JMenuItem meun1 = new JMenuItem(" 打开 ");
  74. JMenuItem meun2 = new JMenuItem(" 保存 ");
  75. JMenuItem meun3 = new JMenuItem(" 另存为 ");
  76. JMenuItem meun4 = new JMenuItem(" 退出 ");
  77. meun4.addActionListener(new ActionListener()
  78. {
  79.  
  80. @Override
  81. public void actionPerformed(ActionEvent arg0)
  82. {
  83. // TODO Auto-generated method stub
  84. JavaFrame.this.dispose();
  85. }
  86. });
  87. meun1.addActionListener(new ActionListener()
  88. {
  89.  
  90. @Override
  91. public void actionPerformed(ActionEvent arg0)
  92. {
  93. // TODO Auto-generated method stub
  94. // 初始化文件选择框
  95. textArea.setText("源代码:" + "\n");
  96. JFileChooser fDialog = new JFileChooser("d:/");
  97. // 设置文件选择框的标题
  98. fDialog.setDialogTitle("请选择文件");
  99. // 弹出选择框
  100. int returnVal = fDialog.showOpenDialog(null);
  101. // 如果是选择了文件
  102. if (JFileChooser.APPROVE_OPTION == returnVal)
  103. {
  104. // 打印出文件的路径,你可以修改位 把路径值 写到 textField 中
  105. System.out.println(fDialog.getSelectedFile());
  106. filename = fDialog.getSelectedFile().toString();
  107. File inFile = new File(filename);
  108. try
  109. {
  110. FileReader reader = new FileReader(inFile);
  111. BufferedReader br = new BufferedReader(reader);
  112. String strings;
  113. while ((strings = br.readLine()) != null)
  114. {
  115. textArea.append(strings + "\n");
  116.  
  117. }
  118. br.close();
  119. } catch (Exception e)
  120. {
  121. // TODO: handle exception
  122. }
  123.  
  124. }
  125. }
  126. });
  127. meun2.addActionListener(new ActionListener()
  128. {
  129.  
  130. @Override
  131. public void actionPerformed(ActionEvent arg0)
  132. {
  133. // TODO Auto-generated method stub
  134.  
  135. JFileChooser jf = new JFileChooser("d:/");
  136. int value = jf.showSaveDialog(null);
  137.  
  138. if (value == JFileChooser.APPROVE_OPTION)
  139. { // 判断窗口是否点的是打开或保存
  140.  
  141. File getPath = jf.getSelectedFile(); // 取得路径
  142. System.out.println(getPath);
  143. try
  144. {
  145. FileWriter fWriter = new FileWriter(getPath);
  146. BufferedWriter out = new BufferedWriter(fWriter);
  147. Iterator iterator = vcVector.iterator();
  148. while (iterator.hasNext())
  149. {
  150. // textArea2.append(iterator.next().toString()+"\n");
  151. out.write(iterator.next().toString());
  152. out.newLine();
  153. }
  154. out.close();
  155. } catch (IOException e)
  156. {
  157. // TODO Auto-generated catch block
  158. e.printStackTrace();
  159. }
  160. } else
  161. {
  162. // 没有选择,即点了窗口的取消
  163. }
  164.  
  165. }
  166. });
  167. menu.add(meun1);
  168. menu.add(meun2);
  169. menu.add(meun3);
  170. menu.addSeparator();
  171. menu.add(meun4);
  172. menuBar.add(menu);
  173. menuBar.add(menu2);
  174. menuBar.add(menu4);
  175. menuBar.add(menu3);
  176. return menuBar;
  177. }
  178.  
  179. private class start implements ActionListener
  180. {
  181.  
  182. @Override
  183. public void actionPerformed(ActionEvent arg0)
  184. {
  185. // TODO Auto-generated method stub
  186. textArea2.setText("词法分析后:" + "\n");
  187. try
  188. {
  189. new JavaAnaylsis(filename);
  190. vcVector = new Vector();
  191. vcVector = JavaAnaylsis.getVector();
  192. Iterator iterator = vcVector.iterator();
  193. while (iterator.hasNext())
  194. {
  195. textArea2.append(iterator.next().toString() + "\n");
  196. }
  197. } catch (Exception e)
  198. {
  199. // TODO Auto-generated catch block
  200. e.printStackTrace();
  201. }
  202. }
  203. }
  204.  
  205. public static void main(String[] args)
  206. {
  207. new JavaFrame();
  208. }
  209. }

实验总结:我在编程的过程中一共花了一天的时间,而在纸上设计就大概花了半个小时吧,花了半天的时间去上机输入和调试,在这次的实验过程中花了近半天的时间去思考问题,也遇到了编程的过程的问题,主要在逻辑错误问题较多,开始时我以为我的逻辑无错误,还以为是其他的问题,最后静下来理清自己的逻辑,还是发现了出现了较严重的逻辑问题,通过在网上查阅相关的资料来解决问题.到最后还是基本完成了这个java词法分析器的实验.对于我自己的程序我认为还是可以应对基本的词法分析,能编出这个程序我感觉到有那么一点成就感,这次的实验让我进一步地熟悉了java语言,提高了我的编程思维能力,增大了我的兴趣爱好,巩固了我的知识.还有好......

  1.  

  

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. python代码学习day03-序列化学习pickle及json

    #!/usr/bin/env python #coding:utf8 import pickle,json import datetime dic1 = {'name':'alex', 'age':4 ...

  2. 提高IT团队工作效率的建议

    过分强调个人主义,不科学分工,内部成员的冲突等,都将导致IT团队没有凝聚力,直接影响团队合作项目的完成.如何提高团队工作效率,相信很多IT经理人都想过这类问题.日前,国外科技网站CIO撰文就如何提高I ...

  3. Heartbeat+LVS构建高可用负载均衡集群

    1.heartbeat简介: Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统.心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里 ...

  4. ejabberd常见配置说明

    1.数据库配置 ejabberd默认安装后使用的是自带的数据库,可以通过配置使用其他的数据库如Mysql.Sqlserver.Postgresql等数据库,Mysql数据库配置参见<Linux下 ...

  5. Memcached内存分配优化及使用问题

    前几天做了个Memcached的思考,并测试了一些数据,是关于如何提高Memcached内存使用率的问题.在启动memcached的时候可以加-f参数和-n参数.-f指定各slab里面chunk大小的 ...

  6. Java中的流

    一.Java中流的原理 流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行.设备可以是文件,网络,内存等. 四种基本流InputStream,Ou ...

  7. hdu-4452-Running Rabbits

    /* Running Rabbits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  8. fastDFS 一二事 - 简易服务器搭建(单linux)

    什么是FastDFS FastDFS是一个叫余庆的哥们用c语言编写的一款开源的分布式文件系统 功能有冗余备份.负载均衡.线性扩容等,高可用.高性能 可以用FastDFS搭建一套高性能的文件服务器集群提 ...

  9. Win8/8.1 .NET3.5安装失败

    .NetFramework 作为开发人员,很多情况都需要.NetFramework,在Win7及之前的系统上直接双击 .NetFramework的安装包就可安装了. Win8/8.1无法安装.Net3 ...

  10. Unity抗锯齿

    Unity抗锯齿设置是针对模型,对模型的阴影的锯齿设置无效,不知道我这样的理解是否正确. 遇到的问题 而我是要对灯光照射在模型上产生的阴影进行抗锯齿,暂时还未研究出解决方案,希望知道的朋友告知一声. ...