有关此FIRST功能的说明

时间:2013-08-12 17:47:34

标签: parsing programming-languages grammar context-free-grammar ll

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)语法的基础知识,所以如果有人花时间把它弄清楚,我将不胜感激,谢谢。

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

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的字符串,这些字符串通常写为PREDICTkFIRSTk,以及{的定义{1}}与上述类似:

FOLLOWk