Parsing 从编程生成的BNF生成解析器
我见过两种解析方法:Parsing 从编程生成的BNF生成解析器,parsing,haskell,Parsing,Haskell,我见过两种解析方法: 使用解析器生成器,如。这允许您使用BNF指定您的语言,而不必担心解析的复杂性。然而,由于它是一个预处理器,您必须以文本形式编写整个解析树 像这样直接使用解析器。通过这种方法,您可以直接访问代码,以便以编程方式生成解析器,但是您还没有得到happy的简单BNF规范(带有优先注释等)的便利。此外,从解析代码中打印出BNF树作为文档似乎很重要,除非在构建过程中考虑到这一点 我想做的是这样的: 以编程方式生成表示BNF的数据结构 将其输入到“快乐式”解析器生成器以生成解析器 通过一
happy
(因为它可能在解析BNF提要后生成自己的内部结构),那就太好了,但是happy
似乎没有库接口
我想我可以生成阿托德BNF,并将其传递给happy,但这似乎是一个来回转换的混乱过程。更干净的方法会更好。甚至可能是对
parsec
或megaparsec
的BNF风格扩展 最简单的方法是生成一些表示相关语法的数据类型,然后使用一些解析器组合器将其转换为解析器,作为(运行时)“编译”步骤。不幸的是,大多数解析器组合器的效率和/或灵活性(在某些方面)不如解析器生成器,因此这可能是一种最小公分母的方法。这就是说,这个库可能很有用,尽管它似乎没有得到维护
有一些库可以在运行时生成解析器。我刚才发现的一个问题是,它似乎没有得到维护,但这可能不是一个问题。另一个选择(由制作Grempa但维护Grempa的同一个人提出)是,由于早期解析器的制作方式,有一个显式语法并将其处理到解析器中是有意义的。Earley解析当然很灵活,但对您来说可能有点力不从心(也可能没有)。那么为什么您不能1)生成一个表示BNF的数据结构[我想您在这里没有问题],2)漂亮地打印它以生成快乐的BNF规范文本3)将它馈送给快乐?对于彼此非常相似的结构,您可能会对Happy的参数化产品感兴趣。您可能会对它感兴趣,因为它提供了一个元程序(以TH的形式),它可以将语法的表示转换为语法分析器的元表示,当然,您可以通过在中拼接它来转换为实际的语法分析器。1是
read::String->Grammar
,2是ebnf::Grammar->DecsQ
(我不知道你说的3是什么意思-什么是“BNF文档”?)