Parsing 从编程生成的BNF生成解析器

Parsing 从编程生成的BNF生成解析器,parsing,haskell,Parsing,Haskell,我见过两种解析方法: 使用解析器生成器,如。这允许您使用BNF指定您的语言,而不必担心解析的复杂性。然而,由于它是一个预处理器,您必须以文本形式编写整个解析树 像这样直接使用解析器。通过这种方法,您可以直接访问代码,以便以编程方式生成解析器,但是您还没有得到happy的简单BNF规范(带有优先注释等)的便利。此外,从解析代码中打印出BNF树作为文档似乎很重要,除非在构建过程中考虑到这一点 我想做的是这样的: 以编程方式生成表示BNF的数据结构 将其输入到“快乐式”解析器生成器以生成解析器 通过一

我见过两种解析方法:

  • 使用解析器生成器,如。这允许您使用BNF指定您的语言,而不必担心解析的复杂性。然而,由于它是一个预处理器,您必须以文本形式编写整个解析树

  • 像这样直接使用解析器。通过这种方法,您可以直接访问代码,以便以编程方式生成解析器,但是您还没有得到happy的简单BNF规范(带有优先注释等)的便利。此外,从解析代码中打印出BNF树作为文档似乎很重要,除非在构建过程中考虑到这一点

  • 我想做的是这样的:

  • 以编程方式生成表示BNF的数据结构
  • 将其输入到“快乐式”解析器生成器以生成解析器
  • 通过一个漂亮的打印机来生成实际的BNF文档
  • 我想这样做的原因是,我正在研究的语法已经变得相当大,并且有很多重复,因为它的许多结构与其他结构相似,但略有不同。如果它可以通过编程方式生成,而不是直接修改happy 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文档”?)