2011-04-13 82 views
0

我正在编写玩具OO语言的编译器。我使用Flex和Bison将它写入C语言。Flex /野牛多通类解析

考虑下面的语法:

class MyClass { 
    int m_n; 

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

    int m_p; 
} 

我当前的代码会抱怨说,在MYFUNC,M_P尚未宣布(有很好的理由)。于是,我来到了,我需要一个多通道分析技术得出结论 - 沿着线的东西:

第1次 - 过程变量声明

第2次 - 过程函数定义

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

感谢

回答

1

我最近写了一个编译器的面向对象的语言,我们必须多遍(根据课程的语言的复杂性):

  1. 收集所有类
  2. 树立超层次结构
  3. 收集所有方法和字段
  4. 收集方法内的变量等

有我们为什么整个过程分成了4个通行证原因:

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

如果你当然没有用你的语言继承,你可以不用第二遍。

当我现在看它,它应该已经可以合并通2和3的所有数据应可用于通3.

我们实施的方式,它只是通过了AST边走边使用所需的符号表对其进行注释。

+0

你可以看看这个项目:http://svn.c0demonkey.com/listing.php?repname=njc-oo&path=%2Ftrunk%2F#path_trunk_(通过semant.c完成 - 非常复杂代码尽管:) – halfdan 2011-04-13 22:05:40