给定一个字符串和一个CFG,可以在字符串之后跟随哪些字符(以CFG的句子形式)?


10

是某些上下文无关文法G的终结符集合,N是非终结符符号G的非终结符集合。ΣNG

说我有一个字符串,使得X Ý 小号ģ 其中X ÿ Σ Ñ *小号ģ 是的句型ģa(ΣN)+xayS(G)x,y(ΣN)S(G)G

鉴于,我想以确定一组C ^ = { b | 瓦特一个b ž 小号ģ b Σ Ñ }GC={bwabzS(G),bΣN}

为了清楚起见,在这种情况下,是终端和非终端的字符串,并且b的长度为1。w,x,y,z,a,bb

我可以看到如果的长度也为1,该如何做?各b是设置的后续成员一个(包括非端子)。aba

但是,我很好奇是否可以使用一系列字符。在我的应用程序中,字符串不比G中的产生式的右侧长很多。aG

终端和非终端之间的区别在我的应用中有些无语,因为我使用的是生成语法。我相信这不会造成太大麻烦,因为的长度为1。b


1
您的应用是什么?您要建立解析器吗?
拉斐尔

我们可以假定语法为任何正常形式还是必须对任意形式起作用?
拉斐尔

xy

@Raphael-我正在尝试自动化L系统语法的转换...因此它不是正常形式。实际上,我将再次编辑该问题以使其更加精确。
Thomas

我希望我不要对这个问题做太多更改-现在它的性质有所不同。
Thomas

Answers:


6

我将描述一种有效的算法。运行时间应该不会太糟。您也可以预先计算很多。

axyaAA

aax

我们使用Earley算法的一种改编。您首先要了解该算法。除了初始化和完成步骤不同之外,我们的算法几乎以相同的方式工作。

a1a

现在,我们对每种可能的初始Earley项目分别执行Earley算法。我们不能简单地同时完成所有这些操作,因为解析可能会相互干扰。我无法轻易地找到比此处回溯更快的方法。

LALR(1)LALR(1)

LALR(1)

a

编辑:我想我已经找到了消除回溯引入的大部分开销的方法。我们将与每个Earley项目关联一组标识符,它们是字符串,因为我们将需要使用这些标识符的前缀。初始化时,我们将所有初始项添加到Earley集,并将唯一标识符与每个集相关联。

在扫描程序和预测程序步骤上,将标识符带到新项目中。通过将其标识符合并在一起,将仅在其标识符方面不同的同一Earley集中的Earley项目合并在一起。请注意,我们可以对具有标识符的这些新项目执行扫描程序和预测程序步骤,而不必分别对每个标识符执行此步骤。

LALR(1)

本质上,我们使用这些标识符进行回溯,这样我们就不会在扫描程序和预测程序步骤中做重复工作。


aa

@Thomas并不难:您只需将非终结符视为解析中该特定位置的终结符:您仍然可以正常地对其进行预测和完成,但是在扫描时也要考虑它。
亚历克斯(Alex)10 Brink 2012年

是的,的确如此-既然我了解您的解决方案,那么它就不会有任何不同。
Thomas
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.