0

我正在为玩具 OO 语言编写编译器。我正在用 C 语言编写它,使用 Flex 和 Bison。

考虑以下语法:

class MyClass {
    int m_n;

    void MyFunc(int b) {
        m_n = 5;
        m_p = b;
    }   

    int m_p;
}

我当前的代码会抱怨在 MyFunc 中,m_p 尚未声明(有充分的理由)。因此,我得出的结论是,我需要一种多遍解析技术——类似于:

第一遍 - 处理变量声明

第二遍 - 处理函数定义

首先 - 这是解决问题的最佳方法吗?还有其他我应该研究的方法吗?其次 - 如果这是一个有利的解决方案,我会使用可重入词法分析器/解析器来实现它吗?

谢谢

4

1 回答 1

2

我最近为一种 OO 语言编写了一个编译器,我们进行了多次传递(当然取决于语言的复杂性):

  1. 收集所有职业
  2. 建立超类层次结构
  3. 收集所有方法和字段
  4. 在方法等中收集变量。

我们必须将整个过程分成 4 遍是有原因的:

  1. 当尚未处理所有类时,您无法建立超类层次结构(导致 2. 通过)
  2. 当超类未知时(导致 2. 通过),您无法验证继承的方法(返回值、参数等)
  3. 当尚未收集所有字段时,您无法处理变量(导致 4. 通过)

当然,如果您的语言没有继承权,则可以省略第二遍。

当我现在查看它时,应该可以合并 pass 2 和 3,因为所有数据都应该可用于 pass 3。

我们实现它的方式只是遍历 AST 并使用所需的符号表对其进行注释。

于 2011-04-13T22:02:58.067 回答