03-上下文无关文法
Context-Free Grammar (CFG) 上下文无关文法
四元组G=(N,T,S,P)
N 非终结符的有限集合:还能继续推导的符号
T 终结符的有限集合:不能继续推导的符号
S∈N 开始符号
P 产生式的有限集合,格式为A→α,其中A∈N,α∈(N∪T)∗
推导:A→α,uAv⇒uαv
连续推导:→∗
上下文无关语言:L(G)={w∈T∗∣S⇒∗w}
最左/右推导:每次替换最左/右边的非终结符
最左/右句型:最左/右推导直到没有非终结符为止
语法树:根据推导过程建立
叶子节点是终结符
非叶子节点是非终结符
句柄:在推导时被替换的部分
最左/右句型的句柄:上一次推导中被替换掉的,最左/右部分只有终结符
歧义问题
Ambiguity 歧义:一个字符串对应多个语法树
无法抑制歧义
没有算法可以判断一个文法是否有歧义
解决方法:根据运算符优先级设置产生式,将优先级高的产生式用其他产生式替换
以下产生式:
E→EOE
E→(E)
E→v∣d
O→+∣∗
最左推导 v∗(v+d):E⇒EOE⇒vOE⇒v∗E⇒v∗(E)⇒v∗(EOE)⇒v∗(vOE)⇒v∗(v+E)⇒v∗(v+d)
最右推导 v∗(v+d):E⇒EOE⇒EO(E)⇒EO(EOE)⇒EO(EOd)⇒EO(E+d)⇒EO(v+d)⇒E∗(v+d)⇒v∗(v+d)
Pushdown Automata (PDA) 下推自动机
上下文无关语言对应 PDA = NFA + 栈
状态转移格式:a,b→c
a 是输入符号
b 是
pop进栈的串c 是
push出栈的串
定义:七元组M=(Q,Σ,Γ,δ,q0,Z0,F)
Q 状态集合
Σ 输入符号集合
Γ 栈上的符号
δ:Q×(Σ∪{ϵ})×Γ→2Q×Γ∗ 状态转移函数
q0 初始状态
z0 初始栈符号
F∈Q 终止状态集合
下推自动机在某一时刻的状态:三元组(q,w,γ)
q 是状态
w 是暂未读取的输入串
γ 是栈上的符号
(q′,γ′)∈δ(q,a,b):在q状态,读取输入a,栈顶是b,可以转移到q′状态,弹出b,栈顶压入γ′
状态转移:(q,aw,γ)⊢M(q′,w,γ′)
PDA 的语言
字符被 PDA 接受的条件
Acceptance by final state:到达终止状态,输入串消耗完毕,不关心栈的内容 L(M)={w∈Σ∗∣(q0,w,z0)⊢M∗(q,ϵ,γ),q∈Fγ∈Γ∗}
或 Acceptance by empty stack:栈为空,输入串消耗完毕,不关心是否到达终止状态 N(M)={w∈Σ∗∣(q0,w,z0)⊢M∗(q,ϵ,ϵ),q∈F}
二者等价
给定 L(M) 可构造出 N(M)
在初始栈底增加x0,防止清空栈
在终止状态后可增加不断
pop栈的状态转移,清空栈
给定 N(M) 可构造出 L(M)
在初始栈底增加x0
在栈内只剩x0后增加状态转移到终止状态,同时
pop掉x0
CFG=PDA
CFG⊆PDA
任意的 CFG,G=(N,T,S,P),可以构造一个以空栈为接受条件的 PDA M=({q},T,N∪T,δ,q,S,∅),其中
对于任意非终结符A∈N,δ(q,ϵ,A)={(q,ϵ)∣A→ϵ∈P}:如果栈顶值是非终结符,不读入任何符号,将栈顶替换来进一步推导
对于任意终结符a∈T,δ(q,a,a)={(q,ϵ)}:如果栈顶值是终结符,读入终结符,将栈顶弹出
PDA⊆CFG
对于任何(以空栈作为匹配成功标准的)PDA M=(Q,Σ,Γ,δ,q0,Z0,∅),可以构造一个 CFG G=(N,T,S,P),其中
N={S}∪{NpXq∣p,q∈Q,X∈Γ}
NpXq 表示从状态p到状态q,栈顶是X的所有可能
T=Σ
P
起始规则:S→Nq0z0p,∀p∈Q
只出栈不压栈的情况:(q,ϵ)∈δ(p,a,X)⇒NpXq→a
既出栈又压栈的情况:(q,X1X2…Xk)∈δ(p,a,X)⇒NpXq→aNqX1p1Np1X2p2…Npk−1Xkpk
DPDA
Deterministic PDA:对于任意输入符号和栈顶符号,只有一个状态转移
DFA/NFA⊆DPDA⊆NPDA
无歧义的 CFL 一定有 DPDA
有歧义的 CFL 只有 NPDA
CFL 的性质
封闭性
若 L1,L2 是 CFL,则下列一定是 CFL:
L1∪L2
L1L2
L1∗
L1R:匹配规则里面每一条都反过来
若 L1,L2 是 CFL,则下列不一定是 CFL:(假设{anbncn}不是 CFL,下证)
L1∩L2:L1={anbncm},L2={ambncn},L1∩L2={anbncn}
L1:若L1是 CFL,则通过德摩根定理,L1∩L2 也是 CFL
L1−L2:若L1−L2是 CFL,则L1=Σ∗−L1也是 CFL
CFL 和 RL 的交是 CFL
判定
给定 CFG,判断 CFL 是否为空:查看起始符号S是否能推导出终结符,S→S 是否在推导过程中出现
给定 CFG,判断 CFL 是否有限
去除无用非结束符
去除 ϵ-产生式
去除单一产生式
画依赖图,判断是否有环
给定 CFG,判断自字符串是否在 CFL 中:
构造 NPDA,判断是否接受
CYK 算法:O(n3),后续章节详述
无法判定的问题
是否有歧义
是否继承了歧义
交集是否为空
两个 CFL 是否相等
是否等于Σ∗
CFL 的泵引理
Chomsky 范式
可以将 CFG 转换为 Chomsky 范式
A→BC
A→a
S→ϵ
解析树是二叉树
对于 CFG G=(N,T,S,P)
假设 ∣N∣=m,n=2m
对于任意字符串 z(∣z∣≥n),解析树的叶子数量是 ∣z∣
设最长的路径为A0A1…Aka,k≤log2∣z∣=∣N∣
路径上面有重复的非终止符Ai=Aj,k−m≤i<j≤k
z=uvwxy,其中vwx由Ai产生
对于任意的i≤0, uviwxiy也是 CFG 的产生式
泵引理
对于任意 CFL L,存在一个常数n,对于任意长的字符串z∈L,∣z∣≥n,z可以分解为z=uvwxy,满足
∣vwx∣≤n
vx=ϵ
∀i≥0,uviwxiy∈L
用泵引理证明某个语言不是 CFL:找到uviwxiy不在语言中
最后更新于