代码之家  ›  专栏  ›  技术社区  ›  ThomasH

如何在本地符号表中表示外部符号的类型信息?

  •  0
  • ThomasH  · 技术社区  · 7 年前

    只要符号是本地的,在源代码解析过程中就有大量关于建立符号表的资源。但是,外部符号如何才能被整合,部分。它们的类型信息,对于具有导入的语言?

    比如说,当前代码(静态类型语言)导入导出某些函数、变量和类的模块,这些符号可以直接在当前代码中使用(比如Java的“星型”导入,或者Python的 from foo import *

    但是模块本身可以导入其他模块,这可能会影响导出的符号,特别是它们的类型。如果您想维护符号的类型信息,您可能需要返回到其他模块中以查找这些类型,而这些类型又可以导入其他相关模块,依此类推。

    虽然这种递归分析通常会终止,但这可能会导致将一个巨大的作用域树添加到本地符号表中,以捕获所有涉及的类型并能够验证表单的表达式 a.b.c... . 这也会使提前扫描导出符号的成本更高。

    还有别的办法吗?

    0 回复  |  直到 7 年前
        1
  •  2
  •   Mike Lischke    7 年前

    有关具体实现,请参见我的 antlr4-vscode extension 我在哪里使用 SourceContext 类以涵盖单个文件(模块)的所有详细信息。它包含一个符号表,源上下文及其符号表相互链接,以允许符号(和其他查找)超出当前上下文。然而,在这个实现中,我不需要递归止动器,因为ANTLR4语法严格组织为一个树(tokenVocab,import)。