CFG:为什么这个语法不明确



语法如下。

S -> SS' | a | b
S' -> a | b

按照我的理解,这种语法的派生将类似于SS'S'S'S'... (0 or more S'),其中每个SS'将生成ab

有人能提供一个例子来说明这种语法是模棱两可的吗?(解决方案说是这样。(

它并不含糊。你的分析是正确的。

这是对你的语法的机械检查(为我们的工具重新调整(:

S = S Sprime ;
S = a ;
S = b ;
Sprime = a ;
Sprime = b ;

工具执行:

C:DMSDomainsDMSStringGrammarToolsParserGenerator>run ParserGenerator.P0B -interactive C:
DMS GLR Parser Generator 2.4.1
Copyright (C) 1997-2018 Semantic Designs, Inc.
Opening C:tempExample.bnf
*** EOF seen
<<<Rule Collection Completed>>>
NTokens = 5 NRules = 5
LR(1) Parser Generator -- Find Follow and SLR Lookahead sets
Computing MemberSets for Nonterminal Tokens...
What next? ambiguities 100
Print results where (<CR> defaults to console)?
Default paper width: 80
How wide should the printout be (<CR> selects default)?
*** Search for ambiguities to depth 100
Nonterminal < Sprime > is not ambiguous
*** Search for ambiguities to depth 1; trying 2 rule pairs...
*** Search for ambiguities to depth 2; trying 2 rule pairs...
*** Search for ambiguities to depth 3; trying 2 rule pairs...
*** Search for ambiguities to depth 4; trying 2 rule pairs...
Nonterminal < S > is not ambiguous [modulo rule derivation loops]
*** 0 ambiguities found ***
*** All ambiguities in grammar detected ***

对于有两个非终结符的语法来说,这个工具有些过头了。但是,当有人给出一组200个非终结符时,手工操作要困难得多。

(对于理论家来说:这个工具显然不能为所有语法决定这一点。它在非终结展开的空间中使用递归迭代深化搜索来查找重复/不明确的展开。这在实践中效果很好(。

最新更新