假设我有某种特定领域语言的类型化表达式:
x+y<=z
其中x,y,z
的输入为int
我们应该使用python中的哪个内置数据结构来实现符号表?我只知道dictionary
所以符号表可以实现为
{x:'int', y:'int', z:'int'},
但也许还有其他更好的选择?
答案 0 :(得分:1)
符号表的基本概念是将范围内的标识符映射到有关标识符的信息(类型,用途......)
因此任何将名称(几乎总是字符串)与“类型值”相关联的机制都可以作为基础。所以,词典会起作用。 (实际上,标识符键上的哈希表是实现此目的的经典方法)。
但是对于真正的符号表,你需要更多。您需要将每个此类地图与其有效的范围相关联。在许多经典的Algol语言中,嵌套块引入了这样的范围。在更复杂的语言(例如,C ++)中,一个具有名称空间和其他复杂的作用域结构,并且映射与作用域的关系可能需要复杂的映射回到源代码(或AST节点或您用作表示的任何内容)。
“符号表”中的查找需要有关如何确定当前范围(因此是当前标识符到类型映射)的规则,以及如果在该范围内找到标识符该怎么办,以及在该范围内找不到该怎么办(通常,查看由语言规则定义的另一个范围)。允许重载的复杂语言可能需要在作用域中使用多个条目来表示重载名称;突然一个简单的字典是不够的,你可能需要一个附加到地图中找到的每个标识符的选择树,或者一个更复杂的标识符与签名数据到范围条目的映射。
在许多类似Algol的语言中,“查看另一个范围”需要上升块的“词法嵌套”,因此每个映射必须与父作用域关联。复杂的语言(如C ++)可能有多个继承规则;现在,您必须能够确定哪些(“父”)范围可能有助于继承,以及搜索父项的顺序。因为复杂语言可能具有许多不同的查找规则,具体取决于符号的上下文,每个标识符映射可能需要其特定的策略(程序附件),关于它如何进行本地查找(例如,处理找到的重载)以及它如何处理失败的查找。 / p>
因此,虽然字典足以支持只有一个范围的真正简单语言,但在实践中,您需要更多“结构”来存储复杂语言的符号表。
如果你认为你的“简单”语言只有很小的实例,因此只需要一个范围,你就会对用户最终做的事情感到非常惊讶。 (曾经看过千行SQL语句?)随着DSL实例变得越来越大,你需要更多的范围规则来使它们易于管理,你最终会得到我上面描述的部分或全部复杂问题。当你这样做时,请考虑长远。
(检查我的bio是否有用于构建DSL的工具,它具有处理上述所有内容的符号表机制。但不是用Python实现的。)