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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

语义分析实验报告.docx

1、语义分析实验报告云南大学编译原理实验报告实验题目: 语义分析学 院: 信息学院专 业: 计算机科学与技术学 号: 064姓 名: 刘继远一、实验目的进一步理解递归下降分析原理和实现方法,理解语义分析的基本机制,掌握语义子程序的构造方法。二、实验内容将带变量声明的表达式翻译为四元式序列,其中包括以下要求: 非终结符号D实现定义两种类型int, real变量的声明; 非终结符号S实现变量之间的*,+,: =(赋值运算) 两个关键字 int 和real 变量之间的*,+,: =(赋值) 运算只能使用声明过的变量,所以要检查使用的变量是否声明过。 对每个*,+,: =(赋值) 运算生成一条四元式如(*

2、,A,B,T1),其中T1是临时变量 *优先级别高于+,*满足左结合规则三、源程序分析这是一个简单的包含词法、语法、语义分析的程序:语义分析.h和语义分析.cpp。 实现的基本原理是自顶向下分析,单遍扫描,以语法分析为核心,调用词法分析,并实现语义分析。1、程序采用的BNFP DS.DB; DD Bint L | real LLid | L,idS V := E H H;S | EE+T | T TT*F|F F( E ) Fid Vid 消除左递归之后的等价文法start DS.DB; DD Bint L | real LLid A A ,idA A S V := E H H;S | ET

3、R R+T R R TF P P* F P P F( E ) Fid Vid 2、根据语义要求得到对应的翻译模式start DS.D B; DD B int L L.type := int | real L L.type := real L id A.Type := L.type enter(v.entry, L.type)A A ,idA A1.Type := A.type enter(v.entry,A.type)A S V := E gen( :=, E.place,0,V.place) H H;S | ET R.i:=T.place R E.place:=R.sR+T R1.i:= n

4、ewtemp; gen( +, R.i, T.place , R1.i) R R.s:= R1.s; R Rs=R.i TF P.i:=F.place P T.place:=P.sP* F p1.i:= newtemp; gen( *, P.i, F.place , T) P P.s:= p1.s; P P.s=P.i F( E ) F.place := E.placeFid F.place:=position (id)Vid V.place:=position(id)3、实现原理基于翻译模式的自上而下语义处理(翻译)1. 对每个非终结符 A,构造一个函数,以 A 的每个继承属性为形参,以A的

5、综合属性为返回值(若有多个综合属性,可返回记录类型的值) 。如同预测分析程序的构造,该函数代码的流程是根据当前的输入符号来决定调用哪个产生式。2. 与每个产生式相关的代码根据产生式右端的终结符,非终结符,和语义规则集(语义动作),依从左到右的次序完成下列工作:(1) 对终结符 X,保存其综合属性x的值至专为 X.x 而声明的变量;然后调用匹配终结符(match_token) 和取下一输入符号(next_token)的函数;(2) 对非终结符 B,利用相应于 B 的函数调用产生赋值语句c:=B(b1, b2, , bk),其中变量 b1, b2, , bk 对应 B的各继承属性,变量c对应B的综

6、合属性(3) 对语义规则集,直接copy其中每一语义规则(动作)来产生代码,只是将对属性的访问替换为对相应变量的访问。 4、文法的属性分析文法符号属性综合或继承含义start无D无B无LL.type继承类型AA.type继承类型S无EE.place综合指向变量或临时变量的指针(用整数实现)RR.i继承同上R.s综合同上TT.place继承同上PP.i继承同上P.s综合同上FF.place综合同上VV.place综合同上5、过程设计int getsym(); /读一个单词void enter(enum symbol type); /登记符号表void init(); int position(c

7、har* idt); /查询符号表用函数,返回在符号表中位置int gen(enum symbol op, int arg1, int agr2,int result ); /生成四元式void newtemp()/申请临时变量void start();void D();void B();void L(enum symbol type);void A(enum symbol type);void S();void H();int E();int R(int Ri);int T();int P(int pi);int F();int V();6、子程序说明init( ): 初始化函数,主要是用于

8、把单字符(例如:+、-、*、/)赋值一个symbol。getsym( ):把文件中的一个字符或者一个字符串分类成各种类型,用sym表示。enter( ): 把声明过的变量保存到tabletx这个结构体数组中。position( ):查找名字的位置,找到则返回在名字表中的位置,否则返回0。gen( ): 生成中间代码,通过传来的参数生产四元式。start( ): 开始对整个文件的语法语义经行分析。D( )、B( )、L( )、A( ):实现变量的声明,并把变量的类型和名字保存到tabletx这个结构体数组中。S( )、H( )、E( )、T( )、P( )、R( )、F( )、V( ):实现后面

9、程序运算语句的检查,并生成中间代码; 其中:S( )是检验赋值运算;H( )是执行下一条运算语句;E( )分析赋值号后面的运算;R( )是实检验+运算;P( )是检验*、/运算;F( )是实现*、/运算的优先级高于+运算,并获得当前位置的ID;V( )获得当前位置的ID。四、设计的基本思想(包括修改之后的属性文法、属性类型分析、翻译模式)按照扩展要求分析:1、增加除法运算 *,/优先级别高于+,*和/满足左结合规则 对包含除法运算的表达式生成对应的四元式(1)、可以在翻译模式中非终结符P增加一个产生式:P/ F p1.i:= newtemp; gen( /, P.i, F.place , T)

10、 P P.s:= p1.s; ,这样就在翻译模式中增加了 / 运算;(2)、在程序中的P( )函数里面模仿 * 运算,增加相应的分析语句:if (sym=divid) getsym(); Fplace=F(); tv=tv+1; gen(divid,pi,Fplace,tv); Ps=P(tv); (3)、在gen( )函数里模仿*运算,增加相应的四元式输出语句:if (op=divid) / /运算 fprintf(fout,(/,%s,%s,%s),temp1,temp2,temp3); printf(/,%s,%s,%s),temp1,temp2,temp3); 这样就在程序中增加了 /

11、 运算的分析要求。2、禁止同名重复声明所以登记符号之前要检查有没有同名变量声明过。因为tabletx数组就是存放声明变量名和类型的结构体数组,可以在enter( )这个存放声明变量的函数中,增加相应检验变量名重复的函数:for(int i=1;itxmax;i+) /*检查变量是否重名*/ if(strcmp(id,tablei.name) = 0) printf(错误4:变量名重复.n); exit(0); 每次要把一个变量加入到tabletx数组中都要检验变量名是否跟tabletx数组中已有的变量名重复,重复就报错,并跳出程序。 这样就在程序中增加了检查重复变量名的功能。五、结果及分析1、运行的文件a.txt内容为:real a,b;int c,d;c:=c+d*b;d:=b*a.运行结果为:2、运行文件a.txt的内容为:real a,b;int c,d,a;c:=c+d*b;d:=b*a.运行结果为:3、运行文件a.txt的内容为:real a,b;int c,d;f:=c+d*b;d:=b*a.运行的结果为:从以上三个结果(一个正确,两个错误)来看,完全实现了扩展要求的两个功能,也完全符合定义的语法语义规则。

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

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