gpt4 book ai didi

c编译器类型检查算法和语义分析

转载 作者:行者123 更新时间:2023-11-30 18:52:34 25 4
gpt4 key购买 nike

是否有任何建议的算法可以在 C 代码中查找变量类型?

我正在编写 C 语言一小部分的编译器。它现在可以处理 int 和 float 类型,但它应该可以处理任何合法的 c 类型(在函数中,int 和 float)。 (例如 int ** (*fp)(int, int) 等..)由于存在任意数量的可能性,因此不可能使用任何类型的枚举或哈希表。

那么这个问题通常是如何解决的呢?

这种声明可以用 LL1 解析器完成吗?

最佳答案

这个问题太深奥,无法在这里完全回答。然而,大多数编译器使用图形数据结构来表示类型。 (许多年前,为了节省空间,图以复杂的方式进行编码,但现在没有必要了。)C 的图节点是递归类型(就像大多数图节点一样),大致如下:

typedef enum { 
VOID, INT, CHAR, DOUBLE, ENUM, POINTER, ARRAY, STRUCT, UNION, FUNCTION,
} KIND;

typedef struct type_s {
KIND kind;
union {
struct enumeration_s {
int n_values;
struct enum_value_s *values;
} enumeration;
struct pointer_s {
struct type_s *to_type;
} pointer;
struct array_s {
struct type_s *of_type;
size_t n_elements;
} array;
struct struct_or_union_s {
size_t n_fields;
struct field_s *fields; // Variable-sized array of fields.
} struct_or_union;
struct function {
struct type_s *return_type;
size_t n_args;
struct field_s *args; // Variable-sized array of args.
} function;
} u;
} TYPE;

typedef struct enum_value_s {
char *name;
int value;
} ENUM_VALUE;

typedef struct field_s {
char *name;
struct type_s *type;
} FIELD;

如果你已经构建过编译器,那么你应该知道什么是抽象语法树。这只是类型的 AST。您应该能够轻松绘制 int ** (*fp)(int, int) 类型的图形(这是一个图形,因为您希望叶类型 INT,... 的节点是单例) .

是的(除了您可能已经在处理的众所周知的 typedef 歧义之外)在 LL(1) 或 LR(1) 解析器中生成这些类型图并不难。

关于c编译器类型检查算法和语义分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34802234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com