LL(1)语法:
(1) Var -> ID DimList
(2) DimList -> ε DimList'
(3) DimList' -> Dim DimList'
(4) DimList' -> ε
(5) Dim -> [ CONST ]
而且,在我正在阅读的脚本中,它表示函数FIRST(ε DimList')
给出了{#, [}
。但是,怎么样?
我的猜测是,由于(2)的右侧以ε
开头,它跳过epsilon并取FIRST(DimList')
,考虑(3)和(5),等于{{1但是,由于(4),我需要{[}
FOLLOW(DimList')
。
其他方式可能是,因为(2)以{#}
开头,它跳过epsilon并取ε
但也从(2)中取出FOLLOW(DimList)......
第一个对我更有意义,虽然我还在学习LL(1)语法的基础知识,所以如果有人花时间把它弄清楚,我将不胜感激,谢谢。
编辑:当然,可能这些都不是真的。
答案 0 :(得分:1)
FIRST函数的通常定义会导致FIRST(Dimlist)
(或者,如果您愿意,FIRST(ε Dimlist')
为{ε, [}
。ε位于FIRST(ε Dimlist')
,因为ε和{ {1}}可以为空。Dimlist'
是一个元素,因为它可能是[
的派生中的第一个符号,这与它可能是{的派生中的第一个符号相同{1}}。
另一种说法是:
ε Dimlist
我们通常会定义函数Dimlist'
:
FIRST(ε Dimlist' #) = {#, [}
我们可以看到
PREDICT
这里,PREDICT(ω) = FIRST(ω FOLLOW(ω))
是终端的字符串集(长度≤1),可以出现在PREDICT(Dimlist) = FIRST(Dimlist FOLLOW(Dimlist)) = {#, [}
的派生开头,而FIRST(ω)
是字符串集合终端(长度≤1)当可能导出ω
时可能出现在输入中。
混淆PREDICT(ω)
和ω
的情况并不少见,但最好保持差异。
请注意,所有这些函数都可以推广到最大长度FIRST
的字符串,这些字符串通常写为PREDICT
,k
和FIRSTk
,以及{的定义{1}}与上述类似:
FOLLOWk