递归下降分析程序
实验一、递归下降与分析程序实验
专业:商业软件专业 姓名:吴华锐 学号:201506110140
一、 实验目的
编译识别LL1文法
G[s]:
S→a |∧| (T)
T→T, S | S
转化为LL1文法
S →a |∧| (T)
T →ST'
T'→,ST'| ε
二、 实验内容和要求
利用c语言构造语法分析程序。
三、 实验方法、步骤及结果测试
- 源程序名:压缩包文件(rar或zip)中
源程序名 递归下降分析程序.c
可执行程序名:×××.exe
- 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
- 主要程序段及其解释:
#include<stdio.h>
#include <string.h>
void scaner();
void E();
void E1();
void T();
void T1();
void F();
void error();
char proce[100],ch,token[20];
int syn,i,j,m,sum=0;
char *keyword[6]= {"begin","if","then","while","do","end"};
main()
{
i=0;//记录输入多少个字符
printf("\n 请输入词法分析程序:");
do{
ch=getchar();
proce[i]=ch;
i++;
}while (ch!='#');
i=0;
do{
scaner();
switch(syn)
{
case 11: printf("\n(%d,%d)",syn,sum);
break;
case -1: printf("\n(%s,#)",token);
break;
default: printf("\n(%d,%s)",syn, token);
}
}while (syn!=0);
printf("\n");
i=0;
scaner();
E();
if (syn==0)
printf("\n 语法正确. \n");
else printf("\n 语法失败. \n");
}
void scaner()
{
for (j=0;j<20;j++)
token[j]=NULL;//将token赋值为空
m=0;
sum=0;
ch=proce[i];
i++;
while (ch==' ')
{
ch=proce[i++];
}
if (ch>='a'&& ch<='z')
{while (ch>='a'&& ch<='z'||ch>='0' && ch<='9')
{
token[m++]=ch;
ch=proce[i++];//继续看后面的
}
syn=10;i--;//判断为变量
for (j=0;j<6;j++)
if(strcmp(token,keyword[j])==0)
{
syn=j+1;
break;
}//如果有可以匹配的就为关键字
}
else
if(ch>='0' && ch<='9')
{while (ch>='0' && ch<='9')
{
sum=sum*10+(ch-'0');
ch=proce[i];
i++;
}
syn=11;
i--;
}
else
switch(ch)
{
case '<': token[m]=ch;
m++;
ch=proce[i];
i++;
if (ch=='>')
{
syn=21;
token[m]=ch;
m++;
}
else if (ch=='=')
{
syn=22;
token[m]=ch;
m++;
}
else
{
syn=20;
i--;
}
break;
case '>': m=0;
token[m]=ch;
m++;
ch=proce[i];
i++;
if (ch=='=')
{
syn=24;
token[m]=ch;
m++;
}
else
{
syn=23;
i--;
}
break;
case ':': m=0;
token[m++]=ch;
ch=proce[i++];
if (ch=='=')
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
i--;
}
break;
case '+':
syn=13;
token[0]=ch;
break;
case '-':
syn=14;
token[0]=ch;
break;
case '*':
syn=15;
token[0]=ch;
break;
case '/':
syn=16;
token[0]=ch;
break;
case '=':
syn=25;
token[0]=ch;
break;
case ';':
syn=26;
token[0]=ch;
break;
case '(':
syn=27;
token[0]=ch;
break;
case ')':
syn=28;
token[0]=ch;
break;
case '#':
syn=0;
token[0]=ch;
break;
default:
syn=-1;
token[0]=ch;
}
}
void E()
{
printf("E ");
T();
E1();
}
void E1()
{
printf("E1 ");
if (syn==13)
{
scaner();
T();
E1();
}
else {
if (syn!=28 && syn!=0)
error();
}
}
void T()
{
printf("T ");
F();
T1();
}
void T1()
{
printf("T1 ");
if (syn==15) {
scaner();
F();
T1();
}
else {
if (syn!=28 && syn!=0 && syn!=13) error();
}
}
void F()
{
printf("F ");
if (syn==27)
{
scaner();
E();
if(syn==28) scaner();
else error();
}
else if (syn==11 || syn==10)
scaner();
}
void error()
{
printf("\n (%d,%s)语法错误! \n",syn, token);
}
- 运行结果及分析
四、 实验总结
主要是进行消除左递归,这个实验能让自己更加熟悉递归下降分析程序的步骤和方法。