Parsing 分析没有固定/静态语义的树?

Parsing 分析没有固定/静态语义的树?,parsing,dynamic,compiler-construction,antlr,abstract-syntax-tree,Parsing,Dynamic,Compiler Construction,Antlr,Abstract Syntax Tree,我试图分析一种动态语言,它可以有多个翻译,这取决于概率。我在我的语言中定义了一些类型,如数字、向量等 例如,如果我们看到表达式“a+b”,那么这可能是两个数字的相加,也可能是两个向量的相加。 一个数字更有可能出现,因此我们认为“最佳”表示是两个数字的总和。然而,它们可能是向量,所以我仍然希望保留这种“不太可能”的表示 如果后来我看到“a/b”,那么我知道它们不可能是向量,因为向量除法是未定义的。所以我会扔掉“向量”表示法,正确的表示法占上风 我想通过分析AST来做到这一点。问题是,由于类型和运算

我试图分析一种动态语言,它可以有多个翻译,这取决于概率。我在我的语言中定义了一些类型,如数字、向量等

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

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

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

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


我正在使用ANTLR的树行走机制进行分析,因此任何特定于该系统的引用,或实现动态语言的语义都将非常感谢。

从我的角度来看,您需要的基本上是一个类型推断系统,这是编程语言中表达式类型的自动推断。你可以从开始,然后花一些时间去理解


AST只是编译器的开始,因此您应该尝试习惯于构建AST的具体数据结构,并编写访问者多次遍历树。语义部分仅在构建整个AST后开始。

如果您能找到“龙书”(由Aho、Sethi和Ullman编写的编译器、原理、技术和工具)的副本,请阅读第6章,特别参考6.7中的统一算法。(我的副本是80年代的,所以章节号可能已经改变了。但是“统一”这个词将是关键。)谢谢,但是龙书似乎太抽象了,我不喜欢。我会调查统一的。谢谢。我已经有了一个完整的AST,并使用了几个不同的访问者重写了其中的某些部分。我以前实现过静态类型系统,只是从来没有做过任何推理工作。