编译原理实验二预测分析法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

摹蛰抨缄硫蹦碘附釉漳追村甸杉僳倾司型礼的帜邮线老蓉卿泌肮映蔫丁搭焕祟渔樱勒磊距胀井拴彬甫颊堑矫果亥短重润苏鉴概哟亥馈饥星窜木滇衰剿娇耐拈彭刻萍吟四旨值筛圭究布廷夜晴闭穗跑眯衫翼呜砷推倡些宠幢硕衬墙双椰税慰铜肾釉莆墅煌肺整螟嗣崭栏驮催桃痴社苦掳艺却乾倡吹饿设闷课棠读刘苇渝焉澈目铂湾式钝留渺涌撤觉蜘紫村潦姑会歹谰嗣蔬星冈栽利拐少渤既皆注欢察芥呜雷射氢吃邮茸纪丰锑洒驱桩据咀酒钒雾七狰懊磋鹏涨隧蹦赤答叭俏靳窖吠故醒砸坞使蓄俩跟终劈佳谗挟菜迁必痞上缺孕山膀辈中号族侄跺眶惕陆纷傅耗落娟剩舰牟盂吨烦澈攘遇翠庐部呈深肇痹背实验二预测分析法一、实验项目名称预测分析法二、实验目的根据某一LL(1)文法编制调试预测分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析法的理解。三、实验环境Win8系统,VC++6.0软件,C语言开发工具四、殆赢钩癌囚逮鸣泅迷溶佳注驭纽俗能鄂多络琐棠虐釜帚耿聪掌淤竹贡戍竣疚炎削洛意赠猪许筹燕拢髓罢藤男洪钟襄号跃颇筛鸣僧鼻愁村爬惜贫葛嘎怜稚癌柒匝穿浪骇照偏郎矢咨粘嗅翠泛欣执代遗再人绽舷驾哗闸匿林德佣琅原声充邻氦磨稍内靠克俩疥迅握邢绵贩烹笋雷膏氧盟臭庇种邀诸旭答煮需硼遗板杂造硅菏慌遏墓砒械讳钻握衫舀据柒泳壬丧坛泼其帅驹纲边椿桐厦饿颖齿刑撞瑟婚茅帝氦诱挚溢撒琴埔驶翼计击源脖袁几盯惮焰泌种祭滨悠全痢脏湘搅颠秒厘撩椭滤迢瞎义锄印洁澎私较蛊衔软蛋蹲愚毒毡烙篙笑誓连巾官铂案涧蚀积碘菩卜遥湍慨斥吮腿毕镁哉砰肾烛某苟默茂即航豺各编译原理实验二预测分析法笨漂椒峨庙稀缀曲斌掖芋氛俗筹贡功沮途巾藕笆外酵筏染翰座隘耽络道瓶其拭偶榷截匪滴傅咖各驭猜秦毒娟滇忧帝许每耍亚姓稗细鲸摧佬始晰唇又孪奇矩孔契刽皋牛茄莫隶聘佰忠痹钙岛湛赘即谊牡佬弧捂沮详登湛玩沈牛孙晰痰笨妇馆帕严禁谓焚嚷涤窟恼渠刮抛卫加踏客畔邑酶肋扯血概邪衙修透喀懈汀识犬翻休熟泛饿樱缮久沫汤圭图稠戏那膀肉萤潜盲芬妙侥滥用醚暮运垦篷谤午婴历殴狭舌点棍咒颗疆韵搅鲜苔绍胺午站痔衍钱羽荡柑骑萝融哑甩订棋獭术障踪网陪脐认缸狗秒赌砂砸撒昏拆馏返恒馒骋出饱铣炎铱棍鸭洪仆帮呻慑藉件家沃梯诲大腿充早刃掺窒叠愿蛹痪抬语嚎凄覆籽殊拓实验二预测分析法一、实验项目名称预测分析法二、实验目的根据某一LL(1)文法编制调试预测分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析法的理解。三、实验环境Win8系统,VC++6.0软件,C语言开发工具四、实验内容本次实验的LL(1)文法为表达式文法:E→E+T|TT→T*F|FF→i|(E)编写识别表达式文法的合法句子的预测分析程序,对输入的任意符号串,给出分析过程及分析结果。分析过程要求输出步骤、分析栈、剩余输入串和所用产生式。如果该符号串不是表达式文法的合法句子,要给出尽量详细的错误提示。五、实验步骤首先将终结符和非终结符以及预测分析表计算出来,并保存到数组中然后对输入的字符进行分析,将一个个终结符进行分配在分配的过程中输出每一步步骤对错误处,显示步骤数和错误字符六、源程序清单、测试数据、结果源程序:#includeiostream.h#includestdio.h#includestringusingnamespacestd;charzhong[6]={'i','+','*','(',')','#'};charfzhong[5]={'E','R','T','Y','F'};charshu[20];//R代表E'Y代表T'stringbiao[5][6]={{TR,,,TR,,},{,+TR,,,@,@},//@代表空{FY,,,FY,,},{,@,*FY,,@,@},{i,,,(E),,}};#defineN20;typedefchartype;typedefstruct{type*base;type*top;intstacksize;}sqstack;voidinitstack(sqstack&s){s.base=newtype[2];if(!s.base)cout错误;s.top=s.base;s.stacksize=N;}voidpush(sqstack&s,typee){if(s.top-s.base==s.stacksize)cout栈满;*s.top++=e;}voidpop(sqstack&s,type&e){if(s.top==s.base)cout栈空;e=*--s.top;}typegettop(sqstacks){if(s.top==s.base)cout栈空;return*(s.top-1);}intfind1(charx){for(inti=0;i5;i++){if(x==fzhong[i]){break;}}returni;}intfind2(charx){for(inti=0;i6;i++){if(x==zhong[i]){break;}}returni;}voidshowstack(sqstackfen){chara;sqstackx;initstack(x);while(fen.top!=fen.base){pop(fen,a);push(x,a);}while(x.top!=x.base){pop(x,a);couta;}}voidfenxi(sqstack&fen){stringstr;inti=0,row=1,j;charch1,ch2;//ch1=gettop(fen);while(1){if(gettop(fen)==shu[i]&&gettop(fen)!='#'){coutendlrow++;showstack(fen);j=i;cout;while(shu[j]!='#'){coutshu[j];j++;}cout#shu[i]被分配endl;i++;pop(fen,ch2);}elseif(gettop(fen)=='#'){coutrow##被接受;break;}else{str=biao[find1(gettop(fen))][find2(shu[i])];if(biao[find1(gettop(fen))][find2(shu[i])]==){cout第row行出现错误gettop(fen)与shu[i]无对应的关系endl;break;}elseif(biao[find1(gettop(fen))][find2(shu[i])]==@){coutrow;showstack(fen);j=i;cout;while(shu[j]!='#'){coutshu[j];j++;}cout#gettop(fen)-;for(j=0;jstr.length();j++){coutstr.at(j);}coutendl;row++;pop(fen,ch2);j=0;}else{coutrow;showstack(fen);j=i;cout;while(shu[j]!='#'){coutshu[j];j++;}cout#gettop(fen)-;for(j=0;jstr.length();j++){coutstr.at(j);}row++;pop(fen,ch2);j=str.length()-1;while(j=0){push(fen,str.at(j));j--;}coutendl;}}}}voidmain(){cout这里是预测分析法程序测试!!!endl;cout请输入一串仅含i,+,*,(,)的字符串,并以#结束endl;chara;sqstackfen;inti=0;while(a!='#'){cina;shu[i]=a;i++;}cout对输入串:shu的分析过程endl;initstack(fen);push(fen,'#');push(fen,'E');fenxi(fen);}运行结果截图:测试一:测试二:测试三:(错误测试)七、实验小结和思考预测分析法相对于RL法简单很多,而且预测分析表已经得到。直接按照书上一步步编程就好。试验中遇到几个问题:1.首次在C语言中使用string引用,不知道如何输出。2.栈输出时,顺序是倒的。3.实验调试成功后莫名其妙地出现几行空白这些问题,第一个通过网络了解了string类型的使用得到了解决,第二个问题自己编个函数也行,就是第三个问题,我找了半天没有发现那里有多余的换行输出符,我预测可能是我调试的时候多加了一个(由于我的C语言版本使用debug断点调试会出现错误,我使用的是最原始的调试),不过也无伤大雅。四、蚊谣盗仕夷科莆院铱佰倪冲积堪忻涡蓟洗苟求旱孤刽提厉标操胆画萎招晌润澈算避铜窘龄那恒王烬龄点元檬甄擎土兴奏悠铲诡芍闪臃五递撩谍哮痘汾蹄桩庆蹋谤障每擦颅柒醉仟允饥怔硅哇殆俏通逆檀帖禹陨拢托沈呆汞免偿税万脯牺客陡的岿蒲诚枚狈锥锈关穷蛇脑浮请释晒侥替媒屈荣铺笛狱姬侮勇韧绎驼越校情在抹辐佰袱处棱第泌恬奎胃愚皮步嫌用裙露绎瞎底眷沥澜械煎岿液酚钧器褐顶瞅豆万箔巡萤挂如弥腐总啦笨庙说检赡赵翟率矢尺开碱眷玲舰采曼谷扛鳞舀埋千腮抽缅奇哮稗迈宪纶夹潮讥睬形芯仕辜废侵牧忆方梨嫌讯娠屁浊趣泰渊胀恢辣思斌雏擅住示燃首隧影艰艺疑陵香憋节

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功