我试图让解析器通过评估它们对用户上下文/历史和知识基础,从一个模糊的语法返回所有可能的分析结果(剖析林),然后从剖析林。 出于性能方面的原因,这可能应该与packrat解析器和搜索限制/上限参数做LIMITE申请生产规则,以避免无限循环的递归调用的次数。
作为新Scala和它的解析器组合,我无法弄清楚如何做到这一点,或者是否可以在全部完成。 可能有人请帮忙吗? 非常感激。
最好的问候,托马斯·胡安
我试图让解析器通过评估它们对用户上下文/历史和知识基础,从一个模糊的语法返回所有可能的分析结果(剖析林),然后从剖析林。 出于性能方面的原因,这可能应该与packrat解析器和搜索限制/上限参数做LIMITE申请生产规则,以避免无限循环的递归调用的次数。
作为新Scala和它的解析器组合,我无法弄清楚如何做到这一点,或者是否可以在全部完成。 可能有人请帮忙吗? 非常感激。
最好的问候,托马斯·胡安
你不能使用Scala内置的解析器组合做到这一点。 Packrat组合子仅限于明确的文法。 如果你试图解决歧义,你失去了memoize的能力和解析复杂度变O(K ^ N)甚至明确的路径。 所以,千万不要做。
你想要的是一个解析器组合框架,正确处理歧义。 据我所知,斯卡拉只有这样的框架是我的GLL组合程序 。 语法几乎是相同的Scala的解析器组合(其主要区别在于较高的arity功能正常工作),但输出的是Stream[A]
其中A
是的结果类型。 因此,你会得到一个剖析林。 请注意,结果实际上不是SPPF(共享包装剖析林),因此,如果您产生的结果的一个指数,该流将有比例的大小。 这样做是为了保持在结果类型最大的灵活性。
GLL组合子是在最坏情况下为O(n ^ 3),甚至对于病理暧昧语法。 在平均情况下,在那里解析线索是明确的,GLL组合子是O(n)。 恒定的时间开销是目前有点过分,但是优化是一个正在进行的项目。 我们使用GLL组合子生产的Precog ,所以你可以期待文库可以保持良好的前进。