Parsing 是维基百科';LR(1)解析中FOLLOW()集的示例错误?
我不知道我是否误解了发生的事情,或者维基百科的解释是否不正确 :Parsing 是维基百科';LR(1)解析中FOLLOW()集的示例错误?,parsing,language-agnostic,lr,Parsing,Language Agnostic,Lr,我不知道我是否误解了发生的事情,或者维基百科的解释是否不正确 : FOLLOW(k,B)一个项目集k和一个非终结B是k中所有项目的FOLLOW集的并集,其中“•”后跟B 他们的示例语法如下所示: S → E E → T E → ( E ) T → n T → + T T → T + n 他们发现LR(0)项集0为: [S → • E] [E → • T] [E → • ( E )] [T → • n] [T → • + T] [T → • T + n] 这意味着,FOLLOW(0,T)是项
FOLLOW(k,B)
一个项目集k
和一个非终结B
是k
中所有项目的FOLLOW集的并集,其中“•”
后跟B
他们的示例语法如下所示:
S → E
E → T
E → ( E )
T → n
T → + T
T → T + n
他们发现LR(0)项集0为:
[S → • E]
[E → • T]
[E → • ( E )]
[T → • n]
[T → • + T]
[T → • T + n]
这意味着,FOLLOW(0,T)
是项目集0中所有项目的FOLLOW集合的并集,其中“•”后跟T
应用它们的逻辑,我们得到“项目集0中的项目,其中“•”后跟T
”实际上是这两个项目:
[E→ • T]
[T→ • T+n]
第二个的以下集合包括符号
)
,因为项目[E→ • (E)]
可以产生[E→ • (T)
,这意味着)
必须在以下集合中
然而,维基百科说遵循(0,T)={$,'+'}
我做错了什么?我在这本书中找到了“沃沙尔闭包算法”的描述 我想在这里有所帮助。(总的来说,我发现这本书比那些更著名的编译器设计书籍更具可读性和实用性!) 可能还有其他关于算法的好描述 编辑:我有些生疏,但我相信维基百科的文章在这方面是正确的: 记住这是
遵循(0,T)
现在你显然是对的,在某些情况下“)”可以跟在T后面 但是,不是从0开始。。。这意味着一个形式为
n)
或n+n)
或n+n+n)
的表达式,以这种方式明确写出,是明显的语法错误
(我真的很喜欢这本书,那就是把这些东西明确化,而不是把它们埋在数学符号中!)