《編譯原理》求 FIRSTVT 集和 LASTVT 集的步驟 - 例題解析
算符優先關系表的構造中涉及到求 FIRSTVT 集和 LASTVT 集。
表示及含義:
FIRSTVT(T) | 非終結符T的最左終結符集合 |
---|---|
LASTVT(T) | 非終結符T的最右終結符集合 |
定義:
定義解釋:
FIRSTVT(T) | 非終結符T經過1步或多步推導,得到的最左端終結符,以及左端第二個終結符的集合 |
---|---|
LASTVT(T) | 非終結符T經過1步或多步推導,得到的最右端終結符,以及倒數第二個終結符的集合 |
求 FIRSTVT 集的步驟:
(1)若有產生式 T→a 或者 T→Ra...,則 a ∈ FIRSTVT(T)
(2)若 a ∈ FIRSTVT(R),且有產生式 T→R...,則 a ∈ FIRSTVT(T)
就是說如果 a 是非終結符 R 的 FIRSTVT 集,且 T 可以推出以非終結 R 帶頭的右部,則 a 也是非終結符 T 的 FIRSTVT 集。
注: 省略號 ... 可以為空,就是沒有
求 LASTVT 集的步驟:
(1)若有產生式 T→...a 或者 T→...aR,則 a ∈ LASTVT(T)
(2)若 a ∈ LASTVT(R),且有產生式 T→...R,則 a ∈ LASTVT(T)
例題:
已給文法:
G[S]:
S→a|b|(B)
A→S, A|S
B→A
求所有非終結符的 FIRSTVT,LASTVT 集
解析:
(1)只要是讓求 FIRSTVT,LASTVT 集,則該文法就隱含條件為算符優先文法。
(2)算符優先文法的特點是:不會出現兩個相鄰的非終結符,即兩個非終結符中間夾着一個終結符。如果第一個是終結符則第二個是非終結符。
結果:
FIRSTVT 集 | LASTVT 集 | |
---|---|---|
S | {a, b, ( } | {a, b, ) } |
A | {a, b, (, 逗號 } | {a, b, ), 逗號} |
B | {a, b, (, 逗號 } | {a, b, ), 逗號} |