作业 12 实验二 递归下降语法分析

一、实验目的:

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

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

二、实验原理

每个非终结符都对应一个子程序。

该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端:

  • 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理
  • 每遇到一个非终结符,则调用相应的子程序

三、实验要求说明

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。

例如:

扫描二维码关注公众号,回复: 8016273 查看本文章

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

输出success

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

输出‘end' error

四、实验步骤

1.待分析的语言的语法(参考P90)

2.将其改为文法表示,至少包含

–语句

–条件

–表达式

3. 消除其左递归

4. 提取公共左因子

5. SELECT集计算

6. LL(1)文法判断

7. 递归下降分析程序

#include<stdio.h>
#include<string.h>

int id(char a[],int i)
{
if(a[i]<='z'&&a[i]>='a')
{
for(i++;(a[i]<='z'&&a[i]>='a')||(a[i]>='0'&&a[i]<='9');i++);
if(a[i]==':'&&a[i+1]=='=')
return i+2;
else
return -1;
}
else
return -1;
}
int yinzi(char e[])
{
int i=0;
if(e[i]>='a'&&e[i]<='z')
{
for(i++;e[i]<='z'&&e[i]>='a'||e[i]>='0'&&e[i]<='9';i++);
if(i!=strlen(e))
return -1;
else
return 1;
}
else if(e[i]>='0'&&e[i]<='9')
{
for(i++;e[i]<='9'&&e[i]>='0';i++);
if(i!=strlen(e))
return -1;
else
return 1;
}
else
return -1;
}
int biaodashi(char d[],int i);
int kuohao(char d[],int i)
{
int kz=1,ky=0,j=0;
char e[200]={};
for(i+=1;d[i]!='\0'&&kz>ky;i++)
{
if(d[i]=='(')
{
kz++;
e[j++]=d[i];
}
else if(d[i]==')')
{
ky++;
if(kz>ky)
e[j++]=d[i];
}
else
e[j++]=d[i];
}
if(kz!=ky)
return -1;
else
{
j=0;
if(biaodashi(e,j)>0)
return i;
else
return -1;
}
}
int jiequ(char d[],int i)
{
int j=0;
char e[200]={};
while(!(d[i]=='+'||d[i]=='-'||d[i]=='*')&&i!=strlen(d))
e[j++]=d[i++];
int k=yinzi(e);
if(k<0)
return -1;
else
return i;
}
int biaodashi(char d[],int i)
{
int k=0;
if(d[i]=='(')
k=kuohao(d,i);
else
k=jiequ(d,i);
if(k<0)
return -1;
else if(k==strlen(d))
return 1;
else
i=k;
if(d[i]=='+'||d[i]=='-'||d[i]=='*'||d[i]=='/')
{
i++;
if(biaodashi(d,i)<0)
return -1;
else
return 1;
}
else if(d[i]==strlen(d))
return 1;
else
return -1;
}
int main()
{
char a[200]={},b[10]={},c[10]={};
scanf("%s ",b);
gets(a);
int n=0,i=0,j=0,k=0;
n=strlen(a);
for(i=n-6;i<=n-1;i++)
c[j++]=a[i];
if((strcmp("begin",b)!=0)||(strcmp(" end #",c)!=0))
printf("error\n");
else
{
for(i=0;i<=n-7;)
{
k=id(a,i);
if(k<0)
break;
else
{
i=k;
k=0;
}
char d[200]={};
j=0;
while(a[i]!=';'&&i<=n-7)
d[j++]=a[i++];
i+=2;
k=biaodashi(d,0);
if(k<0)
break;
else
k=0;
}
if(k<0)
printf("error\n");
else
printf("success\n");
}
return 0;
}

 

 

猜你喜欢

转载自www.cnblogs.com/yeli1629/p/11939862.html