3

我正在为类 C 语言构建编译器。我已经完成了词法分析器和解析器。现在,我正在尝试进行语义分析并尝试构建符号表。现在,根据规范,在同一词汇级别中不允许重复声明。这需要为每个词汇级别构建不同的符号表,对吗?我该怎么做呢?到目前为止,我拥有的一个符号表是二叉树的形式,其中每个节点如下所示:

struct tree_el
{
    char *identifier;
    char *type;
    struct tree_el *right, *left;
}

如何将特定节点指向另一棵树的“根”节点?

任何帮助都会很棒!非常感谢。

4

2 回答 2

1

通常这是通过类似堆栈的结构来完成的:每个“词汇级别”在启动时都在堆栈上打开,并且在遇到其他级别时会推送它们。

例如:

int i,j,k;

while (i) {
   int q, r, s;

   ...
}

在解析此内容时,您首先要定义i jandk并添加它们。然后你会点击 while 语句,并“推送” q rand的定义s。当 while 语句范围退出时,您将“弹出” q rands等。

于 2011-01-30T13:04:13.873 回答
0

您需要为每个词法范围创建一个单独的符号树,其中仅包含在该范围内直接定义的符号。查找符号时,首先查看最深的包含范围,然后是父范围,依此类推,直到到达文件范围。

于 2011-01-31T04:19:31.630 回答