FIRST(A) = { b, epsilon }
FIRST(S) = { b, epsilon }
FOLLOW(S) = { a, $ }
FOLLOW(A) = { a, b, $ }
第一个和第一个的算术表达式是什么?按照设置?
答案 0 :(得分:1)
FIRST(X)
=尝试解析非终端X
时首先出现的终端。如果它可以匹配空字符串,则还包括epsilon。
FOLLOW(X)
=可以在非终端X
之后立即出现的终端。这是在X
之后出现在任何解析规则中的所有符号的FIRST集的并集。
了解详情:LL parser
给出的线索是:
FIRST(A)
,FIRST(S)
⇒A
和S
的所有派生必须以终端b
开头,或者是零长度。
S
→b
... | ε
A
→b
... | ε
FOLLOW(S)
⇒必须有一些构造,其中S
后面是终端a
,或者一个非终端,可以以a
开头。 (A
和S
都不符合条件。)
S
→b
S
a
| ε
A
→b
... | ε
FOLLOW(A)
⇒必须有一些结构,A
和a
中的每个终端都跟着b
,或者某些非终端可以开始与那些。
S
→b
S
a
| ε
A
→b
A
b
|b
A
a
| ε
FOLLOW(A)
⇒假设S
是起始符号,A
必须出现在S
的某个分支的末尾,可能后跟其他可为空的非{n} -Terminals。
S
→b
S
a
|A
| ε
A
→b
A
b
|b
A
a
| ε
(注意:将A
添加到S
并没有打破FIRST(S)
上的约束
我们可以将语法缩小一点:
S
→b
S
a
|A
| ε
A
→b
A
b
| ε
我们无法生成像“bbbabb
”这样的字符串,但它不会违反约束。