03-上下文无关文法
Context-Free Grammar (CFG) 上下文无关文法
四元组
非终结符的有限集合:还能继续推导的符号
终结符的有限集合:不能继续推导的符号
开始符号
产生式的有限集合,格式为,其中,
推导:,
连续推导:
上下文无关语言:
最左/右推导:每次替换最左/右边的非终结符
最左/右句型:最左/右推导直到没有非终结符为止
语法树:根据推导过程建立
叶子节点是终结符
非叶子节点是非终结符
句柄:在推导时被替换的部分
最左/右句型的句柄:上一次推导中被替换掉的,最左/右部分只有终结符
歧义问题
Ambiguity 歧义:一个字符串对应多个语法树
无法抑制歧义
没有算法可以判断一个文法是否有歧义
解决方法:根据运算符优先级设置产生式,将优先级高的产生式用其他产生式替换
Pushdown Automata (PDA) 下推自动机
上下文无关语言对应 PDA = NFA + 栈
状态转移格式:
是输入符号
是
pop
进栈的串是
push
出栈的串
定义:七元组
状态集合
输入符号集合
栈上的符号
状态转移函数
初始状态
初始栈符号
终止状态集合
下推自动机在某一时刻的状态:三元组
是状态
是暂未读取的输入串
是栈上的符号
:在状态,读取输入,栈顶是,可以转移到状态,弹出,栈顶压入
状态转移:
PDA 的语言
字符被 PDA 接受的条件
Acceptance by final state:到达终止状态,输入串消耗完毕,不关心栈的内容
或 Acceptance by empty stack:栈为空,输入串消耗完毕,不关心是否到达终止状态
二者等价
给定 L(M) 可构造出 N(M)
在初始栈底增加,防止清空栈
在终止状态后可增加不断
pop
栈的状态转移,清空栈
给定 N(M) 可构造出 L(M)
在初始栈底增加
在栈内只剩后增加状态转移到终止状态,同时
pop
掉
任意的 CFG,,可以构造一个以空栈为接受条件的 PDA ,其中
对于任意非终结符,:如果栈顶值是非终结符,不读入任何符号,将栈顶替换来进一步推导
对于任意终结符,:如果栈顶值是终结符,读入终结符,将栈顶弹出
对于任何(以空栈作为匹配成功标准的)PDA ,可以构造一个 CFG ,其中
表示从状态到状态,栈顶是的所有可能
起始规则:
只出栈不压栈的情况:
既出栈又压栈的情况:
DPDA
Deterministic PDA:对于任意输入符号和栈顶符号,只有一个状态转移
无歧义的 CFL 一定有 DPDA
有歧义的 CFL 只有 NPDA
CFL 的性质
封闭性
若 是 CFL,则下列一定是 CFL:
:匹配规则里面每一条都反过来
若 是 CFL,则下列不一定是 CFL:(假设不是 CFL,下证)
:
:若是 CFL,则通过德摩根定理, 也是 CFL
:若是 CFL,则也是 CFL
CFL 和 RL 的交是 CFL
判定
给定 CFG,判断 CFL 是否为空:查看起始符号是否能推导出终结符, 是否在推导过程中出现
给定 CFG,判断 CFL 是否有限
去除无用非结束符
去除 -产生式
去除单一产生式
画依赖图,判断是否有环
给定 CFG,判断自字符串是否在 CFL 中:
构造 NPDA,判断是否接受
CYK 算法:,后续章节详述
无法判定的问题
是否有歧义
是否继承了歧义
交集是否为空
两个 CFL 是否相等
是否等于
CFL 的泵引理
Chomsky 范式
可以将 CFG 转换为 Chomsky 范式
解析树是二叉树
对于 CFG
假设
对于任意字符串 ,解析树的叶子数量是
设最长的路径为
路径上面有重复的非终止符
,其中由产生
对于任意的, 也是 CFG 的产生式
泵引理
对于任意 CFL ,存在一个常数,对于任意长的字符串,,可以分解为,满足
,
用泵引理证明某个语言不是 CFL:找到不在语言中
最后更新于