资源描述:
《语法分析报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、语法分析一、实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。二、实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1待分析的简单语言的语法用扩充的BNF表示如下:(1)v程序〉::=begin<语句串〉end(2)v语句$>::=v语句>{;v语句>}(3)v语句=v赋值语句〉⑷v赋值语句=ID:二V表达式>(5)v表达式〉::=v项〉{+v项>I-<项>}(6)<项>::=v因子>{*v因子>I/v因子〉(7)v因了=IDINUMI(v农达式〉)2.
2、2实验要求说明输入单词串,以“#”结束,如果是文法止确的句了,则输出成功信息,打印“success”,否则输出“error”。例如:输入begina:=9;x:=2*3;b:=a+xend#输出success!输入x:=a+b*cend#输出error2.3语法分析程序的酸法思想(1)主程序示意图如图2・1所示。置初值调用scaner读下一个单词符号调用Irparser图2-1语法分析主程序示意图(2)递归下降分析程序示意图如图2・2所示。(3)语句串分析过程示意图如图2・3所示。调用statement函数调用s
3、caner调丿IJstatement函数出错处理图2・3语句串分析示意图是▼打卬分析成功出错处理图2・2递归下降分析程序示意图(1)statement语句分析程序流程如图2・4、2-5>2-6>2・7所示。调用term函数出错处理
4、
5、{错处理图2-4statement语句分析函数示意图图2-5expression表达式分析函数示意图Hl错处理调用scancr调用scaner图2-7factor分析过程示意图三、语法分析程序的C语言程序源代码:#include"stdio.h"#includenstring.h"c
6、harprog[10014oken[8],ch;char*rwtab⑹={nbeginn,,'ir;,then',;,while,,,,,do,,,,,endn};intsyn,p,m,n,sum;intkk;factor();expression();yucu();term();statement();lrparser();scaner();main(){p=kk=O;printf(Hpleaseinputastring(endwith");do{scanf(n%cn,&ch);prog[p++]=ch
7、;}while(ch!=*#');P=0;scaner();lrparser();getch();}lrparser(){if(syn==l)scaner();yucu();/*读下一个单词符号*//*调用yucu()函数;*/if(syn==6){scaner();if((syn==O)&&(kk==O))printf("success!u);}else{if(kk!=l)printf("thestringhaven'tgota*end'!");kk=l;}}else{printf(”haventgot
8、a'begin'!、n”);kk=l;}return;}yucu(){statement();/*调用函数statement。;*/while(syn==26){scaner();/*读卜一个单词符号*/if(syn!=6)statement();/*调用函数statement();*/}return;}statement(){if(syn==10){scaner();/*读b一个单词符号*/if(syn==18){scaner();/*读下一个单词符号*/expression();/*调用函数statement
9、();*/else{printf("thesing*:='iswrong!H);kk=l;}}else{printf(Hwrongsentence!");kk=l;}return;}expression(){term();while((syn==13)ll(syn==14)){scaner();/*读下一个单词符号*/term();/*调用函数term();*/return;}term(){factor();while((syn==15)ll(syn==16)){scaner();/*读卜一个单词符号*/
10、factor();/*调用函数factor();*/return;factor(){if((syn==10)ll(syn==l1))scanerQ;elseif(syn==27){scaner();八读下一个单词符号*/expression();/*调用函数statement。;*/if(syn==28)scaner();/*读下一个单词符号*/else{printf(u