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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

北邮编译原理语义分析文档和程序.docx

1、北邮编译原理语义分析文档和程序实验报告班级:2011211314姓名:oneseven学号:一题目:语义分析程序的设计与实现。二实验内容:编写语义分析程序,实现对算术表达式的类型检查和求值。要求所分析算术表达式由如下的文法产生。E-E+T|E-T|T T-T*F|T/F|F F-num.num|(E)|num三实验要求:用自底向上的语法制导翻译技术实现对表达式的分析和翻译。(1)写出满足要求的语法制导定义或翻译方案。(2)编写分析程序,实现对表达式的类型进行检查和求值,并输出:1.分析过程中所有产生式。2.识别出的表达式的类型。3.识别出的表达式的值。(3)实验方法:可以选用以下两种方法之一。

2、1.自己编写分析程序。2.利用YACC自动生成工具。四实验分析:1.步骤:(1)根据题目所给出的文法构造相应的拓广文法,并求出该文法各非终结符的FIRST、FOLLOW集合;(2)构造拓广文法的项目集规范族,并构造出识别所有前缀的DFA;(3)构造文法的LR分析表;(4)由此构造LR分析程序。(5)写出满足要求的翻译方案。(6)实现对表达式的类型进行检查和求值,并输出。2.实现方法:1.输入缓冲区为一个字符型数组,读入输入的算术表达式并保存在此,以$结束;2.定义两个二维整形数组,goto和action,其值大于零代表移进操作,小于零代表规约操作,引进的状态或规约用到的产生式又绝对值表示。等于

3、零代表出现错误。等于特殊值-10代表acc.状态。3.处理输入表达式中代表id和num的子串,分别将它们转化为i和n进行分析;4.根据分析表,相应进行语法分析,移近或规约,按算法4.3的步骤完成过程。5.由于要求进行类型检查和求值,所以可以定义两个综合属性,一个记录值一个记录类型,存放在结构中,一并传入传出。输出的产生式可以作为虚拟综合属性,在产生式的最后打印出来。将类型检查和求值归于一次扫描,把类型和值赋给相应的表达式。由于只具有综合属性,故可以用S属性的自底向上翻译实现,利用LR分析程序来实现,只需扩充分析站和改造分析程序。本次实验是基于语法分析方法3,因此相关的代码和文档类似于上次实验。

4、3.翻译方案:E-E+TE.val=E.val+T.valif(E.type=real|T.type=real)E.type=real;elseE.type=integer;E-E-TE.val=E.val-T.valif(E.type=real|T.type=real)E.type=real;else E.type=integer;E -TE.val= T.valE.type=T.typeT-T*FT.val=T.val*F.valif(T.type=real|F.type=real)T.type=real;elseT.type=integer;T-T/FT.val=T.val/F.vali

5、f(T.type=real|F.type=real)T.type=real;else T.type=integer;T -FT.val=F.valT.type=F.typeF -num.numF.val=num.num.val F.type=realF -(E)F.val=E.valF.type=E.typeF -numF.val=num.val F.type=integer3.计算过程:文法对应的拓广文法为:(0)E-E (1) E - E+T (2)E - E-T (3) E -T (4)T - T*F(5)T - T/F(6)T -F (7)F -num.num (8)F -(E)(9)

6、F -num求的各个非终结符的FIRST、FOLLOW集合为:ETFFIRST(, num(, num (, numFOLLOW$, ), +, -$, ), +, -, *, /$, ), +, -, *, /4.SLR(1)分析表为:状态+-*/().Num$ETF0S5S41231S6S7acc2R3R3S8S9R3R33R6R6R6R6R6R64R9R9R9R9R9S10R95S5S411236S5S41237S5S41338S5S4149S5S41510S1611S6S7S1712R1R1S9S10R1R113R2R2S9S10R2R214R4R4R4R4R4R415R5R5R5R5

7、R5R516R7R7R7R7R7R717R8R8R8rR8R8R85.主程序说明:void Get_str(void) /获取待分析输入表达式intJudge_num(char ch) /判断字符是否为构成num的数字intGet_ternum(char ch) /返回终结符在终结符表中的下标intGet_unternum(char ch) /返回非终结符在非终结符表中的下标intJudge_ter(char ch) /判断字符是否为终结符intJudge_unter(char ch) /判断字符是否为非终结符void fanyi(intchioce) /翻译方案void Analyse_ou

8、tput(void) /使用LR语法预测分析表分析输入的表达式并输出分析结果五代码。#include#include#includeusing namespace std;char terminal9=+,-,*,/,(,),.,n,$; /终结符表char unterminal3=E,T,F; /非终结符表char grammar1010= /输出产生式 SE,EE+T,EE-T,ET,TT*F, TT/F,TF,Fn.n,F(E),Fn ;intGoto183= /LR()语法预测分析表 1,2,3,0,0,0,0,0,0,0,0,0, 0,0,0,11,2,3,0,12,3,0,13,3

9、, 0,0,14,0,0,15,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0 ;int Action189= 0,0,0,0,5,0,0,4,0, 6,7,0,0,0,0,0,0,-10, -3,-3,8,9,0,-3,0,0,-3, -6,-6,-6,-6,0,-6,0,0,-6, -9,-9,-9,-9,0,-9,10,0,-9, 0,0,0,0,5,0,0,4,0, 0,0,0,0,5,0,0,4,0, 0,0,0,0,5,0,0,4,0, 0,0,0,0,5,0,0,4,0, 0,0,0,0,5,0,0,4,0, 0,0,0,0,0

10、,0,0,16,0, 6,7,0,0,0,17,0,0,0, -1,-1,8,9,0,-1,0,0,-1, -2,-2,8,9,0,-2,0,0,-2, -4,-4,-4,-4,0,-4,0,0,-4, -5,-5,-5,-5,0,-5,0,0,-5, -7,-7,-7,-7,0,-7,0,0,-7, -8,-8,-8,-8,0,-8,0,0,-8, ;char str40; /待分析的输入表达式float value40; /产生式的值int top=0,state40,type40; /状态,栈顶,产生式的类型void Get_str(void) /获取待分析输入表达式 intlen; p

11、rintf(请输入待分析的表达式:);scanf(%s,&str);for(len=0;strlen!=0;len+);strlen=$;strlen+1=0;len+;statetop=0; intJudge_num(char ch) /判断字符是否为构成num的数字if(ch=0&ch=9)return 1;elsereturn 0; intGet_ternum(char ch) /返回终结符在终结符表中的下标inti;for(i=0;i9;i+)if(ch=terminali)returni;return -1; intGet_unternum(char ch) /返回非终结符在非终结符

12、表中的下标inti;for(i=0;i=1;i+) j=j/10;valuetop-2=valuetop-2+valuetop*pow(0.1,i);typetop-2=2;break;case 8:valuetop-2=valuetop-1;typetop-2=typetop-1;break;case 9:valuetop=valuetop;typetop=1;break;default:break; void Analyse_output(void) /使用LR()语法预测分析表分析输入的表达式并输出分析结果inti,j,m;intS,step=0,ip=0,length=0; char

13、a;cout0) /移进 top+;if(a=n)valuetop=i;statetop=ActionSm;ip+=length; else if(ActionSm0&ActionSm!=-10) /规约 i=0-ActionSm;fanyi(i);for(j=1;grammarij!=0;j+) top-; m=statetop; j=Get_unternum(grammari0);top+;statetop=Gotomj;step+;cout(step) grammari0;for(j=1;grammarij!=0;j+) /输出产生式 if(grammarij=n)coutnum;els

14、ecoutgrammarij; couttvalue:valuetop;cout tttype:;if(typetop=1)coutintegern;elsecoutrealn; else if(ActionSm=-10) cout表达式的值:valuetop;coutn表达式的类型:;if(typetop=1)coutintegern;elsecoutrealn;return; else cout发生错误!tn;return; while(1); int main()Get_str();Analyse_output();system(pause);return 0; 六测试数据: 1.运行成功: 2.运行失败:

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

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