含糊不清的语法?

时间:2010-12-19 20:14:18

标签: grammar ambiguity

喜 书中有这个问题说

鉴于此语法

A --> AA | (A) | epsilon

a-它产生什么\

b-显示含糊不清

现在我想到的答案是

a-adjecent paranthesis

b-它会生成不同的解析树,所以它是不明确的,我画了两个场景。

是对还是有更好的答案?

4 个答案:

答案 0 :(得分:2)

a几乎是正确的 语法确实生成()()()()()(),......序列 但由于第二条规则,它可以生成(())()((()))

b不正确 由于立即左递归,此语法不明确:A → AA

如何避免左递归:onetwo

答案 1 :(得分:1)

a)差不多......

该语法完全生成由平衡括号组成的字符串集。要知道为什么会这样,让我们​​试着快速演示。

首先:语法中的所有内容都是平衡的括号字符串。为什么?,简单的归纳:

  • Epsilon是一个平衡(空)括号字符串。
  • 如果A是平衡括号字符串,则(A)也是平衡的。
  • 如果A1和A2是平衡的,A1A2也是如此(我使用太多不同的标识符只是为了明确A - > AA不必为每个A生成相同的事实。)

第二:每组平衡字符串都是由你的语法产生的。让我们通过对字符串大小的归纳来做到这一点。

  • 如果字符串为零,则必须为Epsilon。
  • 如果没有,那么N是字符串的大小,M是平衡的最短前缀的长度(注意字符串的其余部分也是平衡的):
    • 如果M = N,则可以使用(A)生成该字符串。
    • 如果M <你可以用A - >生成它吗? AA,前M个字符,第一个A和最后一个N - M,最后一个A. 在任何一种情况下,你必须产生一个短于N个字符的字符串,所以通过归纳你可以做到这一点。 QED。

例如:(()())(())

我们可以使用演示的想法生成此字符串。

A - &gt; AA - &gt; (A)A - &gt; (AA)A - &gt; ((A)(A))A - > (()())A - &gt; (()())(A) - &gt; (()())((A)) - &gt; (()())(())

b)当然,左右递归足以说明它的含糊不清,但要明白为什么特别是这种语法含糊不清,请遵循同样的想法进行演示:

这是不明确的,因为您不需要采用最短的平衡前缀。您可以采用最长的平衡(或通常任何平衡前缀),这不是字符串的大小,演示(和生成)将遵循相同的过程。

Ex:(())()()

您可以选择A - &gt; AA并使用第一个A生成(())子串或(())()子串。

答案 2 :(得分:0)

是的,你是对的。

这就是暧昧语法的含义。

语法错误的问题在于,如果你正在编写一个编译器,并且想要识别某些代码行中的每个标记(或者类似的东西),那么你就会认定你将会有“两个解释”。 “到那行代码。

答案 3 :(得分:0)

听起来你对B部分的方法是正确的,在语法定义的语言中显示了相同字符串的两个独立派生。

但是,我认为你对A部分的回答需要一些工作。显然,你可以递归地使用第二个子句来获取像(((((epsilon)))))这样的字符串,但是使用第一个子句和第二个子句可以有其他类型的派生。