c - Flex/Bison 多遍类解析

标签 c class bison reentrancy

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

考虑以下语法:

class MyClass {
    int m_n;

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

    int m_p;
}

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

第一遍 - 处理变量声明

第二遍 - 处理函数定义

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

谢谢

最佳答案

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

  1. 收集所有类别
  2. 建立父类(super class)层次结构
  3. 收集所有方法和字段
  4. 收集方法内的变量等。

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

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

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

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

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

关于c - Flex/Bison 多遍类解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656199/

相关文章:

c++ - 模块化开发的互通方式选择

c++ - 在 main() 中调用函数变量后访问函数变量

linux - `...' 的 $1 在 Bison/Yacc 中没有声明类型

javascript - bison precedence(实际使用jison但应该是一样的)

c - 将一个字符数组分配给另一个字符数组会产生错误。为什么?

c - MPI_Recv 期间 MPI 程序卡住

ios - 类的 Setter 未被调用

C++ - 编译时出错

c++ - 为类方法创建模板

flex 和 bison 的通用标记