首页 文章资讯内容详情

什么是 FIRST 和 FOLLOW,它们是如何计算的?

2026-06-02 1 花语

FIRST和FOLLOW是两个与语法相关的函数,可以帮助我们填充M表的条目。

FIRST()-它是一个函数,它给出了从产生式规则派生的字符串开始的终端集。

符号c在FIRST(α)中当且仅当对于某个语法符号序列βα⇒cβ。

终结符a在FOLLOW(N)中当且仅当存在从文法的起始符号S的派生使得S⇒αNαβ,其中α和β是(可能为空的)文法符号序列。换句话说,如果c可以在推导中的某个点跟随N,则终端c在FOLLOW(N)中。

FIRST()和FOLLOW()的好处

可以用来证明文法的LL(K)特性。

可用于促进预测解析表的构建。

它为递归下降解析器提供选择信息。

FIRST的计算

FIRST(α)被定义为终端符号的集合,这些终端符号是从α派生的字符串的第一个字母。

FIRST(α)={α|α→∗αβ对于某些字符串β}

如果X是语法符号,那么First(X)将是-

如果X是终结符,则FIRST(X)={X}

如果X→ε,则FIRST(X)={ε}

如果X是非终结符&X→aα,则FIRST(X)={a}

如果X→Y1,Y2,Y3,则FIRST(X)将是

(a)如果Y是终结点,则

第一(X)=第一(Y1,Y2,Y3)={Y1}

(b)如果Y1是非终结符且

如果Y1不导出为空字符串,即,如果FIRST(Y1)不包含ε,则FIRST(X)=FIRST(Y1,Y2,Y3)=FIRST(Y1)

(c)如果FIRST(Y1)包含ε,则。

FIRST(X)=FIRST(Y1,Y2,Y3)=FIRST(Y1)−{ε}∪FIRST(Y2,Y3)

类似地,FIRST(Y2,Y3)={Y2},如果Y2是终结符,否则如果Y2是非终结符,则

FIRST(Y2,Y3)=FIRST(Y2),如果FIRST(Y2)不包含ε。

如果FIRST(Y2)包含ε,则

FIRST(Y2,Y3)=FIRST(Y2)−{ε}∪FIRST(Y3)

类似地,对于进一步的语法符号,即对于Y4、Y5、Y6...,将重复该方法。ÿķ。

FOLLOW的计算

Follow(A)定义为直接出现在A右侧的终结符的集合。

FOLLOW(A)={a|S⇒*αAaβ其中α,β可以是任何字符串}

查找规则FOLLOW

如果S是起始符号,FOLLOW(S)={$}

如果生产形式为A→αBβ,则β≠ε。

(a)如果FIRST(β)不包含ε,则FOLLOW(B)={FIRST(β)}

或者

(b)如果FIRST(β)包含ε(即β⇒*ε),则

跟随(B)=第一(β)−{ε}∪跟随(A)

∵当β导出ε时,则A之后的终结点将跟随B。

如果生产形式为A→αB,则Follow(B)={FOLLOW(A)}。