一、 实验内容
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. 语法分析主程序示意图
是 打印分析成功 出错处理 否 Syn=0&&kk=0? 调用scaner 出错处理 是否end? 调用statement函数 调用scaner 调用语句串分析函数 是 调用scaner 是否;? 是 否 是否begin? 否 调用statement函数 图3.语句串分析示意图 图2.递归下降分析程序示意图
否 是否标识符 是 调用scaner 否 是否:=? 是 调用scaner 图4.statement语句分析函数出错处理 调用expression函数 示意图
调用factor函数 调用term函数 否 否 是否+,-? 是 调用scaner 出错处理 调用factor函数 调用term函数 是否*,/? 是 调用scaner 出错处理
图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!\"< if(kk!=1) cout<<\"缺end!\"< void yucu() { statement(); while(syn==26) { scaner(); statement(); } return; } void statement() { if(syn==10) { scaner(); if(syn==18) { scaner(); expression(); } else{cout<<\"赋值号错误\"< 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(); else{cout<<\")错误\"< p=0; cout<<\"Please input string\"< scaner(); Irparser(); } 四、实验心得 语法分析是编译过程的核心部分,它的主要功能是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备。 从这次语法分析实验中我感到语法分析的过程要比之前的词法分析实验复杂的多,其中涉及到文法规则,自顶向下分析方法和许多编程的细节问题,有一处不正确,语法分析也不能成功。通过这次的语法分析实验,我对如何将文法规则转换为实际的程序代码有了进一步的认识,并且对语法分析过程有了更深入的认识。 因篇幅问题不能全部显示,请点此查看更多更全内容