用c语言设计并实现一个词法分析器,实现对指定位置的类C语言源程序文本文件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实现简单的词法分析操作
时间: 2024-05-06 21:20:37 浏览: 128
以下是一个简单的词法分析器的实现:
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_LEN 100 // 单词的最大长度
// 定义单词类型
enum TokenType {
KEYWORD, // 关键字
IDENTIFIER, // 标识符
CONSTANT, // 常量
OPERATOR, // 运算符
DELIMITER // 分隔符
};
// 定义关键字数组
char *keywords[] = {"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"};
// 判断是否为关键字
int is_keyword(char *word) {
for (int i = 0; i < sizeof(keywords) / sizeof(keywords[0]); i++) {
if (strcmp(word, keywords[i]) == 0) {
return 1;
}
}
return 0;
}
// 判断是否为常量
int is_constant(char *word) {
int len = strlen(word);
for (int i = 0; i < len; i++) {
if (!isdigit(word[i])) {
return 0;
}
}
return 1;
}
// 判断是否为运算符
int is_operator(char *word) {
char operators[] = "+-*/%=&|<>!^~";
int len = strlen(word);
for (int i = 0; i < len; i++) {
if (strchr(operators, word[i]) == NULL) {
return 0;
}
}
return 1;
}
// 判断是否为分隔符
int is_delimiter(char *word) {
char delimiters[] = "(){}[];,:";
int len = strlen(word);
for (int i = 0; i < len; i++) {
if (strchr(delimiters, word[i]) == NULL) {
return 0;
}
}
return 1;
}
// 分类单词并输出
void classify_word(char *word) {
if (is_keyword(word)) {
printf("%s\t\t\t%s\n", word, "关键字");
} else if (is_constant(word)) {
printf("%s\t\t\t%s\n", word, "常量");
} else if (is_operator(word)) {
printf("%s\t\t\t%s\n", word, "运算符");
} else if (is_delimiter(word)) {
printf("%s\t\t\t%s\n", word, "分隔符");
} else {
printf("%s\t\t\t%s\n", word, "标识符");
}
}
// 读取单词
void read_word(FILE *fp) {
char word[MAX_LEN] = {0};
int pos = 0;
char ch = fgetc(fp);
while (ch != EOF) {
if (isspace(ch)) { // 遇到空格,输出前面的单词
if (pos > 0) {
word[pos] = '\0';
classify_word(word);
pos = 0;
}
} else {
word[pos++] = ch;
}
ch = fgetc(fp);
}
}
int main() {
FILE *fp = fopen("source.c", "r");
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
read_word(fp);
fclose(fp);
return 0;
}
```
在该代码中,我们定义了一个`enum`类型表示单词的类型,并定义了判断单词类型的函数。在`read_word`函数中,我们读取文件中的每个字符,将其存储到一个字符数组中,如果遇到空格,则说明前面的字符已经组成了一个单词,我们将其进行分类并输出。在`main`函数中,我们只需要打开文件并调用`read_word`函数即可。
假设我们有一个名为`source.c`的文件,内容如下:
```c
#include <stdio.h>
int main() {
int a = 123;
float b = 3.14;
printf("Hello, world!\n");
return 0;
}
```
运行程序后,输出结果如下:
```
#include 关键字
<stdio.h> 标识符
int 关键字
main 标识符
( 分隔符
) 分隔符
{ 分隔符
int 关键字
a 标识符
= 运算符
123 常量
; 分隔符
float 关键字
b 标识符
= 运算符
3.14 常量
; 分隔符
printf 标识符
( 分隔符
"Hello, world!\n" 常量
) 分隔符
; 分隔符
return 关键字
0 常量
; 分隔符
} 分隔符
```
阅读全文