資源簡介
本程序能成功識別檢測程序中的每一個單詞。檢測程序中事先定義的關鍵字、實現過程或者在檢測程序中定義的變量,本程序將一二元組輸出。否則,本程序將會統一將其歸類為undeclared identifier。
該程序是linux平臺下的,若在Windows下只需將頭文件unistd.h 改為io.h

代碼片段和文件信息
#include
#include
#include
const?char?*keywords[]={“int““if““else““while““for““return“};??/*關鍵字(1)*/
const?char?*mark[]={“main““printf““%s““%d“};??/*標識符(2)*/
const?char?*calculate[]={“%““*““+““-““/““<““>““=““<=““>=““==“};/*運算符(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];???/*用來存儲定義過的變量*/
void?judge(char?*buffer){
int?i;
if(buffer[0]==0x00)return;???/*如果buffer為空,則立即返回*/
if(buffer[0]<=‘9‘?&&?buffer[0]>=‘0‘){?/*以數字開頭的是常數*/
printf(“(3‘%s‘)\n“buffer);
return;
}
if(!strcmp(buffer“int“)){/*判斷是何種形式的何種單詞*/
printf(“(1‘%s‘)\n“buffer);?
varflg=1;??/*設置變量標志,在關鍵字int型的后面那個單詞即認為是變量*/
}
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;/*定義常量標志,兩個““”之間的可認為是常量“%s““%d“除外*/
char?cbuffer[256]forward=0x00;/*因光一個<>=無法判斷是何種運算符,還得根據后一個符號判斷,forward就是用來存儲第一個讀到的<>或=*/
fd=fopen(“input.txt““r“);??/*打開input.txt文件做讀操作*/
close(0);??/*關閉標準輸入*/
dup2(fileno(fd)0);??/*標準輸入重定向到fd*/
memset(buffer0x00sizeof(buffer));/*刷新緩沖區*/
while((c=getchar())!=EOF){
if((forward==‘>‘?||?forward==‘<‘?||?forward==‘=‘)?&&?c!=‘=‘){?/*前一個符號是<>或者=*/
printf(“(4‘%c‘)\n“forward);
forward=0x00;
buffer[0]=c;
continue;
}
if(c==‘“‘){/*如果是雙引號,則改變標志*/
conflg=(conflg+1)%2;
if(conflg==1){??/*如果是奇數個雙引號,即字符串的開始標識*/
printf(“(5‘%c‘)\n“c);
memset(buffer0x00sizeof(buffer));?
continue;
}
else{??/*if(conflg==0)字符串的結束標識*/
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
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????127??2010-06-01?08:56??input.txt
?????文件???????4765??2010-06-01?09:08??word_analysis.c
-----------?---------??----------?-----??----
?????????????????4892????????????????????2
評論
共有 條評論