如何最好地表示一种编程语言的语法?
我一直在寻找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日星期一为我的课程安排上找到三份有用的教程文件
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?