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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理试验指导.docx

1、编译原理试验指导编译原理实验指导计算机工程学院内容简介编译原理是计算机专业中的一门专业必修课程,在理论上它要求学生掌握有关形式语言和自动机的抽象概念,在技术上要求学生能够熟练地利用各种数据结构进行编程,很具有挑战性。我们希望学生在学习完本课之后,能够对形式语言和其内部结构有一个较深刻的认识。本书包含三个实验:词法分析器,LL1语法分析、语义与代码生成。这三个实验构成了编译器的主要组成部分,全部在VC+6.0环境下完成。目 录实验一 词法分析实验 1实验二 LL1语法分析 4实验三 语义及代码生成 7实验一 词法分析实验1、实验目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够

2、采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。2、实验内容对源程序进行词法分析:要求识别出关键字、标识符、数字和符号,并以(单词类别,单词值)二元组的形式显示。如int a;经过词法分析程序后得到的二元组为:int intID a; ; 以下为词法分析程序的测试数据main()int a,b;a = 10; b = a + 20;请对以上代码利用词法分析程序分析并得到相应的二元组。3、实验分析在本次实验中是对一个简化的c语言程序进行分析,它的单词符号有: 标识符:字母打头,后接字母数字,识别出的标识符用ID标记。 保留字(它是标识符的子集): i

3、f,else,for,while,do,int,write,read,识别出的保留字直接用该保留字标记。 无符号整数:由数字组成,用NUM标记。 分界符:+、-、*、/、(、)、;、,、=、=、!=、=等双字符分界符,直接用双分界符标记。 注释符:用/*.*/括起为了从源程序字符流中正确识别出各类单词符号,相邻的标识符、整数或保留字之间至少要用一个空格分开。此语言的各类单词符号的正则文法规则如下:=|ID|ID=| = a|b|z|A|B|Z=1|2|9|0=+|-|*|/|=|(|)|:|,|;|!=|=|!=|=/*=*/图1 单词符号的状态图根据状态图,分析相应动作就可以构造出词法分析程

4、序的算法流程图,如下图所示,在程序开始时,首先读入一个字符,若为空字符,则继续读,直到读进一个非空字符,读进的字符有如下6种情况,要进行不同的处理。(1) 字母。继续读,直到遇见空格、分界符、文件尾或非字母数字字符。组合标记符,查保留字表。若为保留字,输出相应单词记号;若不是,输出标记符的单词记号及单词值(标识符)。(2) 数字。继续读,直到遇见空格、或非数字字符出现或文件尾。输出无符号整数的单词记号及数字串。(3) =、!。读入下一个字符,判断是否为双字符分界符,若是,组成双字符分界符,输出相应单词记号及双分界符;若不是,输出单分界符记号。(4) 非=、/等与双分界符首字符不同的单分界字符。

5、输出相应单词记号及单分界符。(5) /。读入下一个字符。若不是“*”,输出/的单词记号;若是“*”,进行注释处理。词法分析不输出“/*”,并要跳过整个注释内容直到遇到“*/”为止,然后返回开始状态,继续识别下一个单词符号。(6) 非法字符。如果读进的字符不属于上面任意情况,则说明词法分析程序从源程序读入了一个不合法的字符,即该字符不属于程序语言所定义的所有单词符号首字符集合。词法分析程序在遇到不合法字符时要进行错误处理,报告错误信息,跳过这个字符,然后转入开始状态,继续识别下一个单词符号。 图2 词法分析程序流程图4、实验步骤(1)启动Visual C+系统,新建一个工程;(2)新建一个源程序

6、文件;(3)编译,调试该程序;(4)运行该程序,输入测试数据,观察输出数据;(5)分析实验结果。实验二 LL1语法分析1、实验目的(1) 一切LL(1)文法;含有直接左递归但可以转化为LL(1)文法的文法;含有间接左递归但可以转化为LL(1)文法的文法(2)计算出文法的First() Follow()(3)构造相应文法的预测分析表(4)对某个输入句子进行分析2、实验内容LL(1)文法是一类可以进行确定的自顶向下语法分析的文法。就是要求描述语言的文法是无左递归的和无回溯的。根据LL(1)文法的定义,对于同一非终结符A的任意两个产生式A:=a和A:=b,都要满足:SELECT(A:=a )SELE

7、CT(A:=b)=。(1)文法的左递归当一个文法是左递归文法时,采用自顶向下分析法会使分析过程进入无穷循环之中。所以采用自顶向下语法分析需要消除文法的左递归性。文法的左递归是指若文法中对任一非终结符A有推导AA,则称该文法是左递归的。左递归又可以分为直接左递归和间接左递归。 直接左递归若文法中的某一产生式形如AA,V*,则称该文法是直接左递归的。消除直接左递归的方法:设有产生式是关于非终结符A的直接左递归:AA| (,V*,且不以A开头)对A引入一个新的非终结符A,把上式改写为:A A AA| 间接左递归若文法中存在某一非终结符A,使得AA至少需要两步推导,则称该文法是间接左递归的。消除间接左

8、递归的方法:【方法一】采用代入法把间接左递归变成直接左递归。 【方法二】直接改写文法:设有文法G10S: SA| AS 因为SAS,所以S是一个间接递归的非终结符。为了消除这种间接左递归,将式代入式,即可得到与原文法等价的文法(可以证明): SS| 式是直接左递归的,可以采用前面介绍的消除直接左递归的方法,对文法进行改写后可得文法:SSSS|1 计算first集合 (1) 若XVT ,则First(X)=X(2) 若XVN ,且有产生式Xa, aVT则First(X)=X(3) 若XVN ,且有产生式X,则First(X)=X(4) 若X,Y1 ,Y2 ,Yn 都VN,而由产生式XY1 Y2

9、Yn 。当Y1 ,Y2 ,Yi-1都能推导出时,(其中1in),则First(Y1)-, First(Y2)-, First(Yi)都包含在First(X)中(5)当(4)中所有Yi都能推导出,(i=1,2,n),则First(X)=First(Y1)First(Y2)First(Yn)反复使用上述步骤直到每个符合的First集合不再增大为止。2计算Follow集对文法中的每个AVN,计算Follw(A):(1) 设S为文法的开始符合,把#加入Follow(S)中;(2) 若AB是一个产生式,则把First()的非空元素加入Follow(B)中,如果能推导出,则把Follow(A)也加入(B)

10、中;(3) 反复使用以上步骤直到每个非终结符号的Follow集不再增大为止。3预测分析方法预测分析方法是自顶向下分析的另一种方法,一个预测分析器是由三个部分组成:预测分析程序;先进后出栈;预测分析表。预测分析程序的框图如下:实验三 语义及代码生成1、实验目的理解并掌握语义分析的基本概念,基本方法;掌握代码优化与目标生成的基本原理与技术实现;编写类C语言编译程序的目标代码生成的程序,调试成功后,以给出的程序段为测试数据,并按一定格式显示结果。2、实验内容和分析与实验二的语法规则相比,只有部分规则需要添加动作符号,下面我们列出添加了动作符号的规则。(1)vartablep,datap -int I

11、Dnname-defn,t;动作解释:vartablep指出符号表的最后一个记录的下一个位置,即第一个空白记录位置。每当有一个记录加入符号表,该值加1;datap表示已经分配的地址空间,它开始时为0,每声明一个变量,该值则根据变量类型累加,如整型加2,实型加4等等。name-defn, t的动作:查询符号表,从vartablep所指的前一个位置起往回查直到第一个记录,若没有,将标识符名n及类型1、datap的值填入符号表vartablep所指的位置,然后vartablep加1,datap根据类型t增加;若有,报告错误:变量重复定义。(2):=IDnLOOKndASSIGN =STOd |(3)

12、:= |GT |LES |=GE |=LE |=EQ |!=NOTEQ (4):=(+ADD |-SUB) (5):=(*MULT | /DIV) (6):=()| IDnLOOKndLOADd |NUMiLOADIi(2)、(3)、(4)、(5)、(6)规则中的动作符号解释如下:LOOKnd:查符号表n,给出变量地址d; 没有,变量没定义ASSIGN:超前读一个符号,如果是=,则表示进入赋值表达式,如果不是=,则选择,然后还要将超前读的这个符号退回。STOd:输出指令代码STO d, 且codep+(因产生了指令,所以指令记数加1)LOADIi:输出指令代码LOADI i ,且codep+L

13、OADd :输出指令代码LOAD d , 且codep+GT、ADD等:输出后的指令代码GT、ADD等(7):=if ()BRFlabel1 BRlabel2 SETlabellabel1 else SETlabellabel2其中动作符号的含义如下 BRFlabel1 :输出 BRF label1,codep+ BRlabel2:输出 BR label2,codep+ SETlabellabel1:设置标号label1 SETlabellabel2:设置标号label2(8):=while SETlabellabel1() BRFlabel2 BRlabel1 SETlabellabel2动

14、作解释如下:SETlabellabel1:设置标号label1BRFlabel2 :输出 BRF label2,codep+BRlabel1:输出 BR label1,codep+SETlabellabel2:设置标号label2(9):=for (; SETlabellabel1BRFlabel2BRlabel3; SETlabellabel4 BRlabel1) SETlabellabel3 BRlabel4SETlabellabel2 动作解释: SETlabellabel1:设置标号label1 BRFlabel2 :输出 BRF label2,codep+ BRlabel3:输出 B

15、R label3,codep+ SETlabellabel4:设置标号label4 BRlabel1:输出 BR label1,codep+ SETlabellabel3:设置标号label3 BRlabel4:输出 BR label4,codep+ SETlabellabel2:设置标号label2 (10):=write OUT;动作解释: OUT:输出 OUT(11):=read IDn LOOKnd INd;动作解释: LOOKnd:查符号表n,给出变量地址d; 没有,变量没定义 IN:输出IN STId:输出指令代码STI d抽象机常用汇编指令如下:LOAD D 将D中的内容加载到操

16、作数栈LOADI 常量 将常量压入操作数栈LOAD (D) 将变量地址D压入操作数栈STO D 将操作数栈栈顶单元内容存入DADD 将次栈顶单元与栈顶单元内容相加,和置于栈顶SUB 将栈顶单元减去次栈顶单元内容,差置于栈顶MULT 将次栈顶单元与栈顶单元内容相乘,积置于栈顶DIV 将栈顶单元除次栈顶单元内容,商置于栈顶(分母为栈) BR lab 无条件转移到lab BRF lab 检查栈顶单元逻辑值,若为假(0)则转移到labEQ 将栈顶两单元做等于比较,并将结果真或假(1或0)置于栈顶NOTEQ 将栈顶两单元做不等于比较,并将结果真或假(1或0)置于栈顶GT 次栈顶大于栈顶操作数,则栈顶置1

17、,否则置0LES 次栈顶小于栈顶操作数,则栈顶置1,否则置0GE 次栈顶大于等于栈顶操作数,则栈顶置1,否则置0LE 次栈顶小于等于栈顶操作数,则栈顶置1,否则置0AND 将栈顶两单元做逻辑与运算,并将结果真或假(1或0)置于栈顶OR 将栈顶两单元做逻辑或运算,并将结果真或假(1或0)置于栈顶NOT 将栈顶的逻辑值取反构造语义和代码生成程序,然后对测试程序进行分析测试程序int a;int b;read a;write a;if (a=10) b=1; else b=2;write b;while (a=6) b=3;write b;b=0;for(a=0;a5;a=a+1) b=4;write b;3、实验分析在本实验中仍采用递归下降分析法,根据实验二中的语法分析,用上面给出的各语句程序替换语法分析对应的同名函数程序,即可将语法分析改为语义分析和代码生成程序。为了简化起见,在类C编译程序中没有进行复杂的错误处理。在语法和语义分析中,一旦遇到语法或语义错误,则停止编译,立即返回,并报告发生的错误。4、实验步骤(1)启动Visual C+系统,新建一个工程;(2)新建一个源程序文件;(3)编译,调试该程序;(4)运行该程序,输入测试数据,观察输出数据;(5)分析实验结果。

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

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