/*
词法分析器(C语言)
输入源程序、输出单词符号
1、预处理程序
2、扫描器(单词识别程序)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define KEYWORD_NUM 32
int pos; // pos搜索指针
char ch; // ch最新读入的字符
char buf[1000000]; // buf缓冲区
char strToken[256]; // strToken
char* key_word[] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else",
"enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed",
"sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"};
/*
预处理主要工作:
1、删除注释
2、删除续行符,以及后续换行符(0AH)。
3、换行符、TAB和空格具有界符作用,预处理时通常予以保留。为了简化判断,可在预处理时,将换行符和TAB统一替换为空格。
4、大多数语言(除C语言)不区分大小写,可在预处理时,将大写字母变换成小写字母,或相反,以方便后续处理。
5、对于受书写格式限制的语言(例Fortran和Cobol),还应识别标号区,正确给出语句标号。识别续行标志,把相继行捻接在一起,给出语句结束符。
*/
void pre_process(char* filename) { //扫描缓冲区buf[ ]和扫描缓冲区指针i
FILE *fp;
if ((fp = fopen(filename, "r")) == NULL) {
printf("file %s read error!\n", filename);
exit(0);
}
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) { // 文件尚未处理完
//printf("cur_c = %c\n", cur_c);
if (in_string) { // 当前字符在字符串常量中
if (old_c != '\\' && cur_c == '"') { // 判断"前是否是转义字符
in_string = 0;
}
buf[i] = cur_c; //送入扫描缓冲区
i++;
} else {
if (!in_comment) { //当前字符未处于注释中
if (old_c == '/' && cur_c == '/') { // 单行注释
i = i - 1;
in_comment = 1;
} else if (old_c == '/' &&
C语言简单词法分析器
最新推荐文章于 2024-07-02 22:22:32 发布