是否有任何机构可以告诉如何使用C创建编码器的符号表。
答案 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 */
一旦这个工作,你会想要
答案 2 :(得分:0)
这是最简单的部分imo,一旦你的解析器工作,当你在语法中遇到标识符时,你已经掌握了关于它们的各种信息,类型,如果它们是函数语法规则的一部分,或者如果它们是它们是函数声明/定义的一部分,你的每个参数都有它们的类型。
一旦确定了所有这些信息,最基本的符号表(仅限全局)就是建立一个名称和类型(变量)或名称,类型和名称类型列表的联合列表组合(功能)。你可以用旗帜或其他东西将它们分开。完成后,您可以进一步将其嵌套用于函数,然后再嵌入范围,从而创建一个c风格的符号表。最后,在代码生成阶段,您将在此处编写符号将使用的寄存器/标签,因此请确保它易于扩展;你会回到这个存储库来添加簿记数据。
最棘手的部分是在您仍在解析语法时迁移信息。这通常使用您在阅读时填写的大型结构来完成。采用C风格的int f(int x, int y)
声明:一旦你解析int f
,你就不知道你是在解析一个函数还是一个变量,所以你必须用你的名字填写你的结构。输入类型,然后将其传递给下层树节点(在递归下降解析器的情况下)并让它们处理它,然后一旦完成,将结构返回给调用者,以便它们具有完整信息,即使你,在具体的功能中,你不知道你正在解析的是什么。
答案 3 :(得分:0)
查找如何在字符串上键入哈希表。这是标准的做法。