c语法分析器源程序代码
时间: 2023-07-15 13:15:37 浏览: 86
下面是一个简单的 C 语法分析器的源代码,它可以读取 C 语言代码并检查其语法正确性。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_TOKEN_LEN 100
#define MAX_LINE_LEN 1000
typedef enum {
INT, CHAR, FLOAT, DOUBLE, VOID
} Type;
typedef struct {
Type type;
char name[MAX_TOKEN_LEN];
} Symbol;
Symbol symbol_table[100];
int symbol_count = 0;
void add_symbol(Type type, char *name) {
Symbol symbol;
symbol.type = type;
strcpy(symbol.name, name);
symbol_table[symbol_count++] = symbol;
}
void parse_declaration(char *line) {
char *token = strtok(line, " ");
Type type;
if (strcmp(token, "int") == 0) {
type = INT;
} else if (strcmp(token, "char") == 0) {
type = CHAR;
} else if (strcmp(token, "float") == 0) {
type = FLOAT;
} else if (strcmp(token, "double") == 0) {
type = DOUBLE;
} else if (strcmp(token, "void") == 0) {
type = VOID;
} else {
printf("Unknown type %s\n", token);
return;
}
token = strtok(NULL, " ");
while (token != NULL) {
char *name = token;
if (name[strlen(name) - 1] == ';') {
name[strlen(name) - 1] = '\0';
}
add_symbol(type, name);
token = strtok(NULL, " ");
}
}
void parse_line(char *line) {
if (strstr(line, "int") != NULL ||
strstr(line, "char") != NULL ||
strstr(line, "float") != NULL ||
strstr(line, "double") != NULL ||
strstr(line, "void") != NULL) {
parse_declaration(line);
}
}
void parse_file(FILE *fp) {
char line[MAX_LINE_LEN];
while (fgets(line, MAX_LINE_LEN, fp) != NULL) {
parse_line(line);
}
}
void print_symbol_table() {
for (int i = 0; i < symbol_count; i++) {
char *type_name;
switch (symbol_table[i].type) {
case INT:
type_name = "int";
break;
case CHAR:
type_name = "char";
break;
case FLOAT:
type_name = "float";
break;
case DOUBLE:
type_name = "double";
break;
case VOID:
type_name = "void";
break;
}
printf("%s %s\n", type_name, symbol_table[i].name);
}
}
int main(int argc, char **argv) {
if (argc < 2) {
printf("Usage: %s FILENAME\n", argv[0]);
exit(1);
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Cannot open file %s\n", argv[1]);
exit(1);
}
parse_file(fp);
fclose(fp);
print_symbol_table();
return 0;
}
```
该程序使用了一个简单的符号表来存储 C 语言中声明的变量。它可以读取一个文件,并检查其中的变量声明语句是否符合 C 语言的语法。如果语法正确,它会将变量类型和名称添加到符号表中,并在程序结束时打印出所有的符号。