欢迎来到天天文库
浏览记录
ID:20432887
大小:260.68 KB
页数:12页
时间:2018-10-12
《编译原理实验(二)》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、实验编号:语法分析(2)一、实验目的及要求编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。利用c语言编制递归下降分析程序,并对简单语言进行语法分析。1待分析的简单语言的语法用扩充的BNF表示如下:(1)<程序〉::=begin<语句串〉end(2)<语句串〉=<语句〉{;<语句〉}(3)<语句〉::=<赋值语句〉(4)<赋值语句〉=ID:=<表达式〉(5)<表达式〉=<项〉{+<项:>
2、-<项〉}(6)<项〉::=<因子〉{*<因子〉
3、/<因子〉⑺〈因子〉::=ID
4、NUM
5、(〈表达式〉)2实验要求说明输入单词串,以
6、“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。例如:输入begina:=9;x:=2*3;b:=a+xend#输山success!输入x:=a+b*cend#输山error二、实验环境MicrosoftVisualStudioVC6.0三、算法描述(1)主程序示意图如图2-1所示。[晋初俏调用scaner读下一个单词符号调用lrparser图2-1语法分析主程序示意图(1)递归下降分析程序示意图如图2-2所示。(2)语句串分析过程示意图如图2-3所示。打印分析成功出错处理图2-2递归下降分析程序示意
7、图(3)statement语句
8、分析程序流程如图2-4、2-5、2-6、2-7所示。调用expression函数调MJscaner调用term闲数山错处理图2-4statement语句分析困奴不思囡、出错处理图2-5expression表达式刀n幽似小思图调用scaner图2-6term分析函数示意图调川expression函数Vj是V岀错处理调用scaner调用scaner图2-7factor分析过程示意图四、源程序清单#include"stdio.h"^include"string,h”charprog[100],tokcn[8],ch;char
9、*rwtab[6]={z/bcgin,z,"if",’’then”,"while”,’’do’’,’’end’’};intsyn,p,m,n,sum;intkk;factor();//因子expression();//表达式judgueO;//判断语句、下一条语句tcrmO;//项statement();//赋值语句lrparser();//判断、输出函数scancr();//读下一个字符yucu();voidmain(){P=0;printf("本本本本本本本本本本本本本本本本本本本本本本本本本本本本本本本本本本;printf("请输入源程序:
10、");do{scanf("%c",&ch);prog[p++]=ch;}while(ch!=’#’);P=0;scancr();lrparser();printf("语法分析结束!");•Ilrparscr(){if(syn==l)//begin{scancr0;yucuO;if(syn==6)//end{scancr();if(syn==O&&kk==O)printf(’’success〃);}else{if(kk!=l)printf("error,lose’end’!");kk=l;}}elseprintf(’’error,lose’
11、begin’!〃)kk=l;return0;}yucu(){statement();while(syn==26)//;{scancr();statement();}return0;}statement(){if(syn==10){scancr();if(syn==18){scancr();expression();elseprintfC’error!〃);kk=l;}}else{printfC’error!〃);kk=l;}return0;expression()term();while(syn==13
12、
13、syn==14)scancr();tcr
14、m();return0;tcrm()factor();while(syn==15syn==16)scancr();factor();return0;factor()if(syn==10
15、
16、syn==ll)scanerO;//为标识符或整常数时,读下一个单词符号elseif(syn==27){scancr();expression();if(syn==28)scancr();else{printf(〃’)’错误");kk=l;}}elseprintf(〃表达式错误11〃);kk=l;return0;scancr(){sum=0;for(m=0;m
17、<8;m++)token[m]=NULL;//数组清空m=0;ch=prog[p++];while(ch==
此文档下载收益归作者所有