递归下降子程序的编写

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验4 递归下降子程序的编写

一、实验目的

通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的优缺点。

二、实验准备

1.预习自上而下语法分析小节的内容;

2.学生自己考虑使用的开发环境,如VC++,熟悉开发环境。

三、实验内容

下列文法中选做一题:

1.针对算术表达式文法:E→TE’

E’→ +TE’|ε

T→FT’

T’→*FT’ |ε

F→(E) |i

为其编写递归下降子程序,判定某个算术表达式是否正确:如j+k*m,j*k+m

输入:其输入数据应该为词法分析器输出的记号形式:i+i*i,i*i+i

输出:分析结果:算术表达式结构正确或结构错误。

2.给定文法(PASCAL语言标识符定义文法)(选做)

type→simple|↑id|array[simple] of type

Simple→integer|char|num dotdot num

其中:dotdot表示.

编写递归下降子程序,判定一个句子结构是否正确:array [3..5]of integer 输入:其输入数据应该为词法分析器输出的单词序列:array[num dotdot num] of integer

输出:分析结果

四、实验要求

1.编写程序调试运行;考虑如果将你的程序改为识别其他的文法,你的递归下降子程序可否通用,考虑递归下降子程序方法的优缺点。

2.撰写实验报告:实验名称、实验目的、实验内容、实验结果、结果分析

五、实验结果

1、程序:

#include #include #include #include char EL[20];

int word=0; void E1(); void T(); void T1(); void F();

//编写E函数//E->TE

void E()

{

//因为是第一步,所以直接输出E->TE'

printf("E->TE'\n");

T();

E1();

}

//就是那个E'函数

//E'->+TE'|ε

void E1()

{ //如果匹配为+号的话输出E'->+TE if(EL[word]=='+')

{

printf("E'->+TE'\n");

word++;

T();

E1();

}

else

//如果不是加号、则输出空

printf("T'->ε\n");

}

//T->FT

void T()

{

printf("T->FT'\n");

F();

T1();

}

//如果匹配*则输出T'->*FT,否则输出空

//T'->*FT|ε

void T1()

{

if(EL[word]=='*')

{

printf("T'->*FT'\n");

word++;

F();

T1();

}

else

printf("T'->ε\n");

} //如果为i、则输出F->i\n,如果为(则指针下移、调用E函数、如果为)则输出F->(E),否则说明括号不匹配。

//F->(E)|i

void F()

{

if(EL[word]=='i')

{

printf("F->i\n");

word++;

}

else if (EL[word]=='(')

{

word++;

E();

if(EL[word]==')'){

printf("F->(E)\n");

word++;

}

else{

printf("\n错误、括号不匹配(缺少右括号)\n");

exit (0);

} }

else{

printf("错误、请输入正确的算术表达式!\n");

exit(0);

}

}

//主函数

//输入算数表达式、为其编写递归下降子程序,判定算术表达式是否正确

int main()

{

while(1)

{

printf("请输入算数表达式:");

scanf("%s",EL);

E();

}

return 0;

}

2、截图:

(1)输入正确的算数表达式:

i+i*i

(2)输入有括号的算数表达式

: i+(i*i)

(3)输入缺少一半括号的算数表达式

: i+(i*i

(4) 输入缺少操作数的算数表达式

: i+i*

相关文档
最新文档