资源描述:
《编译原理 递归下降词法分析.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理实验报告—递归下降分析法程序实验2.1递归下降分析法一、实验目的1.根据某一文法编制递归下降分析程序,以便对任意输入的符号串进行分析。2.本次实验的目的是加深对递归下降分析法的理解。二、实验平台Windows+VC++6.0范例程序:“递归下降分析法.cpp”三、实验内容对下列文法,用递归下降分析法对任意输入的符号串进行分析:(1)E→TG(2)G→+TG
2、-TG(3)G→ε(4)T→FS(5)S→*FS
3、/FS(6)S→ε(7)F→(E)(8)F→i1.程序功能:输入:一个以#结束的符号串(包括+-*/()i#):例如:i+i*i-i/i#输出:(1)详细的分析步骤,每
4、一步使用的产生式、已分析过的串、当前分析字符、剩余串,第一步,产生式E->TG的第一个为非终结字符,所以不输出分析串,此时分析字符为i,剩余字符i+i*i-i/i#;第二步,由第一步的E->TG的第一个为非终结字符T,可进行对产生式T->FS分析,此时第一个仍为非终结字符F,所以不输出分析串,分析字符仍为i,剩余字符i+i*i-i/i#;第三步,使用产生式F->i,此时的分析串为i,,分析字符为i,匹配成功,剩余字符串+i*i-i/i#;第四步,因为使用了产生式T->FS,F->i,第一个字符i匹配成功,接着分析字符+,使用产生式S->ε,进行下步;第五步,使用产生式G->+TG
5、,此时的分析串包含i+,分析字符为+,剩余字符串+i*i-i/i#;第六步,重复对产生式T->FS,F->i的使用,对第二个i进行匹配,此时分析串i+i,分析字符为i,剩余串*i-i/i#;第七步,分析字符*,使用产生式S->*FS,分析串i+i*,剩余串i-i/i#;第八步,字符*匹配成功后,使用产生式F->i,匹配第三个字符i,,此时剩余串-i/i#;第九步,分析字符-,只有产生式G->-TG可以产生字符-。所以要先使S->ε,才可使用G->-TG,进行匹配,此时的分析串为i+i*I,剩余串-i/i#;第十步,使用G->-TG,字符-匹配成功,接着重复对产生式T->FS,F-
6、>i的使用,对第四个i进行匹配,此时分析串i+i*i-i,分析字符为i,剩余串/i#;第十一步,分析字符/,使用产生式S->/FS,接着使用F->i,对第五个i匹配,此时分析串i+i*i-i/i,剩余串#;第十二步,最后是#,说明后面字符匹配皆为空,所以要用到S->ε,G->ε结束。结果显示如下图:(2)分析结果:accept(3)推导序列:E=>TG=>FSG=>iSG=>i^G=>i^+TG=>i^+FSG=>i^+iSG=>i^+i*FSG=>i^+i*iSG=>i^+i*i^G=>i^+i*i^-TG=>i^+i*i^-FSG=>i^+i*i^-iSG=>i^+i*i^-
7、i/FSG=>i^+i*i^-i/iSG=>i^+i*i^-i/i^G=>i^+i*i^-i/i^^2.语法树结构:ETGFS+TGiεFS-TGεi*FSFS/FSiεiiε3.功能的完善:(1)原来示例程序只能完成+、*、(、)的语法分析,现在加入-和/的语法分析。(2)将示例程序输出的推导序列中的推导符号由=改为=>。 (3)如果遇到错误的表达式,程序可输出错误提示信息.输入字符串后首先对它进行判断是否有非法字符,若有则提示“有非法字符”部分代码:printf("请输入字符串(长度<50,以#号结束)");do{scanf("%c",&ch);if((ch!='i')&
8、&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='#')){printf("输入串中有非法字符");return;}例如:输入一符号串如i*a+b#,要求输出为“非法的符号串”。如果不符合LL(1)文法则提示错误“error”4.对一个新的文法实现递归下降分析S->aHH->aMdH->dM->AbM->εA->aMA->e(1)程序代码:aa.cpp的文件(2)输入:一个以#结束的符号串:例如:aadb#(3)输出:步骤:第一步,首先判断是否有非法字符,如有则提示“输入非法字符”,若无则进行字符串分析;第二步,将#S进分析
9、栈即分析从S开始,S为开始符,首先使用产生式S->aH,分析串a,分析字符为a,剩余字符串adb#,第三步,分析第二个字符a,对S->aH中的非终结符H进行分析,使用H->aMd,字符a匹配成功,剩余字符串db#;第四步,使用产生式M->ε,字符d匹配成功,剩余字符串b#;第五步,分析到栈底,代表分析成功最后以#结束。非法输入提示错误:(4)步骤分析栈剩余字符串使用产生式或匹配1#Saadb#S->aH2#Haaadb#a匹配成功3#Hadb#H->aMd4#dMaadb#a匹配