代码之家  ›  专栏  ›  技术社区  ›  Chris

F#解析抽象语法树

  •  11
  • Chris  · 技术社区  · 15 年前

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

    歧视工会看起来越来越有用,但你如何着手构建一个拥有大量选项的工会呢?在别处定义类型(比如加法、减法、条件、控制流)并将它们作为联合中的预定义类型组合在一起是否更好?

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

    提前谢谢

    6 回复  |  直到 15 年前
        1
  •  13
  •   Brian    15 年前

    受歧视的工会看来是不公平的 非常有用,但是你会怎么做呢 有多少选择?还是 定义类型(比如加法, 减法、条件、控制 作为中的预定义类型一起使用 工会?

    我不知道你在问什么;即使有大量的选项,DU仍然很容易定义。见例。 this blog entry 对于微型语言的DU结构(以及关于编写树转换的更一般性的讨论)。有一个包含更多案例的DU是很好的,在编译器/解释器中使用这种表示是很常见的。

    FParsec 或者看 this old blog entry . 在使用了这样的解析器组合器之后,我再也不能回到像lex/yacc/ANTLR这样的东西了——相比之下,外部DSL似乎太原始了。

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

        2
  •  3
  •   Bruno Reis    15 年前

    你应该带一本罗伯特·皮克林的《开始F》。

    第13章“解析文本”包含一个示例 FsLex FsYacc ,正如诺尔多林所建议的。

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

    祝你好运

        3
  •  3
  •   kvb    15 年前

    source\fsharp\FSharp.Compiler 发行版中的目录。

        4
  •  2
  •   Noldorin    15 年前

    您可能对查看 Lexing and Parsing F#维基百科的一节。这个 F# PowerPack library 包含 FsLex和FsYacc工具 ,这与此有很大关系。WikiBook指南是一个很好的入门方法。

    除此之外,您还需要考虑如何实际执行AST表单中的代码,这在编译器和解释器的设计中都很常见。然而,这通常被认为是比较容易的部分,并且有很多关于编译器/解释器的通用资源可以提供这方面的信息。

        5
  •  2
  •   Yin Zhu    15 年前

    我自己还没有做过翻译。希望以下帮助:)

    Here 这是耶鲁大学用ML教授的一门编译器课程,你可能会发现它很有用。课堂讲稿非常简洁(简短)且内容丰富。你可以按照前几个课堂讲稿和作业进行操作。如您所知,读取ML程序不会有问题。

    顺便说一句,这位教授是a的学生。Appel,SML实现的创建者。从这些笔记中,你也可以得到 最自然 用ML族语言编写编译器/解释器的方法。

        6
  •  0
  •   V.B.    10 年前

    This is 使用F#和FParsec的完整小型基本实现的一个极好示例。它甚至包括IL编译器。整个代码非常容易访问,并附有作者在 http://trelford.com/blog/