天天看点

1022-词法分析程序

include <stdio.h>

#include <string.h>

char prog[80],token[8],ch;

int syn,p,m,n,sum;

char *rwtab[6]={"begin","if","then","while","do","end"};

void scaner(void);

main()

{

p=0;

printf("\n Please input the source code:\n");

do{

scanf("%c",&ch);

prog[p++]=ch;

}while(ch!='#');

do{

scaner();

switch(syn)

{

case 11:

printf("( %d,%d )\n",syn,sum);

break;

case -1:

printf("you have input a wrong string\n");

return 0;

default:

printf("( %d,%s )\n",syn,token);

}

}while(syn!=0);

printf(" Over.\n");

}

void scaner(void)

{

sum=0;

for(m=0;m<8;m++)

token[m++]= NULL;

ch=prog[p++];

m=0;

while((ch==' ')||(ch=='\n'))

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';

syn=11;

}

else

{

switch(ch)

case '<':

if(ch=='=')

{

syn=22;

token[m++]=ch;

else

{

syn=20;

p--;

break;

case '>':

syn=24;

syn=23;

case '+':

if(ch=='+')

syn=17;

syn=13;

case '-':

if(ch=='-')

syn=29;

syn=14;

case '=':

syn=25;

syn=18;

case '*': syn=15;token[m++]=ch; break;

case '/': syn=16;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;

case ':': syn=17;token[m++]=ch; break;

default: syn=-1; break;

token[m++]='\0';

}

1022-词法分析程序