创建符号表

时间:2009-12-19 12:49:55

标签: c compiler-construction

是否有任何机构可以告诉如何使用C创建编码器的符号表。

4 个答案:

答案 0 :(得分:2)

用于构建编译器和解释器的标准Stack Overflow资源是Learning to write a compiler

答案 1 :(得分:1)

绝对最简单的事情就是提供一系列结构。类似的东西:

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 */

一旦这个工作,你会想要

  1. 摆脱全局符号表,并将其作为所有惯例的参数
  2. 用树或哈希表替换讨厌的低效固定数组

答案 2 :(得分:0)

这是最简单的部分imo,一旦你的解析器工作,当你在语法中遇到标识符时,你已经掌握了关于它们的各种信息,类型,如果它们是函数语法规则的一部分,或者如果它们是它们是函数声明/定义的一部分,你的每个参数都有它们的类型。

一旦确定了所有这些信息,最基本的符号表(仅限全局)就是建立一个名称和类型(变量)或名称,类型和名称类型列表的联合列表组合(功能)。你可以用旗帜或其他东西将它们分开。完成后,您可以进一步将其嵌套用于函数,然后再嵌入范围,从而创建一个c风格的符号表。最后,在代码生成阶段,您将在此处编写符号将使用的寄存器/标签,因此请确保它易于扩展;你会回到这个存储库来添加簿记数据。

最棘手的部分是在您仍在解析语法时迁移信息。这通常使用您在阅读时填写的大型结构来完成。采用C风格的int f(int x, int y)声明:一旦你解析int f,你就不知道你是在解析一个函数还是一个变量,所以你必须用你的名字填写你的结构。输入类型,然后将其传递给下层树节点(在递归下降解析器的情况下)并让它们处理它,然后一旦完成,将结构返回给调用者,以便它们具有完整信息,即使你,在具体的功能中,你不知道你正在解析的是什么。

答案 3 :(得分:0)

查找如何在字符串上键入哈希表。这是标准的做法。