找到相同数量的“a”和“b”语法的等效LR语法?

时间:2017-05-30 19:11:48

标签: parsing grammar compiler-theory lr

我似乎找不到相同的LR语法:

S→aSbS | bSaS | ε

我认为识别字符串的数字'a'与'b'相同。

这将是一个解决方法?是否可以为此找到和LR语法?

提前致谢!

修改

我发现我认为是一种等效的语法,但我无法证明这一点。

我想我需要证明原始语法生成上面的语言,然后证明语言是为以下等效语法生成的。但我不知道该怎么做。我该怎么办?

S→aBS | bAS | ε

B→b | ABB

A→a | BAA

提前致谢...

PS:我已经证明这个新语法是LL(1),SLR(1),LR(1)和LALR(1)。

1 个答案:

答案 0 :(得分:1)

除非语法与另一种语法直接相关 - 例如通过标准化转换,例如标准化,空类生成消除等等 - 证明两种语法派生相同的语言是非常困难的,而不知道语言是什么。通常(独立地)证明每种语法都可以推导出语言。

您提供的第一个语法:

S → aSbS | bSaS | ε
实际上

确实导出了字母{a, b}*上所有字符串的语言,其中 a 的数量与 b 的数量相同。我们可以在两个部分中证明:首先,语法识别的每个句子都具有该属性,其次,具有该属性的每个句子都可以通过该语法导出。这两个证据都是通过归纳进行的。

对于前向证明,我们通过归纳推导的数量来进行。假设我们有一些推导S → α → β → … → ω,其中所有希腊字母代表非终端和终端的序列。

如果推导的长度恰好为零,那么它以S开始和结束,那么任何派生句子中都没有终端,因此很清楚每个派生句子具有相同数量的 a s和 b s。 (基础步骤)

现在进行归纳步骤。假设已知长度i的每个推导都以具有相同数量的 a b s的派生句结束。我们想从这个前提证明长度i+1的每个推导都以一个具有相同数量的 a b s的句子结束。但这也很清楚:三个可能的生产步骤中的每一个都保持平价。

现在,让我们看一下相反的方向:每个具有相同数量的 a b 的句子都可以从该语法中导出。我们将通过感应字符串的长度来做到这一点。我们的归纳前提是,如果是每个j ≤ i,每个句子都具有j a s和j b s派生自S,然后每个句子都有i+1 a s和i+1 b s。 (这里我们只考虑仅由终端组成的句子。)

考虑这样的问题。它以 a b 开头。假设它以 a 开头:那么句子中至少有一个 b ,使得以 b 结尾的前缀具有相同的每个终端的号码。 (将字符串视为沿着正方形网格的步行:每个 a 沿对角线向上和向右移动一个单位,并且每个 b 沿对角线向下和向右移动。由于端点是在与开始点完全相同的高度并且图中没有虫洞,一旦我们提升,我们必须迟早回到起始高度,这是一个结尾 b 的前缀。)所以该前缀的内部(除了开头的 a 和结尾处的 b 之外的所有内容)是平衡的,字符串的其余部分也是如此。这两者都较短,因此通过归纳假设,它们可以来自S。进行这些替换后,我们得到 a S b S ,它可以从S导出。相同的参数适用于以 b 开头的字符串。同样,基本步骤是微不足道的。

所以这基本上就是你需要适应语法的证明程序。

祝你好运。

顺便说一下,这类问题也可以在cs.stackexchange.com或math.stackexchange.com上提出,其中MathJax可用。 MathJax使得编写数学证明变得不那么繁琐,所以你很可能会发现你会得到更多可读答案。