在我的语言中,当定义出现在方法下方时,我可以在方法中使用类变量。它还可以调用我的方法下面的方法等。没有“ 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/