第一&遵循,算术表达式

时间:2011-12-01 15:37:59

标签: grammar puzzle

FIRST(A)  = { b, epsilon  }
FIRST(S) = { b, epsilon  }

FOLLOW(S)  = { a, $ }
FOLLOW(A) = { a, b, $ }

第一个和第一个的算术表达式是什么?按照设置?

1 个答案:

答案 0 :(得分:1)

FIRST(X) =尝试解析非终端X时首先出现的终端。如果它可以匹配空字符串,则还包括epsilon。

FOLLOW(X) =可以在非终端X之后立即出现的终端。这是在X之后出现在任何解析规则中的所有符号的FIRST集的并集。

了解详情:LL parser

给出的线索是:

  1. FIRST(A)FIRST(S)AS的所有派生必须以终端b开头,或者是零长度。

      

    Sb ... | ε
      Ab ... | ε

  2. FOLLOW(S)⇒必须有一些构造,其中S后面是终端a,或者一个非终端,可以以a开头。 (AS都不符合条件。)

      

    Sb S a | ε
      Ab ... | ε

  3. FOLLOW(A)⇒必须有一些结构,Aa中的每个终端都跟着b,或者某些非终端可以开始与那些。

      

    Sb S a | ε
      Ab A b | b A a | ε

  4. FOLLOW(A)⇒假设S是起始符号,A必须出现在S的某个分支的末尾,可能后跟其他可为空的非{n} -Terminals。

      

    Sb S a | A | ε
      Ab A b | b A a | ε

    (注意:将A添加到S并没有打破FIRST(S)上的约束

  5. 我们可以将语法缩小一点:

      

    Sb S a | A | ε
      Ab A b | ε

    我们无法生成像“bbbabb”这样的字符串,但它不会违反约束。