天天看點

0916 程式設計實驗一 詞法分析程式

#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"};

scaner();

main()

{p=0;

printf("輸入源程式,以#号結束\n");

do{

scanf("%c",&ch);

prog[p++]=ch;

}while(ch!='#');

p=0;

scaner();

switch(syn)

{case 11:printf("( %-10d%5d )\n",sum,syn);

break;

case -1:printf("you have input a wrong string\n");

getchar();

default: printf("( %-10s%5d )\n",token,syn);

}

}while(syn!=0);

getchar();

}

scaner()

{ sum=0;

for(m=0;m<8;m++)token[m++]=NULL;

ch=prog[p++];

m=0;

while((ch==' ')||(ch=='\n'))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=22;

token[m++]=ch;

}

else

{ syn=20;

p--;

case '>':token[m++]=ch;

if(ch=='=')

{ syn=24;

token[m++]=ch;

{ syn=23;

p--;

case '+': token[m++]=ch;

if(ch=='+')

{ syn=17;

{ syn=13;

case '-':token[m++]=ch;

if(ch=='-')

{ syn=29;

{ syn=14;

case '!':ch=prog[p++];

{ syn=21;

token[m++]=ch;

}

{ syn=31;

p--;

}

case '=':token[m++]=ch;

{ syn=25;

{ syn=18;

case '*': syn=15;

token[m++]=ch;

break;

case '/': syn=16;

case '(': syn=27;

case ')': syn=28;

case '{': syn=5;

case '}': syn=6;

case ';': syn=26;

token[m++]=ch;

case '\"': syn=30;

case '#': syn=0;

case ':':syn=17;

default: syn=-1;

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

return 0;

0916 程式設計實驗一 詞法分析程式