#include<stdio.h>
#include<string.h>
#define MAX 150//词法分析表的最大容量
#define MAXBUF 255//缓冲区的最大缓冲量
void term();
void lrparser();
void statement();
void yucu();
void expression();
void factor();
char prog[MAXBUF],token[MAX];
char ch;
int syn,p,m,n,sum,kk;
char * rwtab[6]={"begin","if" , "then" , "while"," do", "end"};
/*词法扫描程序:*/
void scaner()
{
for(m=0;m<MAX;m++)
token[m]=NULL;
m=0;sum=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<='9'&&ch>='0'))
{
token[m++]=ch;
ch=prog[p++];//读取下一个字符
}
token[m++]='\0';
ch=prog[--p];
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;//给出syn值
break;
}
}
else if((ch<='9'&&ch>='0'))
{
sum=0;
while(ch<='9'&&ch>='0')
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
ch=prog[--p];
syn=11;
}
else
switch(ch)
{
case '<':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='>'){
syn=21;
token[m++]=ch;
}
else
if(ch=='='){
syn=22;
token[m++]=ch;
}
else
{
syn=20;
ch=prog[--p];
}
break;
case '>':token[m++]=ch;
ch=prog[p++];
if(ch=='='){
syn=24;
token[m++]=ch;}
else{
syn=23;
ch=prog[--p];}
break;
case ':':token[m++]=ch;
ch=prog[p++];
if(ch=='='){
syn=18;
token[m++]=ch;}
else
{
syn=17;
ch=prog[--p];
}
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=18;token[0]=ch;break;
case '<>':syn=21;token[0]=ch;break;
case '<=':syn=22;token[0]=ch;break;
case '>=':syn=24;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;
break;
}
}
void statement()
{
if (syn==10)
{
scaner();//读下一个单词符号
if(syn==18)
{
scaner();//读下一个单词符号
expression();//调用expression 函数
}
else
{
printf( "error!");
kk=1;
}
}
else
{
printf( "error!");
kk=1;
}
return;
}
void expression()
{
term();
while(syn==13||syn==14)
{
scaner();
term();
}
return;
}
void term()
{
factor();
while(syn==15||syn==16)
{
scaner();
factor();
}
return;
}
void lrparser()
{
if (syn==1)
{//begin
scaner();
yucu();
if (syn==6)//end
{
scaner();
if (syn==0&&kk==0) printf( "success \n");}
else
{
if(kk!=1 ) printf( "error,lose 'end' ! \n");
kk=1;}
}
else
{
printf("error,lose 'begin' ! \n");
kk=1;
}
return;
}
void yucu()
{
statement();
while(syn==26) //;
{
scaner();
statement();
}
return;
}
void factor()
{
if(syn==10||syn==11) scaner(); //为标识符或整常数时,读下一个单词符号
else if(syn==27)
{
scaner();
expression();
if(syn==28) scaner();
else {printf("')'错误\n"); kk=1;}
}
else { printf("表达式错误\n"); kk=1;}
return;
}
void main()
{p=0;
printf("*********语法分析程序*******\n");
printf("请输入源程序:\n");
do
{ scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
scaner();
lrparser();
printf("语法分析结束!n");
}
编译原理实验二
于 2023-04-27 11:37:09 首次发布