繁体   English   中英

含糊不清的语法?

[英]Ambiguous grammar?

嗨,书中有这个问题说

鉴于这个语法

A --> AA | (A) | epsilon

a-它产生什么

b-显示含糊不清

现在我想到的答案是

a-adjecent paranthesis

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

这是对的还是有更好的答案?

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

b不正确。
由于立即左递归,该语法是模糊的: A → AA

如何避免左递归:

a)差不多......

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

第一:语法中的一切都是平衡的括号字符串。 为什么?,简单的归纳:

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

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

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

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

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

A - > AA - >(A)A - >(AA)A - >((A)(A))A - >(()())A - >(()())(A) - >( ()())((A)) - >(()())(())

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

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

例如:(())()()

您可以选择A - > AA并使用第一个A(())子字符串或(())()子字符串生成。

是的,你是对的。

这就是ambigious语法的含义。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM