是否有任何可识别EPAL的非常规CFG解析算法?


23

EPAL,甚至回文的语言,被定义为以下明确的上下文无关语法生成的语言:

Saa

Sbb

SaSa

SbSb

EPAL是许多解析算法的“祸根”:我还没有遇到任何能够解析任何描述该语言的语法的CFG解析算法。它通常用于表明存在明确的CFG,而这些CFG无法被特定的解析器解析。这激发了我的问题:

是否有一些解析算法仅接受适用于EPAL的明确CFG?

当然,可以为语法设计一个临时的两次通过语法分析器,以线性时间解析语言。我对解析不是专门为EPAL设计的方法感兴趣。


1
我几乎不敢问:递归下降法对LL(1)有什么问题?
拉斐尔

3
非回溯递归下降不能处理EPAL,因为对于任何k语言都不是LL(k)。具有回溯功能的递归下降可以在时间内处理语法,但这是一种具有指数最坏情况行为的通用算法,这不是我想要的。O(n2)
亚历克斯十布林克

O 2 NO(N2)不是指数的,而是二次的。是指数的。O(2N)
维克多·斯塔夫萨

1
@Victor:回溯在某些语法上具有指数行为,只是在此特定语法上没有。尽管如此,它还是一种适用于歧义语法的算法,但仍可作为我对问题的答案。
亚历克斯(Alex)10 Brink 2012年

1
@jmad:我的目的不是解析语言(您可以在线性时间内平凡地完成此操作),而是满足我的好奇心:我已经看到它被用作无法通过解析方法解析的语言的示例这么多次,我很好奇是否有某种解析方法可以识别它。
亚历克斯十布林克

Answers:


14

考虑以下解析策略的草图,后果自负。

我们不仅从一端读取​​输入,而且从两侧读取并寻找匹配的规则。我们可以采用递归下降的方式进行;在一个呼叫,发现前缀和后缀的输入,从而有一个规则,下降到上的剩余字。如果没有匹配的规则,请拒绝该单词。w v A w B v B A()wvAwBvB()

该算法解析所有线性,明确的语法。如果所有规则对和都具有或,则需要花费线性时间。这包括EPAL。否则,我们需要向前看,以便我们花费时间。AwBvAwBvwpwvsvΘ(n2)

这个想法根本不适用于非线性语法。线性但模棱两可的语法通常必须经过回溯才能解析(至少对于负输入而言)。


  1. wpv在这里表示和,即,两个词都不是另一个词的前缀。与后缀相似。wvvws

1
优秀!正是我想要的。如此简单的算法可以解析出对于任何都不是的语言,这一点很棒。NLR(k)k
亚历克斯十布林克

1
经过更多思考之后,我发现您的描述中有一个小错误:线性语法是明确的,但是没有您描述的唯一前缀。仍然有一个唯一的前缀,但是您可能必须查看非终结符以获取它,并且您的运行时间变为。您的算法确实适用于。SaAb|aBb,Aa,BbO(n2)EPAL
亚历克斯·十·布林克2012年

@AlextenBrink好收获。我对此进行了解释。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.