编译原理语法分析实验报告(共5页).doc
精选优质文档-倾情为你奉上实验二 语法分析实验报告一、 实验内容1.1 实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析.1.2 实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析1.2.1待分析的简单语言的词法用扩充的BNF表示如下:(1)<程序>:=<声明序列><语句序列>(2)<语句串>:=<语句><语句>(3)<语句>:=<赋值语句>(4)<赋值语句>:=ID:= <表达式>(5)<表达式>:=<项>(+<项>|-<项>(6)<项>:=<因子>*<因子>|/<因子>(7)<因子>:=ID|NUM|(<算术表达式>)1.2.2实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。 二、实验程序的总体结构框架置初值 调用scaner读下一个单词符号调用lrparser结束 图1. 语法分析主程序示意图 调用statement函数是否begin?否是是否;?调用scaner是调用语句串分析函数调用scaner是否end?调用statement函数调用scaner否出错处理否Syn=0&&kk=0?图3.语句串分析示意图是出错处理打印分析成功图2.递归下降分析程序示意图图4.statement语句分析函数示意图否是否标识符是调用scaner否是否:=?是调用scaner出错处理调用expression函数调用term函数是否+,-?调用scaner调用term函数是否否是出错处理调用factor函数是否*,/?调用scaner调用factor函数出错处理图5. expression表达式分析函数示意图 图6.term分析函数示意图 是 是是否否否是否整常数?是否标识符是否(?调用scaner 调用expression函数 是否)? 是否调用scaner出错处理调用scaner图7. factor分析过程示意图三、 关键技术的实现方法专心-专注-专业Scanner函数定义已在实验一给出,本实验不再重复给出void Irparser() kk=0; if(syn=1) scaner(); yucu(); if(syn=6) scaner(); if(syn=0 && (kk=0) cout<<"success!"<<endl; else if(kk!=1)cout<<"缺end!"<<endl; kk=1; else cout<<"缺begin!"<<endl;kk=1; return;void yucu() statement(); while(syn=26)scaner(); statement(); return;void statement()if(syn=10)scaner();if(syn=18)scaner();expression();elsecout<<"赋值号错误"<<endl;kk=1;elsecout<<"语句错误"<<endl;kk=1;return;void expression()term();while(syn=13)|(syn=14)scaner();term();return;void term()factor();while(syn=15)|(syn=16)scaner();factor();return; void factor()if(syn=10)|(syn=11)scaner();else if(syn=27)scaner();expression();if(syn=28)scaner();elsecout<<")错误"<<endl;kk=1;elsecout<<"表达式错误"<<endl;kk=1;return;void main()p=0;cout<<"Please input string"<<endl;docin.get(ch);if(ch!=”n”)progp+=ch;while(ch!='#');p=0;scaner();Irparser();四、实验心得语法分析是编译过程的核心部分,它的主要功能是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备。从这次语法分析实验中我感到语法分析的过程要比之前的词法分析实验复杂的多,其中涉及到文法规则,自顶向下分析方法和许多编程的细节问题,有一处不正确,语法分析也不能成功。通过这次的语法分析实验,我对如何将文法规则转换为实际的程序代码有了进一步的认识,并且对语法分析过程有了更深入的认识。