实验二 递归下降语法分析程序设计
更新时间:2023-08-27 18:37:01 阅读量: 教育文库 文档下载
- 实验二小推荐度:
- 相关推荐
实验二 递归下降语法分析程序设计
实验二 递归下降语法分析程序设计
[实验目的]:
1.了解语法分析的主要任务。 2. 熟悉编译程序的编制。
[实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。 [实验要求]:
1. 构造一个小语言的文法,例如,Pascal语言子集的文法,考虑其中的算术表达式文法:
G[<表达式>]:G[E]:
<表达式>→<表达式>+<项>|<表达式>-<项>|<项> E→E+T|T <项>→<项>*<因式>|<项>/<因式>|<因式> T→T*F|F <因式>→<标识符>|<无符号整数>|(<表达式>) F→i|(E) 2. 设计语法树的输出形式,例如:
产生式 ……
3. 编写递归下降语法分析程序
实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法算术表达式。实验报告中要说明分析使用的方法。 4. 生成并输出分析过程中所用的产生式序列:
1 产生式1 2 产生式2 ……
[实验步骤]:
1. 写出一个小语言的算术表达式文法。
2. 写出该小语言的算术表达式等价的LL(1)文法。例如:
G[E]: 其中
E→TG G为E’ E→+TG|^ ^为ε T→FS S为T’ T→*FS|^ F→i|(E)
3. 编写递归下降语法分析程序。 4. 调试运行程序。 5. 结果分析。 6. 撰写实验报告。
[实验报告]:每位同学撰写一份试验报告,并提交电子版。 1. 源程序。
2. 画出流程图。
3. 实验设计过程中出现的问题及解决的方法。 4. 实验设计过程中的体会。 5. 给出程序清单。 6. 给出测试结果。
实验二 递归下降语法分析程序设计
实验报告命名规则:
个人:2013-14(1)医智(1)1107505101蔡菲菲实验二 交各班课代表汇总后,由课代表打包后,发送至老师的邮箱 班级命名规则:2013-14医智(1)实验二 截止日期:第14周周五晚11点30分
测试的结果举例
源代码:
#include <stdio.h> #include <dos.h> #include <stdlib.h> #include <string.h>
char a[50],b[50],d[200],e[10],ch; /*数组a存输入串,数组d存推导式*/
int n1,i1=0,flag=1,n=5; /*flag=1处理非终结符,flag=0处理终结符*/ int total=0; /*步骤计数器*/ int E(),E1(),T(); int G();/*E’*/ int S();/*T’*/ int F();
void input(); void input1(); void output();
实验二 递归下降语法分析程序设计
void main() /*递归分析*/ { int f,p,j=0; char x; d[0]='E';d[1]='=';d[2]='>';d[3]='T';d[4]='G';d[5]='#'; printf("请输入字符串(长度<50,以#号结束)\n"); do { scanf("%c",&ch); a[j]=ch; j++; }while(ch!='#'); n1=j;/* n1输入串实际长度 */ ch=b[0]=a[0]; printf("步骤\t文法\t分析串\t\t分析字符\t剩余串\n"); f=E1(); {system("pause"); } if (f==0) return; /*有语法错误,失败退出*/ if (ch=='#') { printf("accept\n"); /*输入串是文法的句子*/ p=0; x=d[p]; while(x!='#') { printf("%c",x); p=p+1; x=d[p]; /*输出推导式*/ } } else { printf("error\n"); printf("回车返回\n"); getchar(); getchar(); return; } printf("\n"); printf("回车返回\n"); getchar();
实验二 递归下降语法分析程序设计
getchar(); }
int E1()/* 有语法错误函数返回值为0,否则为1*/ { int f,t; printf("%d\tE-->TG\t",total); total++; flag=1; input(); input1(); f=T(); if (f==0) return(0); t=G(); if (t==0) return(0); else return(1); }
int E() { int f,t; printf("%d\tE-->TG\t",total); total++; e[0]='E';e[1]='=';e[2]='>';e[3]='T';e[4]='G';e[5]='#'; output(); flag=1;input();input1(); f=T(); if (f==0) return(0); t=G(); if (t==0) return(0); else return(1); }
int T() { int f,t; printf("%d\tT-->FS\t",total); total++; e[0]='T';e[1]='=';e[2]='>';e[3]='F';e[4]='S';e[5]='#'; output(); flag=1;input();input1(); f=F();
实验二 递归下降语法分析程序设计
if (f==0) return(0); t=S(); if (t==0) return(0); else return(1); }
int G() { int f; if(ch=='+') { b[i1]=ch; printf("%d\tG-->+TG\t",total); total++; e[0]='G';e[1]='=';e[2]='>';e[3]='+';e[4]='T';e[5]='G';e[6]='#'; output(); flag=0;input();input1(); ch=a[++i1]; f=T(); if (f==0) return(0); G(); return(1); } printf("%d\tG-->^\t",total); total++; e[0]='G';e[1]='=';e[2]='>';e[3]='^';e[4]='#'; output(); flag=1; input(); input1(); return(1); }
int S() { int f,t; if(ch=='*') { b[i1]=ch; printf("%d\tS-->*FS\t",total); total++; e[0]='S';e[1]='=';e[2]='>';e[3]='*';e[4]='F';e[5]='S';e[6]='#'; output();
实验二 递归下降语法分析程序设计
flag=0;input();input1(); ch=a[++i1]; f=F(); if (f==0) return(0); t=S(); if (t==0) return(0); else return(1); } printf("%d\tS-->^\t",total); total++; e[0]='S';e[1]='=';e[2]='>';e[3]='^';e[4]='#'; output(); flag=1;a[i1]=ch;input();input1(); return(1); }
int F() { int f; if(ch=='(') { b[i1]=ch; printf("%d\tF-->(E)\t",total); total++; e[0]='F';e[1]='=';e[2]='>';e[3]='(';e[4]='E';e[5]=')';e[6]='#'; output(); flag=0;input();input1(); ch=a[++i1]; f=E(); if (f==0) return(0); if(ch==')') { b[i1]=ch; printf("%d\tF-->(E)\t",total); total++; flag=0; input(); input1(); ch=a[++i1]; } else { printf("error\n"); return(0);
实验二 递归下降语法分析程序设计
} } else if(ch=='i') { b[i1]=ch; printf("%d\tF-->i\t",total); total++; e[0]='F';e[1]='=';e[2]='>';e[3]='i';e[4]='#'; output(); flag=0;input();input1(); ch=a[++i1]; } else { printf("error\n"); return(0); } return(1); }
void input() { int j=0; for (;j<=i1-flag;j++) printf("%c",b[j]); /*输出分析串*/ printf("\t\t"); printf("%c\t\t",ch); /*输出分析字符*/ }
void input1() { int j; for (j=i1+1-flag;j<n1;j++) printf("%c",a[j]); /*输出剩余字符*/ printf("\n"); }
void output() /*推导式计算*/ { int m,k,j,q; int i=0; m=0;k=0;q=0; i=n; d[n]='=';d[n+1]='>';d[n+2]='#'; n=n+2; i=n; i=i-2; while(d[i]!='>'&&i!=0)
实验二 递归下降语法分析程序设计
i=i-1; i=i+1; while(d[i]!=e[0]) i=i+1; q=i;m=q;k=q; while(d[m]!='>') m=m-1; m=m+1; while(m!=q) { d[n]=d[m]; m=m+1; n=n+1; } d[n]='#'; for(j=3;e[j]!='#';j++) { d[n]=e[j]; n=n+1; } k=k+1; while(d[k]!='=') { d[n]=d[k]; n=n+1; k=k+1; } d[n]='#'; }
流程图:
实验二 递归下降语法分析程序设计
开始
输入符号串(#结束)
调用函数 E1
当前字符为#? Y 匹配成功 accept,输 出最左推导过程
N
匹配失败 error
结束 E、E1
INPUTSYM=”i”? Y T
N
INPUTSYM=”(“? Y
N
Error
G
出口
实验二 递归下降语法分析程序设计
T
INPUTSYM=”i”? Y F
N
INPUTSYM=”(“? Y
N
Error
S
出口 G
N
INPUTSYM=”+”? Y INPUTSYM=下一个符号
INPUTSYM=”i”? Y T
N
INPUTSYM=”(“? Y
N
Error
G
出口
实验二 递归下降语法分析程序设计
S
N
INPUTSYM=”*”? Y INPUTSYM=下一个符号
INPUTSYM=”i”? Y F
N
INPUTSYM=”(“? Y
N
Error
S
出口
F
INPUTSYM=”i”? Y
N
INPUTSYM=”(“? Y E
N
INPUTSYM=下一个符号
INPUTSYM=”)“? Y 出口
N
Error
实验二 递归下降语法分析程序设计
运行结果:
验证
i*i+i
验证
ik5
实验设计过程中出现的问题及解决的方法:
本次实验最难的问题就是画流程图,解决方法就是通过问同学和通过google和查看书本,了解LL(1) 文法是怎么实现的,然后在对每个非终结符进行递归下降的程序分析并画出流程图。
实验二 递归下降语法分析程序设计
实验设计过程中的体会:
这次实验比较成功的完成了,由于是C语言,理解上也不是很大问题,不是实验一的那样是C++,有些代码看都看不懂。不过这次实验的重点就是让我们了解LL(1)文法,更能让我们独自地去完成项目,为后面的大作业做准备。
正在阅读:
实验二 递归下降语法分析程序设计08-27
普通话考试普通话朗读作品《“能吞能吐”的森林》文字加拼音05-03
旋转机械振动诊断标准研究07-19
孩子成长感言(优秀3篇)03-22
二级建造师资格岗位实习报告07-29
小学六年级下册品德与社会教学计划04-02
2017年小学语文标点符号的正确用法02-15
走过风雨作文500字06-22
买馒头作文600字06-19
我班的吃饼干比赛作文400字06-27
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 递归
- 程序设计
- 语法
- 下降
- 实验
- 分析
- 初三物理质量和密度典型例题解析
- 中考体育训练计划表
- 中外纪录片赏析
- 2015荣誉体系
- 事业单位申论热点:推进基层政府三公经费公开
- 庆祝中华人民共和国70周年思想汇报1
- 山东省临清三中2012-2013学年高一上学期期末考前考生物试题
- 中国地质大学平时作业2014年春高数
- 广工C语言编程题目
- 浅析科学技术是一把双刃剑
- 如何在Word中打印信封的大小来确定
- 高一数学专题讲座抽象函数
- 流体力学考试复习题
- 2011年重庆市高考理综(物理)试卷及答案(精美解析版)
- 离散数学试题及解答
- 初中美术浙人美版七年级上册第3课《手绘图表》优质课公开课教案教师资格证面试试讲教案
- 国际商法第六章案例解析
- 中西酒文化差异开题报告
- 六西格玛经典案例:削减问询处理成本
- 美国重返亚太对中国的影响及对策