c语言_递归下降分析程序实验_共13页

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

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

、实验目的:加深对语法分析器工作过程的理解;加强对递归下降法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。

、实验内容:在实验1的基础上,用递归下降分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程工具。

三、实验要求:

1.对语法规则有明确的定义;

2.编写的分析程序能够进行正确的语法分析;

3.*对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;

4.实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现*。

四、实验学时:4学时

五、实验步骤:

1.定义目标语言的语法规则;

2.根据语法规则输入语句段,用递归下降分析的方法进行语法分析,直到结束;

3.*对遇到的语法错误做出错误处理。

六、实验内容:

1.编程实现给定文法的递归下降分析程序。

E—T|E+T

T—F|T*F

F—(E)|i

2.(参考课本P74)对文法先进行消除左递归。

3.分析程序由一组递归过程组成,文法中每个非终结符对应一个过程几个全局过程和变量:

ADVANCE,把输入串指示器IP指向下一个输入符号,即读入一个单字符号

SYM,IP当前所指的输入符号

ERROR,出错处理子程序

每个非终结符有对应的子程序的定义,首先在分析过程中,当需要从某个非终结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。

4.具体实现时:

当遇到终结符,编写:if (当前读到的输入符号=i)

读入下一个输入符号

当遇到非终结符E时,编写语句:调用E()

当遇到E-->编写语句if (当前读到的输入符号不属于Follow (E))

Error();

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

#in elude using n ames pace std;

char

〃字符串的存入

a[80];

char sym; 〃单个的判断字符

int

//字符串下标

i=0;

void

//功能识别函数

E();

void

//功能识别函数

E2();

void

//功能识别函数

T();

void

//功能识别函数

T2();

void input(); // 输入函数

void advance(); // 字符串小标进一函数

5. 代码实现:

#include #include

#include #include

char a[50] ,b[50],d[200],e[10];

char ch;

int n1,i1=0,flag=1,n=5;

int total=0;/* 步骤计数器 */ int E();

int E1();

int T();

int F();

void input();

void input1();

void F(); //功能识别函数 int G();/*E

*/ int S();/*T ' */

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;

ch=b[0]=a[0];

printf("步骤吐文法\t分析串\t\t分析字符\t剩余串\n");

f=E1();

if (f==0) return;

if (ch=='#')

{

printf("accept\n");

int E1()

{

p=0; x=d[p];

while(x!='#') {

printf("%c",x);p=p+1;x=d[p];

printf("error\n");

printf(" 回车返回 \n");

getchar();

getchar();

return;

printf("\n");

printf("回车返回 \n");

getchar();

getchar();

式*/

}else

{ /*输出推导

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();

相关文档
最新文档