计算机专业软件类课程实验报告课程名称:编译原理实验题目:词法分析器设计实验小组成员:实验小组组长:任课教师:专业名称:计算机科学与技术班级名称:计科1班实验起止时间:2014-5-8~2014-5-15一、实验目的1、要求设计交互界面,能输入能转换能输出,形式和风格自定。2、设计一个词法分析程序,理解词法分析器实现的原理,掌握程序设计语言中的各类单词的词法分析方法,加深对词法分析原理的理解。二、实验内容1、对给定的程序通过词法分析器能够识别一个个单词符号,并以三元式(单词行号,单词符号的属性值,单词符号类别)显示。如果有错误,统计总共有多少个错误,并且将每个错误所在行号,以及属于哪种错误显示出来。2.本程序自行规定:(1)关键字program,example,const,var,interger,begin,void,String,System,out,println,end,if,else,for,char,to,do,then(2)运算符=,=,++,:,|,*,+,%,-,/(3)界符;,{,},(,),,(4)标识符以字母或下划线开头的字符串表示(5)常量用数字表示(6)空格、回车、换行符跳过3、在屏幕上显示如下:(1)Token表中显示:1program保留字1example保留字1;界符2const保留字2k标识符2=运算符2200常量(2)错误信息显示:2errors42a格式不正确4034不能以0开头三、实验需求1、界面部分:需要对文件有打开、保存、另存为的功能;对文本有撤销、剪切、复制、粘贴、复制、删除、全选的功能2、词法分析器:对读入的程序一个字符一个字符的进行词法分析,识别出一个个单词符号,并以三元式(单词行号,单词符号的属性值,单词符号类别)显示。如果有错误,统计总共有多少个错误,并且将每个错误所在行号,以及属于哪种错误显示出来。四、主要数据结构介绍使用三个数组分别来存放关键字、运算符、界符,凡是不属于这三个数组的所有合法字符串当做标识符处理,凡是不属于这三个数组的所有合法数字当做常量处理,其余情况则进行出错处理五、主要模块算法介绍1、对输入的程序进行处理:空格、回车、换行符跳过,并按照;、=、,、:等符号将字符串切割开来,同时对字符串使用toCharArray()转换成单个字符,求出切割符号在字符串中的位置,并将它们与切割好的字符串重新组合,使它们与输入程序相同2、对第一步得到的字符串数组进行一个一个的检查,如果字符串在table1中,则表明是运算符,将状态标记为1;如果字符串在table2中,则表明是保留字,将状态标记为2;如果字符串在table3中,则表明是界符,将状态标记为33、如果对当前的字符串不在这三个数组中,且数字序列又是合法的,则表明是常量,将状态标记为4;如果对当前的字符串不在这三个数组中,且字符序列又是合法的,则表明是标识符,将状态标记为54、如果对当前的输入不满足前5个状态,且字符序列不是以下划线、字母开头,则表明输入的格式不正确,将状态标记为6;如果对当前的输入不满足前5个状态,且字符序列是以0开头的数字序列,则表明输入的常量是以0开头的,这是非法格式,将状态标记为75、将最终的结果打印输出到文本框中六、程序实现环境及使用说明本次实验采用Eclipse进行代码的编写、编译及运行;编写语言为java语言;程序的运行环境为jdk1.8;系统为windows8.1七、实验测试用例设计说明1、正常的测试,这种情况下不会报错programexample;constk=2;vara:interger;beginend2、错误的测试,这个例子中含有非法标识符和非法常量的错误programexample;constk=2a,c=300,d=034;vara:interger;beginend八、实验结果测试情况九、小组对实验结果的自我评价通过这次实验,我对词法分析器有了一定的了解,进一步的巩固了这部分的知识。懂得了词法分析器的工作原理。在编程过程中,遇到了不少的问题,在同学的帮助下,问题一步一步的得到了解决。先从实现最简单的扫描和输出,再实现扫描的范围扩大和输出的结果更加具体,虽然词法分析器的功能实现了,但是对于小数不能进行较好的分析。在算法上虽然是弄懂了词法分析器,但具体实现起来还有一些不足。由于编程能力和时间的不足,这个分析器还有待完善,没有把双目运算符考虑进来。对于出错处理也考虑得不够周到。望老师多多指教。十、任课教师对实验结果的评分源码FrameView.javapackageview;importjava.awt.BorderLayout;importjava.awt.Event;importjava.awt.FileDialog;importjava.awt.FlowLayout;importjava.awt.Font;importjava.awt.GridLayout;importjava.awt.ScrollPane;importjava.awt.datatransfer.Clipboard;importjava.awt.datatransfer.DataFlavor;importjava.awt.datatransfer.StringSelection;importjava.awt.datatransfer.Transferable;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyEvent;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;importjavax.swing.JFrame;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;importjavax.swing.JOptionPane;importjavax.swing.JPanel;importjavax.swing.JPopupMenu;importjavax.swing.JTextArea;importjavax.swing.KeyStroke;importjavax.swing.event.DocumentEvent;importjavax.swing.event.DocumentListener;importjavax.swing.event.UndoableEditEvent;importjavax.swing.event.UndoableEditListener;importjavax.swing.undo.UndoManager;importoperation.Analysis;publicclassFrameViewextendsJFrameimplementsActionListener,DocumentListener,UndoableEditListener{JFramef=newJFrame(词法分析器);ScrollPanejspa=newScrollPane();ScrollPanejspb=newScrollPane();ScrollPanejspc=newScrollPane();JPopupMenupop=newJPopupMenu();JTextAreata=newJTextArea();JTextAreatb=newJTextArea();JTextAreatc=newJTextArea();JPanelpa=newJPanel();JPanelpb=newJPanel();JOptionPanejop=newJOptionPane();UndoManagerum=newUndoManager();JMenuBarbar=newJMenuBar();JMenufile=newJMenu(文件);JMenuedit=newJMenu(编辑);JMenuanalysis=newJMenu(词法分析);JMenuhelp=newJMenu(帮助);JMenuItemopen=newJMenuItem(打开);JMenuItemsave=newJMenuItem(保存);JMenuItemsaveNew=newJMenuItem(另存为);JMenuItemexit=newJMenuItem(退出);JMenuItemback=newJMenuItem(撤销);JMenuItemcut=newJMenuItem(剪切);JMenuItemcopy=newJMenuItem(复制);JMenuItempaste=newJMenuItem(粘贴);JMenuItemdel=newJMenuItem(删除);JMenuItemall=newJMenuItem(全选);JMenuItemlexical=newJMenuItem(词法分析器);JMenuItemsHelp=newJMenuItem(查看帮助);JMenuItemabout=newJMenuItem(关于);JMenuItemback1=newJMenuItem(撤销);JMenuItemcut1=newJMenuItem(剪切);JMenuItemcopy1=newJMenuItem(复制);JMenuItempaste1=newJMenuItem(粘贴);JMenuItemdel1=newJMenuItem(删除);JMenuItemall1=newJMenuItem(全选);FileDialogopenDia=newFileDialog(f,打开,FileDialog.LOAD);FileDialogsaveDia=newFileDialog(f,保存,FileDialog.SAVE);AboutFileprompta;Filefe;Clipboardclipboard=null;booleanisSave,change,isLine;Stringselect;publicFrameView(){isSave=false;change=false;isLine=true;setup();f.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventwe){if((isSave==false)&&(change==true)){Promptdg=newPrompt(f,词法分析器,true);}elseSystem.exit(0);}});ta.setFont(newFont(宋体,0,20));ta.setLineWrap(true);tb.setEditable(false);tc.setEditable(false);pack();f.setBounds(300,100,750,550);f.setVisible(true);}publicvoidsetup(){setLayout(newBorderLayout());f.setJMenuBar(bar);jspa.add(ta);jspb.add(tb);jspc.add(tc);pb.setLayout(newGridLayout(2,1));pb.add(jspb);pb.add(jspc);pa.se