0916 编程实验一 词法分析程序

#include<stdio.h>
#include<string.h>
#include <conio.h>
#include <ctype.h>
char prog[80],token[8],ch;

int p,syn,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
 
  
scaner() 
{ 
sum=0;  
for(m=0;m<8;m++)
token[m]=''; 
ch=prog[p++]; 
m=0;  
while((ch==' ')||(ch=='
'))
ch=prog[p++];  
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))  
{ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) 
{token[m++]=ch; 
ch=prog[p++]; 
} 
p--; 
syn=10;  
for(n=0;n<6;n++)  
if(strcmp(token,rwtab[n])==0)  
{ syn=n+1;  
  break; 
} 
}  
else if((ch>='0')&&(ch<='9')) 
{ while((ch>='0')&&(ch<='9'))
{ sum=sum*10+ch-'0'; 
ch=prog[p++]; 
} 
p--; 
syn=11; 
}  
else 
switch(ch)  
{ 
case '<':token[m++]=ch; 
           ch=prog[p++]; 
     if(ch=='=') { 
       syn=21;  
       token[m++]=ch; }
     else if(ch=='>'){
         syn=22;
         token[m++]=ch; }
     else  { 
       syn=20; 
       p--;  } 
     break;  
case '>':token[m++]=ch; 
         ch=prog[p++]; 
     if(ch=='=') { 
         syn=24;  
         token[m++]=ch; } 
     else  { 
         syn=23; 
         p--; } 
     break;  
case '+':syn=13;  
         token[m++]=ch; 
         break; 
case '-':syn=14;  
         token[m++]=ch; 
         break;
case '*': syn=15;  
          token[m++]=ch; 
          break;
case '/': syn=16;  
          token[m++]=ch; 
          break;
case ':': token[m++]=ch;
          ch=prog[p++]; 
          if(ch=='=') { 
         syn=18;  
         token[m++]=ch; }  
     else  { 
         syn=17;  
         p--; }  
      break; 
case '=':syn=25;  
         token[m++]=ch;
         break; 
case '(': syn=27;   
          token[m++]=ch; 
          break; 
case ')': syn=28;  
          token[m++]=ch; 
          break; 
case ';': syn=26;  
          token[m++]=ch; 
          break; 
case '#': syn=0;  
          token[m++]=ch; 
          break; 
default: syn=-1; 
         break; 
}  
token[m++]=''; 
} 


main()
{
 p=0;
 printf("
please input a string(end with #):
");
 do{
  scanf("%c",&ch);
  prog[p++]=ch;

}while(ch!='#'); 
 
p=0; 
 
do{  
   scaner(); 
   switch(syn)  
   {case 11:printf("( %-10d%5d )
",sum,syn); 
         break;  
    case -1:printf("you have input a wrong string
"); 
          getch(); 
          break;
    default: printf("( %-10s%5d )
",token,syn); 
          break; 
   }  
           }while(syn!=0); 
           getch(); 
}

原文地址:https://www.cnblogs.com/950525kxj/p/4825849.html