用于C或C ++的GLL分析器组合器或生成器

时间:2014-01-17 22:03:35

标签: c++ c parsing parser-combinators parse-forest

是否存在GLL算法的任何现有实现,无论是以解析器组合器(首选)的形式还是作为C或C ++的解析器生成器?

我的要求是输出是一个共享打包解析林(SPPF),我以后可以使用语义和/或上下文规则消除歧义。还有其他解析算法,如GLR,它们能够处理一般的无上下文语法,但是,我发现的所有GLR解析器生成器要么返回第一个成功的解析树,要么在最后仍有任何歧义时失败。

1 个答案:

答案 0 :(得分:-1)

如果您试用GLL Combinators怎么办?虽然它使用Scala,但你可以写" thin"通过JNI

包装它
  

GLL Combinators 是一个旨在实现GLL parsing algorithm的框架   (Scott和Johnstone,LDTA 2009)以功能性方式。更具体地说,   框架利用原子解析器组合器来编写语法   然后使用GLL算法进行评估。该框架为此提供了语法   任务几乎与构建的解析器组合框架的任务相同   进入斯卡拉。例如,我们可以渲染经典"括号语法"运用   GLL组合子:

lazy val expr: Parser[Any] = (
    "(" ~ expr ~ ")"
  | ""
)
     

正如类型注释所暗示的那样,expr将引用类型的实例   Parser[Any]。也就是说,一个消耗一些输入和返回的原子解析器   值Any的值。我们可以针对String输入调用此解析器   通过以下方式:

expr("((()))")
     

这将返回Stream[Result[Any]]类型的值。 Result[A] ADT是   定义为以下之一(对于某些类型A):

     
      
  • Success[A] - 表示成功的解析并包含结果值。
  •   
  • Failure - 表示失败的解析并包含相关的错误消息   以及解析流的其余部分(不是的字符)   消耗)。
  •   
     

如果任何结果成功(即Success[A]的实例),则没有失败   将被退回。因此,返回的Stream将是完全同质的,   包含 SuccessFailure,但不包含两者。 Stream是。{   返回而不是单个值以允许语法中的歧义(请参阅   下文)。

     

值得一提的是,GLL是recursive-descent parsing的一种形式。它有   传统递归下降的所有优点,包括直观   控制流程,语义动作的任意定位和优越的错误   消息。事实上,GLL是递归下降的事实,它允许它   使用原子组合器实现。其他分享的算法   与GLL(例如GLR,Earley Parsing等)相同的功能基本上是   由于其非常不直观的控制而与组合器模型不兼容   流。在GLL解析中,控制流遵循语法的控制流,就像它一样   在传统的解析器组合器或任何其他形式的递归下降。