六、上下文无关文法-CFG

Definition-(Context-Free Grammar(CFG), 上下文无关文法)

上下文无关文法GG是一个四元组G=(T,N,S,P)G = (T,N,S,P)

  1. TT是终结符号(Terminal)集合,对应于词法分析器产生的词法单元

  2. NN是非终止符号(Non-terminal)集合

  3. SS是开始(start)符号(SN)(S \in N)且唯一

  4. PP是产生式(Production)集合

    ANα(TN)A \in N \to \alpha \in (T \cup N)^*

    头部/左部(Head)A:单个非终结符

    体部/右部(Body)α\alpha:终结符与非终结符构成的串,也可以是空串ϵ\epsilon

[Entended] Backus-Naur form ([E]BNF)

CFG

语义

语义:上下文无关文法GG定义了一个语言L(G)L(G)

语言是串的集合

推导

EE+EEE(E)EidE \to E + E \mid E * E \mid (E) \mid -E \mid id

推导即是将某个产生式的左边替换成它的右边

每一步推导需要选择替换哪个非终结符号,以及使用哪个产生式

EE(E)(E+E)(id+E)(id+id)EE:E+(id+E):E(id+E)E \Rightarrow -E \Rightarrow -(-E) \Rightarrow \\ -(E+E) \Rightarrow -(id + E) \Rightarrow -(id+id) \\ E \Rightarrow -E :经过一步推导得出 \\ E \stackrel{\mathrm{+}}{\Rightarrow} -(id+E):经过一步或者多步推导得出 \\ E \stackrel{\mathrm{*}}{\Rightarrow} -(id+E):经过零步或者多步得出

定义

Definition(Sentential Form-句型)

Sα,α(TU),αG如果 S \stackrel{\mathrm{*}}{\Rightarrow} \alpha ,且 \alpha \in (T \cup U)^*\\ ,则称\alpha是文法G的一个句型

Definition(Sentence-句子)

Sw,wTwG如果S\stackrel{\mathrm{*}}{\Rightarrow} w,且w \in T^* \\ 则称w是文法G的一个句子

Definition(文法GG生成的语言L(G)L( G))

文法GG生成的语言L(G)L( G)是它能够推导出的所有句子的构成的集合

wL(G)Sww \in L(G) \Leftrightarrow S \stackrel{\mathrm{*}}{\Rightarrow} w

文法G的两个基本问题

Membership问题:给定字符串xT,xL(G)x \in T^*,x \in L(G)?

即检查xx是否符合文法GG

这就是语法分析器的任务:

为输入的词法单元流寻找推导,构建语法分析树,或者报错

L(G)L(G)究竟是什么

这是程序设计语言设计者需要考虑的问题

Example

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

L(G)={anbnn0}L(G) = \lbrace a^n b^n \mid n \geqslant 0 \rbrace

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

{x{a,b}xa,b}\lbrace x \in \lbrace a, b \rbrace^* \mid x中a,b个数相同\rbrace

为什么不使用优雅,强大的正则表达式描述程序设计语言的语法

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

此外,若δ(Ai,ϵ)=Aj\delta(A_i,\epsilon)=A_j,则添加AiAjA_i \to A_j

Theorem

L={an,bnn0}L = \lbrace a^n,b^n \mid n \geqslant 0\rbrace该语言无法使用正则表达式来描述

r:L(r)=LD(r):L(D(r))=L;kam,m>k反证法\\ 假设存在正则表达式r:L(r) = L \\ 则存在有限状态自动机D(r): L(D(r)) = L;设状态数为k \\ 考虑输入a^m , m \gt k \\

D(r)ai+jbiD(r)也能接受a^{i+j}b^i \Rightarrow 矛盾!