编译原理语法分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二语法分析实验报告
一、实验内容
1.1 实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析.
1.2 实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析
1.2.1待分析的简单语言的词法
用扩充的BNF表示如下:
(1) <程序>::={<声明序列><语句序列>}
(2)<语句串>::=<语句>{;<语句>}
(3) <语句>::=<赋值语句>
(4) <赋值语句>::=ID:= <表达式>
(5) <表达式>::=<项>{(+<项>|-<项>}
(6) <项>::=<因子>{*<因子>|/<因子>}
(7) <因子>::=ID|NUM|(<算术表达式>)
1.2.2实验要求说明
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。
二、实验程序的总体结构框架
图1. 语法分析主程序示意图
图2.递归下降分析程序示意图
图5. expression表达式分析函数示意图图6.term分析函数示意图
三、关键技术的实现方法
Scanner函数定义已在实验一给出,本实验不再重复给出
void Irparser()
{
kk=0;
if(syn==1)
{
scaner();
yucu();
if(syn==6)
{
scaner();
if(syn==0 && (kk==0)) cout<<"success!"< } else { if(kk!=1) cout<<"缺end!"< kk=1; } } else {cout<<"缺begin!"< return; } void yucu() { statement(); while(syn==26) { scaner(); statement(); } return; } void statement() { if(syn==10) { scaner(); if(syn==18) { scaner(); expression(); } else{cout<<"赋值号错误"< } else{cout<<"语句错误"< 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(); else{cout<<")错误 "< } else{cout<<"表达式错误 "< return; } void main() { p=0; cout<<"Please input string"< do { cin.get(ch); if(ch!=”\n”) prog[p++]=ch; }while(ch!='#'); p=0; scaner(); Irparser(); } 四、实验心得 语法分析是编译过程的核心部分,它的主要功能是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备。 从这次语法分析实验中我感到语法分析的过程要比之前的词法分析实验复杂的多,其中涉及到文法规则,自顶向下分析方法和许多编程的细节问题,有一处不正确,语法分析也不能成功。通过这次的语法分析实验,我对如何将文法规则转换为实际的程序代码有了进一步的认识,并且对语法分析过程有了更深入的认识。