六、上下文无关文法-CFG
Definition-(Context-Free Grammar(CFG), 上下文无关文法)
上下文无关文法G是一个四元组G=(T,N,S,P)
-
T是终结符号(Terminal)集合,对应于词法分析器产生的词法单元
-
N是非终止符号(Non-terminal)集合
-
S是开始(start)符号(S∈N)且唯一
-
P是产生式(Production)集合
A∈N→α∈(T∪N)∗
头部/左部(Head)A:单个非终结符
体部/右部(Body)α:终结符与非终结符构成的串,也可以是空串ϵ

CFG
语义
语义:上下文无关文法G定义了一个语言L(G)
语言是串的集合
推导
E→E+E∣E∗E∣(E)∣−E∣id
推导即是将某个产生式的左边替换成它的右边
每一步推导需要选择替换哪个非终结符号,以及使用哪个产生式
E⇒−E⇒−(−E)⇒−(E+E)⇒−(id+E)⇒−(id+id)E⇒−E:经过一步推导得出E⇒+−(id+E):经过一步或者多步推导得出E⇒∗−(id+E):经过零步或者多步得出
定义
如果S⇒∗α,且α∈(T∪U)∗,则称α是文法G的一个句型
Definition(Sentence-句子)
如果S⇒∗w,且w∈T∗则称w是文法G的一个句子
Definition(文法G生成的语言L(G))
文法G生成的语言L(G)是它能够推导出的所有句子的构成的集合
w∈L(G)⇔S⇒∗w
文法G的两个基本问题
Membership问题:给定字符串x∈T∗,x∈L(G)?
即检查x是否符合文法G
这就是语法分析器的任务:
为输入的词法单元流寻找推导,构建语法分析树,或者报错
L(G)究竟是什么
这是程序设计语言设计者需要考虑的问题
Example

L(G)={良匹配括号串}

L(G)={anbn∣n⩾0}

字母表Σ={a,b}上的所有回文串构成的语言

{x∈{a,b}∗∣x中a,b个数相同}
为什么不使用优雅,强大的正则表达式描述程序设计语言的语法

每个正则表达式r对应的语言L(r)都可以使用上下文无关文法来描述

此外,若δ(Ai,ϵ)=Aj,则添加Ai→Aj
Theorem
L={an,bn∣n⩾0}该语言无法使用正则表达式来描述
反证法假设存在正则表达式r:L(r)=L则存在有限状态自动机D(r):L(D(r))=L;设状态数为k考虑输入am,m>k

D(r)也能接受ai+jbi⇒矛盾!