www.pudn.com > c.zip > BY.C
#include#include #include #include #include #define NULL 0 FILE *fp; char cbuffer; char *key[8]={"DO","BEGIN","ELSE","END","IF","THEN","VAR","WHILE"}; char *border[6]={",",";",":=",".","(",")"}; char *arithmetic[4]={"+","-","*","/"}; char *relation[6]={"<","<=","=",">",">=","<>"}; char *consts[20]; char *label[20]; int constnum=0,labelnum=0; int search(char searchchar[],int wordtype) { int i=0; switch (wordtype) { case 1:for (i=0;i<=7;i++) { if (strcmp(key[i],searchchar)==0) return(i+1); }; case 2:{for (i=0;i<=5;i++) { if (strcmp(border[i],searchchar)==0) return(i+1); }; return(0); } case 3:{for (i=0;i<=3;i++) { if (strcmp(arithmetic[i],searchchar)==0) { return(i+1); }; }; return(0); }; case 4:{for (i=0;i<=5;i++) { if (strcmp(relation[i],searchchar)==0) { return(i+1); }; }; return(0); }; case 5:{for (i=0;i<=constnum;i++) { if (strcmp(consts[i],searchchar)==0) { return(i+1); }; } consts[i-1]=(char *)malloc(sizeof(searchchar)); strcpy(consts[i-1],searchchar); constnum++; return(i); }; case 6:{for (i=0;i<=labelnum;i++) { if (strcmp(label[i],searchchar)==0) { return(i+1); }; } label[i-1]=(char *)malloc(sizeof(searchchar)); strcpy(label[i-1],searchchar); labelnum++; return(i); }; } } char alphaprocess(char buffer) { int atype; int i=-1; char alphatp[20]; while ((isalpha(buffer))||(isdigit(buffer))) { alphatp[++i]=buffer; buffer=fgetc(fp); }; alphatp[i+1]='\0'; if (atype=search(alphatp,1)) printf("%s (1,%d)\n",alphatp,atype-1); else { atype=search(alphatp,6); printf("%s (6,%d)\n",alphatp,atype-1); }; return(buffer); } char digitprocess(char buffer) { int i=-1; char digittp[20]; int dtype; while ((isdigit(buffer))) { digittp[++i]=buffer; buffer=fgetc(fp); } digittp[i+1]='\0'; dtype=search(digittp,5); printf("%s (5,%d)\n",digittp,dtype-1); return(buffer); } char otherprocess(char buffer) { int i=-1; char othertp[20]; int otype,otypetp; othertp[0]=buffer; othertp[1]='\0'; if (otype=search(othertp,3)) { printf("%s (3,%d)\n",othertp,otype-1); buffer=fgetc(fp); goto out; }; if (otype=search(othertp,4)) { buffer=fgetc(fp); othertp[1]=buffer; othertp[2]='\0'; if (otypetp=search(othertp,4)) { printf("%s (4,%d)\n",othertp,otypetp-1); goto out; } else othertp[1]='\0'; printf("%s (4,%d)\n",othertp,otype-1); goto out; }; if (buffer==':') { buffer=fgetc(fp); if (buffer=='=') printf(":= (2,2)\n"); buffer=fgetc(fp); goto out; } else { if (otype=search(othertp,2)) { printf("%s (2,%d)\n",othertp,otype-1); buffer=fgetc(fp); goto out; } }; if ((buffer!='\n')&&(buffer!=' ')) printf("%c error,not a word\n",buffer); buffer=fgetc(fp); out: return(buffer); } void main() { int i; for (i=0;i<=20;i++) { label[i]=NULL; consts[i]=NULL; }; if ((fp=fopen("\\DEMO.PAS","r"))==NULL) printf("error"); else { cbuffer = fgetc(fp); while (cbuffer!=EOF) { if (isalpha(cbuffer)) cbuffer=alphaprocess(cbuffer); else if (isdigit(cbuffer)) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer); }; printf("over\n"); }; }