您的当前位置:首页正文

《编译原理(实验部分)》实验6_自顶向下递归子程序法

2020-06-10 来源:易榕旅网


《编译原理》(实验部分)

实验6_自顶向下递归子程序法

一、实验目的

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

二、实验设备

1、PC 兼容机一台;操作系统为WindowsWindowsXP。

2、Visual C++ 6.0 或以上版本, Windows 2000 或以上版本,汇编工具(在Software 子目录下)。

三、实验原理

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

E’→ +TE’|ε

T→FT’

T’→*FT’ |ε

F→(E) |i

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

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

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

四、实验步骤

各个函数之间的调用关系如下图所示:

源代码如下:

#include

#include

#include

#include

char a[10];

int lookahead=0;

void E1();

void T();

void T1();

void F();

void E()

{

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

T();

E1();

}

void E1()

{

if(a[lookahead]=='+')

{

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

lookahead++;

T();

E1();

}

else

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

}

void T()

{

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

F();

T1();

}

void T1()

{

if(a[lookahead]=='*')

{

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

lookahead++;

F();

T1();

}

else

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

}

void F()

{

if(a[lookahead]=='i')

{

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

lookahead++;

}

else if (a[lookahead]=='(')

{

lookahead++;

E();

if(a[lookahead]==')'){

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

lookahead++;

}

else{

printf(\"\\n括号不匹配分析失败!\\n\");

exit (0);

}

}

else{

printf(\"括号不匹配,分析失败!\\n\");

exit(0);

}

}

int main()

{

while(1)

{

printf(\"请输入算数表达式(以#键结束):\");

scanf(\"%s\

E();

if((a[lookahead]=='#'))

printf(\"句子结构正确\\n\");

else

printf(\"无结束标志,分析失败\\n\");

}

return 0;

}

程序运行结果如下所示:

因篇幅问题不能全部显示,请点此查看更多更全内容