C語言簡單詞法分析器

2021-10-05 14:45:20 字數 3417 閱讀 6588

/*

詞法分析器(c語言)

輸入源程式、輸出單詞符號

1、預處理程式

2、掃瞄器(單詞識別程式)

*/#include #include #include #define keyword_num 32

int pos; // pos搜尋指標

char ch; // ch最新讀入的字元

char buf[1000000]; // buf緩衝區

char strtoken[256]; // strtoken

char* key_word = ;

/*預處理主要工作:

1、刪除注釋

2、刪除續行符,以及後續換行符(0ah)。

3、換行符、tab和空格具有界符作用,預處理時通常予以保留。為了簡化判斷,可在預處理時,將換行符和tab統一替換為空格。

4、大多數語言(除c語言)不區分大小寫,可在預處理時,將大寫字母變換成小寫字母,或相反,以方便後續處理。

5、對於受書寫格式限制的語言(例fortran和cobol),還應識別標號區,正確給出語句標號。識別續行標誌,把相繼行捻接在一起,給出語句結束符。

*/void pre_process(char* filename)

char old_c = '\0', cur_c;

int in_comment = 0; // in_comment是否在注釋內,1為在單行注釋中,2為在多行注釋中,或者拆分in_scomment、inmcomment

int in_string = 0; // in_string是否在字串常量內

int i = 0;

while ((cur_c = fgetc(fp)) != eof)

buf[i] = cur_c; //送入掃瞄緩衝區

i++;

} else else if (old_c == '/' && cur_c == '*') else else if (cur_c == '\t' || cur_c == '\n')

if (old_c != '\'' && cur_c == '"') in_string = 1; // 字串常量,需要判斷"是否是字元常量

buf[i] = cur_c; //送入掃瞄緩衝區

i++;

}//printf("buf[%d] = %c\n", i, cur_c);

} else if (in_comment == 1) else

} old_c = cur_c;

} if (buf[i] != ' ' && buf[i] != '\0')

buf[i] = '#';

buf[i + 1] = '\0';

printf("預處理後:");

printf("buf:\n", buf);

int j = 0;

char last = '\0';

char now = buf[0];

while (!(last == '#' && now == '\0'))

printf("\nbuf length %d\n", strlen(buf));

fclose(fp);

}void formatting()

void getchar()

void getbc()

void concat(char* strtoken)

int isletter()

int isdigit()

int reserve(char* strtoken)

return 0;

}void retract()

int insertid(char* strtoken)

int insertconst(char* strtoken)

void procerror()

void scanner()

retract();

code = reserve(strtoken);

if (code == 0) else printf("(%s, -)\n", strtoken);

} else if (isdigit())

retract();

value = insertconst(strtoken);

printf("(\'int\', %s)\n", strtoken);

} else if (ch == '"') else

concat(strtoken);

getchar();

}concat(strtoken);

printf("(\'string\', %s)\n", strtoken);

} else if (ch == '=')

} else if (ch == '+')

} else if (ch == '-')

} else if (ch == '*')

} else if (ch == '/')

} else if (ch == '|')

} else if (ch == '\\') printf("(\'\\\', -)\n");

else if (ch == ';') printf("(\';\', -)\n");

else if (ch == '(') printf("(\'(\', -)\n");

else if (ch == ')') printf("(\')\', -)\n");

else if (ch == '<')

} else if (ch == '>')

} else if (ch == '') printf("(\'}\', -)\n");

else if (ch == '[') printf("(\'[\', -)\n");

else if (ch == ']') printf("(\']\', -)\n");

else if (ch == '.') printf("(\'.\', -)\n");

else if (ch == '#') else if (ch == '?') printf("(\'#\', -)\n");

else if (ch == ',') printf("(\',\', -)\n");

else if (ch == ':') printf("(\':\', -)\n");

else if (ch == '\'') else

getchar();

}concat(strtoken);

printf("(\'char\', %s)\n", strtoken);

} else if (ch == '!')

} else if (ch == '&')

} else procerror(); //錯誤處理 }}

void test()

int main()

c 模擬簡單詞法分析器

編譯原理的基礎之一就是詞法分析,這裡便使用c 簡單模擬了乙個詞法分析器。這個詞法分析器的狀態轉換圖如下 而我的執行截圖如下 如下 include using namespace std define max len 200 將乙個字串內容清空 void cleararray char c 判斷是否為...

簡單詞法分析器實現

編寫分析器有兩種方法,一種是通過dfa對單詞進行識別,二是通過直接編敲 進行識別。本程式採用dfa對單詞進行識別。dfa的實現方法。大概思想和書上一致,在程式中,則是用二維陣列代表狀態轉換矩陣,用一維陣列表示終態。可以識別識別符號 keyword 數字和運算子,對凝視進行過濾。同一時候還能識別出程式...

簡單詞法分析器實現

編寫分析器有兩種方法,一種是通過dfa對單詞進行識別,二是通過直接編敲 進行識別。本程式採用dfa對單詞進行識別。dfa的實現方法。大概思想和書上一致,在程式中,則是用二維陣列代表狀態轉換矩陣,用一維陣列表示終態。可以識別識別符號 keyword 數字和運算子,對凝視進行過濾。同一時候還能識別出程式...