一、实验目的:

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

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

 

二、实验原理

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

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

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

 

三、实验要求说明

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

例如:

输入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<dos.h>
#include<stdlib.h>
#include<string.h>

 

char a[50] ,b[50],d[200],e[10];
char ch;
int n1,i1=0,flag=1,n=5;

int E();
int E1();
int T();
int G();
int S();
int F();
void input();
void input1();
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;
//int count = 0;
if (ch=='#')
{ printf("accept\n");
p=0;
x=d[p];
while(x!='#') {
printf("%c",x);p=p+1;x=d[p];
//count++;
}
}
else {
printf("error\n");
printf("回车返回\n");
getchar();getchar();
return;
}
printf("\n");

printf("规则如下\n");
printf("(1)E->TG\n(2)G->+TG|-TG\n(3)G->^\n(4)T->FS\n(5)S->*FS|/FS\n(6)S->^\n(7)F->(E)\n(8)F->i");
printf("\n\n\n\n回车返回\n");
getchar();
getchar();
}


//(1)E->TG
int E1()
{
int f,t;
printf("E->TG\t");
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("E->TG\t");
flag = 1;
e[0] = 'E';e[1] = '=';e[2] = '>';e[3] = 'T';e[4] = 'G';e[5] = '#';
output();
input();
input1();
f = T();
if (f == 0) return(0);
t = G();
if (t == 0) return(0);
else return(1);
}

int T() // T-> FS
{ //
int f, t;
printf("T->FS\t");
e[0] = 'T';e[1] = '-';e[2] = '>';e[3] = 'F';e[4] = 'S';e[5] = '#';
output();
flag = 1;
input();
input1();
f = F();
if (f == 0) return(0);
t = S();
if (t == 0) return(0);
else return(1);
}

//(3)G->ε
//(2)G->+TG|-TG
int G()
{ //
int t, g;
if(ch == '+')
{
b[i1]=ch;
printf("G->+TG\t");
e[0]='G';e[1]='-';e[2]='>';e[3]='+';e[4]='T';e[5]='G';e[6]='#';
output();
flag = 0;
input();
input1();
ch = a[++i1];
t = T();
if(t==0) return (0);
g = G();
if(g==0) return (0);

}
else if(ch == '-')
{
b[i1]=ch;
printf("G->-TG\t");
e[0]='G';e[1]='-';e[2]='>';e[3]='-';e[4]='T';e[5]='G';e[6]='#';
output();
flag = 0;
input();
input1();
ch = a[++i1];
t = T();
if(t==0) return (0);
g = G();
if(g==0) return (0);

}
else
{
//b[i1]=ch;
printf("G->^\t");
e[0]='G';e[1]='-';e[2]='>';e[3]='^';e[4] = '#';
output();
flag = 0;
input();
input1();
//ch = a[++i1];
}
return (1);
}

int S() //S->ε S->*FS|/FS
{
// if(ch == )
//printf("S %d\n",i1);
int s;
if(ch == '*')
{
b[i1]=ch;
printf("S->*FS\t");
e[0]='S';e[1]='-';e[2]='>';e[3]='*';e[4]='F';e[5]='S';e[6]='#';
output();
flag = 0;
input();
input1();
ch = a[++i1];
s = F();

if(s == 0) return (0);
s = S();
if(s == 0) return (0);

}
else if(ch == '/')
{
b[i1]=ch;
printf("S->/FS\t");
e[0]='S';e[1]='-';e[2]='>';e[3]='*';e[4]='F';e[5]='S';e[6]='#';
output();
flag = 0;
input();
input1();
ch = a[++i1];
s = F();
if(s == 0) return (0);
s = S();
if(s == 0) return (0);

}
else
{
//b[i1]=ch;
printf("S->^\t");
e[0]='S';e[1]='-';e[2]='>';e[3]='^';e[4] = '#';
output();
flag = 0;
input();
input1();
//ch = a[++i1];
}
return 1;
}

// F-> (E)
//(8)F->i
int F()
{
int f;
if(ch=='(') { 
b[i1]=ch;
printf("F->(E)\t");
e[0]='F';e[1]='=';e[2]='>';e[3]='(';e[4]='E';e[5]=')';e[6]='#';
output();
flag=0;
input();
input1();
ch=a[++i1];
f=E();
if (f==0) return(0);
if(ch==')') {
b[i1]=ch;
printf("F->(E)\t");
flag=0;input();input1();
ch=a[++i1];
}
else {
printf("error in f\n");
return(0);
}
}
else if(ch=='i') {
b[i1]=ch;printf("F->i\t");
e[0]='F';e[1]='=';e[2]='>';e[3]='i';e[4]='#';
output();
flag=0;input();input1();
ch=a[++i1];
//printf("ddddd");
//printf("%c",ch);
}
else {printf("error in f\n");return(0);}
return(1);
}


void input()
{

int j=0;
for (;j<=i1-flag;j++)
printf("%c",b[j]); 
printf("\t\t");
printf("%c\t\t",ch); 
}


void input1()
{
int j;
for (j=i1+1-flag;j<n1;j++)
printf("%c",a[j]); 
printf("\n");
}

void output(){ 
int m,k,j,q;
int i=0;
m=0;k=0;q=0;
i=n;
d[n]='=';
d[n+1]='>';
d[n+2]='#';
n=n+2;
i=n;
i=i-2;
while(d[i]!='>'&&i!=0) i=i-1;
i=i+1;
while(d[i]!=e[0]) i=i+1;
q=i;
m=q;k=q;
while(d[m]!='>') m=m-1;
m=m+1;
while(m!=q) {
d[n]=d[m];m=m+1;n=n+1;
}
d[n]='#';
for(j=3;e[j]!='#';j++){
d[n]=e[j];
n=n+1;
}
k=k+1;
while(d[k]!='=') {
d[n]=d[k];n=n+1;k=k+1;
}
d[n]='#';
}

 

 

 

posted on 2019-11-29 21:19  hebinwen  阅读(116)  评论(0编辑  收藏  举报