排列短语是对标准(E)BNF上下文无关语法定义的扩展:排列短语包含n个生成词(或等效地,非末尾词)A 1至A n。在置换词组的位置,我们希望只看到一次所有这些产生式,但是我们对这些非末端的顺序不感兴趣。
例如:
S <- X { A, B, C } Y
等效于:
S <- X A B C Y
S <- X A C B Y
S <- X B A C Y
S <- X B C A Y
S <- X C A B Y
S <- X C B A Y
该概念似乎在“用置换短语扩展上下文无关文法”中引入。其中还描述了如何使用LL(1)解析器在线性时间内解析这些短语。
论文“解析置换短语”描述了一种使用解析器组合器解析置换短语的方法。这是我发现的仅有两篇关于置换短语以及如何解析它们的论文。
看到我们可以使用基于LL(1)的解析器轻松解析这些置换短语,我的猜测是我们可以使用LR(1)样式解析器进行相同的处理。因此,我的问题是:
可以在保持合理大小的表的同时,使用LR(1)机制以线性的方式在输入字符串的大小中解析包含置换短语的语法吗?
排列短语并不能扩展上下文无关语言的功能:在上面的示例中,人们可以简单地列举所有可能的排列。但是,语法会爆炸,因为生成的语法的大小可能为。这样可以进行线性时间解析,但是语法的大小变得太大。
上面的方法适用于任何解析算法(尽管它没有用),所以也许我们可以针对特定算法做得更好。我们可以将爆炸率降低到“仅”指数(通过将短语编码到LR表中,(2 | G |)):我们可以让LR项目编码哪些产品尚未出现,从而减少对所有子集的爆破排列短语。
尽管这样做更好,但它当然还不够好-排列短语为30个项目会使语法无法使用。LR解析的一部分仍未涉及,这是用于解析的实际基于堆栈的过程。我想将计数器存储在堆栈中也许可以解决该问题,但是我不确定该怎么做。
我当前正在实现一个解析器生成器,在问题域中,排列短语将是天赐之物。当我使用LR(1)机制时,出现了上述问题。