2024年5月25日发(作者:)

实验三 递归下降分析器设计与实现

1、实验目的:

(1)掌握自上而下语法分析的要求与特点。

(2)掌握递归下降语法分析的基本原理和方法.

(3)掌握相应数据结构的设计方法。

2、实验内容:

编程实现给定算术表达式的递归下降分析器.

算术表达式文法如下:

E——〉E+T|T

T——>T*F|F

F-—>(E)|i

3、设计说明:

首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过

程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。

4、设计分析

这个题目属于比较典型的递归下降语法分析。需要先将原算术表达式方法改写

为LL(1)文法为:

E—->TE’

E’——〉+TE’|ε

T—-〉FT'

T'-—〉*FT’|ε

F--〉(E)|i

然后再为每个非终结符设计一个对应的函数,通过各函数之间的递归调用从而

实现递归下降语法分析的功能。具体方法为:

(1)当遇到终结符a时,则编写语句

If(当前读到的输入符号==a)读入下一个输入符号

(2)当遇到非终结符A时,则编写语句调用A().

(3)当遇到A——>ε规则时,则编写语句

If(当前读到的输入符号不属于Follow(A))error()

(4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一

个候选式进行推导.

5、程序代码

#include

void E();

void T();

void E1();

void T1();

void F();

char s[100];

int i, SIGN;

int main()

void E()

{

}

void E1()

{

if(SIGN==0)

{

if(SIGN==0)

}

T();

E1();

printf(”请输入一个语句,以#号结束语句(直接输入#号推出)n”);

while( 1 )

}

return 1;

SIGN = 0;

i=0;

scanf("%s”,&s);

if( s[0] == '#’)

return 0;

E();

if(s[i]==’#’)

printf("正确语句!n");

printf("请输入一个语句,以#号结束语句n");