采用java图形化界面编写了java语言的词法分析器,该分析器可识别所有java关键字。软件工程课程中编译原理实验。

Keyword.jvav
package org.kyc.test1;public class Keyword {private String keyword; //存储关键字字符private int keywordindex;//存储关键字的下标Keyword[] keyW;//存储关键字对象的数组public Keyword(){//构造数组keyW=setKeywordList();}public Keyword(String str,int t){setKeyword(str);setKeywordindex(t);}public String getKeyword() {return keyword;}public void setKeyword(String keyword) {this.keyword = keyword;}public int getKeywordindex() {return keywordindex;}public void setKeywordindex(int keywordindex) {this.keywordindex = keywordindex;}/*** 创建关键字列表* @return*/public  Keyword[] setKeywordList(){final int    PRIVATE=30;// private私有的final int  PROTECTED=31;// protected受保护的final int PUBLIC=32 ;//public 公共的//类、方法和变量修饰符final int   ABSTRACT=33;//abstract 声明抽象final int   ClASS=34;// class类final int    EXTEND=35;//extends 扩允,继承final int   FINAL=36;//final 终极,不可改变的final int   IMPLEMENTS=37;//implements实现final int  INTERFACE=38;//interface 接口final int   NATIVE=39;//native 本地final int NEW=40;//new 新,创建final int STATIC=41;//static 静态 final int    STRICTFP=42;//strictfp 严格,精准final int  SYNCHRONIZED=43;//synchronized 线程,同步final int  TRANSIENT=44;//transient 短暂final int   VOLATILE=45;//volatile 易失//程序控制语句final int BREAK=46;//break 跳出循环final int CONTINUE=47;//continue 继续final int RETURN=48;//return 返回final int DO=49;//do 运行final int WHILE=50;//while 循环final int   IF=51;//if 如果final int ELSE=52;// else 反之final int    FOR=53;//for 循环final int   INSTANCEOF=54;//instanceof 实例final int SWITCH=55;//switch 开关final int CASE=56;//case 返回开关里的结果final int   DEFAULT=57;//default 默认//错误处理final int CATCH=58;//catch 处理异常final int FINALLY=59;//finally 有没有异常都执行final int   THROW=60;//throw 抛出一个异常对象final int   THROWS=61;//throws 声明一个异常可能被抛出final int    TRY=62;//try 捕获异常//包相关final int    IMPORT=63;//import 引入final int   PACKAGE=64;//package 包//基本类型final int    BOOLEAN=65;//boolean 布尔型final int   BYTE=66;//byte 字节型final int   CHAR=67;//char 字符型final int    DOUBLE=68;//double 双精度,final int   FLOATE=69;//float 浮点final int  INT=70;//int 整型final int   LONG=71;//long 长整型final int    SHORT=72;//short 短整型final int  NULL=73;//null 空final int  TRUE=74;//true 真final int  FALSE=75;//false 假//变量引用final int  SUPER=76;//;super 父类,超类final int   THIS=77;//this 本类final int VOID=78;//void 无返回值final int   CONST=80;//constfinal int   GOTO=81;//gotoKeyword kwTable[] = { new Keyword("private", PRIVATE),new Keyword("protected", PROTECTED),new Keyword("public",  PUBLIC),//类、方法和变量修饰符new Keyword("abstract"    ,ABSTRACT), // 声明抽象new Keyword("class",   ClASS), // 类new Keyword("extends" ,EXTEND), // 扩允,继承new Keyword("final"   ,FINAL), // 终极,不可改变的new Keyword("implements"    ,IMPLEMENTS), //实现new Keyword("interface",    INTERFACE), // 接口new Keyword("native",    NATIVE), // 本地new Keyword("new"   ,NEW),// 新,创建new Keyword("static" ,STATIC), // 静态 new Keyword("strictfp" ,  STRICTFP), //严格,精准new Keyword("synchronized",SYNCHRONIZED), // 线程,同步new Keyword("transient" ,TRANSIENT), // 短暂new Keyword("volatile"  ,VOLATILE), // 易失//程序控制语句new Keyword("break"  ,BREAK), // 跳出循环new Keyword("continue"    ,CONTINUE), // 继续new Keyword("return" ,   RETURN), //返回new Keyword("do" ,DO), // 运行"new Keyword("while"  ,WHILE), //循环new Keyword("if",IF), // 如果new Keyword("else"  ,ELSE), //   反之new Keyword("for"  ,FOR), // 循环new Keyword("instanceof    ",INSTANCEOF), // 实例new Keyword("switch ",   SWITCH), //开关new Keyword("case",  CASE), // 返回开关里的结果new Keyword("default",  DEFAULT), // 默认//错误处理new Keyword("catch",     CATCH), //处理异常new Keyword("finally",  FINALLY), // 有没有异常都执行new Keyword("throw",  THROW), //抛出一个异常对象new Keyword("throws",  THROWS), // 声明一个异常可能被抛出new Keyword("try", TRY), // 捕获异常//包相关new Keyword("import",   IMPORT), // 引入new Keyword("package",   PACKAGE), // 包//基本类型new Keyword("boolean",   BOOLEAN), // 布尔型new Keyword("byte",   BYTE), // 字节型new Keyword("char",   CHAR), // 字符型new Keyword("double",   DOUBLE), // 双精度,new Keyword("float",  FLOATE), // 浮点new Keyword("int",  INT),// 整型new Keyword("long", LONG), // 长整型new Keyword("short", SHORT), // 短整型new Keyword("null", NULL), // 空new Keyword("true",    TRUE), // 真new Keyword("false",   FALSE), // 假//变量引用new Keyword("super",    SUPER), //, 父类,超类new Keyword("this",  THIS), // 本类new Keyword("void",   VOID), // 无返回值new Keyword("const" ,  CONST),new Keyword("goto",   GOTO), };return kwTable;}/** 判断字符串是否为关键字*/public boolean isKeyWord(String str){boolean b=false;for(int i=0;i<keyW.length;i++){if(keyW[i].getKeyword().equals(str)||keyW[i].getKeyword()==str){b=true;break; }}return b;}}
package org.kyc.test1;public class Operators {private String strOperators;private int flagOperators;private Operators[] oper;public Operators(){oper=setOperators();}public Operators(String str,int t){strOperators=str;flagOperators=t;}public String getStrOperators() {return strOperators;}public void setStrOperators(String strOperators) {this.strOperators = strOperators;}public int getFlagOperators() {return flagOperators;}public void setFlagOperators(int flagOperators) {this.flagOperators = flagOperators;}/*** 创建操作符列表* @return Operators[]*/public Operators[] setOperators(){Operators operators[]={new Operators(".",101),new Operators("(",102),new Operators(")",103),new Operators("[",104),new Operators("]",105),new Operators("+",106),new Operators("-",107),new Operators("++",108),new Operators("--",109),new Operators("~",110),new Operators("!",111),new Operators("*",112),new Operators("/",113),new Operators("//",114),new Operators("<<",115),new Operators(">>",116),new Operators(">>>",117),new Operators(">",118),new Operators(">=",119),new Operators("<=",120),new Operators("==",121),new Operators("!=",122),new Operators("&",123),new Operators("|",124),new Operators("?",125),new Operators(":",126),new Operators("=",127),new Operators("+=",128),new Operators("-=",129),new Operators("/=",130),new Operators("%=",131),new Operators("&=",132),new Operators("|=",133),new Operators("^=",134),new Operators("<<=",135),new Operators(">>=",136),new Operators(">>>=",137),new Operators(";",140),new Operators("{",141),new Operators("}",142),new Operators("\"",143),new Operators("\'",144),new Operators("@",145),new Operators("$",146),new Operators("\\",147),new Operators(",",148)};return operators;}public boolean isOperator(String str){// 判断字符是否是操作符boolean b=false;for(int i=0;i<oper.length;i++){if(oper[i].getStrOperators().equals(str)||oper[i].getStrOperators()==str){b=true;break;}}return b;}public boolean isOperator(char c){// 判断字符是否是操作符boolean b=false;for(int i=0;i<oper.length;i++){if(oper[i].getStrOperators().equals(c)||oper[i].getStrOperators().charAt(0)==c){b=true;break;}}return b;}public int getNumber(String str){//返回与字符对应的数字int f=0;for(int i=0;i<oper.length;i++){if(oper[i].getStrOperators().equals(str)||oper[i].getStrOperators()==str){f=oper[i].getFlagOperators();break;}}return f;}public int getNumber(char c){int f=0;for(int i=0;i<oper.length;i++){if(oper[i].getStrOperators().equals(c)||oper[i].getStrOperators().charAt(0)==c){f=oper[i].getFlagOperators();break;}}return f;}
}
package org.kyc.test1;import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class CharacterAnalysis {final int ERROR=0;//错误final int LETTER=1;//字母final int NUM=2;//数字final int NOTE=3;//注释的private char[] prog;//存储所扫描的程序private int progIndex;//扫描的下标private String token;//获取到的字符串final int PROG_SIZE = 1000000;// 将关键字的外部表示,和内部表示保存在一个名为KeyWordTable的表中Keyword keyword=new Keyword();Keyword keywordTable[] =keyword.setKeywordList();Operators operator=new Operators();Operators operatorsTable[]=operator.setOperators();Object [][] list=new Object[65635][2];int List_index=0;public CharacterAnalysis(File file_choosed) throws IOException {//实现将文件中的字符存到数组中char tempbuf[] = new char[PROG_SIZE];int size=0;try {FileReader fr = new FileReader(file_choosed);BufferedReader br = new BufferedReader(fr);size = br.read(tempbuf, 0, PROG_SIZE);fr.close();} catch (FileNotFoundException exc) {System.out.print("没有找到该文件!");}if (size != -1) {prog = new char[size];System.arraycopy(tempbuf, 0, prog, 0, size);   }}public void Analyse(String str){this.prog=str.toCharArray();try {Analyse();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void Analyse() throws IOException {// 对代码扫描do {token = "";// 跳过空格符while(isSpaceOrTab(prog[progIndex])||isnextline(prog[progIndex])){while (isSpaceOrTab(prog[progIndex])){progIndex++;if(progIndex>=prog.length)break;}// 处理换行while (isnextline(prog[progIndex])) {progIndex ++;if(progIndex>=prog.length)break;}if(progIndex>=prog.length)break;}if(progIndex>=prog.length){break;}/** 判断是否为注释,并作处理*/else if(isMark()){System.out.println("注释:"+token+"  "+NOTE);AddTolist("注释:"+token,NOTE);continue;}/**    是一个操作符,或者是运算符*/else if (operator.isOperator(prog[progIndex])) {//System.out.println("是个操作符");token += prog[progIndex];progIndex++;//继续判断是否为两个符号组成在一起的操作符if (operator.isOperator(prog[progIndex])){//判端接下来的操作符是否和前面的操作符能够组成在一起token += prog[progIndex];progIndex++;if (operator.isOperator(token)){//说明组成在一起了System.out.println(token+"  "+operator.getNumber(token));AddTolist(token,operator.getNumber(token));continue;}else{//说明组不到一起System.out.println(token.charAt(0)+" "+operator.getNumber(token.charAt(0)));System.out.println(token.charAt(1)+" "+operator.getNumber(token.charAt(1)));AddTolist(token.charAt(0),operator.getNumber(token.charAt(0)));AddTolist(token.charAt(1),operator.getNumber(token.charAt(1)));continue;}}else{System.out.println(token+"  "+operator.getNumber(token));AddTolist(token,operator.getNumber(token));continue;}} /** 是一个字符变量*/else if (Character.isLetter(prog[progIndex])) {while (Character.isLetterOrDigit(prog[progIndex])||prog[progIndex]=='_') {//System.out.println("是个字符变量");token += prog[progIndex];progIndex++;if (progIndex >= prog.length)break;}if (keyword.isKeyWord(token)){//说明是关键字for(int i=0;i<keywordTable.length;i++){if(token.equals(keywordTable[i].getKeyword())||token==keywordTable[i].getKeyword()){System.out.println(token+"   "+keywordTable[i].getKeywordindex());AddTolist(token,keywordTable[i].getKeywordindex());break;}}}else{System.out.println(token + "   " + LETTER);AddTolist(token, LETTER);}} /**  是一个数字字符*/else if (Character.isDigit(prog[progIndex])) {while (Character.isDigit(prog[progIndex])) {token += prog[progIndex];progIndex++;if (progIndex >= prog.length)break;}System.out.println(token + "   " +NUM );AddTolist(token, NUM);}else  {System.out.println(token+"  "+ERROR);AddTolist(token, ERROR);progIndex++;continue;}} while (progIndex != prog.length);System.out.println("程序分析完毕");}private boolean isMark() {// TODO Auto-generated method stub//判断是否为注释部分if(prog[progIndex]=='/'&&prog[progIndex+1]=='/'){while(!isnextline(prog[progIndex])){token += prog[progIndex];progIndex++;}return true;}return false;}//判断是否为空格private boolean isSpaceOrTab(char c) {if (c == ' ' || c == '\t')return true;return false;}//判断是否为换行private boolean isnextline(char c){if(c== '\r'||c == '\n'){return true;}else{return false;}}public char[] getProg() {return prog;}public void AddTolist(String str,int num){list[List_index][0]=str;list[List_index][1]=num;List_index++;}private void AddTolist(char charAt, int num) {// TODO Auto-generated method stublist[List_index][0]=charAt;list[List_index][1]=num;List_index++;}
}

package org.kyc.test1;

package org.kyc.test1;import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;
import java.awt.Font;/*** 编译原理实验一——词法分析器* @author 康雨城* 2015/6/4*/
public class View extends JFrame {private JPanel contentPane;private JFileChooser fc;private JTextArea textArea;private CharacterAnalysis ob;private JTable table;private File file_choosed;String [] cloumnNames= {"词语","分析结果"};/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {View frame = new View();frame.setVisible(true);frame.setTitle("词法分析器");} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public View() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 750, 400);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(new GridLayout(1, 2, 0, 0));fc = new JFileChooser();fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);JPanel panel = new JPanel();contentPane.add(panel);panel.setLayout(null);JPanel panel_Left = new JPanel();panel_Left.setBounds(0, 297, 362, 54);panel.add(panel_Left);panel_Left.setLayout(new GridLayout(1, 2, 0, 0));JScrollPane Left_ScrollPane = new JScrollPane();Left_ScrollPane.setBounds(0, 0, 362, 297);panel.add(Left_ScrollPane);textArea = new JTextArea();Left_ScrollPane.setViewportView(textArea);JScrollPane RightScrollPane = new JScrollPane();contentPane.add(RightScrollPane);JButton btnSelectFile = new JButton("选取文件");btnSelectFile.setFont(new Font("宋体", Font.BOLD, 18));btnSelectFile.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {int i=fc.showOpenDialog(null);if(i==fc.APPROVE_OPTION){file_choosed = fc.getSelectedFile();try {ob = new CharacterAnalysis(file_choosed);textArea.setText(String.valueOf(ob.getProg()));} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}  }else {System.out.println("没有选择文件");}}});panel_Left.add(btnSelectFile);JButton btnAnalysis = new JButton("分析");btnAnalysis.setFont(new Font("宋体", Font.BOLD, 18));btnAnalysis.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {if(file_choosed==null){System.out.println("请选择文件!");}else{ob.Analyse();    table=new JTable(ob.list,cloumnNames);RightScrollPane.setViewportView(table);table.invalidate();}} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});panel_Left.add(btnAnalysis);}
}

编译原理——词法分析器相关推荐

  1. 【SEUSE】编译原理 - 词法分析器实验报告

    [SEU&SE]编译原理 - 词法分析器实验报告 README 一. 实验目的 二. 实验环境 1. 开发环境: 2. 运行环境 三. 实验内容 1. 主要内容 2. 主要功能 3. 种别码 ...

  2. 编译原理--词法分析器(python语言实现)

    词法分析器 最近在学习编译原理.由于实验要求有词法分析器,这里我就先记录一下词法分析器实现过程以及具体思路. 目标语言 此处我选择的目标语言是c语言的子集来进行词法分析. 实现语言 此处我选用的语言是 ...

  3. 编译原理词法分析器的c++实现

    一.题目的理解和说明 编译原理这门课是计算机专业的核心课程之一,是一门研究软件是什么,为什么可以运行,以及怎么运行的学科.编译系统的改进将会直接对其上层的应用程序的执行效率,执行原理产生深刻的影响.编 ...

  4. 编译原理———词法分析器

    1.目的 设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解. 2.实现功能:词法分析 输入:所给文法的源程序字符串. 输出:二元组(syn,token或sum)构成的序列.其 ...

  5. 南华大学编译原理----词法分析器的设计与实现、语法分析器的设计与实现

    下载链接:(各位同学不需要充钱哈,这种我也没有收益,去淘宝上面找个代下,大概0.5元就能下载实验报告,用来给同学们参考,下载积分不是我设置的,是网站自己默认的) ------------------- ...

  6. 编译原理——词法分析器的设计

    两种设计方案以及各自优缺点 我们先学手工构造 词法分析器手工构造 关系运算符的手工构造: 上面这个图其实我有点疑惑,下面说一下,我自己的理解 C语言中的关系运算符,有<. <=. > ...

  7. 编译原理—词法分析器(Java)

    1.当运行程序时,程序会读取项目下的program.txt文件 2. 程序将会逐行读取program.txt中的源程序,进行词法分析,并将分析的结果输出. 3. 如果发现错误,程序将会中止读取文件进行 ...

  8. 编译原理-词法分析器

    词法分析器 实验要求 1.根据以下的正规式,编制正规文法,画出状态图: 标识符 <字母>(<字母>|<数字字符>)* 十进制整数 0 | ((1|2|3|4|5|6 ...

  9. 编译原理词法分析器(C/C++)

    前言&思路 词法分析器不用多说,一开始我还不知道是什么样的,看了下别人的博客,再看看书,原来是输出二元组,这不就是字符串操作嘛.然后细看几篇博客,发现大都是用暴力判断来写的.我对代码重复性比较 ...

最新文章

  1. 世界人口钟实时数据_用数字孪生重新定义智慧城市,美象VR推出MxDATA智慧城市CIM数据可视化平台...
  2. java nio doug_Java NIO简介
  3. 支付系统路由系统设计
  4. 【css】文字溢出,显示省略符号(...)
  5. docker image 实践之容器化 ganglia
  6. 微服务框架下的思维变化-OSS.Core基础思路
  7. 计算器软件设计和计算机软件设计区别,求一个模拟计算器程序
  8. ROS project part 1: Ubuntu中安装opencv包以及相应的依赖
  9. Erlang/OTP设计原则(文档翻译)
  10. 开发人员学Linux(13):CentOS7安装配置IT设备监控系统Zabbix
  11. pythonqt项目_python GUI编程 QT5开发项目实战
  12. 35岁程序员失业后感慨:之前月薪2万,现在找5千的工作都没人要
  13. 西门子PLC s7-1200学习之路
  14. 审计专业毕业论文有什么好写一点的论文选题吗?
  15. 俞扬 新书_哇,太好了...新书
  16. C语言 逻辑运算符与逻辑表达式
  17. matlab画网格等高线,matlab绘制网格图
  18. 计算机c盘崩了,崩溃,C盘爆红了!试试这5款电脑清理工具,每一个都很实用
  19. 气球java游戏_气球游戏-2019腾讯笔试
  20. vue-live2d 看板娘

热门文章

  1. C语言预定义宏 __func__、__FUNCTION__、__LINE__、__FILE__、__DATE__、__TIME__
  2. 【深度学习的数学】接“2×3×1层带sigmoid激活函数的神经网络感知机对三角形平面的分类训练预测”,输出层加偏置b
  3. python 在python的class中的,self到底是什么?
  4. HTML页面引入另一个HTML页面,比如各个页面引入通用的网站头部、尾部、导航栏
  5. Mocha and Math 运算
  6. html通过php获取mysql数据_怎样借助PHP从HTML网页中获取phpmyadmin数据库里数据表的内容...
  7. Spring Cloud Alibaba:Sentinel 热点参数限流
  8. python保存快捷键_超详细的Sublime Text配置python教程
  9. springboot七牛云---报{“error“:“download token auth failed“}错误
  10. php跳转404_php伪静态.htaccess实现403,404跳转