import javax.swing.*;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class lexical {//基本词义设置 lineno = 1//    column = 1static public int column=0,lineno=1;
public enum lexer{TK_PLUS ("+"),TK_MINUS("-"),TK_MUL("*"),TK_DIV("/"),TK_NEG("unary-"),TK_LT("<"),TK_GT(">"),TK_EQ("=="),TK_NE("!="),TK_GE(">="),TK_LE("<="),TK_LPAREN("("),TK_RPAREN(")"),TK_LBRACE("{"),TK_RBRACE("}"),TK_LBRACK("["),TK_RBRACK("]"),TK_COMMA(","),TK_SEMICOLON(";"),ERROR("error!!!!!"),TK_RETURN("return"),TK_INT("int"),TK_IF("if"),TK_THEN("then"),TK_ELSE("else"),TK_IDENT("IDENT"),TK_INTEGER_CONST ("INTEGER_CONST"),TK_ASSIGN("="),TK_EOF("EOF"),;// 定义一个 private 修饰的实例变量private String date;// 定义一个带参数的构造器,枚举类的构造器只能使用 private 修饰private lexer(String date) {this.date = date;}// 定义 get set 方法public String getDate() {return date;}}public lexer getType(String k){int ding;for (int i = 0; i< lexer.values().length; i++){if (lexer.values()[i].getDate()==k){ return lexer.values()[i]; }}return lexer.ERROR;}public String readFile() throws IOException {BufferedReader in = new BufferedReader(new FileReader("textoffer/test.txt"));String str,allline = "";while ((str = in.readLine()) != null) {allline+=str;}return allline;}//判别是否是字母public Boolean aA(String a){int tem=a.compareTo("a");int tem1=a.compareTo("z");int tem2=a.compareTo("A");int tem3=a.compareTo("Z");if (tem>=0&&tem1<=0)return true;else if (tem2>=0&&tem3<=0) {return true;}else return false;}//判断是否为数字public Boolean numberChoose(String a){int tem=a.compareTo("0");int tem1=a.compareTo("9");if (tem>=0&&tem1<=0){return true;}return false;}//是否在enom里面public lexer getTheType(String a){for (int i=0;i<lexer.values().length;i++){if (a.equals(lexer.values()[i].getDate())){return lexer.values()[i];}}return lexer.TK_IDENT;}//是否为双字符public Boolean doubleRe(String allline,int oneTwo){String b=allline.substring(oneTwo,oneTwo+2);if (b.equals("==")||b.equals(">=")||b.equals("<=")||b.equals("!="))return true;return false;}//是否为连串数字public Token num(String allline){Token token;int old_column=column;int step=0;String result="";while (numberChoose(allline.substring(step,step+1))){result+=allline.substring(step,step+1);step++;}column=old_column+step;token=new Token(lexer.TK_INTEGER_CONST,result,lineno,column,step);return token;}//下一个词分析public Token get_next_token(String allline){Token token;int start=0;while (allline.length()-start>0){//删除空格if (allline.substring(start,start+1).equals(" ")){start++;continue;}//数字串if (numberChoose(allline.substring(start,start+1))){token=num(allline);return token;}//文字串或者if int等if (aA(allline.substring(start,start+1))){String result=allline.substring(start,start+1);start++;while (aA(allline.substring(start,start+1))||numberChoose(allline.substring(start,start+1))){result+=allline.substring(start,start+1);start++;}column+=start;token=new Token(getTheType(result),result,lineno,column,start);return token;}if (allline.length()-start>1){if (doubleRe(allline,start)) {column += 2;column += start;token = new Token(getType(allline.substring(start, start + 2)), allline.substring(start, start + 2), lineno, column, 2);}else if (getTheType(allline.substring(start,start+1))!=lexer.TK_IDENT){column++;column+=start;return token=new Token(getTheType(allline.substring(start,start+1)),allline.substring(start,start+1),lineno,column,1);}else {return token=new Token(lexer.ERROR,lexer.ERROR.getDate(),lineno, column,start);}}else if (getTheType(allline.substring(start,start+1))!=lexer.TK_IDENT){column++;column+=start;return token=new Token(getTheType(allline.substring(start,start+1)),allline.substring(start,start+1),lineno,column,1);}else {return token=new Token(lexer.ERROR,lexer.ERROR.getDate(),lineno, column,start);}}return token=new Token(lexer.TK_EOF,null,lineno,column,0);}//词法分析器两大基操,其一,正确翻译,其二错误报告//正确翻译//错误报告
//     def gather_all_tokens(self):
//        token = self.get_next_token()
//        self.tokens.append(token)
//        while token.type != TokenType.TK_EOF:
//            token = self.get_next_token()
//            self.tokens.append(token)
//        return self.tokenspublic List<Token> list=new ArrayList<>();public List<Token> gather_all_tokens(String alllist){Token token=get_next_token(alllist);list.add(token);String newAlllist=alllist.substring(column);while (token.type!=lexer.TK_EOF){token=get_next_token(newAlllist);list.add(token);newAlllist=alllist.substring(column);}return list;}public static void main(String[] args) {lexical lexical=new lexical();try {String allline=lexical.readFile();lexical l=new lexical();List<Token> list1= l.gather_all_tokens(allline);for (int i=0;i<list1.size();i++){System.out.println(list1.get(i).type+" "+list1.get(i).value+" "+list1.get(i).column);}} catch (IOException e) {throw new RuntimeException(e);}}
}

词法分析器--简易版相关推荐

  1. 用Lex编写的简易版C语言词法分析器(编译原理大作业1)

    本文讲解关于如何用lex工具来编写一个简易版的C语言的词法分析器.我主要通过一个完整的项目例子来进行讲解.当然这篇文章面向已经对lex有所了解但还不会具体运用的读者,如果对lex一无所知,请看我的另一 ...

  2. node.js——麻将算法(六)简易版麻将出牌AI1.0

    普通麻将的出牌AI如果不是要求特别高的话,其实蛮容易实现的,毕竟大多数人打牌都只是看自己的手牌. 所以作为简易版的AI,出牌的策略只要奔着胡牌去就可以了.我们能想到的就是把相邻或相同的牌凑到一起,把单 ...

  3. 从封装函数到实现简易版自用jQuery (一)

    温馨提示 本文阅读对象: 对 JavaScript 有一定的了解,如果你没有学过或者忘记 JavaScript 某些操作,请看 阮一峰 JavaScript 教程 . 导语 DOM 有许多 API , ...

  4. 利用python实现简易版的贪吃蛇游戏(面向python小白)

    前言 这篇文章主要给大家介绍了关于如何利用python实现简易版的贪吃蛇游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学 ...

  5. python车辆管理系统_Python简易版停车管理系统

    本文实例为大家分享了Python简易版停车管理系统的具体代码,供大家参考,具体内容如下 import time # 最大停车数 max_car = 100 # 当前停车数,初始为0 cur_car = ...

  6. 用Java写一个植物大战僵尸简易版!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/byeEj ...

  7. python实现简易版成绩管理系统_Python 实现简易版成绩管理系统!

    上一次,公众号介绍了如何使用 Python 实现单链表,下面让我们一探单链表的简单应用:在命令行,实现简易版成绩管理系统. 这次的简易版成绩管理系统,主要有六大功能:增加学生信息.删除学生信息.修改学 ...

  8. python成绩管理系统界面-python实现简易版学生成绩管理系统

    300来行python代码实现简易版学生成绩管理系统,供大家参考,具体内容如下 使用链表来实现 class Node(object): def __init__(self, data, pointer ...

  9. DFiddler:A HTTP Packets Listener一个简易版的手机端的Fiddler。

    Diddler A HTTP Packets Listener一个简易版的手机端的Fiddler. Android系统需要Root权限. PIC_20140121_220503_617.jpeg PI ...

  10. 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!

    零.准备工作 <dependencies><dependency><groupId>mysql</groupId><artifactId>m ...

最新文章

  1. 笔记-项目沟通管理-沟通基本原则
  2. 用键盘来操纵鼠标指针(鼠标损坏时的应急措施)
  3. 理解至上:二叉堆与优先队列详细用法
  4. EasyNVR、EasyDSS二次开发之:RTMP、HLS流在web页面进行无插件播放示例Demo代码
  5. 快速高效 | iOS身份证识别
  6. 微服务的好处与弊端_一文了解微服务的流程和组织
  7. xmind试用模式会过期吗_汽车发动机机油「保质期」概念解析:机油真的会过期吗?...
  8. javaaop模式供其他项目调用_结构性模型-静态代理模式
  9. smartsvn 使用
  10. php chm生成工具,phpDocumentor PHP 文档生成 CHM
  11. git远程代码回滚_git 远程分支回滚
  12. TestCenter测试管理工具环境配置(C)
  13. 颈椎病的康复锻炼方法
  14. 海外看病大火,盛诺一家获中信里昂千万美金级C轮融资
  15. matlab 在2k屏幕,如何将4k显示器的分辨率调整为2k,并将2k分辨率用于4k显示器
  16. DETR与Deformable DETR小结
  17. 被骗的还不够吗?物联网卡这个陷阱千万要注意!
  18. 基于大规模基因敲除实验揭示182个癌细胞免疫逃逸相关基因,指导肿瘤免疫治疗的研究
  19. 世界上第一台通用计算机用途,世界上第一台计算机的作用?
  20. lifekeeper +DR+windows for sql 双机

热门文章

  1. Matplotlib绘制立方体示意图-伪三维
  2. oracle 挖掘日志,使用Oracle的Logminer工具进行日志挖掘
  3. dell台式计算机主板电池,台式机主板电池怎么拆
  4. Unity 法线翻转
  5. Windows下使用Thunderbird实现邮箱的加密解密和签名认证
  6. 将Flutter添加到现有应用——过程中遇到的问题
  7. 为什么苹果日历不能设置日程_苹果自带日历hold每日待办日程提醒不再轻易miss日程...
  8. 翟菜花:睡眠里的经济掘金
  9. Java的sort用法深究,compare按照姓氏排序
  10. 唱响艾泽拉斯-泰兰德的拥抱专辑