我正在为类C语言构建编译器。我对词法分析器和解析器做了一些工作。现在,我正在尝试进行语义分析,并尝试构建符号表。 现在,根据规范,不允许在相同的词法级别重复声明。这需要为每个词汇级别构建一个不同的符号表,对吧?我该怎么做呢? 截至目前,我所拥有的一个符号表是二叉树形式,其中每个节点如下所示:
struct tree_el
{
char *identifier;
char *type;
struct tree_el *right, *left;
}
如何将特定节点指向另一棵树的“根”节点?
任何帮助都会很棒!非常感谢。
答案 0 :(得分:1)
通常,这是通过类似堆栈的结构完成的:每个“词法级别”在启动时在堆栈上打开,并且在遇到它们时会推送其他级别。
例如:
int i,j,k;
while (i) {
int q, r, s;
...
}
在解析此问题时,您首先要定义i
j
和k
,然后添加这些定义。然后,您点击了while语句,并“推送”q
r
和s
的定义。当while语句范围退出时,您将“弹出”q
r
和s
等。
答案 1 :(得分:0)
每个词法范围都需要一个单独的符号树,它只包含在该范围内直接定义的符号。查找符号时,首先查看最深的包含范围,然后查看父范围,依此类推,直到达到文件范围。