语法分析程序报告
kk=1;
}
}
else { printf("Sorry,haven't got a 'begin'!\n");
kk=1;
}
return;
}
yucu()
{
statement(); /*调用函数statement();*/
while(syn==26)
{
scaner(); /*读下一个单词符号*/
if(syn!=6)
printf("\n----Please input the string end with '#':-------- \n");
do
{ scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
scaner();
lrparser();
getch();
}
lrparser()
是
图2-7 factor分析过程示意图
三、语法分析程序的C语言程序源代码
#include "stdio.h"
#include "string.h"
char pro *rwtab[6]={"begin","if","then","while","do","end"};
xx理工大学
《编译原理》
题目语法分析程序
姓名:
学号:
班级:
一、实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
二、实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
2.1待分析的简单语言的语法
用扩充的BNF表示如下:
⑴<程序>::=begin<语句串>end
}
return;
}
factor()
{ if((syn==10)||(syn==11)) scaner();
else if(syn==27)
{ scaner(); /*读下一个单词符号*/
expression(); /*调用函数statement();*/
if(syn==28)
scaner(); /*读下一个单词符号*/
{ scaner(); /*读下一个单词符号*/
term(); /*调用函数term();*/
}
return;
}
term()
{ factor();
while((syn==15)||(syn==16))
{ scaner(); /*读下一个单词符号*/
factor(); /*调用函数factor(); */
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')))
{
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");
int syn,p,m,n,sum;
int kk;
factor();
expression();
yucu();
term();
statement();
lrparser();
scaner();
main()
{
p=kk=0;
printf("\nGrade:05 Class:03 Name:Qiyubing Number:200507096 \n");
例如:
输入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语句串分析示意图
⑷statement语句分析程序流程如图2-4、2-5、2-6、2-7所示。
否
否
否是
图2-4 statement语句分析函数示意图图2-5 expression表达式分析函数示意图
是
否否
是
是
否
否
是
图2-6 term分析函数示意图
否
⑵<语句串>::=<语句>{;<语句>}
⑶<语句>::=<赋值语句>
⑷<赋值语句>::=ID:=<表达式>
⑸<表达式>::=<项>{+<项> | -<项>}
⑹<项>::=<因子>{*<因子> | /<因子>
⑺<因子>::=ID | NUM |(<表达式>)
2.2实验要求说明
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。
{token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
token[m++]='\0';
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))