C 创建符号表

C 创建符号表,c,compiler-construction,C,Compiler Construction,有没有人能告诉你如何使用C为编译器创建符号表。构建编译器和解释器的标准堆栈溢出资源是这是我所知最简单的部分,一旦你的解析器工作了,当你在语法中遇到标识符时,你已经有了关于它们的每一点信息,类型,如果它们是否是函数语法规则的一部分,如果它们是函数声明/定义的一部分,则每个参数都有其类型 识别所有这些信息后,最基本的符号表(仅限全局符号)将构建名称和类型(变量)或名称、类型和名称类型组合列表(函数)的联合列表。你可以用旗子什么的把它们分开。完成后,您可以为函数和以后的作用域进一步嵌套它,从而创建一个

有没有人能告诉你如何使用C为编译器创建符号表。

构建编译器和解释器的标准堆栈溢出资源是这是我所知最简单的部分,一旦你的解析器工作了,当你在语法中遇到标识符时,你已经有了关于它们的每一点信息,类型,如果它们是否是函数语法规则的一部分,如果它们是函数声明/定义的一部分,则每个参数都有其类型

识别所有这些信息后,最基本的符号表(仅限全局符号)将构建名称和类型(变量)或名称、类型和名称类型组合列表(函数)的联合列表。你可以用旗子什么的把它们分开。完成后,您可以为函数和以后的作用域进一步嵌套它,从而创建一个c样式的符号表。最后,在代码生成阶段,您将在这里编写符号将使用的寄存器/标签,因此确保它易于扩展;您将多次返回此存储库以添加簿记数据


最棘手的部分是迁移信息,因为您仍在解析语法。这通常是通过阅读时填写的大型结构来完成的。以C风格的
intf(intx,inty)
声明为例:解析
intf
后,您还不知道是在解析函数还是变量,因此您必须仅用名称和类型填充结构,然后将其传递给较低的树节点(在递归下降解析器的情况下)并让它们处理它,完成后,将结构返回给调用者,这样调用者就有了完整的信息,即使在特定函数中,您根本不知道要解析的是什么。

绝对最简单的方法是提供一个结构数组。比如:

typedef struct {
  char *name;
  char type; /* i for int, s for string ... */
  value union {
     int i;
     char c;
     char *s;
     float f;
  }
} symbol;
symbol stable[MAX_SYMBOLS];
int symbolCount=0;
和一组操作它的例程

您需要:

int isDefined(char *name);  /* returns trye if the named symbol already exists */
symbol* addSymbol(char *name, char type);  /* Adds a symbol; returns a pointer to it */
symbol* getSymbol(char *name); /* returns a pointer to the named symbol or NULL */
一旦这起作用,您将希望

  • 去掉全局符号表,并将其作为所有例程的参数
  • 用树或哈希表替换讨厌的、低效的固定数组

  • 查找如何在字符串上创建哈希表。这是标准的方法。

    你是说编译器是用C语言编写的?还是编译C代码?ı需要使用哈希表存储声明、函数类型等的asymbol表。这属于注释。大多数资源都假设程序员对他的实现语言了解得足够多,不需要问这个基本问题。