【问题标题】:Implementing the symbol table for a domain specific language using Python使用 Python 实现特定领域语言的符号表
【发布时间】:2015-12-09 17:17:22
【问题描述】:

假设我有一个特定领域语言的类型化表达式:

x+y<=z

其中x,y,z 被键入为int

我们应该使用python中的哪个内置数据结构来实现符号表?我只知道dictionary 所以符号表可以实现为

{x:'int', y:'int', z:'int'}, 

但也许还有其他更好的选择?

【问题讨论】:

    标签: python compiler-construction


    【解决方案1】:

    符号表的基本概念是将范围内的标识符映射到有关标识符的信息(类型、用途、...)

    因此,任何将名称(几乎总是字符串)与“类型值”相关联的机制都可以作为基础。因此,字典将起作用。 (事实上​​,标识符键上的哈希表是实现这一点的经典方法)。

    但是对于真正的符号表,您需要更多。您需要将每个此类映射与其有效的 范围 相关联。在许多经典的类似 Algol 的语言中,此类范围是由嵌套块引入的。在更复杂的语言(例如,C++)中,具有名称空间和其他复杂的范围结构,并且映射与范围的关系可能需要复杂的映射回源代码(或 AST 节点或您用作表示的任何内容)。

    查找 在“符号表”中需要关于如何确定当前范围(因此是当前标识符到类型映射)以及如果在该范围内找到标识符该怎么办的规则,以及在该范围内找不到它时该怎么办(通常,查看由语言规则定义的另一个范围)。允许重载的复杂语言可能需要一个范围内的多个条目来表示重载名称;突然间,一个简单的字典是不够的,您可能需要将选择树附加到映射中的每个标识符,或者将带有签名数据的标识符映射到范围条目的更复杂的映射。

    在许多类似 Algol 的语言中,“在另一个范围内查找”需要提高块的“词法嵌套”,因此每个映射都必须与父范围有关联。 C++等复杂语言可能有多重继承规则;现在您必须能够确定哪些(“父级”)范围可能有助于继承,以及搜索父级的顺序。因为复杂的语言可能有许多不同的查找规则,具体取决于符号的上下文,每个标识符映射可能需要其特定的策略(程序附件)关于它如何进行本地查找(例如,处理发现的重载)以及它如何处理失败的查找。

    因此,虽然字典对于只有一个范围的真正简单语言就足够了,但实际上,您需要更多“结构”来存储复杂语言的符号表。

    如果您认为您的“简单”语言只会有小实例,因此只需要一个范围,那么您会对您的用户最终所做的事情感到非常惊讶。 (见过一千行 SQL 语句吗?)随着 DSL 实例变得越来越大,您需要更多的范围规则来使它们易于管理,并且您最终会遇到我上面描述的部分或全部复杂情况。做这件事时要着眼长远。

    (查看我的简历,了解构建 DSL 的工具,该工具具有处理上述所有内容的符号表机制。但未在 Python 中实现)。

    【讨论】:

      猜你喜欢
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多