当前位置:文档之家› 语法分析程序报告

语法分析程序报告

语法分析程序报告
语法分析程序报告

X理工大学

《编译原理》

题目语法分析程序

姓名: _____________________________

学号: _____________________________

班级: _____________________________

一、实验目的

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

二、实验要求

利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

2.1待分析的简单语言的语法

用扩充的BNF表示如下:

⑴ <程序>::=begin<语句串>end

⑵ <语句串>::=<语句>{;<语句>}

⑶ <语句>::=<赋值语句>

⑷ <赋值语句>::=ID :=<表达式>

⑸ <表达式>::=<项>{+<项>卜<项>}

⑹ <项>::=<因子>{*<因子> | /<因子>

⑺ <因子>::=ID | NUM | (<表达式>)

2.2实验要求说明

输入单词串,以“ #”结束,如果是文法正确的句子,贝U输出成功信息,打印“ succesS', 否则输出“ error”。

例如:

输入begin a:=9; x:=2*3; b:=a+x end #

输出success

输入x:=a+b*c end #

输出error

2.3语法分析程序的酸法思想

⑴主程序示意图如图2-1所示。

结束

图2-1语法分析主程序示意图

⑵递归下降分析程序示意图如图2-2所示。

⑶语句串分析过程示意图如图2-3所示。

图2-2递归下降分析程序示意图图2-3语句串分析示意图

2-4、2-5、2-6、2-7 所示。

⑷stateme nt语句分析程序流程如

图2-4 statement语句分析函数示意图图2-5 expression表达式分析函数示意图

图2-6 term 分析函数示意图

图2-7 factor

分析过程示意图

三、语法分析程序的 C 语言程序源代码 #in elude "stdio.h" #i nclude "stri ng.h"

char prog[100],toke n[ 8],ch;

char *rwtab [ 6]={"begi n","if',"the n","while","do","e nd"}; int syn, p,m, n,sum; int kk; factor 。; expressi on(); yucu(); term(); stateme nt(); lrparser(); sca ner(); main () { p=kk=0;

printf("\nGrade:05 Class:03 Name:Qiyubing Number:200507096 \n ”); prin tf("\n----Please in put the stri ng end with '#': ---- \n"); do

{ scanf("%c",&ch); prog[p++]=ch;

调用factor 函数

是否* , /?

是否标识符?

是否整常数?

调用 scaner

J

调用factor 函数

出错处理

是否(?

调用seaner

出错处理

调用expression 函数 否

是否)?

调用seaner

调用seaner

}while(ch!='#');

p=0; scaner(); lrparser(); getch();

} lrparser()

{

if(syn==1)

{

scaner(); /* 读下一个单词符号*/ yucu(); /* 调用yucu() 函数;*/ if (syn==6)

{ scaner();

if ((syn==0)&&(kk==0)) printf("SUCCESS!\n");

}

else { if(kk!=1) printf("Sorry,the string haven't got an 'end'!\n");

kk=1;

}

}

else { printf("Sorry,haven't got a 'begin'!\n"); kk=1;

}

return;

}

yucu()

{

statement(); /* 调用函数statement();*/

while(syn==26)

{

scaner(); /* 读下一个单词符号*/

if(syn!=6)

statement(); /* 调用函数statement();*/

}

return;

} statement()

{ if(syn==10)

{ scaner(); /* 读下一个单词符号*/

if(syn==18)

{ scaner(); /* 读下一个单词符号*/ expression(); /* 调用函数statement();*/

}

else { printf("Sorry,the sing ':=' is wrong!\n");

kk=1;

}

}

else { printf("Sorry,wrong sentence!\n");

kk=1;

}

return;

}

expression()

{ term();

while((syn==13)||(syn==14))

{ scaner(); /* 读下一个单词符号*/ term(); /* 调用函数term();*/

}

return;

}

term()

{ factor();

while((syn==15)||(syn==16))

{ scaner(); /* 读下一个单词符号*/ factor(); /* 调用函数factor(); */

}

return;

}

factor()

{ if((syn==10)||(syn==11)) scaner();

else if(syn==27)

{ scaner(); /* 读下一个单词符号*/ expression(); /* 调用函数statement();*/ if(syn==28)

scaner(); /* 读下一个单词符号*/

else { printf("Sorry,the error on '('\n");

kk=1;

}

}

else { printf("Sorry,the expression error!\n");

kk=1;

}

return;

scaner()

{ sum=0;

for(m=0;m<8;m++)token[m++]=NULL;

m=0;

ch=prog[p++];

}

while(ch==' ')ch=prog[p++]; if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) { while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) {token[m++]=ch;

ch=prog[p++];

}

p--;

syn=10;

token[m++]='\0';

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)

{ syn=n+1;

break;

}

}

else if((ch>='0')&&(ch<='9'))

{ while((ch>='0')&&(ch<='9'))

{ sum=sum*10+ch-'0';

ch=prog[p++];

}

p--;

syn=11;

}

else switch(ch)

{ case '<':m=0;

ch=prog[p++];

if(ch=='>')

{ syn=21;

}

else if(ch=='=')

{ syn=22;

}

else

{ syn=20;

p--;

}

break;

case '>':m=0;

ch=prog[p++];

相关主题
文本预览
相关文档 最新文档