F#解析抽象语法树

使用F#解析AST构建解释器的最佳方法是什么? 有很多F#示例用于简单的语法(基本算术操作),但我似乎无法找到具有更多功能范围的语言的任何内容。

被歧视的工会看起来是非常有用的,但你将如何去建造一个拥有大量选择的工会? 在其他地方定义类型(比如加法,减法,条件,控制流)是否更好,并将它们作为联合中的预定义类型一起使用?

或者我是否错过了一些更有效的口译手段? 是否有更有效的每种类型的eval函数,或者可能使用monads?

提前致谢


被歧视的工会看起来是非常有用的,但你将如何去建造一个拥有大量选择的工会? 在其他地方定义类型(比如加法,减法,条件,控制流)是否更好,并将它们作为联合中的预定义类型一起使用?

我不确定你在这里问什么; 即使有大量选项,DU仍然很容易定义。 参见例如这篇博客文章,了解微型语言的DU结构(以及关于编写树型变换的更一般的讨论)。 拥有更多案例的DU是很好的事情,并且在编译器/解释器中通常使用这种表示。

至于解析,我更喜欢monadic解析器组合器; 检查FParsec或查看这个旧的博客条目。 在使用这种解析器组合器之后,我永远无法回到像lex / yacc / ANTLR这样的任何东西 - 外部DSL似乎比较原始。

(编辑:你发现的“小算术例子”可能代表了更大的解决方案的样子,'玩具'的例子通常展示了正确的架构。)


你应该拿一份Robert Pickering的“Beginning F#”。

正如Noldorin所建议的,第13章“解析文本”包含一个FsLexFsYacc的例子。

除此之外,在同一本书的第12章中,作者解释了如何为他提出的算术语言构建一个实际简单的编译器。 非常有启发性。 最重要的部分是你正在寻找的东西: AST解析器

祝你好运。


我第二次布赖恩的建议,看看FParsec。 如果你有兴趣用FsLex和FsYacc做老式的学习方法,那么寻找如何解析非平凡语言的地方就是F#源代码本身。 请参阅分发中的sourcefsharpFSharp.Compiler目录。

链接地址: http://www.djcxy.com/p/68201.html

上一篇: F# parsing Abstract Syntax Trees

下一篇: Python Best Practices: Abstract Syntax Trees