optimization - 为一种可以预见和多个文件的语言编写一个编译器?

标签 optimization compiler-construction build-process compiler-theory compiler-optimization

在我的语言中,当定义出现在方法下方时,我可以在方法中使用类变量。它还可以调用我的方法下面的方法等。没有“ header ”。以这个 C# 为例。

class A
{
    public void callMethods() { print(); B b; b.notYetSeen();
    public void print() { Console.Write("v = {0}", v); }
    int v=9;
}

class B
{
    public void notYetSeen() { Console.Write("notYetSeen()\n"); }
}

我应该如何编译它?我的想法是:

  • pass1:将所有内容转换为 AST
  • pass2:遍历所有类并构建定义类/变量等的列表
  • pass3:检查代码并检查是否存在任何错误,例如 undefined variable 、错误使用等,并创建我的输出

但似乎要使其起作用,我必须在执行第 3 步之前对所有文件执行第 1 步和第 2 步。而且,在我发现语法错误之前,感觉还有很多工作要做(除了在解析时可以完成的明显错误,例如忘记关闭大括号或写入 0xLETTERS 而不是十六进制值)。我的直觉告诉我还有其他方法。

注意:我使用 bison/flex 来生成我的编译器。

最佳答案

我对处理前向引用的语言的理解是,它们通常只使用第一遍来构建有效名称列表。类似于只是将一个条目放入表中(不填写定义),以便稍后在执行真正的传递来生成定义时可以指向一些内容。

如果您尝试实际构建完整的定义,那么您最终将不得不重复重新扫描,每次都保存对未定义事物的任何引用,直到下一次。如果存在循环引用,即使这样也会失败。

关于optimization - 为一种可以预见和多个文件的语言编写一个编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1578835/

相关文章:

c# - 为什么编译器至少不警告 this == null

c++ - LLVM IR 生成的代码到 native 代码

c++ - 在 Visual C++ 的命令行上编译

.net - Bin 部署 rake(和 IronRuby)

Android:任务 ':dexDebug' 执行失败

c++ - 在 TensorFlow 上创建优化器的步骤

mysql - 将 mysql 引擎从 InnoDB 更改为 MyISAM 的安全方法

optimization - Mysql查询需要时间

continuous-integration - TeamCity 在工作目录结帐中缺少项目

python-3.x - 使用随机森林时 scikit 中的 "ValueError: max_features must be in (0, n_features] "