[英]Ambiguous grammar?
嗨,书中有这个问题说
鉴于这个语法
A --> AA | (A) | epsilon
a-它产生什么
b-显示含糊不清
现在我想到的答案是
a-adjecent paranthesis
b-它生成不同的解析树,所以它的不明确,我画了两个场景。
这是对的还是有更好的答案?
a)差不多......
该语法完全生成由平衡括号组成的字符串集。 要知道为什么会这样,让我们试着快速演示。
第一:语法中的一切都是平衡的括号字符串。 为什么?,简单的归纳:
第二:每组平衡字符串都是由你的语法产生的。 让我们通过对字符串大小的归纳来做到这一点。
例如: (()())(())
我们可以使用演示的想法生成此字符串。
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.