编译原理实验1
#include<stdio.h>#include<stdlib.h>#include<string.h>#define KEYWORDEND "waiting for your expanding"typedef struct{ int typenum; char *word;} WORD;char input[255];char token[255]="";int pinput;int ptoken;char ch;char *rwtab[]= {"begin","if","then","while","do","end",KEYWORDEND};WORD *scaner();int main(){ int over=1; WORD *oneword=new WORD; printf ("enter your words(end with #):"); scanf("%[^#]s",input); pinput=0; printf ("your words:\n%s\n",input); while(over<1000 && over!=-1) { oneword=scaner(); if (oneword->typenum<1000) printf ("(%d,%s)",oneword->typenum,oneword->word); over=oneword->typenum; } printf("\npress # to exit:"); scanf("%[^#]s",input); return 0;}char mgetch() //读取一个字符到ch{ ch=input[pinput]; pinput=pinput+1; return(ch);}void getbc() //去掉空白符号{ while(ch==' ' || ch==10) { ch=input[pinput]; pinput=pinput+1; }}void concat(){ token[ptoken]=ch; ptoken=ptoken+1; token[ptoken]='\0';}int letter(){ if (ch>='a' && ch<='z'||ch>='A'&&ch<='z')return 1; else return 0;}int digit(){ if (ch>='0' && ch<='9') return 1; else return 0;}int reserve(){ int i=0; while(strcmp(rwtab[i],KEYWORDEND)) { if(!strcmp(rwtab[i],token)) { return i+1; } i=i+1; } return 10;}void retract(){ pinput=pinput-1;}char *dtb(){ return NULL;}WORD *scaner(){ WORD *myword=new WORD; myword->typenum=10; myword->word=""; ptoken=0; mgetch(); getbc(); if (letter()) { while(letter() || digit()) { concat(); mgetch(); } retract(); myword->typenum=reserve(); myword->word=token; return(myword); } else if(digit()) { while(digit()) { concat(); mgetch(); } retract(); myword->typenum=11; myword->word=token; return(myword); } else switch(ch) { case'=': mgetch(); if (ch=='=') { myword->typenum=39; myword->word="=="; return(myword); } retract(); myword->typenum=21; myword->word="="; return(myword); break; case'+': myword->typenum=13; myword->word="+"; return(myword); break; case'-': myword->typenum=14; myword->word="-"; return(myword); break; case'*': myword->typenum=15; myword->word="*"; return(myword); break; case'/': myword->typenum=16; myword->word="/"; return(myword); break; case'(': myword->typenum=27; myword->word="("; return(myword); break; case')': myword->typenum=28; myword->word=")"; return(myword); break; case'[': myword->typenum=28; myword->word="["; return(myword); break; case']': myword->typenum=29; myword->word="]"; return(myword); break; case'{': myword->typenum=30; myword->word="{"; return(myword); break; case'}': myword->typenum=31; myword->word="}"; return(myword); break; case',': myword->typenum=32; myword->word=","; return(myword); break; case':': mgetch(); if (ch=='=') { myword->typenum=18; myword->word=":="; return(myword); } retract(); myword->typenum=17; myword->word=":"; return(myword); break; case';': myword->typenum=26; myword->word=";"; return(myword); break; case'>': mgetch(); if (ch=='=') { myword->typenum=37; myword->word=">="; return(myword); } retract(); myword->typenum=35; myword->word=">"; return(myword); break; case'<': mgetch(); if (ch=='=') { myword->typenum=38; myword->word="<="; return(myword); } if (ch=='>') { myword->typenum=21; myword->word="<="; return(myword); } retract(); myword->typenum=20; myword->word="<"; return(myword); break; case'!': mgetch(); if (ch=='=') { myword->typenum=40; myword->word="!="; return(myword); } retract(); myword->typenum=-1; myword->word="ERROR"; return(myword); break; case'\0': myword->typenum=1000; myword->word="OVER"; return(myword); break; default: myword->typenum=-1; myword->word="ERROR"; return(myword); }}