資源簡(jiǎn)介
本程序能成功識(shí)別檢測(cè)程序中的每一個(gè)單詞。檢測(cè)程序中事先定義的關(guān)鍵字、實(shí)現(xiàn)過(guò)程或者在檢測(cè)程序中定義的變量,本程序?qū)⒁欢M輸出。否則,本程序?qū)?huì)統(tǒng)一將其歸類(lèi)為undeclared identifier。
該程序是linux平臺(tái)下的,若在Windows下只需將頭文件unistd.h 改為io.h

代碼片段和文件信息
#include
#include
#include
const?char?*keywords[]={“int““if““else““while““for““return“};??/*關(guān)鍵字(1)*/
const?char?*mark[]={“main““printf““%s““%d“};??/*標(biāo)識(shí)符(2)*/
const?char?*calculate[]={“%““*““+““-““/““<““>““=““<=““>=““==“};/*運(yùn)算符(4)*/
/*ASCLL)??37??42??43??45??47??60??62??61*/
const?char?*divide[]={“\“““(““)““““;““[““]““{““}“};/*界符(5)*/
????/*ASCLL)???34???40??41??44??59??91??94??123?125*/
static?int?varflg=0var_count=0;
char?varbuf[256][14];???/*用來(lái)存儲(chǔ)定義過(guò)的變量*/
void?judge(char?*buffer){
int?i;
if(buffer[0]==0x00)return;???/*如果buffer為空,則立即返回*/
if(buffer[0]<=‘9‘?&&?buffer[0]>=‘0‘){?/*以數(shù)字開(kāi)頭的是常數(shù)*/
printf(“(3‘%s‘)\n“buffer);
return;
}
if(!strcmp(buffer“int“)){/*判斷是何種形式的何種單詞*/
printf(“(1‘%s‘)\n“buffer);?
varflg=1;??/*設(shè)置變量標(biāo)志,在關(guān)鍵字int型的后面那個(gè)單詞即認(rèn)為是變量*/
}
else?if(!strcmp(buffer“if“))printf(“(1‘%s‘)\n“buffer);
else?if(!strcmp(buffer“else“))printf(“(1‘%s‘)\n“buffer);
else?if(!strcmp(buffer“while“))printf(“(1‘%s‘)\n“buffer);
else?if(!strcmp(buffer“for“))printf(“(1‘%s‘)\n“buffer);
else?if(!strcmp(buffer“return“))printf(“(1‘%s‘)\n“buffer);
else?if(!strcmp(buffer“main“))printf(“(2‘%s‘)\n“buffer);
else?if(!strcmp(buffer“printf“))printf(“(2‘%s‘)\n“buffer);
else?{
if(varflg==1){??/*變量*/
printf(“(2‘%s‘)\n“buffer);
var_count++;
for(i=0;i varbuf[var_count-1][i]=buffer[i];
}
else{
for(i=0;i if(!strcmp(buffervarbuf[i])){
printf(“(2‘%s‘)\n“buffer);
return;
}
}
printf(“undeclared?identifier:‘%s‘\n“buffer);
}
}
return;
}
int?main(){
FILE?*fd;
int?i;
int?conflg=0;/*定義常量標(biāo)志,兩個(gè)““”之間的可認(rèn)為是常量“%s““%d“除外*/
char?cbuffer[256]forward=0x00;/*因光一個(gè)<>=無(wú)法判斷是何種運(yùn)算符,還得根據(jù)后一個(gè)符號(hào)判斷,forward就是用來(lái)存儲(chǔ)第一個(gè)讀到的<>或=*/
fd=fopen(“input.txt““r“);??/*打開(kāi)input.txt文件做讀操作*/
close(0);??/*關(guān)閉標(biāo)準(zhǔn)輸入*/
dup2(fileno(fd)0);??/*標(biāo)準(zhǔn)輸入重定向到fd*/
memset(buffer0x00sizeof(buffer));/*刷新緩沖區(qū)*/
while((c=getchar())!=EOF){
if((forward==‘>‘?||?forward==‘<‘?||?forward==‘=‘)?&&?c!=‘=‘){?/*前一個(gè)符號(hào)是<>或者=*/
printf(“(4‘%c‘)\n“forward);
forward=0x00;
buffer[0]=c;
continue;
}
if(c==‘“‘){/*如果是雙引號(hào),則改變標(biāo)志*/
conflg=(conflg+1)%2;
if(conflg==1){??/*如果是奇數(shù)個(gè)雙引號(hào),即字符串的開(kāi)始標(biāo)識(shí)*/
printf(“(5‘%c‘)\n“c);
memset(buffer0x00sizeof(buffer));?
continue;
}
else{??/*if(conflg==0)字符串的結(jié)束標(biāo)識(shí)*/
printf(“(3‘“);
for(i=0;i if(buffer[i]==‘%‘?&&?(buffer[i+1]==‘s‘?||?buffer[i+1]==‘d‘))i++;
else?printf(“%c“buffer[i]);
printf(“‘)\n“);
for(i=0;i if(buffer[i]==‘%‘?&&?(buffer[i+1]==‘s‘?||?buffer[i+1]==‘d‘))
printf(“(2‘%c%c‘)\n“buffer[i]buffer[i+1]);
printf(“(5
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件????????127??2010-06-01?08:56??input.txt
?????文件???????4765??2010-06-01?09:08??word_analysis.c
-----------?---------??----------?-----??----
?????????????????4892????????????????????2
評(píng)論
共有 條評(píng)論