C算符优先分析法-试验报告_第1页
C算符优先分析法-试验报告_第2页
C算符优先分析法-试验报告_第3页
C算符优先分析法-试验报告_第4页
C算符优先分析法-试验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成绩成绩姓名学号实验报告实验题目:算符优先分析法课程名称:编译原理主讲教师:班级:实验日期:提交日期:一、实验目的:采用算符优先分析法对表达式(不包含括号运算)进行分析,并给出四元式。二、实验内容在实验1、2的基础上,用算符优先分析法编制语法分析程序。分析过程:先在算符栈置“$”,然后开始顺序扫描表达式,若读来的单词符号是操作数,这直接进操作数栈,然后继续读下一个单词符号。分析过程从头开始,并重复进行;若读来的是运算符。2则将当前处于运算符栈顶的运算符01的入栈优先数f与02的比较优先函数g进行比较。三、程序的改写:因为这次的实验与前面两次的实验有很大的重合,所以会用到很多之前两次的代码。首先,定义函数:WORD*5cann”();“网法扫面函数,获得一^单词voidI叩消叩*();“递归下降分析程序voidyucu():〃语句串分析函数UOidstdtenwnu)语句分淅函数void表或就分析函数voidtern();〃项uoidFdCtdl*1);〃因子intF(charch);/intg(charch);/intintF(charch);/intg(charch);/intconpare(charvoiduoidcharctiaruoidniddlefcharpusti_operatorStaGk(charpop_operatorStack();//top_operatorStaclc();手核顶元素和新注入的优先级大小的函数算符栈进栈函数pushooperandetack(Flnntch)A与取栈顶函数floatpop_operandStack();/zg.floattop_opprandStack()与取栈顶函数其中本次需要写的函数有:入栈优先函数f,比较优先函数g,compare,middle,栈函数以及主函数。.入栈优先函数f书上已经给出了入栈优先函数的表,根据输入的符号赋予数值,以便后面方便比较。inif(char血>”入栈优先函数suitch(<case'*':return5;bneal:;case'/':return5;break;case"+':return3:break;case;return3;break;ca5e,$1:return0;break;default:return-1;br&ak:.比较优先函数g原理同入栈优先函数fi-ntg(char比较优先函数<switch<cti)(case'**:return4;breah;caseV:return&;break;case"+':return2;case:return2;by0甘K;case15':returnG;break;default:return-1;break;3.compare用f()和g()来做比较,来判定是否将运算符压入栈。intcompare(charch)〃比较优先级iF(F(top_operatorStack())<g(ch)||f(top_operatorStack())==g(ch))pushoperatorStack(ch);else讦(f(top_operatorStack())>g(ch))<while(top_operatorStack(),■,$,||ch,・•$,)〃至少有一个不为,$•,表明还要继续循环运算下去<iF(F(top_operatorStack())<g<ch)||F(top_operatorStack())==g(ch)){--pushoperatorStack(ch);return0;}elseiF(F(top_operatorStack<))>g(ch))middle(top_operatorStack());>return0;将取算符栈顶的运算符和操作数栈顶的两个操作数做运算的方法写在一个函数里,这样方面以后的调用,使代码变得简洁些。•idEiddlKeh*运算符栈中最上方两个运算符的计算值.并再压入运算符栈floatresult;floatoperand2=pop_operandStack();flodtoperaind1=pop_operandStack();pop_operatorStach();switch(ch)case:re5ult=operand1*operand2;pu3h_(]p"antl5tacK(『B5Ult);br&ak;case:result=operand1-operand2;push_operandStack(resultJ;break;case**■:result=operand1*operand2;push_叩e产dn(13tacH(峰;break:caseV:result=operand1/operand2;pushopepandStack(result):break;default::break;}prlintf,常f.,告甘*n".ch,op曰叩wand2Me、ult)?push_operatorStackvoidpush_operatorStdch(cliarch>"算奇栈进栈{_一astackl-top++;stackn.stack[^tackl-top]=ch;pop_operatorStackcharpop_op心mtorMtacK()/仅符枝出枝<charc=stdcl<l.stdck[stjckl.top];stackl..top--;returnc;top_operatorStackchar七0p_operztur$t日ckf)〃算符栈抑栈顶<returnstack"1_stack[stackl.top];ualdpush_operandStack(float心h)〃操作数越i#花stack2.top++;st3ck2.stack[stack2.top]=ch;pop_operandStackfloatpup一叩erandStaum)〃操作数栈出栈ctiarc=stack2,stack[stack2_top];stjck2.top一;returnc;top_operandStackFloattop_Qp"Mnd£tdcMQ”操作数栈取楂顶(returnstack[stack2_top];}以上的有关栈的函数在数据结构中学过。在主函数中,先将文件里的内容读入缓冲区,然后从缓冲区依次取数进行一下判断,如果取出的是数字时将数字压入操作数栈,如果取出的是运算符时调用compare()函数判断是将其压入栈,还是做其他的操作。当结束操作后,算符栈里遇到$,操作数栈里只有结果时,操作成功,否则失败。uoidm^inOFILE*Fp-fopen("in.txt"/T");iF(Fp-=NULL)printfCVnurFiledosen1t)Fread(input9sizeof(char),Fp);Fclose(fp);p_input=0;printfC'Vourwords:\rAs\nvlfinput);WORD*readword=newWORD;reddword=scanner();intsyn=readwt)rd->lypenun;charend-'$1;pusn_operator5tacl<(end);stack2-top=-1;wh:iletsynt-B)(iF(syn=-11)/Z11digitpush_operandStHack(atDf(readwQrd->word));readword=scanner();syn=readword->typenum;>elseiF(syn==iS||syrt--1^||syn==19||syn==1-!i||syn==-1:*f16:7,13,1-Uz-,-1:$(conpdre(reddirard->vord[•]);rpadword=scanner();synireadviord->typenuni;}else(readword-scanncrf);syn=readword->ti^penuni;}printFC'SuccessTKn");结果13・修\弱译原理\匚4算将优先分析法^)白卜口9\丁磨盘33?Vourno产口拿二£:=4+2«3-28/4;ond$ttC*.2.993099,3.900999.6.000@00>t+,4.,6.0国000日,L0-日日旧园0日〉CZ,28.083909,4.300900,7.0000B0><—,10«000009,7,900000.3.000000>Kiiccefss*[Pi'&ss:anykeytocantInue四、我的感想这次试验可以说是前两个试验的综合了,程序中也很多用到了前两次的代码。对于我自己来说,最难的部分在于将这些思想转换成代码实现出来,很大一部分在于自己平时没有多打代码以及就是对算符优先分析的思想理解得还不够透彻。在写m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论