ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:327.23KB ,
资源ID:8384585      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8384585.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理实验报告词法分析器.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理实验报告词法分析器.docx

1、编译原理实验报告词法分析器编译原理实验词法分析器 一、实验目的通过动手实践,使学生对构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。二、实验内容及要求对某特定语言A ,构造其词法规则。该语言的单词符号包括:保留字(见左下表)、标识符(字母大小写不敏感)、 整型常数、界符及运算符(见右下表) 。 功能要求如下所示:按单词符号出现的顺序,返回二元组序列,并输出。出现的标识符存放在标识符表,整型常数存放在常数表,并输出这两个表格。如果出现词法错误,报出:错误类型,位置(行,列)。处

2、理段注释(/* */),行注释(/)。有段注释时仍可以正确指出词法错误位置(行,列)。三、实验过程1、词法形式化描述使用正则文法进行描述,则可以得到如下的正规式:其中ID表示标识符,NUM表示整型常量,RES表示保留字,DEL表示界符,OPR表示运算符。 A(ID | NUM | RES | DEL | OPR) *IDletter(letter | didit)*NUMdigit digit*lettera | | z | A | | Zdigit 0 | | 9RES program | begin | end | var | int | and | or | not | if | the

3、n | else | while | doDEL( | ) | . | ; | ,OPR+ | * | := | | = | = | 如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。空格由空白、制表符和换行符组成。2、单词种别定义;A语言中的单词符号及其对应的种别编码如下表所示:单词符号种别编码单词符号种别编码program1+16begin2*17end3(18var4)19int5,20and6.21or7:=22not8;23if924then10=27do13=28标识符1429整型常量15-303、状态转换图;语言A的词法分析的状态转换图如下所示:空格

4、符,制表符 或回车符 字母或数字 数字4、运行环境介绍;本次实验采用MyEclipse进行代码的编写和编译及运行,编写语言为java语言;程序的运行环境为windows 7 旗舰版5、关键算法的流程图及文字解释;程序中用到的函数列表:A类定义各种类函数以及包含主函数public static void main()变量ch储存当前最新读进的字符的地址strToken存放当前字符串main() /主函数Analysis()/分析函数,每次读入一行文件,进行识别处理;char GetChar(); /取得当前位置的字符的内容放入ch,并提前指向下一个字符;char GetNextChar();/取

5、得当前位置的下一位置的字符,String ConCat(); /将ch指向的字符连接到strToken后面isLetter(); /判断ch指向的字符是否字母isDigit(); /判断ch指向的字符是否数字add(p,str); /向p表中插入当前strToken的字符串Boolean findKeyWord(str); /检测当前strToken中的字符串是否保留字,若是,则执行getKeyWordKey(str),返回保留字的id,否则,判别其是否是已存在的标示符,若是,返回标示符的id以及该标示符在表中的位置;findPunctuation()/判断是否是一个保留的符号;getinde

6、x() /返回已经识别的标示符或者是数字的位置下标;Boolean exist(); /检测当前strToken中的字符串是否在标识符表中已存在,若是,则返回true,否则返回falsevoid callError(); /出错处理过程,将错误的位置报告出来(1)main()函数的流程图如下:(2)具体分析流程图: 继续判读 IndexoutofBound6、测试报告(测试用例,测试结果);首先输入一个不含错误的程序(两种注释)进行检测:运行后在控制台上得到的结果如下所示: 得到的二元组序列如下: 经检验,输出的是正确的二元组序列。 再输入一个含有错误的程序(含有注释)进行检验: 运行后在控制

7、台上得到的结果如下所示: 经检验,错误的位置是正确的如果是空文件,编译也会通过; 四、实验总结通过本次试验,我加深了对编译原理中的词法分析的理解,同时通过动手,更加锻炼了自己。本次试验由于使用的刚刚学习的java语言,通过这次机会加强了自己对java语言的熟悉的使用。在这次试验中,感谢老师的认真的讲解与同学的无私的帮助。总结来说,自己在这次试验中收获很大。附:以下为本次实验的源代码: package Analysis;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.i

8、o.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;public class A private static char ch; private static String strToken; private static int index = 0; private static int line = 1; private static boolean noteTag=false; private Map keywords; private HashMap punctua

9、tions; private static ArrayList p=new ArrayList(); private static ArrayList q=new ArrayList(); / get and set 函数 public char getCh() return ch; public void setCh(char ch) A.ch = ch; public String getStrToken() return strToken; public void setStrToken(String strToken) A.strToken = strToken; public voi

10、d setPunctuations(HashMap punctuations) this.punctuations = punctuations; public Map getPunctuations() return punctuations; public void setKeywords(Map keywords) this.keywords = keywords; public Map getKeywords() return keywords; / 构造函数 public A() this.keywords = new HashMap(); keywords.put(1,Progra

11、m); keywords.put(2,begin); keywords.put(3,end); keywords.put(4,var); keywords.put(5,int); keywords.put(6,and); keywords.put(7,or); keywords.put(8,not); keywords.put(9,if); keywords.put(10,then); keywords.put(11,else); keywords.put(12,while); keywords.put(13,do); this.punctuations = new HashMap(); pu

12、nctuations.put(+, 16); punctuations.put(*, 17); punctuations.put(, 18); punctuations.put(), 19); punctuations.put(, 20); punctuations.put(;, 21); punctuations.put(:=, 22); punctuations.put(, 23); punctuations.put(=, 24); punctuations.put(, 25); punctuations.put(=, 26); punctuations.put(., 27); punct

13、uations.put(, 28); punctuations.put(=, 29); / 函数定义(词法分析函数) public boolean Analyse(char strArray) index = 0;/ 每次分析一行完成后就将index置0 char temp1; int rowLength = strArray.length; outer:while (index ) if( temp1=this.getNextChar(strArray)=) System.out.println(24,=); else index-; System.out.println(23,); els

14、e if(ch=) if( temp1=this.getNextChar(strArray)=) System.out.println(26,) System.out.println(28,); else index-; System.out.println(25,); else if(ch=*& noteTag=false) System.out.println(17,*); else if (java.lang.Character.isLetter(ch)¬eTag=false) strToken = contact(strToken, ch); ch = getNextChar(s

15、trArray); while (java.lang.Character.isLetter(ch) | (java.lang.Character.isDigit(ch) strToken = contact(strToken, ch); ch = getNextChar(strArray); index-; / System.err.println(+strToken); if (findKeyword(strToken) /System.out.println(15, + strToken.toString() + )n); int i=getKeyWordKey(strToken); Sy

16、stem.out.println(+i+,-); else if(!exist(p,strToken) p.add(strToken); int i=getindex(p,strToken); /System.out.println(14, + strToken.toString() + )n); System.out.println(14,+i+); else if (java.lang.Character.isDigit(ch)¬eTag=false) strToken = this.contact(strToken, ch); ch = this.getNextChar(strAr

17、ray); while (java.lang.Character.isDigit(ch) strToken = this.contact(strToken, ch); ch = this.getNextChar(strArray); index-; /System.out.println(15, + strToken.toString() + )n); if(!exist(q,strToken) q.add(strToken); int i=getindex(q,strToken); System.out.println(15,+i+); strToken = ; else if (ch =

18、/|noteTag=true) int startj=index; /注释起始位置标记 int starti=line; if(noteTag=false) /System.out.println(该部分是注释注释,从第+starti+行第+startj+列开始); char temp = this.getNextChar(strArray); if (temp = *¬eTag=false) temp = this.getNextChar(strArray); while(index=rowLength) noteTag=true; break outer; else if(noteT

19、ag=true&ch!=*) while(index=rowLength) break outer; else return false; else String key = String.valueOf(ch); if (this.findPunctuation(key) System.out.println(+this.getPunctuation(key)+, + key + ); else if (key.equals( ) | key.equals( ) / * break; else return false; /System.out.println( 未知符号 + key + n

20、); /strToken = ; return true; public char GetChar(char array) try while (arrayindex) = ) index+; index+;/ 提前指向下一个字符* catch (ArrayIndexOutOfBoundsException e) return ; return arrayindex - 1; public char getNextChar(char strChar) index+; return strCharindex - 1; public String contact(String token, cha

21、r ch) return token + String.valueOf(ch); public boolean findKeyword(String str) for(int i=0;i13;i+) if(str.equalsIgnoreCase(this.keywords.get(i) return true; return false; public boolean findPunctuation(String str) if (this.punctuations.containsKey(str) return true; else return false; public int get

22、Punctuation(String str) return this.punctuations.get(str); public boolean Clean() return true; public void callError(int line) System.out.println(出现错误,错误位置在第 + line + 行,第 + index + 列); public boolean exist(ArrayList p,String strToken) if(p.contains(getStrToken() return true; else return false; publi

23、c int getKeyWordKey(String str) for(int i=1;i=13;i+) if(str.equalsIgnoreCase(this.keywords.get(i) return i; return 10000; public int getindex(ArrayList p,String Str) return p.lastIndexOf(Str)+1; /*int j=0; for(int i=0;ip.size();i+) if(p.get(i).equals(Str) j+; return j;*/ public static void main(String args) File file = new File(F:sample.txt); A a = new A(); char strChar = new char100;/ 限制每行代码字符数不超过100 BufferedReader reader = nu

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1