首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

编译原理实验一

2013-10-12 
编译原理实验1#includestdio.h#includestdlib.h#includestring.h#define KEYWORDEND waiting for y

编译原理实验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);        }}

热点排行