如何最好地表示一种编程语言的语法?

我一直在寻找Haskell,我很想编写一个编译器(作为学习练习),因为它的许多先天特性可以很容易地应用于编译器(特别是递归体面编译器)。

我无法理解的是如何用Haskell-Ian方式表示语言的语法。 我的第一个想法是使用递归数据类型定义,但我看不到如何使用它们与语言中的关键字(“if”)匹配。

思考和建议非常感谢,

皮特


递归数据类型对此很好。 例如,给定语言:

expr ::= var
      |  "true"
      |  "false"
      |  "if" expr "then" expr "else" expr
      |  "(" expr ")"

这种语言的一个示例表达式是:

if true then x else (if false then y else true)

你的Haskell数据类型看起来像这样:

data Expr = Var String
          | Lit Bool
          | If Expr Expr Expr

然后,解析器会将如x转换为Var "x" ,并将true转换为Lit True等。即:

parse "if x then false else true" 
  ==  If (Var "x") (Lit False) (Lit True)

为了编写解析器,你可以使用Norman的答案中提到的技术,或者使用Parsec或使用像Happy这样的解析器生成器来编译你自己的解析器。


您使用相互递归的代数数据类型表示程序,并解析您使用解析组合器的程序 。 有一百万种口味。 您将在2009年3月23日星期一为我的课程安排上找到三份有用的教程文件

  • Graham Hutton和Erik Meijer,功能性明珠:Haskell中的Monadic解析(1998)
  • Graham Hutton,解析高阶函数(1992)
  • Jeroen Fokker,Functional Parsers(1995)

    Hutton和Meijer纸是最短和最简单的纸,但它使用monads,这对业余人士来说并不明显。 然而,他们有一个非常好的语法和表达式的解析器。 如果你还没有选择单子,福克的教程就是其中之一。


    也许你可以看一些真实世界的项目,看看他们是如何做到的?

    不到一周前,Language-Python项目在Haskell-Cafe邮件列表上发布。 这是一个在Haskell中实现的Python解析器,使用Happy解析器生成器和Alex lexer生成器。

    当然,还有Pugs,Haskell中的Perl 6实现(Perl 6的第一个实现,符合Perl 6规范的重要子集)。

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

    上一篇: How to best to represent a programming language's grammar?

    下一篇: Beginners Guide to Haskell?