資源簡(jiǎn)介
這是學(xué)《編譯原理》時(shí)的上機(jī)實(shí)驗(yàn)。可實(shí)現(xiàn)對(duì)C語(yǔ)言的詞法分析,關(guān)鍵字32個(gè),包含了C的絕大部分運(yùn)算、限界符,主要是對(duì)文件進(jìn)行讀、寫(xiě)操作,節(jié)省內(nèi)存消耗,自以為是一個(gè)不錯(cuò)的詞法分析程序。運(yùn)行環(huán)境為VC++6.0。
代碼片段和文件信息
/*******************************************
?詞法分析程序
?作者:龔勛
?學(xué)號(hào):200131500342
?計(jì)科系?13班
********************************************/
#include
#include
#include
/*******************************************
?初始化函數(shù)
********************************************/
void?init()
{?????????????
????char?*key[]={“?““auto““break““case““char““const““continue““default““do““double“
?????????????????“else““enum““extern““float““for““goto““if““int““l(fā)ong““register“
?????????????????“return““short““signed““sizeof““static““struct““switch““typedef“
?????????????????“union““unsigned““void““volatile““while“};?????/*C語(yǔ)言所有關(guān)鍵字,共32個(gè)*/
????char?*limit[]={“?““(““)““[““]““->““.““!““++““--““&““~“
???????????????????“*““/““%““+““-““<<““>>““<““<=““>““>=““==““!=““&&““||“
??????????????????“=““+=““-=““*=““/=““““;““{““}““#““_““‘“};/*運(yùn)算、限界符*/
????FILE?*fp;
????int?i;
????char?c;
????fp=fopen(“k.txt““w“);
????for(i=1;i<=32;i++)
???????fprintf(fp“%s\n“key[i]);
????fclose(fp);???????????????/*初始化關(guān)鍵字表*/
????fp=fopen(“l(fā).txt““w“);
????for(i=1;i<=38;i++)
???????fprintf(fp“%s\n“l(fā)imit[i]);
????c=‘“‘;
????fprintf(fp“%c\n“c);
????fclose(fp);???????????????/*初始化運(yùn)算、限界符表*/
????fp=fopen(“i.txt““w“);
????fclose(fp);???????????????/*初始化標(biāo)識(shí)符表*/
????fp=fopen(“c.txt““w“);
????fclose(fp);???????????????/*初始化常數(shù)表*/
????fp=fopen(“output.txt““w“);
????fclose(fp);???????????????/*初始化輸出文件*/
}
/*******************************************
?十進(jìn)制轉(zhuǎn)二進(jìn)制函數(shù)
********************************************/
char?*?dtb(char?*buf)
{??????????
????int?temp[20];
char?*binary;
int?value=0i=0j;
for(i=0;buf[i]!=‘\0‘;i++)
value=value*10+(buf[i]-48);???????/*先將字符轉(zhuǎn)化為十進(jìn)制數(shù)*/
????if(value==0)
????{
binary=malloc(2*sizeof(char));
binary[0]=‘0‘;
binary[1]=‘\0‘;
return(binary);
}
i=0;
while(value!=0)
????{
temp[i++]=value%2;
value/=2;
}
temp[i]=‘\0‘;
binary=malloc((i+1)*sizeof(char));
for(j=0;j<=i-1;j++)
???????binary[j]=(char)(temp[i-j-1]+48);
????binary[i]=‘\0‘;
????return(binary);
}
/*******************************************
?根據(jù)不同命令查表或造表函數(shù)
********************************************/
int?find(char?*bufint?typeint?command)
{?????????????
????int?number=0;
????FILE?*fp;
????char?c;
????char?temp[30];
????int?i=0;
????switch(type)
????{
????????case?1:?fp=fopen(“k.txt““r“);break;
????????case?2:?fp=fopen(“i.txt““r“);break;
????????case?3:?fp=fopen(“c.txt““r“);break;
????????case?4:?fp=fopen(“l(fā).txt““r“);
????}
????c=fgetc(fp);
????while(c!=EOF)
????{
????????while(c!=‘\n‘)
????????{
????????????temp[i++]=c;
????????????c=fgetc(fp);
????????}
????????temp[i]=‘\0‘;
????????i=0;
????????number++;
????????if(strcmp(tempbuf)==0)
????????{??
????fclose(fp);
return(number);????????/*若找到,返回在相應(yīng)表中的序號(hào)*/
????????}
????????else
???????????c=fgetc(fp);
?????}
?????if(command==1)
?????{???
?????f
評(píng)論
共有 條評(píng)論