2第二章_文法与语言

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.2 文法与语言的形式定义
2.2.1 文法的形式定义 1. 重写规则 (产生式规则) 定义: 有序对(U,u) 或 U::=u
A → α(或A::=α) 其中,A是一个符号,称为产生式规则的左部,而 α是有穷 非空符号串,称为产生式规则的右部,“ → ”和“::=”表 示“定义为”或“由……组合成的”或“生成”,其含义是 左部符号用右部的符号串定义或左部符号生成右部符号串。 产生式规则可合写,如: A → α和 A → β可写为A → α | β
直接推导时,给定 v=xUy, 找到规则U::=u, 把u代替U, 得到 w=xuy 称v直接推导到w,记为:v => w 或 xUy => xuy
推导(直接推导序列):=>+ <句子> => ‹主语› ‹谓语› ‹状语› => ‹名词› ‹谓语› ‹状语› => Peter ‹谓语› ‹状语› => Peter ‹动词› ‹状语› => Peter swims ‹状语› => Peter swims ‹介词› ‹名词› => Peter swims in ‹名词› => Peter swims in river 推导时,给定符号串v, 找到 v=>u1=>u2=>…=>un-1=>w, 得到符号串w, 称v推导到w,记为:v =>+ w。
直接归约 :v=> w w直接归约为v 归约 : v=>+ w w归约为v 广义归约: v=>* w w广义归约为v
请对照比较推导与归约这两个概念。
重要概念:句型、句子
句型:Z=>* x, x ∈(VN∪VT)+
句子:Z=>* x,
x ∈VT+
例 Peter swims in river
注意:句子和<句子>在概念上的区别
xn=xn-1x=xxn-1
x0=Ɛ
|xy|=|x|+|y|
x3=(ab)3=ababab
|xn|=n |x| |x0|=0
2.1.3
符号串集合(语言)
1. 符号串集合的定义 2)表示法
枚举法 { 1,11,111,1111 }
1) 它是一切元素都是某字母表上的符号串的集合。
省略法 { 1,11,111,1111,┅ }

文法产生句型和句子的例子
【例】设有文法G[E]: E ::= E+T|E-T|T T ::= T*F|T/F|F F :: =(E)|i 试证明i+i*i是它的一个句子。 分析:只有证明i+i*i可由文法G从开始符号E推导出,即可证 明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
如:用标识符产生式规则产生句子area. <标识符> <标识符><字母下划线> <标识符>a <标识符><字母下划线> a <标识符>ea <标识符><字母下划线> ea <标识符>rea <字母下划线> rea area 其中,“=>”为推导。
17
ห้องสมุดไป่ตู้
2. 文法的定义
• 语言是一切句子的集合; 程序设计语言是一切程序的集合; 把程序看做程序设计语言的句子。
• • 程序是(程序设计)语言的句子
如何系统地构造程序?或者,一般地, 如何为一个(程序设计)语言生成句子?
2.1 符号串与符号串集合



语言实际上是一个符号串集合; 文法规定语言中句子的构造规则。 句子是一个语言之字母表上按一定规则构造的 符号串。 2.1.1 字母表 字母表: 有穷非空的符号集合。 例 A={ a, b, c } ∑={ 0,1 } C语言字母表={ 字母,数字,界限符 } 不同的语言有不同的字母表。 字母表上的元素(即符号)组成符号串。
n
{1,0}3=?
{1,0}n=?
3. 字母表的闭包与正闭包 闭包 A =A0∪A1∪┅∪An∪┅ {0,1,2}* 正闭包 A+= A1∪┅∪An∪┅ = A*- {}
* x∈A ,
*
{0,1,2}+ x∈A+, 则|x|>=1 则|x|>=0
任何一个语言是其字母表之正闭包的真子集。
如何找出此真子集?或说,如何找出其句子?
‹动词› ‹状语› swims ‹状语›
swims ‹介词› ‹名词› swims in ‹名词› swims in river
应用文法生成句子的步骤:
步骤1 以识别符号为当前符号串;
步骤2 对当前符号串中的一个非终结符号进行替换, 把它替换为以此非终结符号为左部的规则之右部符号串, 生成新的当前符号串; 步骤3 重复步骤2,直到当前符号串中不包含非终结 符号,最终不包含非终结符号的符号串就是所生成的句 子。
2.1.2 符号串:
1. 符号串及其长度 符号串:由字母表上的符号所组成的有穷序列。 字母表A={a,b,c}上的符号串:
a,b,c,ab,ba,aaa,aab,baa,abcab,ε (空串)
注意:顺序是重要的, ab≠ba
C语言字母表上的符号串?
长度:|aabcaca|=7 |ε |=0
2. 子符号串 若u=xvy ,其中 |v|≠0 ( |u|>=|v|) 则v是u中的子符号串。(非空符号串) 例 a+(b-c)/d中的子符号串
说明: 每步的当前符号串将称为句型, 最终的终结符号串称为句子。
按上述步骤应用各个规则,可生成:
Berry swims in river 甚至可生成:river swims in Peter 表明:语法上的正确性不能保证语义上的正确性。
对当前句型中任一非终结符号进行替换,都将生成 新的句型,最终生成句子。但宜用系统的方式进行推导, 如,每步对最左的或最右的非终结符号进行替换。这时, 分别称为最左推导与最右推导。 引进句子生成中的两个重要概念:推导与归约。
3. 应用文法产生语言的句子 G[<句子>]: 1. <句子>::=<主语><谓语><状语> 2. <主语>::=<名词> 3. <谓语>::=<动词> 4. <状语>::=<介词><名词> 5. <名词>::=Peter 6. <名词>::=Berry 7. <名词>::=river 8. <动词>::=swims 9. <介词>::=in
直接推导 : => xUy => xuy
‹句子› => ‹主语› ‹谓语› ‹状语› ‹主语› ‹谓语› ‹状语› => ‹名词› ‹谓语› ‹状语›
‹名词› ‹谓语› ‹状语› => Peter ‹谓语› ‹状语› Peter ‹谓语› ‹状语› => Peter ‹动词› ‹状语› Peter ‹动词› ‹状语› => Peter swims ‹状语› Peter swims ‹状语› => Peter swims ‹介词› ‹名词› Peter swims ‹介词› ‹名词› => Peter swims in ‹名词› Peter swims in ‹名词› => Peter swims in river
例 试以文法G [<句子>]为例考察如何应用文法 来生成句子。 替换为 ‹句子›=>‹主语› ‹谓语› ‹状语› =>‹名词› ‹谓语› ‹状语› =>Peter ‹谓语› ‹状语› =>Peter =>Peter =>Peter =>Peter =>Peter
(规则1) (规则2) (规则5)
(规则3) (规则8) (规则4) (规则9) (规则7)
一般,从识别符号开始推导,例如, <句子> =>+ Peter ‹谓语› ‹状语› <句子> =>+ Peter swims in river 推导长度:直接推导的步数。
直接推导 : => 直接推导时,给定v=xUy, 在其中找出U,应用规则U::=u, 得到 w=xuy, 称v直接推导到w, 或w直接归约到v,记为 v => w 一般,总有: U::=u xUy => xuy 推导: =>+ 推导时,给定符号串v, 找出直接推导序列: v=>u1=>u2=>…=>un-1=>w 得到符号串w, 称v推导到w, 或w归约到v,记为: v =>+ w n称为推导的长度。 广义推导: =>* 若 v =>+ w 或 v=w,则称v广义推导到w, 或广义 归约到v。
3. 符号串的头与尾(前缀、后缀) abc的头: a, ab, abc, Ɛ x=t… abc的尾: c, bc, abc, Ɛ x=…t
4. 对符号串的运算
联结(或并置): x=ab xy=abba
y=ba yx=baab
对任何符号串x, 有x=x=x。
方幂: xn=xx…x (x自身联结n次)

规则构造的例子
C语言标识符的规则: <标识符>::=<字母下划线> <标识符> ::= <标识符><字母下划线> <标识符> ::= <标识符><数字> <字母下划线> ::= A|…|Z <字母下划线> ::= a|…|z <字母下划线> ::= _ <数字> ::= 0|…|9
16
用规则产生句子的例子
2. 对符号串集合的运算 乘积:AB={ xy | x ∈A 且 y ∈ B } {1,0} {a,b,c}=? 对任何符号串x有x=x=x,A0={ε} 因此,{}A=A{}=A,但ØA=AØ=Ø。 方幂: An =AA…A (n 个A乘积)
An=An-1A=AAn-1
特例,字母表A的方幂 ,x∈A , | x |=n
1. 重写规则 (产生式规则)
规则表示法:通常的 E::=E+T E::=T 或 E::=E+T | T 扩充的 E::=T{+T} 术语:非终结符号,
非终结符号集VN 终结符号,(不会出现在规则左部) 终结符号集VT ( VN ∩VT=Ø V= VN ∪VT )
单规则:右部是单个非终结符
{ } 用于指定重复次数 <标识符>::= <字母> {<字母数字>}05 [ ] 内中符号至多出现一次 <整数>::= [+|-]<数字>{< 数字>} ( ) 提公因子 E::=E+T|E-T 可改写为 E::=E(+|-)T
文法G[Z]是非空有穷的重写规则集合,其中 Z是识别符号(或称开始符号),G是文法名。 例G1[E]:E::=E+T E::=T T::=T*F T::=F F:=(E) F::=i
G2[E]:E::=E+T |T F::=(E) F::=i T::=T*F|F
G[E]:E::=T{+T} T::=F{*F} F::=(E) | i 文法的四要素:VN,VT,P,Z P有穷非空的重写规则集,识别符号Z VN
编译原理
Compiler Principles
2013年9月
闫雷鸣
第二章 文法与语言
讨论问题: 文法和语言的概念和定义 文法和语言的分类 文法等价变换 句型分析

简单回顾





对程序的理解 程序是计算机执行的一系列指令; 程序是计算任务的 处理对象和处理规则的描述。 • 对程序设计语言的理解 程序设计语言是程序的书写规范; 程序设计语言的要素: 一组记号(符号)和一组规则。 程序设计语言程序是 程序设计语言之符号集合上的、 按一定规则组成的符号串。
注意:应用文法生成句子仅是形式上的。
例 river swims in Peter
注:句子也是句型,但句型不一定是句子。
文法产生句型和句子的例子
【例】设有文法G[Z]: Z::=aZb| Ɛ 有推导: Z =>* Ɛ Z =>* aZb=> aaZbb =>* aaabbb 可见,符号串 ε,aZb,aaZbb和aaabbb都 是文法G[Z]的句型,而 ε 和aaabbb才是文 法G[Z]的句子。
对照: 直接推导v=> w (U::=u v=xUy w=xuy) (推导长度=1) 推导 v=>+ w(v=>u1=>…=>un-1=>w) (推导长度1) 广义推导v=>* w(v=>+ w 或 v=w) (推导长度0)
通常考虑的都是从识别符号出发的推导: + Z=>* x x ∈(VN ∪ VT)
描述法 { 1i | i≥1 } 或{x |x全由1组成,|x|≥1} 注意:一定不能涉及含义, 如{ x |x=∑10i }。
字母表∑上的一个语言就是∑上的一些 符号串组成的集合。 空集 ф 是一个语言,仅含一个空符 号串集合{ф }也是一个语言。特别需要指 出的是, Ɛ 和{Ɛ }是不同的语言。
相关文档
最新文档