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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

合肥工业大学编译原理实验.docx

1、合肥工业大学编译原理实验宣城校区实 验 报 告课 程 名 称 编译原理 专 业 班 级 计算机0001班 学生姓名及学号 赵保飞 2015216768 指 导 教 师 李芒宏 实 验 地 点 计算机中心楼第四机房 2017 2018 学年第 一 学期编译原理课程实验报告实验名称词法分析设计姓 名赵保飞系院专业计算机科学与技术班级计算机01班学号2015216768实验日期2017.10.18指导教师李芒宏成绩一、实验目的和要求通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。二、

2、实验原理(1)实验数据结构说明 KString数组-关键字表;schar数组分界符;mchar数组算术运算符;rString数组关系运算符;ArrayList型String数组ci常数;ArrayList型String数组id标识符(2)实验算法描述(3)算法流程图三、源程序代码和测试结果package lexicalAnalysis;import java.util.*;import java.io.*;public class lexicalAnalysis static String k=for,main,if,while,void,public,static,printf,scanf,

3、asm,do,return,typedef,auto,double,break,short,using,default,long;/关键字 static char s=,;,(,),;/2分界符 static char m=+,-,*,/;/3算术运算符 static String r=,=,;/4关系运算符 ArrayList ci=new ArrayList();/5常数 ArrayList id=new ArrayList();/6标识符 String tempToken=;/临时存放组成一个“词”单位串 int pint ,row = 1,line = 1;/当前指针指示,行数,列数

4、char ch;/存放最新读入源程序字符 String instring;/存放输入de源程序代码 public static void main(String args)throws Exception / TODO Auto-generated method stub lexicalAnalysis one = new lexicalAnalysis(); System.out.println(单词+t二元序列+t类 型+t位置(行,列)); one.readtext(); boolean isdigit(char c)/判断所读字符是否为数字,是则返回ture,否则返回false if(

5、c=48 & c64&c96&c)/当其后的字符是=或时,要再读一个字符。否则不要再读。 return true; else return false; void clearBlank()/检查空白直到读入字符非空白 while(ch= ) getchar(); void getchar() pint+; if(pint = instring.length()-1) ch=instring.charAt(pint); if(ch = n) change_row_line(); getchar(); else ch= ;/instring数据读取完,需重新读入 void retract()/读入

6、前一个字符 pint-; ch=instring.charAt(pint); void distinguishLeter()/识别字符串 tempToken=;/清空 while(isletter(ch) | isdigit(ch) | isline(ch)/字母,数字,下划线仍是字符串合法组成,继续识别 tempToken=tempToken + ch; getchar(); void distinguishDigit()/识别数字串 tempToken=;/先将strtoken置空 while(isdigit(ch)/当数字时继续识别数字串 tempToken=tempToken+ch;/

7、将新识别的字符加到strtoken后 getchar(); if(isletter(ch)|isline(ch)/识别完数字串而其后是字母,下划线时出错处理 while(isletter(ch)|isline(ch)|isdigit(ch)/当是字母,数字,下划线时继续识别错误数字串 tempToken=tempToken+ch;/将新识别的字符加到strtoken后 getchar(); display(0,tempToken, );/输出错误数字串 tempToken=;/将strtoken置空返回 void display(int i,String s,char a)/各种输出处理 sw

8、itch(i) case -1:System.out.println(a+tError+tError+t+row+,+line+); break; case 0:System.out.println(s+tError+tError+t(+row+,+line+); break; case 1:System.out.println(s+t(1,+s+)+t关键字 +t(+row+,+line+); break; case 2:System.out.println(a+t(2,+a+)+t分界符+t(+row+,+line+); break; case 3:System.out.println(a

9、+t(3,+a+)+t算术运算符+t(+row+,+line+); break; case 4:System.out.println(s+t(4,+s+)+t关系运算符 +t(+row+,+line+); break; case 5:System.out.println(s+t(5,+s+)+t常数+t+(+row+,+line+); break; case 6:System.out.println(s+t(6,+s+)+t标识符+t(+row+,+line+); break; line+;/列数加一 void change_row_line()/改变行数和列数 row+; line=1; v

10、oid handleString()/输入串处理 pint=-1;/将搜索指示器置-1 System.out.println(要处理的语句为 : +instring); getchar();/读入一个字符 while(pintinstring.length()/当搜索指示器没有越界时 clearBlank();/检查空白直到读入读入非空 if(isdigit(ch)/当ch为数字时进行数字串识别 distinguishDigit();/数字串识别 if(tempToken.length()!=0)/经过数字串识别后,如果strtoken不为空 if(reseverci(tempToken)=-

11、1)/如果strtoken不在ci表中,将strtoken加入ci表中 ci.add(tempToken);/将strtoken加入ci表中 display(5,tempToken, );/输出数字串 else /如果strtoken在ci表中,仅输出 display(5,tempToken, );/输出数字串 else if(isletter(ch)/当ch为字母时进行字符串识别 distinguishLeter();/字符串识别 if(reserve(tempToken)=-1)/如果strtoken不在k表中 if(reseverid(tempToken)=-1)/如果strtoken不

12、在id表中 id.add(tempToken);/将strtoken加入id表中 display(6,tempToken, );/输出标识串 else /如果strtoken在id表中 display(6,tempToken, );/输出标识串 else /如果strtoken在关键字表 display(1,tempToken, );/输出关键字 else if(in_s(ch)!=-1)/分界符处理包含在one.in_s(one.ch)中 else if(in_m(ch)!=-1)/算术运算符处理包含在one.in_m(one.ch)中 else if(in_k(ch)!=-1)/关系运算符

13、处理包含在one.in_k(one.ch)中 else display(-1, ,ch);/error getchar();/读下一位 int reserve(String s)/判断字符串是否是保留字 int i; for(i=0;ik.length;i+) if(s.equals(ki) return i;/是保留字,就返回编码 return -1;/不是保留字,就返回-1 int reseverid(String s)/判断识别的标志符是否已经在id表中 int i; for(i=0;iid.size();i+) if(s.equals(id.get(i) return i;/识别的标志

14、符已经在id表中,返回位置 return -1;/识别的标志符不在id表中,返回-1 int reseverci(String s)/判断识别的数字串是否已经在ci表中 int i; for(i=0;ici.size();i+) if(s.equals(ci.get(i) return i;/识别的数字串已经在ci表中,返回位置 return -1;/识别的数字串不在ci表中,返回-1 int in_s(char c)/确认分界符 int i; for(i=0;is.length;i+) if(c=si)/与某个分界符配备时 display(2, ,c);/输出分界符 getchar();/读

15、下一位 return i;/返回所在位置 return -1;/不在分界符表中 int in_m(char c)/查找算术运算符 int i; for(i=0;im.length;i+) if(c=mi)/与某个算术运算符配备时 display(3, ,c);/输出算术运算符 getchar();/读下一位 return i;/返回所在位置 return -1;/不在算术运算符表中 int in_k(char b)/查找关系运算符 int i; if(remove()=false)/读下一位为假时,进行一位关系运算符识别 for(i=0;ir.length;i+) if(ri.length()

16、=1)/当关系运算符为一位时,尝试匹配 if(ri.equals(Character.toString(b) display(4, ri, );/输出关系运算符 getchar();/读下一位 return i;/返回所在位置 else/读下一位为假时,进行两位关系运算符识别 char a=new char2;/将两位字符放入a中 a0=b; getchar(); a1=ch; for(i=0;iTG(2)G-+TG|-TG(3)G-(4)T-FS(5)S-*FS|/FS(6)S-(7)F-(E)(8)F-i(1)实验数据结构说明 Char数组-Vn数组-非终结符表;char数组-Vt数组-终

17、结符;String数组-Gr数组-文法;Boolean型FIRST二维数组对应每个非终结符的first集,初始化均为false;Boolean型FOLLOW二维数组对应每个非终结符的Follow集,初始化均为false;String型M二维数组对应预测分析表(2)实验算法描述算法总的来讲不是很复杂,但是细节上可能有点复杂。总的是依据本实验的数据结构FIRST和FOLLOW集,这两个数据结构虽然浪费了不少空间但是确实让程序的实现变得更简单。First()总的来求所有的非终结符的first集,first1()分工为具体求某一个具体非终结符的first集;first2()则是求某一个集体的产生式的f

18、irst集。通过这三个函数的逐级分工来实现求所有的非终结符的first集。Follow集来说相对难求一点,但把它放到first集后面求来说相对简单一点。通过上面的分布设计就可以实现了。(3)算法流程图三、源程序代码和测试结果package exp3;import javax.swing.*;import java.awt.*;import java.awt.GridLayout.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;class WinGrid extends JFrame GridLay

19、out grid ; JPanel chessboard; JTextField text; JTextArea textShow; JButton button; ReaderListen listener; WinGrid() init(); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); void init() setLayout(new FlowLayout(); text = new JTextField(10); setBounds(466,166,500,400); button = new JB

20、utton(读取); textShow = new JTextArea(9,30); listener = new ReaderListen(); listener.setJTextField(text); listener.setJTextArea(textShow); text.addActionListener(listener); button.addActionListener(listener); add(text); add(button); add(new JScrollPane(textShow); class ReaderListen implements ActionLi

21、stener JTextField text; JTextArea textShow; LL one=new LL(); String s; String temp1= new String186; public void setJTextField(JTextField text) this.text = text; public void setJTextArea(JTextArea textShow) this.textShow = textShow; public String S() String t = text.getText(); return t; Override public void actionPerformed(ActionEvent e) try String s = text.getText()+#; textShow.append(s+n); textShow.append(步骤+t+分析栈+t+剩余输入串+t+所用产生式+t+动作+n); one.right(s,temp1); for(int i = 0;i18;i+)

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

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