/*
詞法分析器(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 數字和運算子,對凝視進行過濾。同一時候還能識別出程式...