資源簡介
這是學《編譯原理》時的上機實驗。可實現對C語言的詞法分析,關鍵字32個,包含了C的絕大部分運算、限界符,主要是對文件進行讀、寫操作,節省內存消耗,自以為是一個不錯的詞法分析程序。運行環境為VC++6.0。
代碼片段和文件信息
/*******************************************
?詞法分析程序
?作者:龔勛
?學號:200131500342
?計科系?13班
********************************************/
#include
#include
#include
/*******************************************
?初始化函數
********************************************/
void?init()
{?????????????
????char?*key[]={“?““auto““break““case““char““const““continue““default““do““double“
?????????????????“else““enum““extern““float““for““goto““if““int““long““register“
?????????????????“return““short““signed““sizeof““static““struct““switch““typedef“
?????????????????“union““unsigned““void““volatile““while“};?????/*C語言所有關鍵字,共32個*/
????char?*limit[]={“?““(““)““[““]““->““.““!““++““--““&““~“
???????????????????“*““/““%““+““-““<<““>>““<““<=““>““>=““==““!=““&&““||“
??????????????????“=““+=““-=““*=““/=““““;““{““}““#““_““‘“};/*運算、限界符*/
????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);???????????????/*初始化關鍵字表*/
????fp=fopen(“l.txt““w“);
????for(i=1;i<=38;i++)
???????fprintf(fp“%s\n“limit[i]);
????c=‘“‘;
????fprintf(fp“%c\n“c);
????fclose(fp);???????????????/*初始化運算、限界符表*/
????fp=fopen(“i.txt““w“);
????fclose(fp);???????????????/*初始化標識符表*/
????fp=fopen(“c.txt““w“);
????fclose(fp);???????????????/*初始化常數表*/
????fp=fopen(“output.txt““w“);
????fclose(fp);???????????????/*初始化輸出文件*/
}
/*******************************************
?十進制轉二進制函數
********************************************/
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);???????/*先將字符轉化為十進制數*/
????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);
}
/*******************************************
?根據不同命令查表或造表函數
********************************************/
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.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);????????/*若找到,返回在相應表中的序號*/
????????}
????????else
???????????c=fgetc(fp);
?????}
?????if(command==1)
?????{???
?????f
- 上一篇:c++語言-物流管理系統
- 下一篇:正則表達式轉換為nfa以c語言源程序
評論
共有 條評論