喜 书中有这个问题说
鉴于此语法
A --> AA | (A) | epsilon
a-它产生什么\
b-显示含糊不清
现在我想到的答案是
a-adjecent paranthesis
b-它会生成不同的解析树,所以它是不明确的,我画了两个场景。
是对还是有更好的答案?
答案 0 :(得分:2)
a
几乎是正确的
语法确实生成()
,()()
,()()()
,......序列
但由于第二条规则,它可以生成(())
,()((()))
等
b
不正确
由于立即左递归,此语法不明确:A → AA
。
答案 1 :(得分:1)
a)差不多......
该语法完全生成由平衡括号组成的字符串集。要知道为什么会这样,让我们试着快速演示。
首先:语法中的所有内容都是平衡的括号字符串。为什么?,简单的归纳:
第二:每组平衡字符串都是由你的语法产生的。让我们通过对字符串大小的归纳来做到这一点。
例如:(()())(())
我们可以使用演示的想法生成此字符串。
A - > AA - > (A)A - > (AA)A - > ((A)(A))A - > (()())A - > (()())(A) - > (()())((A)) - > (()())(())
b)当然,左右递归足以说明它的含糊不清,但要明白为什么特别是这种语法含糊不清,请遵循同样的想法进行演示:
这是不明确的,因为您不需要采用最短的平衡前缀。您可以采用最长的平衡(或通常任何平衡前缀),这不是字符串的大小,演示(和生成)将遵循相同的过程。
Ex:(())()()
您可以选择A - > AA并使用第一个A生成(())子串或(())()子串。
答案 2 :(得分:0)
是的,你是对的。
这就是暧昧语法的含义。
语法错误的问题在于,如果你正在编写一个编译器,并且想要识别某些代码行中的每个标记(或者类似的东西),那么你就会认定你将会有“两个解释”。 “到那行代码。
答案 3 :(得分:0)
听起来你对B部分的方法是正确的,在语法定义的语言中显示了相同字符串的两个独立派生。
但是,我认为你对A部分的回答需要一些工作。显然,你可以递归地使用第二个子句来获取像(((((epsilon)))))这样的字符串,但是使用第一个子句和第二个子句可以有其他类型的派生。