CFG定义
形式定义:CFG G = (𝕍, T, 𝓟, S),其中,
• G为文法标识(可省略),
• 𝕍是变元的有穷集合,
• T是终结符的有穷集合(字母表,也习惯用Σ),
• 𝓟是产生式规则的有穷集合,
• S是一个初始符号,S∈𝕍。
⌲ 文法G所定义的语言,L(G) = L(S) ⊆ T*,是T上的语言
eg:
E ⟶ E + E | E * E | (E) | d
CFG ({E}, {+, *, (, ), d}, {(E, E+E), (E, E*E), (E,\(E\)), (E, d)}, E)
句型:从初始符号推导出来的任意串。
⌲ 句子:从初始符号推导出来的终结符串。
⌲ 句子是句型的一个特例。
最左、最右推导
每次替换最左变元还是最右变元。
eg:
问句子 a*(ab+10)的最左、
最右推导 ?
E → E+E | E*E | (E) | F
F → aF | bF | 0F | 1F | ε
语法分析树
• 叶子:用终结符或ε标记
• 内结点:用变元标记
• 根:用初始符号标记
歧义性文法
选择不同的候选式常常会推导出不同的句子,但有时不尽然。如果真出现同一个句子有多个语法树的情况,表明文法是有歧义的。
一个 CFG 是歧义的 若它的语言有元素至少是两个语法树的产物。
定理:对于CFG的句子w有两个语法树当且仅当有两个最
左推导。
把歧义文法转换为无歧义文法
⌲ 歧义文法:
• B → BB | (B) | ()
⌲ 无歧义文法:
• B → (RB | ε
• R → ) | (RR
CFG化简
有用与无用的文法符号
从初始符号推导句子的步骤中出现的符号都是有用的。
⌲ 可达符号:由初始符号推导出的任意串中的文法符号。
⌲ 如果S ⇒* αXβ, α,β∈(V∪T), 那么X是可达的。
⌲ 有产出的符号:能推导出终结符串的文法符号。
⌲ 如果X⇒w, X∈(V∪T), w∈T,那么X是产出的。
终结符,一定是产出的,但有可能是不可达的;
变元,4种情形都有可能。
eg:
⌲ 例:S⟶AB;A⟶aA | a;B⟶AB
⌲ 可达符号:S,A,B,a
⌲ 不可达符号:无
⌲ 有产出的符号:A,a
⌲ 无产出符号:S,B
⌲ 因为初始符号S是无产出的,所以该语言是空
去除无用符号
从G中去除无产出变元得到CFG Gg = (Vg, T, Pg, S)
从Gg中去除不可达符号得到CFG Gu = (Vu, Tu, Pu, S)
去除ε-产生式
定义:CFG G=(V,T,P,S),A∈V是可空变元,当且仅当A⇒*ε。
⌲ 输入:G = (V, T, P, S)
⌲ 输出:Ga = (V, T, Pa, S)
- Pa初始化为空集合;
- 找出G的所有可空变元;
- 对P中每个非ε产生式,将它的变形全部加入Pa;
- Pa 中去掉以ε为候选式的所有产生式。
eg:
去除单位产生式
单位产生式:右部为单个变元的产生式。
关键点:找出所有单位对(A, B) 使得A ⇒* B 仅通过一系列单位产生式得到。