今天我们来看看编译原理中的递归下降分析法,费话就不多说了,直接上代码了:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char prog[80],token ;
char ch;
int syn=-1,p,t;
void scanner();
void statement();
void expression_r();
void term();
void factor();
void getcha()
{
ch=prog[p++];
}
void getbc()
{
while(prog[p]==' ')
p++;
getcha();
}
void concat()
{
token[t++]=ch;
}
bool letter(char ch)
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
return true;
return false;
}
bool digit(char ch)
{
if(ch>='0'&&ch<='9')
return true;
return false;
}
int reserve()
{
token[t++]='\0';
if(strcmp(token,"begin")==0) return 1;
if(strcmp(token,"end")==0) return 6;
if(strcmp(token,"if")==0) return 2;
if(strcmp(token,"then")==0) return 3;
if(strcmp(token,"else")==0) return 7;
if(strcmp(token,"while")==0) return 4;
if(strcmp(token,"do")==0) return 5;
return 10;
}
void retract()
{
p--;
}
int dtb()
{
token[t++]='\0';
int i=atoi(token);
return i;
}
void Irparse()
{
scanner();
statement();
while(syn==26)//;
{
scanner();
statement();
}
}
void statement()
{
if(syn==10)
{
scanner();
if(syn==18)
{
scanner();
expression_r();
}
else
{
printf("语法分析出错! 请检查表达式是否含:=\n");return ;
}
}
else
{
//printf("语法分析出错! 请检查语句是否正确\n");return 0;
}
}
void expression_r()
{
term();
while(syn==13||syn==14)//+ -
{
scanner();
term();
}
}
void term()
{
factor();
while(syn==15||syn==16)//* /
{
scanner();
factor();
}
}
void factor()
{
if(syn==10||syn==11)
{
scanner();
}
else if(syn==27)
{
scanner();
expression_r();
if(syn==28)
{
scanner();
}
else {printf("语法分析出错! 请检查是否缺少')'\n");return;}
}
else {printf("语法分析出错! 请检查是否输入非法字符\n");return;}
}