是否存在GLL算法的任何现有实现,无论是以解析器组合器(首选)的形式还是作为C或C ++的解析器生成器?
我的要求是输出是一个共享打包解析林(SPPF),我以后可以使用语义和/或上下文规则消除歧义。还有其他解析算法,如GLR,它们能够处理一般的无上下文语法,但是,我发现的所有GLR解析器生成器要么返回第一个成功的解析树,要么在最后仍有任何歧义时失败。
答案 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
将是完全同质的, 包含Success
或Failure
,但不包含两者。Stream
是。{ 返回而不是单个值以允许语法中的歧义(请参阅 下文)。值得一提的是,GLL是recursive-descent parsing的一种形式。它有 传统递归下降的所有优点,包括直观 控制流程,语义动作的任意定位和优越的错误 消息。事实上,GLL是递归下降的事实,它允许它 使用原子组合器实现。其他分享的算法 与GLL(例如GLR,Earley Parsing等)相同的功能基本上是 由于其非常不直观的控制而与组合器模型不兼容 流。在GLL解析中,控制流遵循语法的控制流,就像它一样 在传统的解析器组合器或任何其他形式的递归下降。