F#解析抽象语法树

Chr*_*ris 11 f# language-design abstract-syntax-tree

使用F#解析AST来构建解释器的最佳方法是什么?有很多F#例子用于简单的语法(基本的算术运算),但我似乎找不到任何具有更大范围功能的语言.

受歧视的工会看起来非常有用,但您如何构建具有大量选项的工会呢?是否更好地在其他地方定义类型(例如加法,减法,条件,控制流)并将它们作为联合中的预定义类型组合在一起?

或者我错过了一些更有效的口译员写作方式?对每种类型的eval函数更有效,或者使用monad?

提前致谢

Bri*_*ian 13

受歧视的工会看起来非常有用,但您如何构建具有大量选项的工会呢?是否更好地在其他地方定义类型(例如加法,减法,条件,控制流)并将它们作为联合中的预定义类型组合在一起?

我不确定你在这里问什么; 即使有大量选项,DU仍然很容易定义.请参阅此博客条目,了解一个小语言的DU结构(以及关于编写树转换的更一般的讨论).拥有更多案例的DU是很好的,并且在编译器/解释器中很常见以使用这种表示.

至于解析,我更喜欢monadic解析器组合; 查看FParsec或查看此旧博客条目.在使用这样的解析器组合器之后,我再也无法回到像lex/yacc/ANTLR这样的东西 - 外部DSL看起来比较原始.

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