实验二 递归下降语法分析程序设计

更新时间:2023-11-10 05:47: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 #include #include #include

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(\ a[j]=ch; j++; }while(ch!='#'); n1=j;/* n1输入串实际长度 */ ch=b[0]=a[0]; printf(\步骤\\t文法\\t分析串\\t\\t分析字符\\t剩余串\\n\ f=E1(); {system(\} if (f==0) return; /*有语法错误,失败退出*/ if (ch=='#') { printf(\输入串是文法的句子*/ p=0; x=d[p]; while(x!='#') { printf(\ p=p+1; x=d[p]; /*输出推导式*/ } } else { printf(\ printf(\回车返回\\n\ getchar(); getchar(); return; } printf(\ printf(\回车返回\\n\ getchar();

getchar(); }

int E1()/* 有语法错误函数返回值为0,否则为1*/ { int f,t; printf(\ 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(\ 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(\ 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(\ 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(\ 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(\ e[0]='S';e[1]='=';e[2]='>';e[3]='*';e[4]='F';e[5]='S';e[6]='#'; output();

本文来源:https://www.bwwdw.com/article/2czv.html

Top