一、 实验目的

设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

二、 实验内容

2.1 待分析的简单词法
(1)关键字:
begin if then while do end
所有关键字都是小写
(2) 运算符和界符
: = + - * / < <= <> > >= = ; ( ) #
(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:

(4)空格有空白、制表符和换行符组成。空格一般用来分隔、运算符、界符和关键字,词法分析阶段通常被忽略。

三、运行结果:


程序流程图


上面是自己画的流程图
下面是从网上copy 下来的转换图:(如果侵权了评论我 删除)

原文:https://wenku.baidu.com/view/aede6c4a0a1c59eef8c75fbfc77da26924c5964c.html

程序代码

注释还是比较多的尼,,但是bug 是一定有的,,,基本功能实现了

package com.compile;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;/*** @author JimmyYang.MJ* @Date: 2020/4/10 9:16*/
public class LexicalAnalysis {/**标识符 ID >> 正则表达式*/final static String ID = "\\p{Alpha}(\\p{Alpha}|\\d)*";/** 整形常数 NUM >> 正则表达式*/final static String NUM = "\\d\\d*";/** token 词法单元* <词符号, 种别码> *//** 关键字 token*/static Map<String, Integer> TOKEN_KEYWORDS;/** 运算符/界符 token */static Map<String, Integer> TOKEN_OPERATOR_BOUNDARY;/** 其他单词 token*/static Map<String, Integer> TOKEN_ID_SUM;/** 文件根目录*/static final String ROOT_DIRECTORY = "D:/IDEA-workspace/MyJAVA_DS/src/com/compile/";/*** 初始化 token 单元*/private static void initToken(){TOKEN_KEYWORDS = new HashMap<String, Integer>(){{put("begin", 1);put("if", 2);put("then", 3);put("while", 4);put("do", 5);put("end", 6);}};TOKEN_OPERATOR_BOUNDARY= new HashMap<String, Integer>(){{put("+", 13);put("-", 14);put("*", 15);put("/", 16);put(":", 17);put(":=", 18);put("<", 20);put("<>", 21);put("<=", 22);put(">", 23);put(">=", 24);put("=", 25);put(";", 26);put("(", 27);put(")", 28);put("#", 0);}};TOKEN_ID_SUM= new HashMap<String, Integer>(){{put(ID, 10);put(NUM, 11);}};}/*** 读 源程序 文件*/public static void ReadFile1() {FileInputStream fis = null;InputStreamReader isr = null;BufferedReader br = null;try {fis = new FileInputStream(ROOT_DIRECTORY + "program.txt");isr = new InputStreamReader(fis, "UTF-8"); // 转化类br = new BufferedReader(isr); // 装饰类String line;/** 记录 程序 行数 */int countLine = 1;while ((line = br.readLine()) != null) {  // 每次读取一行boolean answer = lexicalAnalysis(line);if(answer == false){System.out.printf("ERROR 编译错误=== 第 %d 行出现 词法错误 ", countLine);break;}countLine++;}System.out.printf("===编译完成===");} catch (Exception ex) {ex.printStackTrace();} finally {try {br.close(); // 关闭最后一个类,会将所有的底层流都关闭} catch (Exception ex) {ex.printStackTrace();}}}/** 判断key是否是其他单词*/private static boolean isIDOrSUM(String key){if (key.matches(ID) ) {System.out.printf("(%d, %s)\n", TOKEN_ID_SUM.get(ID), key);}else if (key.matches(NUM)) {System.out.printf("(%d, %s)\n", TOKEN_ID_SUM.get(NUM), key);}else {return false;}return true;}/*** 进行 词法分析* @param word 要分析的字符串* @return 结果*/public static boolean  lexicalAnalysis(String word){word = word.trim(); // 去 首尾 空格String[] strings = word.split("\\p{Space}+"); // 保证处理的字符串没有空格for (String string : strings) {/** 3种情况:*      1. 关键字 == end (关键字的后面一定是空格 )*      2. 运算符/ 分界符 == continue*      3. 其他单词 == continue*/String key = "";for (int i = 0; i < string.length(); i++){String indexChar = String.valueOf(string.charAt(i)) ;/** 是 运算符 或者 关键字*/if (TOKEN_OPERATOR_BOUNDARY.containsKey(indexChar) ||TOKEN_KEYWORDS.containsKey(string.substring(i, string.length()))){if (key.length() > 0) {if (isIDOrSUM(key) == false) {/** 词法错误 */return false;}key = "";}if(TOKEN_OPERATOR_BOUNDARY.containsKey(indexChar)) {/**  1. 是 运算符/分界符 */key += indexChar;if(i + 1 < string.length() && TOKEN_OPERATOR_BOUNDARY.containsKey(indexChar + string.charAt(i+1))){ // 运算分界符key += string.charAt(++i);}System.out.printf("(%d, %s)\n",TOKEN_OPERATOR_BOUNDARY.get(key),key);key = "";}else if(TOKEN_KEYWORDS.containsKey(key = string.substring(i, string.length()))) {/** 2. 是关键字*/System.out.printf("(%d, %s)\n",TOKEN_KEYWORDS.get(key),key);key = "";break;}}else {/** 是其他单词*/key += indexChar;/** 其他单词后面是 1. 换行,2. 运算符/界符 3. 其他单词*/if(i+1 >= string.length()){if (isIDOrSUM(key) == false) {/** 词法错误 */return false;}}}}}return true;}public static void main(String[] args) {initToken();System.out.println("==词法分析程序==");System.out.println("从文件中读取程序");System.out.println("==============");ReadFile1();System.out.println();}
}

实验一 词法分析程序设计与实现 (Java实现)相关推荐

  1. c语言词法分析程序实验报告,实验一词法分析程序设计与实现

    实验一 词法分析程序设计与实现 一.实验目的: 加深对词法分析器的工作过程的理解:加强对词法分析方法的掌握:能够采用一种编程语言实现简单的词法分析程序:能够使用自己编写的分析程序对简单的程序段进行词法 ...

  2. java实验四用户程序设计_20145329《Java程序设计》实验四总结

    实验四 Android环境搭建 实验内容 1.搭建Android环境 2.运行Android 3.修改代码,能输出学号 实验步骤 1.搭建Android环境 2.安装Android,核心是配置JDK. ...

  3. java实验2词法分析程序设计

    具体实现程序: import java.util.Scanner;public class Analyze_terms { private String keyWord[] = {"for& ...

  4. 编译原理实验一 词法分析程序设计与实现

    一.实验目的 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词构成的序列的词法分析方法. 二.基本实验内容与要求 假定一种高级程序 ...

  5. 实验1 词法分析程序设计

    [开发语言及实现平台或实验环境] C++/Clion [实验目的] (1)理解词法分析在编译程序中的作用 (2)加深对有穷自动机模型的理解 (3)掌握词法分析程序的实现方法和技术 [实验内容] 对一个 ...

  6. 实验一 词法分析程序设计_重庆新增一生物2级安全实验室,将着眼新冠病毒等药物检测分析...

    5月12日,上游新闻·重庆商报记者获悉,位于两江新区的迪纳利医药科技有限责任公司(下简称"迪纳利")将建立生物2级安全实验室(简称"BSL-2"),该实验室主要 ...

  7. 编译原理 实验二 词法分析程序设计

    1. 实验内容 ● TINY语言的词法由TINY Syntax.ppt描述: ● TINY语言的词法分析器由TINY Scanner.rar的C语言代码实现: ● TINY+语言的词法由TINY+ S ...

  8. 实验四 Android程序设计

    实验四 Android程序设计 课程:Java程序设计 班级:1652 姓名:孔月 学号:20165208 指导教师:娄嘉鹏 实验日期:2018.5.14 实验名称:Android程序设计 实验要求: ...

  9. 南邮java实验一报告_南邮JAVA程序设计实验1 综合图形界面程序设计

    实验目的: 学习和理解JAVA SWING中的容器,部件,布局管理器和部件事件处理方法.通过编写和调试程序,掌握JAVA图形界面程序设计的基本方法. 实验内容: 设计和编写一个用于将人民币转换为等值的 ...

最新文章

  1. MATLAB【九】————ICP算法实现
  2. Android自定义View全解
  3. NPM使用淘宝NPM镜像的使用方法汇总
  4. shell脚本之变量的作用域
  5. aliyun tianchi ai contest meeting note
  6. ONOS系统架构演进,实现高可用性解决方案
  7. 给ADSL用户的忠告
  8. MIPS汇编实现冒泡排序法
  9. buck电路pscad仿真_十二脉波整流器谐波抑制控制策略仿真
  10. 淘宝双12惊喜——“寻”千兆,万兆光模块等你来
  11. php字符串副职_PHP explode()函数
  12. pytorch ImageFolder
  13. 基于导频的信道估计实现
  14. kali linux 添加字体,在kali linux之下安装wps之后 报错字体缺失
  15. java 判断数字是否连续,JAVA 判断是否连续字母或者数字
  16. Windows XP 下载与安装-怀念过去
  17. android高仿今日头条,高仿今日头条App
  18. 打开Windows任务管理器的七种方法
  19. 《Linux7构搭建DISCUZ论坛 》
  20. 对机载预警雷达STAP的慢时调频干扰matlab

热门文章

  1. 自动驾驶领域常见英文缩写及其中文含义(不断完善中)
  2. 【Linux学习】信号——信号保存 | 信号处理 | 不可重入函数,volatile,SIGCHLD信号
  3. 部分淘宝店超低价卖商品是骗局
  4. 电脑无线(外网)和有线(内网)网络同时使用方法
  5. 基于改进的蚂蚁群算法求解最短路径问题、二次分配问题、背包问题【MatlabPython代码实现】
  6. Why is ksoftirqd using 100% of the CPU?
  7. 微信errcode大全
  8. 经验:如何快速地写出格雷码
  9. python用于导入模块或模块中的对象_在 Python 中导入模块中的对象有哪几种方式? (5.0分)_学小易找答案...
  10. 情怀——推荐梁晓声新作《未死的沙威》