用C语言编写一个程序实现对源程序中运算符、界符和常量单词的信息提取,信息包含所处位置(行号、列号)、类别信息,关键字、标识符、运算符、界符、常量类别分别为1、2、3、4、5。
时间: 2023-07-04 08:13:18 浏览: 93
好的,下面是一个简单的实现。需要注意的是,这个程序只考虑了一些基本的情况,实际上编写一个完整的编译器需要考虑很多更复杂的情况。
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define KEYWORD_NUM 5
#define KEYWORD_MAX_LENGTH 6
char keywords[KEYWORD_NUM][KEYWORD_MAX_LENGTH] = {
"int", "float", "double", "char", "void"
};
int is_keyword(char* word) {
for (int i = 0; i < KEYWORD_NUM; i++) {
if (strcmp(word, keywords[i]) == 0) {
return 1;
}
}
return 0;
}
int main() {
char filename[100];
printf("请输入源文件名:\n");
scanf("%s", filename);
FILE* fp = fopen(filename, "r");
if (!fp) {
printf("文件打开失败!\n");
return 1;
}
char buf[1000];
int line_num = 1;
int col_num = 1;
while (fgets(buf, 1000, fp)) {
int len = strlen(buf);
for (int i = 0; i < len; i++) {
if (isspace(buf[i])) {
// 空格和换行符不算单词
col_num++;
} else if (isalpha(buf[i])) {
// 标识符或关键字
char word[100];
int j = 0;
while (isalnum(buf[i]) || buf[i] == '_') {
word[j++] = buf[i++];
}
word[j] = '\0';
col_num += j;
if (is_keyword(word)) {
printf("(%d,%d) 类型:关键字,值:%s\n", line_num, col_num - j, word);
} else {
printf("(%d,%d) 类型:标识符,值:%s\n", line_num, col_num - j, word);
}
i--;
} else if (isdigit(buf[i])) {
// 常量
char num[100];
int j = 0;
while (isdigit(buf[i]) || buf[i] == '.') {
num[j++] = buf[i++];
}
num[j] = '\0';
col_num += j;
printf("(%d,%d) 类型:常量,值:%s\n", line_num, col_num - j, num);
i--;
} else {
// 运算符或界符
printf("(%d,%d) 类型:", line_num, col_num++);
switch (buf[i]) {
case '+':
case '-':
case '*':
case '/':
case '%':
case '=':
case '<':
case '>':
case '!':
case '&':
case '|':
case '~':
case '^':
printf("运算符,值:%c\n", buf[i]);
break;
case '(':
case ')':
case '{':
case '}':
case '[':
case ']':
case ';':
case ',':
printf("界符,值:%c\n", buf[i]);
break;
default:
printf("未知,值:%c\n", buf[i]);
break;
}
}
}
line_num++;
}
fclose(fp);
return 0;
}
```
阅读全文