问题描述
E -> EAE | (E) | -E |身份证
A -> + | - | * | /
终端集是{id,-,+,*,/},起始符号是E。
我想将此语法转换为常规语法。我尝试取消这个语法的左递归,我得到了:
E -> (E)X | -EX | idX
A -> + | - | * | /
X -> AEX | ε
是这样还是我需要做其他事情?
解决方法
你注定要失败,因为你的语言不是常规语言。它不可能有正确的正则语法。为了证明这种情况,我们可以使用 Myhill-Nerode 定理,该定理表明,常规语言的最小 DFA 具有与语言的不可区分性关系上的等价类一样多的状态。如果我们可以证明相对于您的语法语言有无限多个可区分的字符串(我们将在下面进行),那么这意味着您的语言的最小 DFA 将具有无限多个状态。 DFA 只能有有限多个状态,因此这实际上意味着您知道您的语言不规则。
为了证明有无限多个可区分的字符串,只要找到一个无限的字符串序列 w1,w2,...,wn,... 就足够了你的语法。我经常处理这个问题的一种方法是争论最短的字符串是什么,它将把我们序列中的每个字符串都变成语言中的一个字符串。如果您可以证明每个 wi 的最短字符串与其他任何字符串都不同,那么您就完成了 - 因为如果其中的最短字符串具有不同的长度,则两个集合不可能相同。
要找到合适的序列,我们可以查看您的语法并查找看起来不规则的规则。 E -> EAE 和 E -> (E) 似乎都有问题。我的直觉是,因为 E -> (E) 更简单(它涉及更少的非终结符),所以使用起来会更容易。让我们定义一个单词序列 w1,... 利用这个产生式来获得可区分的字符串。如果反复使用此产生式,然后使用 E -> Id,则会得到 (^n id )^n 形式的字符串,其中括号匹配。这很重要 - 常规语言无法做到这一点。我们使用 Myhill-Nerode 展示了这一点,如下所示:
假设语言是正则的。然后通过 Myhill-Nerode,最小 DFA 中的状态数是关于语言的不可区分性关系上的等价类数。考虑字符串的无限序列 (,((,(^n,... 可以附加到每个字符串以获得语言中字符串的最短字符串是 Id),Id)),.. .,Id)^n,长度为 3,4,n+2,... 这意味着每个字符串都是可区分的,因此有无限多个等价类。这是一个矛盾,所以假设语言是正则是错误的。