在LR解析中需要S' - > S.

时间:2015-01-30 05:27:49

标签: parsing lr

有人告诉我,如果没有添加规则S-> S',我们可能会接受语法语言中不存在的单词,有人会想到一个很好的例子吗? 此外,您是否有一个减少SLR解析的示例,该解析可以转到多个州?

1 个答案:

答案 0 :(得分:1)

您需要此额外生产规则的主要原因是能够确定何时实际读取输入字符串。如果你不包括它,你可能会得到一些误报。

举个例子,考虑一下这个语法:

  

S→aS | B'/ P>

让我们假设我们不会用额外的开始生成来扩充这个语法,而是开始为它构建一个LR(0)解析器。我们会回到这些状态

INFO [org.netbeans.modules.autoupdate.updateprovider.DownloadListener]: Reading URL file:C:/Users/Jesper/Desktop/netbeans_site/updates.xml" failed (java.io.FileNotFoundException: C:\Users\Jesper\Desktop\netbeans_site\updates.xml" (Syntaksen i filnavnet, mappen eller diskenhedsnavnet er forkert))

现在,假设我们使用这个LR(0)解析器来解析字符串abb。请注意,此字符串在语法语言中,因此我们不应接受它。以下是发生的事情:

(1)
S -> .aS
S -> .b

(2)
S -> b.

(3)
S -> a.S
S -> .aS
S -> .b

(4)
S -> aS.

所以这就是问题所在。在这种状态下,我们有一个减少项目S→b。现在,我们在这里做减少并继续解析吗?或者我们完成了解析?如果我们选择在此停止,我们将错误地报告字符串是语言,即使它实际上并不存在。如果我们不选择在这里停止,那么我们将正确地解析输入,但这意味着如果我们得到了不同的输入(比如,只是字符b),那么我们可能会减少我们真的应该只是停止解析。这里使用SLR(1)解析器无法解决此问题,因为前瞻不能帮助我们区分这些情况。

通过在开始时添加额外的产品,我们可以明确地区分“我已经将”与“开始符号”匹配“来自”我完全完成“,因为解析器只会考虑生产,如果它是完成减少S并且解析堆栈为空。