F# 解析抽象语法树

标签 f# language-design abstract-syntax-tree

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

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

还是我错过了一些更有效的编写口译员的方法?对每种类型都有一个 eval 函数更有效,还是使用 monad?

提前致谢

最佳答案

Discriminated unions look to be incrediably useful but how would you go about constructing one with large number of options? Is it better to define the types (say addition, subtraction, conditionals, control flow) elsewhere and just bring them together as predefined types in the union?



我不确定你在这里问什么;即使有大量选项,DU 仍然很容易定义。见例如this blog entry对于微小语言的 DU 结构(以及关于编写树变换的更一般性讨论)。拥有更多情况的 DU 很好,并且在编译器/解释器中使用这种表示很常见。

至于解析,我更喜欢 monadic 解析器组合器;退房 FParsec或见 this old blog entry .在使用了这样的解析器组合器之后,我再也无法回到像 lex/yacc/ANTLR 这样的东西了——相比之下,外部 DSL 似乎太原始了。

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

关于F# 解析抽象语法树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2058082/

相关文章:

f# - F#可以重构为pointfree风格吗?

f# - F# 中的累加器生成器

.net - 将数据从 Matlab 应用程序服务器传输到 F#

c++ - 为什么std::fetch_add返回旧值?

scala - 覆盖继承的构造函数字段时的差异?

javascript - 如何编写 Typescript 插件?

function - F# 中的模式匹配函数

java - 为什么 Java 没有 block 作用域的变量声明?

typescript - TypeScript Compiler API 可以解析表达式的值吗?

grails - 无法使用AST转换将方法添加到GORM对象