【问题标题】:Analysing a tree without fixed/static semantics?分析没有固定/静态语义的树?
【发布时间】:2012-12-27 00:19:46
【问题描述】:

我正在尝试分析一种可以根据概率进行多种翻译的动态语言。我的语言中有一些已定义的类型,例如数字、向量等...

例如,如果我们要看到表达式“a+b”,那么这可能是两个数字的相加,也可能是两个向量的相加。 一个数字更有可能,因此我们认为“最佳”表示是两个数字的总和。但是它们有可能是向量,所以我仍然想保留这种“不太可能”的表示。

如果后来我看到“a/b”,那么我知道它们不能是向量,因为向量除法是未定义的。所以我会丢弃“向量”表示,正确的表示占上风。

我想通过分析 AST 来做到这一点。问题在于,由于类型和运算符的多种可能组合,我们遇到了组合爆炸。

关于我可以使用的合适策略或模式的任何想法?我正在考虑一种用于不同组合的访问者,它们并行运行以赋予结构最佳含义。有点像在自然语言处理中分析句子。

我正在使用 ANTLR 的树遍历机制进行分析,因此任何特定于该系统的参考,或为动态语言实现语义将不胜感激。

【问题讨论】:

  • 如果您能找到“Dragon Book”(编译器、原理、技术和工具,Aho、Sethi 和 Ullman 着)的副本,请阅读第 6 章,特别参考 6.7 中的统一算法。 (我的副本是 1980 年代的,所以章节编号可能已经改变。但“统一”这个词将是关键。)
  • 谢谢,但龙书对我来说似乎太抽象了。我会研究统一的。

标签: parsing dynamic compiler-construction antlr abstract-syntax-tree


【解决方案1】:

在我看来,您需要的本质上是一个类型推断系统,它是编程语言中表达式类型的自动推断。你可以从the wikipedia page about type inference开始,然后花点时间了解the Hindley–Milner algorithm

AST 只是一个编译器的开始,所以你应该尽量习惯于构建一个具体的 AST 数据结构,并编写访问者多次遍历树。语义部分仅在您构建了整个 AST 之后才开始。

【讨论】:

  • 谢谢。我已经有一个完整的 AST,并且已经使用了几个不同的访问者来重写它的某些部分。我以前实现过静态类型系统,只是从未做过任何推理。
猜你喜欢
  • 2013-12-28
  • 1970-01-01
  • 2019-01-03
  • 2013-11-21
  • 1970-01-01
  • 2014-05-30
  • 2010-10-06
  • 2011-12-16
  • 1970-01-01
相关资源
最近更新 更多