0

LL(1) 语法:

(1) Var -> ID DimList   
(2) DimList -> ε DimList'  
(3) DimList' -> Dim DimList'
(4) DimList' -> ε  
(5) Dim -> [ CONST ]

而且,在我正在阅读的脚本中,它说该函数FIRST(ε DimList')给出了{#, [}. 但是,怎么做?

我的猜测是,由于 (2) 的右侧以 开头ε,它会跳过 epsilon 并取FIRST(DimList')is,考虑到 (3) 和 (5),等于{[},但由于 (4),它也取FOLLOW(DimList')is {#}

其他方式可能是,因为 (2) 以它开始,ε它跳过 epsilon 并从 (2) 中获取FIRST(DimList')但也从 (2) 获取 FOLLOW(DimList) ...

第一个对我来说更有意义,尽管我仍在学习 LL(1) 语法的基础知识,所以如果有人花时间说明这一点,我将不胜感激,谢谢。

编辑:当然,这些都可能不是真的。

4

1 回答 1

1

FIRST 函数的通常定义将导致FIRST(Dimlist)(或者,如果您愿意,FIRST(ε Dimlist')存在{ε, [}. ε 是FIRST(ε Dimlist')因为 ε 和都可以为Dimlist'空。[是一个元素,因为它可能是 的推导中的第一个符号ε Dimlist,这与说它可能是 的推导中的第一个符号Dimlist'

另一种说法是:

FIRST(ε Dimlist' #) = {#, [}

然后我们通常定义函数PREDICT

PREDICT(ω) = FIRST(ω FOLLOW(ω))

我们可以看到

PREDICT(Dimlist) = FIRST(Dimlist FOLLOW(Dimlist)) = {#, [}

这里,FIRST(ω)是可能出现在推导开始处的终结符串的集合(长度≤1)ω,而PREDICT(ω)是推导时可能出现在输入中的终结符串的集合(长度≤1)是ω可能的。

混淆FIRST和并不少见PREDICT,但最好保持区别。

注意,所有这些函数都可以泛化为最大长度的字符串,k通常写成,和, 的定义与上面类似:FIRSTkFOLLOWkPREDICTkPREDICTk

PREDICTk(ω) = FIRSTk(ω FOLLOWk(ω))

于 2013-08-13T05:06:18.330 回答