编译原理语法分析报告+代码

上传人:枫** 文档编号:544949069 上传时间:2022-09-03 格式:DOCX 页数:15 大小:166.43KB
返回 下载 相关 举报
编译原理语法分析报告+代码_第1页
第1页 / 共15页
编译原理语法分析报告+代码_第2页
第2页 / 共15页
编译原理语法分析报告+代码_第3页
第3页 / 共15页
编译原理语法分析报告+代码_第4页
第4页 / 共15页
编译原理语法分析报告+代码_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《编译原理语法分析报告+代码》由会员分享,可在线阅读,更多相关《编译原理语法分析报告+代码(15页珍藏版)》请在金锄头文库上搜索。

1、语法分析一、实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分 析。二、实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1 待分析的简单语言的语法用扩充的 BNF 表示如下:(1) v 程序:=begin 语句串end(2) v语句串::=语句; 语句 语句 := 赋值语句 赋值语句:=ID:=表达式(5) v 表达式 :=项 + 项 I-项(6) v项::= 因子* 因子I /因子(7) v 因子 :=ID I NUM I (v 表达式)2.2 实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,贝9输出成功信息,打印“su

2、ccess”, 否则输出“ error”。例如:输入begin a:=9; x:=2*3; b:=a+x end #输出success!输入x:=a+b*c end #输出error2.3 语法分析程序的酸法思想(1)主程序示意图如图2-1 所示。图 2-1 语法分析主程序示意图2)递归下降分析程序示意图如图2-2 所示。3)语句串分析过程示意图如图2-3 所示。图 2-2 递归下降分析程序示意图(4) statement语句分析程序流程如图2-4、2-5、2-6、2-7所示。图 2-7 factor 分析过程示意图三、语法分析程序的 C 语言程序源代码:#include stdio.h#in

3、clude string.h char prog100,token8,ch;char *rwtab6=begin,if,then,while,do,end;int syn,p,m,n,sum;int kk; factor(); expression(); yucu(); term(); statement(); lrparser(); scaner(); main() p=kk=0; printf(nplease input a string (end with #): n);do scanf(%c,&ch);progp+=ch;while(ch!=#);p=0;scaner();lrpars

4、er();getch();lrparser()if(syn=1)scaner();/*读下一个单词符号*/yucu();/* 调用 yucu()函数;*/if (syn=6) scaner();if (syn=0)&(kk=0)printf(success!n);else if(kk!=1) printf(the string havent got a end!n); kk=1;else printf(havent got a begin!n);kk=1;return;yucu()statement();/*调用函数 statement();*/while(syn=26)scaner();/*

5、读下一个单词符号*/if(syn!=6)statement();/*调用函数 statement();*/return;statement() if(syn=10)scaner();/*读下一个单词符号*/if(syn=18) scaner(); expression();/*读下一个单词符号*/*调用函数 statement();*/else printf(the sing := is wrong!n); kk=1;else printf(wrong sentence!n); kk=1;return;expression() term();while(syn=13)|(syn=14) sca

6、ner(); term();return;/*读下一个单词符号*/*调用函数 term();*/term() factor();while(syn=15)|(syn=16) scaner(); factor();return;/*读下一个单词符号*/*调用函数 factor(); */factor() if(syn=10)|(syn=11) scaner();else if(syn=27) scaner();expression(); if(syn=28) scaner();/*读下一个单词符号*/ /*调用函数 statement();*/*读下一个单词符号*/else printf(the

7、 error on (n); kk=1;else printf(the expression error!n); kk=1;return;scaner() sum=0;for(m=0;m8;m+)tokenm+=NULL;m=0;ch=progp+;while(ch= )ch=progp+; if(ch=a)|(ch=A) while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch;ch=progp+;p-;syn=10;tokenm+=0;for(n=0;n=0)&(ch=0)&(ch=9) sum=sum*10+ch-0;ch=progp+;p-;syn=11;

8、else switch(ch) case ) syn=21;else if(ch=) syn=22;else syn=20;p-;break;case :m=0;ch=progp+;if(ch=) syn=24;else syn=23;P-;break;case :m=0;ch=progp+;if(ch=) syn=18;else syn=17;p-;break;case +: syn=13; break;case -: syn=14; break;case *: syn=15;break;case /: syn=16;break;case (: syn=27;break;case ): sy

9、n=28;break;case =: syn=25;break;case ;: syn=26;break;case #: syn=0;break;default: syn=-1;break;四、结果分析:输入 begin a:=9; x:=2*3; b:=a+x end # 后输出 success! 如图 4-1 所示:k三下T诸原理yufafe-1 .exeplease input a string (end. with J it* beg(n a: =9 ; x: =2*3 : b: =a.+x end tt success!图4-1输入x:=a+b*c end #后输出error如图4-

10、2所示:g=: k: =a+b*c end Itliauen,t got a Jbegin1 ?图4-2五、总结:通过本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值调用scaner 函数读下一个单词符号T调用IrParseT结束。递归下降分析的大致流程为:“先判断是否为 begin” T不是则“出错处理”,若是则“调用scaner函数” T调用语句串分析函数T “判断 是否为end” T不是则“出错处理”,若是则调用scaner函数T “判断syn=0&kk=0是否成 立”成立则说明分析成功打印出来。不成立则“出错处理”语义分析程序#include stdio.h#includ

11、e string.hchar prog100,token8,ch;char *rwtab6=begin,if,then,while,do,end;int syn,p,m,n,sum,q;int kk;struct char result18;char ag118;char op18;char ag218; quad20;char *factor();char *expression();int yucu();char *term();int statement();int lrparser();char *newtemp();scaner();emit(char *result,char *a

12、g1,char *op,char *ag2);main() int j;q=p=kk=0;printf(nplease input a string (end with #): );do scanf(%c,&ch);progp+=ch;while(ch!=#);p=0;scaner();lrparser();if(q19)printf( to long sentense!n);else for (j=0;jq;j+)printf( %s = %s %s %s nn,quadj.result1,quadj.ag11,quadj.op1,quadj.ag21);getch();int lrparser() int schain=0;kk=0;if (syn=1) scaner();schain=yucu();if(syn=6) scaner(); if(syn=0)&(kk=0) printf(Success!n);else if(kk!=1)printf(short of end !n); kk=1;getch();exit(0);else printf

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号