Compiler construction 向编程语言添加导入或包含支持的方法有哪些?

Compiler construction 向编程语言添加导入或包含支持的方法有哪些?,compiler-construction,python-import,abstract-syntax-tree,interpreter,Compiler Construction,Python Import,Abstract Syntax Tree,Interpreter,我现在正在使用教程实现一个口译员作为爱好项目。基本上,我需要解析代码,生成一个抽象语法树并对其进行求值。从一个源代码文件中,我生成了一棵树。现在我想添加一个类似于Python的import或C的include语句的功能。我的方法是什么?其他语言如何克服这个问题?他们是创建两棵独立的树并将它们组合起来,还是将文件内容复制到实际文件并创建一棵大树?你能给我一些教程或论文来解释可能的方法吗?解决方案取决于包含的是函数(如C等)的签名还是头,还是源代码体(如Java) 包含为标题或签名 Lex并检查是

我现在正在使用教程实现一个口译员作为爱好项目。基本上,我需要解析代码,生成一个抽象语法树并对其进行求值。从一个源代码文件中,我生成了一棵树。现在我想添加一个类似于Python的import或C的include语句的功能。我的方法是什么?其他语言如何克服这个问题?他们是创建两棵独立的树并将它们组合起来,还是将文件内容复制到实际文件并创建一棵大树?你能给我一些教程或论文来解释可能的方法吗?

解决方案取决于
包含的
是函数(如C等)的签名还是头,还是源代码体(如Java)

包含为标题或签名
  • Lex并检查是否有任何
    include
    语句
  • 加载任意include并为每个include创建一个符号表,然后放入堆栈(主观实现警告)。无需为每个创建完整的AST,因为只有符号对于解析引用很重要
  • 在parse和AST emit期间,使用符号表堆栈进行查找
假设是:组成
include
的内容已经被解析、验证,并且代码已经从源代码发出

包括作为源 当您包含源代码时,您正在扩展编译单元,导入的源代码将被视为范围中的
。这将需要:

  • 基本源
  • 识别、加载和删除包含的源。这应该
    pre-pend
    您的lex令牌列表,除非您有特定的行为作为语言语义的一部分
  • 现在继续生成一(1)个AST。它只会更大

解决方案取决于
包含的
是函数(如C等)的签名还是头文件,还是源代码(如Java)

包含为标题或签名
  • Lex并检查是否有任何
    include
    语句
  • 加载任意include并为每个include创建一个符号表,然后放入堆栈(主观实现警告)。无需为每个创建完整的AST,因为只有符号对于解析引用很重要
  • 在parse和AST emit期间,使用符号表堆栈进行查找
假设是:组成
include
的内容已经被解析、验证,并且代码已经从源代码发出

包括作为源 当您包含源代码时,您正在扩展编译单元,导入的源代码将被视为范围中的
。这将需要:

  • 基本源
  • 识别、加载和删除包含的源。这应该
    pre-pend
    您的lex令牌列表,除非您有特定的行为作为语言语义的一部分
  • 现在继续生成一(1)个AST。它只会更大

编译器至少有两种解决“包含”问题的通用方法

  • 字面上包括文件的文本。这就是C和增强型FORTRAN 77编译器使用的方法

  • 单独编译“包含”,只包含定义。这就是Ada采取的方法


  • 有些编译器同时使用这两种方法。有一些编译器(例如一些PASCAL)支持这两种方法。

    编译器至少有两种通用方法解决“包含”问题

  • 字面上包括文件的文本。这就是C和增强型FORTRAN 77编译器使用的方法

  • 单独编译“包含”,只包含定义。这就是Ada采取的方法

  • 有些编译器同时使用这两种方法。有些编译器(例如一些PASCAL)支持这两种方法