【问题标题】:Explanation on this FIRST function关于这个 FIRST 函数的解释
【发布时间】:2013-08-12 17:47:34
【问题描述】:

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),等于 {[},但是,由于 (4),采用 FOLLOW(DimList'){#}

其他方式可能是,由于 (2) 以 ε 开头,它跳过 epsilon 并采用 FIRST(DimList') 但也从 (2) 中采用 FOLLOW(DimList)...

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

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

【问题讨论】:

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


    【解决方案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) 当可以推导ω 时,它可能出现在输入中。

    混淆FIRSTPREDICT 的情况并不少见,但最好保持区别。

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

    PREDICT<sub>k</sub>(ω) = FIRST<sub>k</sub>(ω FOLLOW<sub>k</sub>(ω))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多