第二章 文法和语言 2.1 文法的基本概念 符号和符号串 2.2 句型的分析 文法和语言的形式定义 推导与递归 文法的分类 语法树 第二章 文法和语言 2.1 文法的基本概念 符号和符号串 文法和语言的形式定义 推导与递归 文法的分类 2.2 句型的分析 语法树 文法的约定 句型的分析方法
主要内容 本章讨论与编译实现相关的形式语言理论基本概念,主要内容有: 文法与语言的形式定义 Chomsky文法及其分类 上下文无关文法的主要特性 文法的等价变换 句型分析的概念
文法与语言 一个程序设计语言的确切定义是构造编译程序的重要前提。 文法被用来精确而无歧义地描述语言的构成方式. 文法描述语言的时候不考虑语言的含义。
2.1 语言和文法的直观概念 程序设计语言的定义 语言是一个记号系统。 汉语--符合汉语语法的句子的全体 英语--符合英语语法的句子的全体 程序设计语言--该语言的程序的全体 程序设计语言由语法和语义定义:
语法(syntax) 定义: 是一组规则,用它可以形成和产生一个合适的程序 描述工具:文法 作用: 定义什么样的符号序列是合法的,与符号的含义无关。
语义(semantics) 分类: 静态语义:一系列限定规则,确定哪些合乎语法的程序是合适的 动态语义:表明程序要做什么 描述工具: 指称语义,操作语义等 作用: 检查类型匹配,变量作用域等
文法的直观概念 如何来描述一种语言?文法是描述语言的语法(形式)结构的形式规则。 如果语言是有穷的(只含有有穷多个句子),可以将句子逐一列出来表示 如果语言是无穷的,要找出语言的有穷表示。 有两个途经: 生成方式 (文法):语言中的每个句子可以用严格定义的规则来构造 识别方式(自动机):用一个过程,当输入的一任意串属于语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”,要么永远继续下去。
形式语言 Chomsky于1956年提出了一种用来描述语言的数学系统。人们把用一组数学符号和规则来描述语言的方式称为形式描述,而把所用的数学符号和规则称为形式语言。 形式语言,只是从语法上研究语言。它是抽象的数学系统,用于模拟程序设计语言的语法,或者是并不很成功地模拟自然语言如英语的语法。 形式语言理论是编译理论的重要基础,它主要研究组成符号语言的符号串的集合及它们的表示法、结构与特性。
形式语言和编译理论中的 最基本概念 ——符号串和符号串集合 基本定义 它们的运算
2.2 符号和符号串 字母表 定义:元素的非空有穷集合 例:∑={0‚1} Α={a‚b,c} 元素也称为符号,字母表也称符号集。 程序语言的字母表由字母数字和若干专用符号组成。
符号串 定义:由字母表中的符号组成的任何有穷序列 例: 0,00,10是字母表∑={0‚1}上的符号串 a,ab,aaca是Α={a‚b,c}上的符号串 在符号串中,符号是有顺序的,顺序不同,代表不同的符号串,如:ab和ba不同 不含任何符号的符号串称为空串,用ε表示 注意:{ε}并不等于空集合{ } 符号串长度: 符号串中含有符号的个数 如: |abc|=3 | ε|=0
子符号串 设有非空符号串u=xvy,其中符号串 ,则称v为符号串u的子符号串。 V≠ε 例如 符号串x=a+b*(c+d),则 a, a+b*, 与(c+d)等都是x的子符号串,且 其长度分别为|a|=1, |a+b*|=4, |(c+d)|=5 设有非空符号串u=xvy,其中符号串 ,则称v为符号串u的子符号串。 V≠ε
符号串的头与尾 例如:字母表A={a,b,c}上的符号串x=abc, 则x的 头:ε, a, ab, abc, 尾:ε, c, bc, abc 固有头: ε, a, ab, 固有尾:ε, c, bc 如果z=xy是一个符号串,则x是z的头,而y是z的尾。如果y非空,则x是z的固有头;如果x非空,则y是z的固有尾。
符号串的连接:设x、y是符号串,它们的连接是把y的符号写在 x的符号之后得到的符号串xy 符号串的运算 符号串的连接:设x、y是符号串,它们的连接是把y的符号写在 x的符号之后得到的符号串xy 例如 x="ST",y="abu" ,则 xy="STabu" 显然εx = xε=x 符号串的方幂:把符号串a自身连接n次得到的符号串an = aa…aa 例如 a1=a a2=aa a0=ε
符号串集合: 定义: 若集合A中所有元素都是某字母表上的符号串,则称A为字母表上的符号串集合。 符号串集合的乘积:符号串集合A和B的乘积定义为: AB ={xy|x∈A且y∈B},即AB是由A中的串x 和B中的串y连接而成的串xy组成的集合。 若集合A = ab,cde B = 0,1 则 AB = ab0,ab1,cde0,cde1 显然 {ε}A = A{ε} = A
符号串集合的方幂: 设A是符号串的集合,则称Ai为符号串集A的方幂,其中i是非负整数。具体定义如下: A1 = A , A2 = A A AK = AA......A(k个)
集合的闭包 闭包 集合Σ的闭包Σ *定义如下: Σ * = Σ 0∪ Σ1∪ Σ 2∪ Σ 3∪… 例:设有字母表Σ={0,1} 则Σ*=Σ0∪Σ1∪Σ2∪… ={ε,0,1,00,01,10,11,000,…} 即Σ*表示Σ上所有有穷长的串的集合。
正闭包 Σ+ = Σ1∪Σ2∪Σ3∪…称为Σ的正闭包。 + 表示上的除ε外的所有用穷长串的集合 Σ* = Σ0∪Σ+ Σ+ = ΣΣ* = Σ* Σ
字母表上的一个语言是上符合某种规则的一些符号 串的集合 ,是*的一个子集。 例如:Σ={a,b} Σ*={ε,a,b,aa,ab,ba,bb,aaa,aab,…} 1. 集合{ab,aabb,aaabbb,…,anbn,…}或 {w|w∈Σ*且w=anbn,n≥1}为字母表上的一个语言。 集合{a,aa,aaa,…}或{w|w∈Σ*且w=an,n≥1}为字母表上的一个语言。 ε是一个语言。 即 是一个语言。
小结 1 符号与字母表 2 符号串 3 符号串的运算 4 符号串集合 5 集合的闭包 6 字母表的闭包
2.3 文法和语言的形式定义 1.文法的定义 2.文法形式上的约定 3.推导与归约 4.句型、句子、语言的定义 5.文法的等价
“我是大学生”是汉语的一个句子 用::=表示的汉语句子的构成规则: 〈句子〉∷=〈主语〉〈谓语〉 〈主语〉∷=〈代词〉|〈名词〉 〈代词〉∷= 我|你|他 〈名词〉∷= 王明|大学生|工人|英语 〈谓语〉∷=〈动词〉〈直接宾语〉 〈动词〉∷= 是|学习 〈直接宾语〉∷=〈代词〉|〈名词〉
句子“我是大学生”的推导过程如下: 从句子出发,反复把规则中的”::=”左边的成分替换成右边的成分。 〈句子〉 〈主语〉〈谓语〉 〈代词〉〈谓语〉 我〈谓语〉 我〈动词〉〈直接宾语〉 我是〈直接宾语〉 我是〈名词〉 我是大学生
文法——介绍 包括四个组成部分: 一组终结符号(不能被替换的符号,单词符号) 一组非终结符号(能够被替换为终结符号或非终结符号,语法单位) 一个开始符号(从这个符号开始替换,最大语法单位-程序) 一组产生式(替换规则,把左边的字符串替换为右边的字符串)
关键思路 从文法的开始符号出发, 反复使用产生式,对非终结符进行替换(展开), 直到整个字符串中不在包含非终结符。 这时,得到了这个文法的一个句子(一个程序) 这个过程称为推导
1.文法的形式定义 产生式(规则) 产生式是一个有序对(α,β),通常写作 α→β(或α::=β ) 文法定义: 文法G(Grammar)定义为四元组(VN,VT,P,S) VN (Nonternimal):非终结符集 VT (Terminal):终结符集 P (Production):产生式(规则)集合 S:开始符号或识别符号
说明: V=VN∪VT,V称为文法G的字母表 P中产生式形如:α→β,其中α∈V+且至少含一个非终结符,β∈V* VN,VT和P是非空有穷集 VN∩VT=φ S是一个非终结符,且至少要在一条产生式的左部出现 非终结符代表一个语言中的语法成分,如<赋值语句>,它是构成程序的一个语法成分,这个符号本身不会在程序中出现,而终结符是组成程序的具体的符号。
2 文法形式定义上的约定 文法习惯上只将产生式写出。并有如下约定: 第一条产生式的左部是开始符号,或用G[S]表示S是开始符号 用尖括号括起的是非终结符,否则为终结符。或者大写字母表示非终结符,小写字母表示终结符 G可写成G[S],S是开始符号 希腊字母代表由终结符号和非终结符号组成的符号串 α、β、γ 左部相同的产生式A→α,A→β可以记为A→α|β, 其中“|”是“或”的意思,α,β分别称为侯选式
其中:VN={S},VT={0,1},P={S→0S1,S→01} 如:对于文法 G:S→0S1 可写成 G[S]:S→0S1 S→01 S→01 例:文法G=(VN,VT,P,S) 其中:VN={S},VT={0,1},P={S→0S1,S→01} 开始符为S
例:文法G=(VN,VT,P,S) VN ={标识符,字母,数字}, VT ={a,b,c,…x,y,z,0,1,…,9}, <标识符>→<标识符><字母> <标识符>→<标识符><数字>, <字母>→a, …, <字母>→z, <数字>→0,…,<数字>→9 }, S=<标识符> 例如: 文法G[S]: S→A|SA|SD A→a|b|…|z D→0|1|…|9
3. 推导(Derivation)与归约(Reduction) 直接推导和直接归约: α→β是文法G的产生式,若有v,w满足: v=γαδ,w=γβδ, 其中γ,δ∈V* 则称v直接推导出w,也称w直接归约到v, 记作 v w 直接推导就是用产生式的右部替换产生式的左部的过程 直接归约就是用产生式的左部替换产生式的右部的过程
例 文法G: S→0S1,S→01 有直接推导: S 0S1 ( S→0S1 ) 0S1 00S11 ( S→0S1 ) 00S11 000S111 ( S→0S1 ) 000S111 00001111( S→01 )
推导例题1 文法G1:S->bA, A->aA|a定义了一个什么样的语言? S=>bA=>ba S=>bA=>baA=>baa S=>bA=>baA=>baaA=>baaa …… S=>bA=>baA=>…=>ba…a L(G1)={ban|n>=1} L(G1) = { 以b开头后跟一个或多个a的串}
推导例题2 e.g. 文法产生的语言 L(G4)={ambn|m,n1} L(G5) = {anbn|n 1} G4: S A B A a A | a B b B | b G5: S a S b | ab
e.g. 文法产生的语言 A=> aB => ab A=> Ab => ab 文法G4对句子aaabb的推导: S => A B S A B => a A B A a A => a a A B A a A => a a a B A a => a a a b B B b B => a a a b b B b
e.g. 文法产生的语言 文法G5对句子aaaabbbb的推导: S => a S b S a S b => a a S b b S a S b => a a a S b b b S a S b => a a a a b b b b S a b
直接推导序列和广义推导 直接推导序列: 或 + 若存在v =u0 u1 ... un=w, (n>0) 直接推导序列: 或 + 若存在v =u0 u1 ... un=w, (n>0) 则称v + w,v推导出w,或w归约到v(至少有1步推导),这个直接推导序列的长度为n。 广义推导: 或 * 若有v + w 或 v=w, 则记为v * w,v广义推导出w,w广义规约到v(可以包含0步推导) + *
三种推导的比较 直接推导()的长度为1 直接推导序列( +)的长度n≥1 广义推导( *)的长度≥0
规范推导与规范规约 考虑两种特殊推导:最右推导和最左推导,即 对于一个推导序列中的每一步直接推导,都是对最左(最右)非终结符进行替换。 最右推导也称规范推导,它的逆过程称为最左规约,也称规范规约。 . 若用表示规约,设A→a是文法G中的一个规则,则对于 xAy xay 有 xay xAy
例1: 文法G[S]: S→AB A→A0|1B B→0|S1 举例 例1: 文法G[S]: S→AB A→A0|1B B→0|S1 请给出句子101001的最左和最右推导。 最左推导: S AB 1B B10B 10S1 10AB1 101BB1 1010B1 101001 最右推导: S AB AS1AAB1 AA01 A1B01 A1001 1B1001 101001
例2 文法G: E→E+T|T T→T×F|F F→(E)|i 句子i+i×i的推导过程如下: 最左推导: E=>E+T=>T+T=>F+T=>i+T=>i+T×F=>i+F×F =>i+i×F=>i+i×i 最右推导: E=>E+T=>E+T×F=>E+T×i=>E+F×i=>E+i×i => T+i×i=>F+i×i=>i+i×i
递归规则 借助于自身来定义的规则,称为递归规则。如 <数字序列>::=<数字序列><数字> 递归规则的存在,使得能用有穷个规则来定义无穷的语言。 如果一个规则形如U::=…U…(或U→xUy),则该规则是递归的; 如果规则形如U::=U… (或U→Uy),则称左递归的; 如果规则形如U::=…U (或U→xU),则称右递归的。 例:<标识符表>::=<标识符表>,<标识符> (左递归规则) <因式>::=!<因式> (右递归规则)
文法的递归性 定义:对于某文法,存在U∈VN, 如果U + …U..., 则称该文法递归于U; 例1:C语言中: <语句> + …<语句> (文法右递归于<语句>) 例2: U→Vx V→Uy|z (都不递归) 有 U + Uxy,所以该文法是左递归的。 注:描述程序设计语言的文法必定都是递归的。
4.句型、句子、语言的定义 句型和句子 设有文法G[S],若符号串α是从开始符推导出来的,即 S =>* α ,则称α是文法G的句型。若α仅由终结符组成,即 S =>* α ,且α∈VT*,则称α是文法G的句子。 例 文法G[S]: S→0S1, S→01 因为S 0S1 00S11 000S111 00001111 所以S,0S1 ,00S11 ,000S111,00001111都是G的句型00001111是G的句子 由规范推导所得的句型称为规范句型
语言的定义 由文法G生成的语言记为L(G),它是文法G的一切句子的集合,即 L(G)={x|S =>* x,且 x∈VT* } 例 文法G: S→0S1, S→01 S0S1 00S11 03S13 … 0n-1S1n-1 0n1n L(G)={0n1n|n≥1} 文法和语言的关系: 文法G生成的每个串都在L(G)中 L(G)中的每个串确实能被G生成
根据文法,可以通过推导得到该文法相应的语言; 例:G[E]:E→E+T|T T→T×F|F F→(E)|a E E+T T+T F+T a+T a+T×F a+F×F a+a×F a+a×a 表示一切能用符号a,+,×,(,)构成的算术表达式 有了语言的要求,也可以为该语言设计文法 例:若语言由0、1符号串组成,串中0和1的个数相同,构造其文法为: A → 0B|1C B → 1|1A|0BB C → 0|0A|1CC
5.文法的等价 若L(G1)=L(G2),则称文法G1和G2是等价的。 例如 文法 G1[A]:A→0R A→01 R→A1 G2[S]:S→0S1 S→01 所定义的语言都是0n1n 两文法等价
2.4 文法的类型 0型文法(PSG) 0型语言或短语结构语言 1型文法(CSG) 1型语言或上下文有关语言 Chomsky对文法中的规则施加不同限制,将文法和语言分为四大类: 0型文法(PSG) 0型语言或短语结构语言 1型文法(CSG) 1型语言或上下文有关语言 2型文法(CFG) 2型语言或上下文无关语言 3型文法(RG)3型语言或正则(正规)语言
0型文法 如果对于某文法G,P中每个规则具有下列形式: 如文法G,其中VN={A,B,S} VT={0,1} P={ S→0AB 1B→0 α→β 其中α∈V+ , β ∈ V*,则该文法G为(Chomsky)0型文法或短语结构文法,缩写为PSG。相应的语言称为0型语言或短语结构语言。 如文法G,其中VN={A,B,S} VT={0,1} P={ S→0AB 1B→0 B→SA|01 A1→SB1 A0→S0B } L0(G[S])={ }
1型文法(上下文有关):它是0型文法的特例, 1型文法(上下文有关):它是0型文法的特例, 对P中的任一产生式α→β,都|β|≥|α|, 仅仅 S→ε除外,但S不得出现在任何产生式的右部。 例 文法G[S]: S→aSBE S→aBE EB→BE aB→ab bB→bb bE→be eE→ee 1型文法产生式的一般形式是 A→, , ∈ V* ,A∈VN , β∈V+ ,它表示当A的上文为且下文为时可把A替换成,因此称1型文法为上下文有关文法。
2型文法(上下文无关文法) :它是1型文 法的特例,对任一产生式α→β,都有 α∈VN , β∈(VN∪VT)* 例 文法G[S]: S→AB A→BS|0 B→SA|1 2型文法产生式的一般形式是: A→,它表示不管A 的上下文如何都可把A替换成,因此被称为上 下文无关文法。 通常程序设计语言的文法,可用2型文法来描述, 因此我们重点研究2型文法。如C,Pascal
3型文法(正规文法):它是2型文法的特例, 任一产生式α→β的形式都为 A→aB或 A→a,其中A ,B∈VN ,a∈VT 例如 文法G[S]: S→0A|1B|0 A→0A|1B|0S B→1B|1|0 在程序设计语言中,3型文法通常用来描述单词的结构。
文法类别 产生式形式 产生的语言 说明 0型文法 (短语文法) α→β α∈V+ ,且至少含一个非终结符,β∈V* 0型语言 对产生式基本无限制 1型文法 (上下文有关文法) α→β,|β|≥|α| 1型语言(上下文有关语言) 将A替换成时,必须考虑A的上下文 2型文法 (上下文无关文法) A→β,A∈VN , β∈V* 2型语言(上下文无关语言) 无需考虑A在上下文中的出现情况 3型文法 (正规文法) A→aB 或 A→a, A,B∈VN ,a∈VT 3型语言 (正规语言) 产生式全部是规定的形式
四种文法之间的逐级“包含”关系 2型文法 1型文法 3型文法 0型文法
2.5 上下文无关文法及其语法树 1.上下文无关文法(Context-Free Grammar) 自然语言是上下文有关的。 2.5 上下文无关文法及其语法树 1.上下文无关文法(Context-Free Grammar) 自然语言是上下文有关的。 上下文无关文法有足够的能力描述现今程序设计语言的语法结构 例:算术表达式:E→i|E+E|E*E|(E) <赋值语句>→i:=E <条件语句>→if <条件>then <语句> | if <条件> then <语句> else <语句> 我们更关心上下文无关文法产生的句子的分析
2.语法树(推导树Parse Tree) 作用:直观地描述上下文无关文法的句型推导过程。给定文法G=(VN,VT,P,S),对于G的任何句型都能构造与之关联的语法树
语法树的概念 定义:语法树是这样的一个语法结构,它的结点由符号组成。根结点对应于识别符号。只有非终结符号对应的结点有子结点。并且,一个结点和它的子结点分别对应于文法中的一个规则的左部和右部。 引入语法树的意义:作为识别句子的辅助工具,语法树可以表示句子的结构。这一点对于其后的语义分析有非常重要的意义。
语法树的相关概念 结点:每个树的结点对应于一个符号。结点的名字就是该符号。 边:两个结点之间的连线。 根结点:没有边进入的结点。 分支:某个结点向下射出的边和其结点称为分支。(父子结点,兄弟结点) 子树:语法树的某个结点和它向下射出的部分 末端结点:没有向下射出的边的结点成为末端结点。在相对于句型的语法树中,末端结点可能是非终结符号。
语法树的特征 给定文法G,G=(VN,VT,P,S),对于G的任何句型都能构造与之关联的语法树(推导树)。这棵树具有下列特征: 3、若一棵子树的根结点为A,且其所有直接子孙的标记从左向右的排列次序为A1A2…AR,那么 A::=A1A2..AR一定是P中的一条规则; 4、若一标记为A的结点至少有一个除它以外的子孙,则A∈VN 5、若树的所有叶结点上的标记从左到右排列为字符串w,则w是文法G的句型;若w中仅含终结符号,则w为文法G所产生的句子。
从推导构造语法树 例如:推导 S AB AcBd Accdd abccdd 方法:把识别符号做为根结点,对每一个直接推导画一个分支,分支的名字是直接推导中被替换的非终结符号,直到再无分支可画结束。 例如:推导 S AB AcBd Accdd abccdd S A B a b c B d c d
语法树的构造过程 S AB AcBd Accdd abccdd (1) (2) (3) (5) (4) S S S A B A B
E T + E T + T F T × T F T × 例:文法G:E→E+T|T T→T×F|F F→(E)|i 从左到右读出叶子结点得到的符号串,为文法的句型。也把该语法树称为该句型的语法树。 E=>E+T =>E+T×F =>T+T×F E=>E+T =>T+T =>T+T×F E T + E T + T F T × T F T × 从语法树中看不出句型中的符号被替代的顺序
从语法树构造推导 方法:从分支建立直接推导,然后从语法树中剪去之这个分支,直到无分支可剪。 语法树表明了在推导过程中使用了哪条规则和使用在哪个非终结符号上,但它并没有表明使用规则的顺序。 一棵语法树可能对应不止一种推导。
从语法树构造推导的过程 例如文法G[S]: S::=AB A::=aAb|ab B::=cBd|cd 存在下面的推导可能: S AB AcBd (4) (3) Accdd abccdd (2) (1) S AB abB abcBd abccdd (从后往前看) S (4) A B (3) a b c B d (1) c d (2)
4.文法的二义性(Ambiguity) 文法G:E→E+E|E×E|(E)|i 句子 i×i+i 对应的语法树 i E + × E × i 两个不同的最左推导: 推导1:E E+E E×E+E i×E+E i×i+E i×i+i 推导2:E E×E i×E i×E+E i×i+E i×i+i
如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。二义性文法存在某个句子,它有两个不同的最左(右)推导 定义: 如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。二义性文法存在某个句子,它有两个不同的最左(右)推导 文法G1: E→ E+E | E×E |(E) | i 文法G2: E→T|E+T T→F|T×F F→(E)| i 等价的无二义文法
为什么要避免文法产生二义性? 二义性的文法将给编译程序的执行带来问题。当编译程序对二义性文法生成的句子结构进行语法分析时,就会产生两种甚至更多种不同的理解。语法结构上的不确定性,必将导致语义处理上的不确定性。因此,希望描述语言的文法是无二义性的。
如何消除文法的二义性?(1) 方法一:不改变文法中原有的语法规则,仅加进一些语法的非形式规定。 如1:对于文法 G[E]: E → i E → E+E E → E*E E → (E) 规定运算符优先顺序和结合律,即*优先于+,+、*服从左结合。 如2:Pascal中二义性的消除是通过约定,如在符合if 语句中,else子句总是属于最近的尚无else子句的那个if语句。
如何消除文法的二义性?(2) 方法二:构造一个等价的无二义性的文法,即把排除二义性的规则合并到原有文法中,改写原有的文法。 如文法 G[E]: E → i E → E+E E → E*E E → (E) 将运算符的优先顺序和结合规则加到原有文法中,则可构造无二义性的文法 G’[E]: E → T|E+T T → F|T*F F → (E)|i
二义性文法的改造 文法的二义性是不可判定的: 注意:文法的二义性性与语言二义性的区别 因为可能有两个不同的文法G1和G2,其中有一个是二义性的,但却有L(G1)=L(G2)。如果产生某上下文无关语言的每个文法都是二义性的,则说明该语言是先天二义性的,即该语言是二义性的。
2.6 句型的分析 任务: 句型分析就是识别一个符号串是否为某文法的句型,是某个推导的构造过程。 2.6 句型的分析 任务: 句型分析就是识别一个符号串是否为某文法的句型,是某个推导的构造过程。 对于程序设计语言来说,句型分析就是一个识别输入符号串是否为语法上正确的程序的过程。 它是一种推导或语法树的构造过程。对于一个给定的符号串,试图按照文法的规则构造其对应的推导,或语法树。
从左到右的分析算法,即总是从左到右地识别输入符号串.句型分析算法采用从左到右的分析算法 句型的分析算法分类 自上而下分析法 (Top-Down parsing) 自下而上分析法 (Bottom-Up parsing)
2.6.1 自上而下的分析方法 定义: 从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。 2.6.1 自上而下的分析方法 定义: 从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。 语法树的构造:将文法的开始符号作为语法树的根,向下逐步建立语法树,使语法树的末端结点符号串正好是输入符号串。
例 文法G:S → cAd A → ab A → a 识别输入串w=cabd是否为该文法的句子 推导过程: S =>cAd =>cabd S c A d a b
假定要被代换的最左非终结符号是B,且有n条规则:B→A1|A2|…|An,那么如何确定用哪个右部去替代B? 自上而下方法的主要问题 对输入串cabd自上而下构造语法树的另一过程 S 不成功,不成功的原因是选错产生式A→a c A d a 自上而下分析的主要问题是选择产生式 : 假定要被代换的最左非终结符号是B,且有n条规则:B→A1|A2|…|An,那么如何确定用哪个右部去替代B?
2.6.2 自下而上的分析方法 定义:从输入符号串开始,逐步进行归约,直至归约到文法的开始符号。 2.6.2 自下而上的分析方法 定义:从输入符号串开始,逐步进行归约,直至归约到文法的开始符号。 语法树的构造:从输入符号串开始,以它作为语法树的末端结点符号串,自底向上的构造语法树
例 文法G:S → cAd A → ab A → a 识别输入串w=cabd是否为该文法的句子 归约过程: cabd |-cAd |-S 用“|-”表示归约,下划线部分为被归约符号 S A c a b d
自下而上分析的主要问题 对输入串cabd的两种归约过程 (1)cabd|-cAd|-S 归约到开始符 (2)cabd|-cAbd 不能归约到开始符 在自下而上的分析方法中,每一步都是从当前串中选择一个子串加以归约,该子串暂称“可归约串”。 如何确定“可归约串”是自下而上分析的主要问题。 为了刻划“可归约串”,引入下面的概念
短语,直接短语和句柄 定义: 设αβδ是文法G[S]中的一个句型,如果有S=>*αAδ且A=>+β,则称β是句型αβδ相对于非终结符A的短语 特别的如有A=>β,则称β是句型αβδ相对于规则A→β的简单短语。 一个句型的最左简单短语称为该句型的句柄(Handle)。 句柄就是“可归约串”
用语法树求短语、句柄 短语:(子)树的末端结点形成的符号串是相对于(子)树根的短语。 简单短语(直接短语):简单子树的末端结点形成的符号串是相对于简单子树根的简单短语。 句柄:最左简单子树的末端结点形成的符号串是句柄。 例:对于文法G[S]:S::=AB A::=Aa|bB B::=a|Sb 求句型baSb的全部短语、直接短语和句柄? baSb为句型baSb的相对于S的短语; ba为句型baSb的相对于A的短语; a为句型baSb的相对于B的短语,且为直接短语和句柄; Sb为句型baSb的相对于B的短语,且为直接短语。 S A B b a
例:文法G[E]: E→E+T|T T→T×F|F F→(E)| i 的一个句型是 T×F+i,相应的语法树见右图: . 因为E=>* T+i 且 T=>T×F,所以T×F 是句型相对于T的短语,且是相对 于T→T×F的直接短语 . 因为E=>* T×F+F 且 F=>i,所以i是句 型相对于F的短语,且是相对于F→i 的直接短语 . 因为E=>* E 且E=>+ T×F+i,所以 T×F+i是句型相对于E的短语 . T×F是最左直接短语,即句柄 E T + F × i
E T + F i 文法G[E]: E→E+T|T T→T×F|F F→(E)|i 的一个句型 是T×F+i 虽然F+i是句型T×F+i的一部分, 但不是短语,因为尽管有E=>+ F+i, 但是不存在从文法开始符 E=>* T×E的推导
E T + F i 短语与语法树 从句型的语法树上很容易找出句型的短语 语法树中每棵子树的末端结点构成相对于子树根的短语 例:文法G[E]的句型T×F+i语法树: E T + F × i 五棵子树对应三个短语T × F,i,T × F+i 两层子树的末端结点构成直接短语 两棵两层子树对应两个直接短语: T×F,i 位于最左边的两层子树的末端结点构成句柄: T×F
2.7 有关文法实用中的一些说明 有关文法的实用限制 有害规则和多余规则 有害规则:U→U ,无用且引起文法的二义 2.7 有关文法实用中的一些说明 有关文法的实用限制 有害规则和多余规则 有害规则:U→U ,无用且引起文法的二义 多余规则:所有句子推导都用不到的规则,表现形式: 不可到达:不在任何句型中出现的非终结符的规则,即除了开始符号外,U不出现在该文法的任何其他的规则的右部。 不可终止:不可推出终结符号串的非终结符的规则,若在推导中使用该规则,则在也不能推出终结符号串。
例:文法G[S]: (1)S→Be (2)B→Ce (3)B→Af (4)A→Ae (5)A→e (6)C→Cf (7)D→f 多余规则为: (7)不可到达 (6)不可终止 (2)也是多余的
第2章小结 文法←→语言←→句子 句型→推导的语法树→短语→简单短语→句柄 1 形式语言基础 字母表、符号串、空串、 2 文法和语言的定义★ 认真看书,理解概念。 文法←→语言←→句子 句型→推导的语法树→短语→简单短语→句柄 1 形式语言基础 字母表、符号串、空串、 符号串的长度、连接、(正则)闭包 2 文法和语言的定义★ 3 重要概念★★ (规范)推导、(规范)规约、句子、语言、 句型、短语、简单短语、句柄 4 文法的表示 5 文法和语言的分类
给出串aaabbabbba的最左、最右推导及推导树 作业1 :给出生成下述语言的上下文无关文法: (1) { an bn am bm | n,m>=0 } (2) { 1n 0m 1m 0n | n,m>=0 } (3) { an b bn | n>=1 } (4) { an b an | n>=0} 作业2:设有文法G G:S→aB∣bA A→aS∣bAA | aR B→bS ∣ aBB | b 给出串aaabbabbba的最左、最右推导及推导树
作业3 :有下面的文法G: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 求句型(F+i)-T*(E-T)的短语、简单短语和句柄。 作业4:.为句子i+i*i构造两棵语法树,从而证明 下述文法G[<表达式>]是二义的。 〈表达式〉->〈表达式〉〈运算符〉〈表达式〉 |(〈表达式〉)|i 〈运算符〉->+|-|*|/ 作业5: 文法G1: P->PaP|PbP|cP|Pe|f 证明文法G1是二义文法.