我不知道我是否误解了发生的事情,或者维基百科的解释是否错误。
项目集FOLLOW(k,B)
的
k
和非终结B
是K
中所有项目的跟随集合的并集,其中'•'
后面跟着B
S → E E → T E → ( E ) T → n T → + T T → T + n
。
他们的示例语法如下所示:
[S → • E]
[E → • T]
[E → • ( E )]
[T → • n]
[T → • + T]
[T → • T + n]
他们发现LR(0)项目设置为0:
FOLLOW(0,T)
那意味着, T
是项目集0中所有项目的跟随集合的并集,其中“•”后跟T
。
应用他们的逻辑,我们得到项目集0中的“项目,其中'•'后跟[E → • T]
”实际上是这两项:
[T → • T + n]
)
然而,这是我被卡住的地方:
第二个的跟随集包含符号[E → • ( E )]
,因为项[E → • ( T )]
可以生成)
,这意味着FOLLOW(0,T) = { $, '+' }
必须位于跟随集中。
然而,维基百科说{{1}}。
我做错了什么?
答案 0 :(得分:1)
我在本书中找到了“Warshall's Closure算法”的描述
Bornat : Understanding and Writing Compilers
在这里有所帮助。 (总的来说,我发现这本书比关于编译器设计的更着名的书更具可读性和实用性!)
可能还有其他很好的算法描述。
编辑:我生锈但我相信维基百科的文章在这方面是对的:请记住这是Follow(0,T)
现在你显然是正确的,')'在某些情况下可以跟随T.
然而,不是从0的起点......这意味着n)
或n+n)
或n+n+n)
形式的表达,明确地这样写出,是显而易见的语法错误。
(将这些事情显而易见而不是用数学符号掩盖它们是我真的喜欢这本书!)