#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char prog[100],ch,token[8];
int p,syn,n,i,kk;
char *keyword[6]={"begin","then","if","while","do","end"};
void scaner();
void Irparse();
void yucu();
void statement();
void expression();
void term();
void factor();
void main()
{
FILE *fp;
fp=fopen("3.txt","r");
if(fp==NULL)
{
printf("The file has not been found!");
exit(0);
}
do
{
ch=fgetc(fp);
prog[p++]=ch;
}
while(ch!=*#*);
p=0;
scaner();
Irparse();
fclose(fp);
}
void scaner()
{
for(n=0;n<8;n++)
token[n]=*\0*;
n=0;
ch=prog[p++];
while(ch==* *)
ch=prog[p++];
/*首字母为字母*/
if((ch>=*a*&&ch<=*z*)||(ch>=*A*&&ch<=*Z*))
{
/*拼接单词*/
do
{
token[n++]=ch;
ch=prog[p++];
}
while((ch>=*a*&&ch<=*z*)||(ch>=*A*&&ch<=*Z*)||(ch>=*0*&&ch<=*9*));
syn=10;
for(n=0;n<6;n++)
{
if(strcmp(token,keyword[n])==0)
syn=n+1;
}
p--;
return;
}
else if(ch>=*0*&&ch<=*9*)
{
p--;
do
{
token[n++]=prog[p++];
ch=prog[p];
}
while(ch>=*0*&&ch<=*9*);
syn=11;
return;
}
else
{
ch=prog[p++];
switch(ch)
{
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=17;token[0]=ch;ch=prog[p++];
if(ch==*=*)
{
token[1]=ch;syn++;
}
else p--;
break;
case *<*:syn=20;token[0]=ch;ch=prog[p++];
if(ch==*>*){token[1]=ch;syn++;}
else if(ch==*=*){token[1]=ch;syn=syn+2;}
else p--;
break;
case *>*:syn=23;token[0]=ch;ch=prog[p++];
if(ch==*=*){token[1]=ch;syn++;}
else p--;
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;kk=0;token[0]=ch;break;
default: printf("词法分析出错! \n");syn=-1;break;
}
return;
}
}
void Irparse()
{
if(syn==1)
{
scaner();
yucu();
if(syn==6)
{
scaner();
if(syn==0&&kk==0)
printf("success");
}
else if(kk!=1)
{
printf("*缺end*错误\n");
kk=1;
}
}
else
{
printf("*begin*错误\n");
kk=1;
}
}
void yucu()
{
statement();
while(syn==26)
{
scaner();
statement();
}
return;
}
void statement()
{
// printf("%d",syn);
if(syn==10)
{
// printf("%d",syn);
scaner();
// printf("%d",syn);
if(syn==18)
{
scaner();
expression();
}
else
{
printf("赋值号错误\n");
kk=1;
}
}
else
{
printf("语句错误\n");
kk=1;
}
return;
}
void expression()
{
term();
while(syn==13||14)
{
scaner();
term();
}
return;
}
void term()
{
factor();
while(syn==15||16)
{
scaner();
factor();
}
return;
}
void factor()
{
if(syn==10||11)
scaner();
else if(syn==27)
{
scaner();
expression();
if(syn==28)
scaner();
else
{
printf("*)*错误\n");
kk=1;
}
}
else
{
printf("表达式错误\n");
kk=1;
}
return;
}
#include <stdlib.h>
#include <string.h>
char prog[100],ch,token[8];
int p,syn,n,i,kk;
char *keyword[6]={"begin","then","if","while","do","end"};
void scaner();
void Irparse();
void yucu();
void statement();
void expression();
void term();
void factor();
void main()
{
FILE *fp;
fp=fopen("3.txt","r");
if(fp==NULL)
{
printf("The file has not been found!");
exit(0);
}
do
{
ch=fgetc(fp);
prog[p++]=ch;
}
while(ch!=*#*);
p=0;
scaner();
Irparse();
fclose(fp);
}
void scaner()
{
for(n=0;n<8;n++)
token[n]=*\0*;
n=0;
ch=prog[p++];
while(ch==* *)
ch=prog[p++];
/*首字母为字母*/
if((ch>=*a*&&ch<=*z*)||(ch>=*A*&&ch<=*Z*))
{
/*拼接单词*/
do
{
token[n++]=ch;
ch=prog[p++];
}
while((ch>=*a*&&ch<=*z*)||(ch>=*A*&&ch<=*Z*)||(ch>=*0*&&ch<=*9*));
syn=10;
for(n=0;n<6;n++)
{
if(strcmp(token,keyword[n])==0)
syn=n+1;
}
p--;
return;
}
else if(ch>=*0*&&ch<=*9*)
{
p--;
do
{
token[n++]=prog[p++];
ch=prog[p];
}
while(ch>=*0*&&ch<=*9*);
syn=11;
return;
}
else
{
ch=prog[p++];
switch(ch)
{
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=17;token[0]=ch;ch=prog[p++];
if(ch==*=*)
{
token[1]=ch;syn++;
}
else p--;
break;
case *<*:syn=20;token[0]=ch;ch=prog[p++];
if(ch==*>*){token[1]=ch;syn++;}
else if(ch==*=*){token[1]=ch;syn=syn+2;}
else p--;
break;
case *>*:syn=23;token[0]=ch;ch=prog[p++];
if(ch==*=*){token[1]=ch;syn++;}
else p--;
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;kk=0;token[0]=ch;break;
default: printf("词法分析出错! \n");syn=-1;break;
}
return;
}
}
void Irparse()
{
if(syn==1)
{
scaner();
yucu();
if(syn==6)
{
scaner();
if(syn==0&&kk==0)
printf("success");
}
else if(kk!=1)
{
printf("*缺end*错误\n");
kk=1;
}
}
else
{
printf("*begin*错误\n");
kk=1;
}
}
void yucu()
{
statement();
while(syn==26)
{
scaner();
statement();
}
return;
}
void statement()
{
// printf("%d",syn);
if(syn==10)
{
// printf("%d",syn);
scaner();
// printf("%d",syn);
if(syn==18)
{
scaner();
expression();
}
else
{
printf("赋值号错误\n");
kk=1;
}
}
else
{
printf("语句错误\n");
kk=1;
}
return;
}
void expression()
{
term();
while(syn==13||14)
{
scaner();
term();
}
return;
}
void term()
{
factor();
while(syn==15||16)
{
scaner();
factor();
}
return;
}
void factor()
{
if(syn==10||11)
scaner();
else if(syn==27)
{
scaner();
expression();
if(syn==28)
scaner();
else
{
printf("*)*错误\n");
kk=1;
}
}
else
{
printf("表达式错误\n");
kk=1;
}
return;
}