使用JAVA实现PL0语言的词法分析器

用直接转向法实现有限自动机的代码

枚举类

import java.util.UUID;/*** @author HJC* @version 1.0* @apiNote PL0语言单词分类* @since 2021/11/6*/
public enum PL0 {IDENTIFIER("IDENTIFIER", 1),INTEGER("INTEGER", 2),ADD("+", 3),SUB("-", 4),MUL("*", 5),DIV("/", 6),EQL("=", 7),GT(">", 8),LT("<", 9),NE("<>", 10),LE("<=", 11),GE(">=", 12),LS("(", 13),RS(")", 14),LB("{", 15),RB("}", 16),SEM(";", 17),DOT(",", 18),YY("\"", 19),SET(":=", 20),VAR("var", 21),IF("if", 22),THEN("then", 23),ELSE("else", 24),WHILE("while", 25),FOR("for", 26),BEGIN("begin", 27),WRITELN("writeln", 28),PROCEDURE("procedure", 29),END("end", 30),ERROR(UUID.randomUUID().toString(), 100);private String word;private Integer value;PL0(String word, Integer value) {this.word = word;this.value = value;}public String getWord() {return word;}public void setWord(String word) {this.word = word;}public Integer getValue() {return value;}public void setValue(Integer value) {this.value = value;}
}

Node实体类(key,value)

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;/*** @author HJC* @version 1.0* @apiNote Node类* @since 2021/11/6*/
@Data
@Getter
@Setter
@AllArgsConstructor
public class Node {String key;Integer value;@Overridepublic String toString() {return "(" + value + "," + key + ")";}
}

主实现类

import javax.swing.*;
import java.io.*;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;/*** @author HJC* @version 1.0* @apiNote PL0语言的词法分析器实现* @since 2021/11/6*/
public class Main {/*代码段索引*/private static Integer index = 0;/*代码段*/private static String progress;/*输出处理结果的链表*/public static List<Node> list = new LinkedList<>();/*存取单词总类的哈希表*/public static Map<String, Integer> map = new HashMap<>();public static void main(String[] args) throws IOException {// 初始化单词分类init();// 初始化代码initPL0();System.out.println(progress);// 消除注释没有写// 分析代码analyzer();}private static void analyzer() {while (index < progress.length()) {// 扫描字段Node node = scanner();if (node != null) {list.add(node);}}// 输出字段list.forEach(System.out::println);}/**  扫描一个单词出来**/private static Node scanner() {StringBuilder tokenBuilder = new StringBuilder();// 跳过一些特定字符while (progress.charAt(index) == ' ' || progress.charAt(index) == '\n' || progress.charAt(index) == '\t' || progress.charAt(index) == '\r') {index++;if (index >= progress.length()) {return null;}}// 字母开头if (Character.isLetter(progress.charAt(index))) {while (Character.isLetter(progress.charAt(index)) || Character.isDigit(progress.charAt(index)) || progress.charAt(index) == '_') {tokenBuilder.append(progress.charAt(index));index++;}String res = tokenBuilder.toString();// 关键字if (map.containsKey(res)) {return new Node("\"" + res + "\"", map.get(res));// 标识符} else {return new Node("\"" + res + "\"", PL0.IDENTIFIER.getValue());}}// 数字开头if (Character.isDigit(progress.charAt(index))) {boolean floatFlag = false;while (Character.isDigit(progress.charAt(index)) || progress.charAt(index) == '.') {if (!floatFlag && progress.charAt(index) == '.') {floatFlag = true;}if (floatFlag && progress.charAt(index) == '.') {throw new IllegalArgumentException("语法不正确");}tokenBuilder.append(progress.charAt(index));index++;}return new Node(tokenBuilder.toString(), PL0.INTEGER.getValue());}// 符号switch (progress.charAt(index)) {// 冒号case ':':if (progress.charAt(index + 1) == '=') {index += 2;//:=return new Node("\"" + PL0.SET.getWord() + "\"", PL0.SET.getValue());} else {// 单独的:index++;throw new IllegalArgumentException("语法不正确,:的意思是:=嘛?");}case '<':// <>if (progress.charAt(index + 1) == '>') {index += 2;return new Node("\"" + PL0.NE.getWord() + "\"", PL0.NE.getValue());}// <=if (progress.charAt(index + 1) == '=') {index += 2;return new Node("\"" + PL0.LE.getWord() + "\"", PL0.LE.getValue());}index++;return new Node("\"" + PL0.LT + "\"", PL0.LT.getValue());case '>':if (progress.charAt(index + 1) == '=') {index += 2;return new Node("\"" + PL0.GE.getWord() + "\"", PL0.GE.getValue());}index++;return new Node("\"" + PL0.GT.getWord() + "\"", PL0.GT.getValue());case '+':case '-':case '*':case '/':case '=':case ';':case ',':case '"':// 无特殊字段,直接返回String res = String.valueOf(progress.charAt(index++));return new Node("\"" + res + "\"", map.get(res));default:index++;return null;}}private static void init() {for (PL0 v : PL0.values()) {map.put(v.getWord(), v.getValue());}}private static void initPL0() throws IOException {/*选择一个文件JFrame jFrame = new JFrame();JFileChooser jFileChooser = new JFileChooser();jFileChooser.showOpenDialog(jFrame);String path = jFileChooser.getSelectedFile().getPath();*/String path = "D:\\HJC\\Desktop\\编译原理\\pl01.txt";BufferedReader reader = null;try {System.out.println(path);reader = new BufferedReader(new InputStreamReader(new FileInputStream(path)));String str;StringBuilder stringBuilder = new StringBuilder();while ((str = reader.readLine()) != null) {stringBuilder.append(str).append('\n');}progress = stringBuilder.toString();} catch (Exception e) {e.printStackTrace();} finally {if (reader != null) {reader.close();}}}
}

处理结果

procedure divide;
var w;
beginr := x; q := 0; w := y;
end(29,"procedure")
(1,"divide")
(17,";")
(21,"var")
(1,"w")
(17,";")
(27,"begin")
(1,"r")
(20,":=")
(1,"x")
(17,";")
(1,"q")
(20,":=")
(2,0)
(17,";")
(1,"w")
(20,":=")
(1,"y")
(17,";")
(30,"end")进程已结束,退出代码为 0

使用JAVA实现PL0语言的词法分析器相关推荐

  1. mysql解释器_atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  2. 编译原理大作业-PL0语言编译器

    编译原理大作业-PL0语言编译器 一.实验目的 二.源码说明 1.头文件pl0.h (1 词法分析主要数据结构(通过enum symbol类实现) 1.保留字(13+4个): 2.运算符及界符(16+ ...

  3. java 全局变量_Java语言与C语言、C++语言有何差异以及优劣势

    差异 熟悉C语言和C++语言的读者一定想搞清楚这个问题,实际上,Java确实是从C语言和C++语言继承了许多成分,甚至可以将Java看成是类C语言发展和衍生的产物.比如Java语言的变量声明.操作符的 ...

  4. arduino与java,Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境

    Arduino具有与Java和C语言类似的IDE集成开发环境和图形化编程环境 更多相关问题 听力原文:W: Hi, Steve, good to see you are up and around a ...

  5. JAVA调用R语言之Rserve(二)

    之前,我写了一篇文章是java调用R语言之Rserve,但我发现那种方法比较麻烦.后来我发现了一个比较方便的方法,所以今天从又写了一篇博客,来简单说说. 这次我们需要写一个简单的R语言脚本,然后通过运 ...

  6. atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97

    atitit.js javascript 调用c# java php后台语言api html5交互的原理与总结p97 1. 实现html5化界面的要解决的策略1 1.1. Js交互1 1.2. 动态参 ...

  7. 【Groovy】Groovy 语言特点简介 ( 支持 Java 语法 | 支持 Java 虚拟机 | Groovy 语言是动态语言 | Groovy 扩展 JDK | 编译时元编程 )

    文章目录 一.Groovy 支持 Java 语法 二.Groovy 支持 Java 虚拟机 三.Groovy 语言是 动态语言 四.Groovy 扩展 JDK 五.Groovy 编译时元编程 一.Gr ...

  8. 人工智能用python还是java_学会java和python语言,可以开始搞人工智能吗?

    作为一名软件开发工程师,个人认为,当你学会Java和Phthon语言使用后,不建议你直接上手人工智能.下面我来说一下个人看法: 人工智能领域门槛较高 人工智能对于一般同学而言,其入门门槛相对较高,你虽 ...

  9. 学完java学swift_前言最近学完Swift之后一直没有机会实战,发现由于Swift发展历史原因,目前网上大部分的算法都是使用C、Java或其他语言实现的,几乎没有使用Swift实...

    前言 最近学完Swift之后一直没有机会实战,发现由于Swift发展历史原因,目前网上大部分的算法都是使用C.Java或其他语言实现的,几乎没有使用Swift实现的,所以自己打算使用Swift去实现一 ...

  10. java接收c语言的结构体

    java接收c语言的结构体 DataInputStream inputStream = new DataInputStream(s.getInputStream()); int read = 0; i ...

最新文章

  1. j2ee关于响应头的传输猜想
  2. 数据表格搜索php代码_手把手教学:提取PDF各种表格文本数据(附代码)
  3. 2014 Super Training #10 D 花生的序列 --DP
  4. leetcode 970. 强整数(Powerful Integers)
  5. 参考的datalist分页helper
  6. win下常用快捷鍵及其作用
  7. ic卡消费管理系统_详述食堂消费系统的功能特点
  8. 漆桂林:多模态知识图谱种类及其应用
  9. win10远程电脑连接
  10. m3 pcb开孔 螺丝_螺丝过孔工艺孔底孔尺寸参照表
  11. 本科课程【数字图像处理】实验1 - 腐蚀与膨胀
  12. CCS错误解决:#10247-D null: creating output section “ramfuncs“ without a SECTIONS specification
  13. 百度注册登录页面简单实现——仿照
  14. Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) G. Sum the Fibonacci(子集卷积)
  15. 【图像处理】记一次粗心:未加载opencv_world300d.dll
  16. Unity 导航系统Navigation
  17. Arduino与Proteus仿真实例-LCD12864液晶显示屏(ST7920)驱动仿真
  18. 想做AR/VR相关创新项目,有什么好方向?要怎么做?
  19. 如何去掉CSDN中图片水印
  20. 中国平安增持华夏幸福5.69%股权

热门文章

  1. 模块一 day06 数据类型(中)
  2. MLX90614 非接触式红外测温
  3. Sourcetree中使用cherry-pick
  4. 反证法与归谬法的区别
  5. [Kaldi] MFCC特征提取源码详解
  6. 淘宝标品运营技巧,标品如何实现小单量爆搜索
  7. 后盾网php项目开发实例,后盾网thinkphp许愿墙html源码
  8. iOS 音乐播放 Swift
  9. html5拆红包源码,最新1月拆红包源码强制分享朋友圈分享群防封裂变红包游戏
  10. 去掉桌面图标蓝底的方法