Compiler construction 跟随集算法第三条规则的基本原理是什么?

Compiler construction 跟随集算法第三条规则的基本原理是什么?,compiler-construction,ll,Compiler Construction,Ll,对于compilers类,我们获得了以下查找以下(a)的规则: α 如果A是开始符号,则在(A)后面添加“$” 如果A->αBβ,则在(B)之后加上第一个(β){ε} 如果A->αB,或(A->αBβ和β*->),则将FOLLOW(A)添加到FOLLOW(B)中 我们还得到了以下(A)的非正式定义: 以句子形式紧跟在A后面的一组终端 为什么第三条规则是正确的 我知道如何应用第三条规则,但我不明白为什么一定是这样。有谁能提供一个需要使用它的具体例子,或者一个在没有第三条规则的情况下无法通过非正式定

对于compilers类,我们获得了以下查找以下(a)的规则:

α

  • 如果A是开始符号,则在(A)后面添加“$”
  • 如果A->αBβ,则在(B)之后加上第一个(β){ε}
  • 如果A->αB,或(A->αBβ和β*->),则将FOLLOW(A)添加到FOLLOW(B)中
  • 我们还得到了以下(A)的非正式定义: 以句子形式紧跟在A后面的一组终端

    为什么第三条规则是正确的


    我知道如何应用第三条规则,但我不明白为什么一定是这样。有谁能提供一个需要使用它的具体例子,或者一个在没有第三条规则的情况下无法通过非正式定义的例子吗?

    假设您有一条产生式规则

    A→ αBβ

    你知道β可以导出空字符串。在这种情况下,如果使用上述产生式规则,然后将β扩展为空字符串,则可以合法地跟在a非终结符后面的字符也可以跟在B非终结符后面

    作为一个例子,让我们看看这个简单的语法:

    → 斧头

    A→ CBC

    C→ ε

    B→ y

    在这里,我们可以做这个推导,把x放在B之后:

    → 斧头→ CBCx→ CBx


    我认为这个问题可能与这里的主题无关,当你提到其他网站时,你在@Rob上会有更好的运气,指出@gnat Yes通常是有帮助的。我知道。而且经常提到它。