資源簡介
一個簡單的詞法分析器,從文件中讀入源程序,分析后的結果存入文件token.txt中。不完善的地方敬請指正。。謝謝

代碼片段和文件信息
#include
#include
#include
#define?MAX_CODE?1000
#define?MAX_SYMBOL?32
int?ijksignnumberflag;/*把類號內碼等定義成全局變量*/
char?ch;
int?line;???????????
char?words[MAX_SYMBOL]={“?“};/*定義一個符號表*/
char?program[MAX_CODE];?//用于保存源程序的字符數(shù)組???
int?scan(char?program[])???????/*掃描器*/
{??????????????????????/*定義程序可以處理的關鍵字*/
????char*keywords[]={“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“
};
????number=0;?flag=0;?j=0;?ch=program[i++];?
/*處理空格與制表符回車*/
????while((ch==‘?‘)||(ch==‘\n‘)||(ch==?‘\t‘)||(ch==‘\r‘))
{
if(ch==‘\n‘)
line++;
ch=program[i++];
}
/*處理字母*/
????if((ch>=‘a(chǎn)‘)&&(ch<=‘z‘)||(ch>=‘A‘)&&(ch<=‘Z‘)||ch==‘_‘)
{
????????while(((ch>=‘a(chǎn)‘)&&(ch<=‘z‘))||((ch>=‘A‘)&&(ch<=‘Z‘))||((ch>=‘0‘)&&(ch<=‘9‘))||ch==‘_‘)
{
words[j++]=ch;
ch=program[i++];
}
words[j++]=‘\0‘;
for(k=0;k<32;k++)
if(strcmp(wordskeywords[k])==0)
switch(k)????????????????????????//處理相應的字母并生成相應的類號或內碼并加到符號表中
{
????????????????????case?0:
sign=1;flag=1;break;?????//設置類號與內碼的值在下面的程序中用
case?1:
sign=2;flag=1;break;
case?2:
sign=3;flag=1;break;
case?3:
sign=4;flag=1;break;
case?4:
sign=5;flag=1;break;
case?5:
sign=6;flag=1;break;
case?6:
sign=7;flag=1;break;
case?7:
sign=8;flag=1;break;
case?8:
sign=9;flag=1;break;
case?9:
sign=10;flag=1;break;
case?10:
sign=11;flag=1;break;
case?11:
sign=12;flag=1;break;
case?12:
sign=13;flag=1;break;
case?13:
sign=14;flag=1;break;
case?14:
sign=15;flag=1;break;
case?15:
sign=16;flag=1;break;
case?16:
sign=17;flag=1;break;
case?17:
sign=18;flag=1;break;
case?18:
sign=19;flag=1;break;
case?19:
sign=20;flag=1;break;
case?20:
sign=21;flag=1;break;
case?21:
sign=22;flag=1;break;
case?22:
sign=23;flag=1;break;
case?23:
sign=24;flag=1;break;
case?24:
sign=25;flag=1;break;
case?25:
sign=26;flag=1;break;
case?26:
sign=27;flag=1;break;
case?28:
sign=29;flag=1;break;
case?29:
sign=30;flag=1;break;
case?30:
sign=31;flag=1;break;
case?31:
sign=32;flag=1;break;
}
if?(flag==0)
{
i--;sign=100;
}
}
/*處理常數(shù)*/
else?if((ch>=‘0‘)&&(ch<=‘9‘))
{
number=0;
sign?=?-1;
while((ch>=‘0‘)&&(ch<=‘9‘))
{
number=number*10+(ch-‘0‘);
ch=program[i++];????????//把識別出的常數(shù)并加到符號表中
}
if(((ch>=‘a(chǎn)‘)&&(ch<=‘z‘))||((ch>=‘A‘)&&(ch<=‘Z‘))||ch==‘_‘)
{
sign=-1;
do{???????????????????????????????????//酌情處理
ch=program[i++];????????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????9186??2008-03-12?21:46??詞法分析器.cpp
?????文件???????1571??2008-03-13?13:19??token.txt
?????文件????????150??2008-03-12?21:01??a.txt
-----------?---------??----------?-----??----
????????????????10907????????????????????3
評論
共有 條評論