【发布时间】:2011-02-18 13:55:45
【问题描述】:
我目前正在尝试为编程语言编写一个(非常)小的解释器/编译器。我已经设置了语言的语法,现在我需要写下语言的语法。我打算使用 LL(1) 解析器,因为经过一番研究,它似乎是最容易使用的。
我是这个领域的新手,但根据我收集到的信息,强烈建议使用 BNF 或 EBNF 形式化语法。然而,似乎并非所有语法都适合使用 LL(1) 解析器来实现。因此,我想知道以 LL(1) 形式编写语法的正确(或推荐)方法是什么。
感谢您的帮助, 查理。
PS:我打算使用 Haskell 的 Parsec 库编写解析器。
编辑:另外,根据 SK 逻辑,Parsec 可以处理无限前瞻(LL(k) ?) - 但我想这个问题仍然代表这种类型的语法。
【问题讨论】:
-
Parsec 能够进行无限前瞻。您无需出于性能以外的原因将自己限制为 LL(1)。
-
而且不一定是LL(k),可以是上下文相关的。因此,您唯一需要担心的是避免左递归。
标签: parsing grammar recursive-descent ll