【编译原理】实验二 语法分析器设计与实现

实验类型: 设计性   实验学时:4   实验要求:必修

一、实验目的

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

二、实验内容

利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

2.1 待分析的简单语言的语法

用扩充的BNF范式表示如下:

 

2.2 实验要求说明

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。

例如:

    输入  begin a:=9; x:=2*3; b:=a+x end #

    输出  success!

    输入  x:=a+b*c end #

    输出  error

三、仪器设备

计算机,C++6.0软件环境。

四、所需耗材

五、实验原理、方法和手段

语法分析程序的算法思想

(1)主程序示意图如图5-1所示。

(2)递归下降分析程序示意图如图5-2所示。

(3)语句串分析过程示意图如图5-3所示。

(4)statement语句分析程序流程如图5-4、5-5、5-6、5-7所示。

六、实验步骤

阅读实验说明,做好实验准备,然后进行编辑调试。

七、实验结果处理

演示结果并保存相关文件。

八、实验注意事项

注意数据输入格式,单词的匹配规则。

九、预习与思考题

预习:阅读课本相关内容,分析相关算法设计思想,熟悉VC++6.0使用方式。

思考题:类C语言程序的语法分析。

十、实验报告要求

1、实验报告中应包括相关操作步骤和程序代码。</

  • 7
    点赞
  • 139
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实验2 语法分析 一、 实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 实验内容 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 1、 待分析的简单语言的语法 用扩充的BNF表示如下: (1)::=beginend (2)::={;} (3)::= (4)::=ID:= (5)::={+|-} (6)::={*|/} (7)::=ID| NUM|() 2、实验要求说明 输入单词,以“#”结束,如果是文法正确句子,则输出成功信息,打印“success”,否则输出error”。 三、 结果验证 1. 输入:begin_a:=9;_x:=2*3;_b:=a+x_end# 输出success! 2. 分别验证其他错误(至少2个) 四、 语法分析程序的源程序代码 #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,sum=0,kk; //p是缓冲区prog的指针,m是token的指针 char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner(); void factor(); void term(); void expression(); void statement(); #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,sum=0; //p是缓冲区prog的指针,m是token的指针 char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { 同实验一代码 } void factor() { …完成函数代码 } void term() { ……完成函数代码 } void expression() { ……完成函数代码 } void statement() {//cout<<"调用statement,syn="<<syn<<endl; if(判断语句) {scaner(); if(syn==18) {//cout<<"syn=18"<<endl; scaner(); expression(); } else{cout<<"缺:=错误!"<<endl;kk=1;} } else {cout<<"error!"<<endl;kk=1;} return; } void yucu() {…..完成函数代码 } //return; } void lrparser() {//cout<<"调用Irparser"<<endl; 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 main() {p=0; cout<>ch; 执行语句3; }while(ch!='#'); p=0; scaner(); lrparser(); //cout<<syn<<','<<kk<<endl; }
实验一名称 词法分析程序(2学时) 实验目的 理解词法分析在编译程序中的作用;加深对有穷自动机模型的理解; 掌握词法分析程序的实现方法和技术。 实验内容 选择部分C语言的语法成分,设计其词法分析程序,要求能够识别关键字、运算符、分界符、标识符、常量(至少是整型常量,可以自己扩充识别其他常量)等,并能处理注释、部分复合运算符(如>=等)。单词元式形式输出输出有词法错误的单词及所在行号。 实验要求 (1)待分析的简单的语法 关键字:begin if then while do end … 运算符和界符::= + - * / < <= > >= <> = == ; ( ) # , … 其他单词是标识符id和整型常数num,通过以下正规式定义: id=l(l|d)* (l:letter d:digit) num=dd* 空格、注释:在词法分析中要去掉。 (2)各种单词符号对应的种别编码(参考这张表,可以不同) (3)待分析的源程序: (a)int main() { int a=1,b=2; b/a; /* 注释部分*/ b>a; c=a+b; cout<<c; return 0; } (b)这个待分析程序有词法错误(选做) while ((a+15)>0) { if (2x = = 7) i3=z; } 实验名称 预测分析程序(2学时) 实验目的 掌握LL(1)文法分析思想;掌握预测分析程序的构造方法。 实验内容 设计实现能够识别表达式的预测分析程序。 实验要求 (1)总体要求: 1) 根据文法手工或程序方式构造预测分析表; 2) 采用程序方式构造预测分析表时,需计算First()和Follow()集合,有一定难度; 3) 根据预测分析表,设计实现预测分析总控程序,完成自上而下的语法分析器。 (2)文法的定义(可以选择此文法,也可以自己选择其他文法) (3)给出当输入为:(i1+i2)*(i3+i4)的分析过程。(输出分析过程中的栈,输入和利用的产生式等信息)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值