2023年西安邮电大学编译原理词法分析

上传人:时间****91 文档编号:166415631 上传时间:2022-11-01 格式:DOC 页数:18 大小:115.50KB
收藏 版权申诉 举报 下载
2023年西安邮电大学编译原理词法分析_第1页
第1页 / 共18页
2023年西安邮电大学编译原理词法分析_第2页
第2页 / 共18页
2023年西安邮电大学编译原理词法分析_第3页
第3页 / 共18页
资源描述:

《2023年西安邮电大学编译原理词法分析》由会员分享,可在线阅读,更多相关《2023年西安邮电大学编译原理词法分析(18页珍藏版)》请在装配图网上搜索。

1、 西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称: 词法分析器 专业名称:班 级: 学生姓名:学号(8位):指导教师:实验日期: 年月日一. 实验目的及实验环境设计一个词法分析器,并更好的理解词法分析实现原理,掌握程序设计语言中各类单词的词法分析方法,并实现对一种程序设计语言的词法分析。二. 实验内容1.对java程序语言的词法分析:单词分类表:keyvaluetypekeyvaluetype1abstractKEYWORD42throwKEYWORD2assertKEYWORD43throwsKEYWORD3booleanKEYWORD44transientKEYWORD4bre

2、akKEYWORD45tryKEYWORD5caseKEYWORD46voidKEYWORD6catchKEYWORD47volatileKEYWORD7charKEYWORD48whileKEYWORD8classKEYWORD49+OPERATOR9constKEYWORD50+OPERATOR10continueKEYWORD51-OPERATOR11defaultKEYWORD52-OPERATOR12doKEYWORD53*OPERATOR13doubleKEYWORD54/OPERATOR14elseKEYWORD55=OPERATOR15enumKEYWORD56=OPERATO

3、R16extendsKEYWORD57%OPERATOR17finalKEYWORD58!OPERATOR18finallyKEYWORD59!=OPERATOR19floatKEYWORD60OPERATOR20forKEYWORD61=OPERATOR21gotoKEYWORD62OPERATOR22ifKEYWORD63OPERATOR23implementsKEYWORD64=OPERATOR24importKEYWORD65OPERATOR25instanceofKEYWORD66&OPERATOR26intKEYWORD67&OPERATOR27interfaceKEYWORD68

4、OPERATOR28longKEYWORD69|OPERATOR29nativeKEYWORD70|OPERATOR30newKEYWORD71OPERATOR31packageKEYWORD72;DEVIDER32protectedKEYWORD73,DEVIDER33publicKEYWORD74.DEVIDER34returnKEYWORD75(DEVIDER35strictfpKEYWORD76)DEVIDER36shortKEYWORD77DEVIDER37staticKEYWORD78DEVIDER38superKEYWORD79DEVIDER39switchKEYWORD80DE

5、VIDER40synchronizedKEYWORD81“DEVIDER41thisKEYWORD82DEVIDER2.单词结构描述(正规式或正规文法)|abstract|assert|boolean|break|byte|case|catch|char|class| const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long native|new|package|private|protect

6、ed|public|return|strictfp|short static|super|switch|synchronized|this|throw|throws|transient|try void|volatile|while +|+|-|-|*|/|=|=|%|!|!=|%|=|=|&|&|.|0|1|2|3|4|5|6|7|8|9A|B|.|X|Y|Z|a|b|.|x|y|z;|,|.|(|)|”|3. 单词状态转换图字母空白字母非字母非数字非关键字210SSS关键字非字母436非字母非数字5字母或数字数字非数字小数点数字非数字或.数字789A0分隔符BC操作符4. 算法描述 读取文

7、献到内存,逐个字母分析,并将连续的字母使用超前搜索组合成为变量或关键字;若是数字,则要判断是否为浮点数,即使用超前搜索的时候,判断扫描到的字符是否为小数点;若是分隔符或者操作符,则要到响应的表中查找并输出。三方案设计程序结构:1. 终结符封装的javabean:用于存储id,代表的实体entity,种类type;2. 关键字表存放在一个Map集合KeyWordTable中;分隔符表存放在一个Map集合DeviderTable中;操作符表存放在OperatorTable中;3. Scanner工具类用于扫描输入的java源程序;4. Analysis类用于分析词法,analysis方法分析词法。

8、程序流程图开始读取源文献扫描数字?添加分隔符NYYN是分隔符?扫描字母?读取源文献YYNY数字或.?扫描字母?添加操作符NN关键字?添加数字添加变量Y添加关键字四测试数据及运营结果1 正常测试数据(3组)及运营结果:扫描Analyst.javaWordType id=78, entity=, type=4, content=WordType id=78, entity=, type=4, content=WordType id=34, entity=return, type=1, content=returnWordType id=0, entity=, type=5, content=lis

9、tWordType id=72, entity=;, type=4, content=;WordType id=78, entity=, type=4, content=.扫描Test.javaWordType id=31, entity=package, type=1, content=packageWordType id=0, entity=, type=5, content=comWordType id=74, entity=., type=4, content=.WordType id=0, entity=, type=5, content=zcWordType id=74, enti

10、ty=., type=4, content=.WordType id=0, entity=, type=5, content=caWordType id=74, entity=., type=4, content=.WordType id=0, entity=, type=5, content=testWordType id=72, entity=;, type=4, content=;WordType id=33, entity=public, type=1, content=publicWordType id=8, entity=class, type=1, content=classWo

11、rdType id=0, entity=, type=5, content=TestWordType id=77, entity=, type=4, content=WordType id=0, entity=, type=5, content=privateWordType id=37, entity=static, type=1, content=staticWordType id=26, entity=int, type=1, content=intWordType id=0, entity=, type=5, content=aWordType id=55, entity=, type

12、=3, content=WordType id=0, entity=, type=2, content=0WordType id=72, entity=;, type=4, content=;WordType id=0, entity=, type=5, content=privateWordType id=17, entity=final, type=1, content=finalWordType id=13, entity=double, type=1, content=doubleWordType id=0, entity=, type=5, content=bWordType id=

13、55, entity=, type=3, content=WordType id=0, entity=, type=2, content=1.234WordType id=72, entity=;, type=4, content=;WordType id=33, entity=public, type=1, content=publicWordType id=37, entity=static, type=1, content=staticWordType id=46, entity=void, type=1, content=voidWordType id=0, entity=, type

14、=5, content=main五总结实验过程中碰到的问题及解决办法:扫描过程中出现非法字符的解决:t,n等:跳过六 附录:源代码(电子版)DeviderTable.javapackage com.zc.ca.db;import java.util.HashMap;import java.util.Map;import com.zc.ca.model.WordType;public class DeviderTable public static Map db = new HashMap();staticdb.put(;, new WordType(72,;,WordType.TYPE.DEV

15、IDER,;);db.put(, new WordType(73,WordType.TYPE.DEVIDER,);db.put(., new WordType(74,.,WordType.TYPE.DEVIDER,.);db.put(, new WordType(75,(,WordType.TYPE.DEVIDER,();db.put(), new WordType(76,),WordType.TYPE.DEVIDER,);db.put(, new WordType(77,WordType.TYPE.DEVIDER,);db.put(, new WordType(78,WordType.TYP

16、E.DEVIDER,);db.put(, new WordType(84,.,WordType.TYPE.DEVIDER,);db.put(, new WordType(85,.,WordType.TYPE.DEVIDER,);KeyWordTable.javapackage com.zc.ca.db;import java.util.HashMap;import java.util.Map;import com.zc.ca.model.WordType;public class KeyWordTable public static Map db= new HashMap();staticdb

17、.put(abstract, new WordType(1,abstract,WordType.TYPE.KEYWORD,abstract);db.put(assert, new WordType(2,assert,WordType.TYPE.KEYWORD,assert);db.put(boolean, new WordType(3,boolean,WordType.TYPE.KEYWORD,boolean);db.put(break, new WordType(4,break,WordType.TYPE.KEYWORD,break);db.put(case, new WordType(5,

18、case,WordType.TYPE.KEYWORD,case);db.put(catch, new WordType(6,catch,WordType.TYPE.KEYWORD,catch);db.put(char, new WordType(7,char,WordType.TYPE.KEYWORD,char);db.put(class, new WordType(8,class,WordType.TYPE.KEYWORD,class);db.put(const, new WordType(9,const,WordType.TYPE.KEYWORD,const);db.put(continu

19、e, new WordType(10,continue,WordType.TYPE.KEYWORD,continue);db.put(default, new WordType(11,default,WordType.TYPE.KEYWORD,default);db.put(do, new WordType(12,do,WordType.TYPE.KEYWORD,do);db.put(double, new WordType(13,double,WordType.TYPE.KEYWORD,double);db.put(else, new WordType(14,else,WordType.TY

20、PE.KEYWORD,else);db.put(enum, new WordType(15,enum,WordType.TYPE.KEYWORD,enum);db.put(extends, new WordType(16,extends,WordType.TYPE.KEYWORD,extends);db.put(final, new WordType(17,final,WordType.TYPE.KEYWORD,final);db.put(finally, new WordType(18,finally,WordType.TYPE.KEYWORD,finally);db.put(float,

21、new WordType(19,float,WordType.TYPE.KEYWORD,float);db.put(for, new WordType(20,for,WordType.TYPE.KEYWORD,for);db.put(goto, new WordType(21,goto,WordType.TYPE.KEYWORD,goto);db.put(if, new WordType(22,if,WordType.TYPE.KEYWORD,if);db.put(implements, new WordType(23,implements,WordType.TYPE.KEYWORD,impl

22、ements);db.put(import, new WordType(24,import,WordType.TYPE.KEYWORD,import);db.put(instanceof, new WordType(25,instanceof,WordType.TYPE.KEYWORD,instanceof);db.put(int, new WordType(26,int,WordType.TYPE.KEYWORD,int);db.put(interface, new WordType(27,interface,WordType.TYPE.KEYWORD,interface);db.put(l

23、ong, new WordType(28,long,WordType.TYPE.KEYWORD,long);db.put(native, new WordType(29,native,WordType.TYPE.KEYWORD,native);db.put(new, new WordType(30,new,WordType.TYPE.KEYWORD,new);db.put(package, new WordType(31,package,WordType.TYPE.KEYWORD,package);db.put(protected, new WordType(32,protected,Word

24、Type.TYPE.KEYWORD,protected);db.put(public, new WordType(33,public,WordType.TYPE.KEYWORD,public);db.put(return, new WordType(34,return,WordType.TYPE.KEYWORD,return);db.put(strictfp, new WordType(35,strictfp,WordType.TYPE.KEYWORD,strictfp);db.put(short, new WordType(36,short,WordType.TYPE.KEYWORD,sho

25、rt);db.put(static, new WordType(37,static,WordType.TYPE.KEYWORD,static);db.put(super, new WordType(38,super,WordType.TYPE.KEYWORD,super);db.put(switch, new WordType(39,switch,WordType.TYPE.KEYWORD,switch);db.put(synchronized, new WordType(40,synchronized,WordType.TYPE.KEYWORD,synchronized);db.put(th

26、is, new WordType(41,this,WordType.TYPE.KEYWORD,this);db.put(throw, new WordType(42,throw,WordType.TYPE.KEYWORD,throw);db.put(throws, new WordType(43,throws,WordType.TYPE.KEYWORD,throws);db.put(transient, new WordType(44,transient,WordType.TYPE.KEYWORD,transient);db.put(try, new WordType(45,try,WordT

27、ype.TYPE.KEYWORD,try);db.put(void, new WordType(46,void,WordType.TYPE.KEYWORD,void);db.put(volatile, new WordType(47,volatile,WordType.TYPE.KEYWORD,volatile);db.put(while, new WordType(48,while,WordType.TYPE.KEYWORD,while);OperatorTable.javapackage com.zc.ca.db;import java.util.HashMap;import java.u

28、til.Map;import com.zc.ca.model.WordType;public class OperatorTable public static Map db= new HashMap();staticdb.put(+, new WordType(49, +, WordType.TYPE.OPERATOR,+);db.put(+, new WordType(53, +, WordType.TYPE.OPERATOR,+);db.put(-, new WordType(50, -, WordType.TYPE.OPERATOR,-);db.put(-, new WordType(

29、54, -, WordType.TYPE.OPERATOR,-);db.put(*, new WordType(51, *, WordType.TYPE.OPERATOR,*);db.put(/, new WordType(52, /, WordType.TYPE.OPERATOR,/);db.put(=, new WordType(55, =, WordType.TYPE.OPERATOR,=);db.put(=, new WordType(57, =, WordType.TYPE.OPERATOR,=);db.put(%, new WordType(56, %, WordType.TYPE

30、.OPERATOR,%);db.put(!, new WordType(67, !, WordType.TYPE.OPERATOR,!);db.put(!=, new WordType(58, !=, WordType.TYPE.OPERATOR,!=);db.put(, new WordType(59, , WordType.TYPE.OPERATOR,);db.put(=, new WordType(61, =, WordType.TYPE.OPERATOR,=);db.put(, new WordType(70, , WordType.TYPE.OPERATOR,);db.put(, n

31、ew WordType(60, , WordType.TYPE.OPERATOR,);db.put(=, new WordType(62, =, WordType.TYPE.OPERATOR,=);db.put(, new WordType(71, , WordType.TYPE.OPERATOR,);db.put(&, new WordType(63, &, WordType.TYPE.OPERATOR,&);db.put(&, new WordType(68, &, WordType.TYPE.OPERATOR,&);db.put(, new WordType(64, , WordType

32、.TYPE.OPERATOR,);db.put(|, new WordType(65, |, WordType.TYPE.OPERATOR,|);db.put(|, new WordType(69, |, WordType.TYPE.OPERATOR,|);db.put(, new WordType(66, , WordType.TYPE.OPERATOR,);Analyst.javapackage com.zc.ca.exec;import java.io.File;import java.io.IOException;import java.util.ArrayList;import ja

33、va.util.Arrays;import java.util.List;import com.zc.ca.db.DeviderTable;import com.zc.ca.db.KeyWordTable;import com.zc.ca.db.OperatorTable;import com.zc.ca.model.WordType;public class Analyst private List list = new ArrayList();private String str;public Analyst(String string) this.str = string;public

34、List analysis() for (int i = 0; i :if (str.charAt(+i) = =)list.add(OperatorTable.db.get(=);else if (str.charAt(i) = )list.add(OperatorTable.db.get();else list.add(OperatorTable.db.get();i-;break;case :if (str.charAt(+i) = =)list.add(OperatorTable.db.get(=);else if (str.charAt(i) = )list.add(Operator

35、Table.db.get();else list.add(OperatorTable.db.get();i-;break;case &:if (str.charAt(+i) = &)list.add(OperatorTable.db.get(&);else list.add(OperatorTable.db.get(&);i-;break;case :list.add(OperatorTable.db.get();break;case |:if (str.charAt(+i) = |)list.add(OperatorTable.db.get(|);else list.add(Operator

36、Table.db.get(!);i-;break;case :list.add(OperatorTable.db.get();break;default:break;return list;public static void main(String args) File file = new File(src/com/zc/ca/test/Test.java);try Scanner scanner = new Scanner(file);Analyst analyst = new Analyst(scanner.getStringBuffer().toString();List list

37、= analyst.analysis();for (WordType wt : list) System.out.println(wt); catch (IOException e) e.printStackTrace();Scanner.javapackage com.zc.ca.exec;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.

38、io.Reader;public class Scanner private StringBuffer sb = new StringBuffer();public Scanner(File file) throws IOException FileInputStream fis = new FileInputStream(file);init(fis);private void init(FileInputStream fis) throws IOException Reader reader = new InputStreamReader(fis); BufferedReader br = new BufferedReader(reader); String line = null; while (line = br.readLine()!=null) sb.append(line); public StringBuffer getStringBuffer()return sb;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!