730 likes | 920 Views
语法描述图. 文法的 EBNF 表示. < > :用左右尖括号括起来的中文字表示 语法构造成分,或称语法单位,为非 终结符 ∷= :该符号的左部由右部定义,可读作 ‘ 定义为 ’ | :表示 ‘ 或 ’ ,为左部可由多个右部定义 { } :花括号表示其内的语法成分可以重 复。 [ ] :方括号表示其内的成分为任选项 ( ) :表示圆括号内的成分优先. EBNF 描述<整数>文法的定义. <整数>∷=[+|-]<数字>{<数字>} <数字>∷=0|1|2|3|4|5|6|7|8|9
E N D
< > :用左右尖括号括起来的中文字表示 语法构造成分,或称语法单位,为非 终结符 • ∷= :该符号的左部由右部定义,可读作 ‘定义为’ • | :表示‘或’,为左部可由多个右部定义 • { } :花括号表示其内的语法成分可以重 复。 • [ ] :方括号表示其内的成分为任选项 • ( ) :表示圆括号内的成分优先
EBNF描述<整数>文法的定义 • <整数>∷=[+|-]<数字>{<数字>}<数字>∷=0|1|2|3|4|5|6|7|8|9 • 或更好的写法<整数>∷=[+|-]<非零数字>{<数字>}|0<非零数字>∷=1|2|3|4|5|6|7|8|9 <数字>∷=0|<非零数字>
<程序>∷=<分程序>. • <分程序>∷=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句> • <常量说明部分>∷=CONST<常量定义> {,<常量定义>}; • <常量定义>∷=<标识符>=<无符号整数> • <无符号整数>∷=<数字>{<数字>} • <变量说明部分>∷=VAR<标识符>{,<标识符>}; • <标识符>∷=<字母>{<字母>|<数字>} • <过程说明部分>∷=<过程首部><分程序>{;<过程说明部分>};
<过程首部>∷=PROCEDURE<标识符>; • <语句>∷=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>|<空> • <赋值语句>∷=<标识符>∶=<表达式> • <复合语句>∷=BEGIN<语句>{;<语句>}END • <条件>∷=<表达式><关系运算符><表达式>|ODD<表达式> • <表达式>∷=[+|-]<项>{<加法运算符><项>} • <项>∷=<因子>{<乘法运算符><因子>}
<因子>∷=<标识符>|<无符号整数>|'('<表达式>')' • <加法运算符>∷=+|- • <乘法运算符>∷=*|/ • <关系运算符>∷=#|=|<|<=|>|>= • <条件语句>∷=IF<条件>THEN<语句> • <过程调用语句>∷=CALL<标识符> • <当型循环语句>∷=WHILE<条件>DO<语句> • <字母>∷=a|b|…|X|Y|Z • <数字>∷=0|1|2|…|8|9
语言 • 程序设计语言同自然语言一样,它的完整的定义应包括语法和语义两个方面。 • 语法是表示构成语言句子的各个记号之间的组合规律。目前广泛使用的手段是上下文无关文法 • 语义表示按照各种表示方法所表示的各个记号的特定含义。(各个记号和记号所表示的对象之间的关系)
形式语言 • 如果不考虑语义,只从语法这一侧面来看语言,这种意义下的语言称作形式语言 • 形式语言抽象地定义为一个数学系统 • “形式”是指这样的事实:语言的所有规则只以什麽符号串能出现的方式来陈述 • 形式语言理论是对符号串集合的表示法、结构及其特性的研究
文法的直观概念 • 即对于含有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题 • 以语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构, • 这些规则看成是一种元语言,用它描述语言。
例 • <句子>∷=<主语><谓语><主语>∷=<代词>|<名词><代词>∷= 我 | 你 | 他<名词>∷= 王明 | 大学生 | 工人 | 英语<谓语>∷=<动词><直接宾语><动词>∷= 是 | 学习<直接宾语>∷=<代词>|<名词> • “我是大学生”符合上述规则 • “我大学生是”不符合上述规则
推导或产生句子 • <句子>=> <主语><谓语> => <代词><谓语> => 我<谓语> => 我<动词><直接宾语> => 我是<直接宾语> => 我是<名词> => 我是大学生 <句子>∷=<主语><谓语><主语>∷=<代词>|<名词><代词>∷= 我 | 你 | 他<名词>∷= 王明 | 大学生 | 工人 | 英语<谓语>∷=<动词><直接宾语><动词>∷= 是 | 学习<直接宾语>∷=<代词>|<名词>
符号和符号串 • 每个程序都是一个"基本符号"串,设有一基本符号集 • 符号:可以相互区别的记号(元素)。 • 字母表S:符号(元素)的非空有穷集合。 • 符号串:由字母表S中的符号组成的任何有穷序列称为该字母表上的符号串。 • 符号串ε(没有符号的符号串)是S上的符号串 称为空串
例 • 字母表:26个英文字母组成的集合{a,b,c…,z} • 符号:a,b • 符号串: a,b,c,ab,aa,…… 注:在符号串中,有符号的顺序要求 例:
符号串的运算 • 符号串的长度:符号串中符号的个数.符号串s的长度记为|s|。 ε的长度为0 • 符号串的头、尾:设z=xy是一符号串,则x是z的头,y是尾 • 固有头、尾:设z=xy是一符号串,且x非空,则y是z的固有尾;设z=xy是一符号串,且y非空,则x是固有头 • 连接:符号串x、y的连接,是把y的符号写在x的符号之后得到的符号串xy 如 x=ab,y=cd 则 xy=abcd 有εa = aε
Z=abc • Z的头有ε,a,ab,abc • Z的固有头有ε,a,ab • Z的尾有ε,c,bc,abc • Z的固有尾有ε,c,bc
方幂:符号串自身连接n次得到的符号串an定义为 aa…aa (n个a) a1=a, a2=aa则a0=ε使用∑* 表示S上的一切符号串(包括ε)组成的集合。∑*称为Σ的闭包。∑上的除ε外的所有符号串组成的集合记为∑+ 。 ∑+ 称为Σ的正闭包。 • ∑*=∑0∪∑1∪∑2∪… ∪∑n… • ∑+=∑1∪∑2∪… ∪∑n… • ∑*=∑0∪∑+ • ∑+=∑∑*= ∑*∑
例: x0= ε , x1=x, x2=xx, x3=x2x=xx2=xxx, ……, xn=xn-1x=xxn-1=xx…x 设x=abc 则x2=abcabc
符号串集合:若集合A中的一切元素都是某字母表上的符号串,则称A为该字母表上的符号串集合符号串集合:若集合A中的一切元素都是某字母表上的符号串,则称A为该字母表上的符号串集合 • 符号串集合的乘积:设A、B是两个符号串集合,AB表示A与B的乘积,则定义 AB={xy|x ∈ A ,y ∈ B} 例:设A={ab,c} B={d,efg},则 AB={abd,abefg,cd,cefg} 注:{ε}A=A{ε}=A ΦA=AΦ=A 其中Φ={}为空集 一般AB ≠ BA
符号串集合的方幂:同一符号串集合的乘积也可写成方幂形式符号串集合的方幂:同一符号串集合的乘积也可写成方幂形式 • 设符号串集合A,则定义 A0={ε} A1=A A2=AA A3=A2A=AA2=AAA …… An=An-1A=AAn-1=AA…A 例: A={a,bc} A2=AA={aa,abc,bca,bcbc}
符号串集合的闭包:设符号串集合A,A的闭包记为A*,则有A*=A0∪A1∪A2∪…… ∪An∪…… • 符号串集合的正闭包: A的正闭包记为A+ A+=A1∪A2∪…… ∪An∪…… • A*={ε}∪A+=A+∪{ε} • A+=AA*=A*A • 对于所有的符号串集A,有ε ∈A*
文法和语言的形式定义 产生式 也称规则、重写规则或生成式 是形如α→β或α::=β的(α, β)有序对 其中: α是某字母表V的正闭包V+中的一个符号 β是V*中的一个符号 α称为规则的左部, β称为规则的右部 将一个符号串用另一个符号串替换
文法G定义为四元组(Vn,VT,P,S)。其中Vn为非终结符号(或语法实体,或变量)集;VT为终结符号集;P为产生式(也称规则)的集合;Vn,VT和 P是非空有穷集。S称作识别符号或开始符号,它是一个非终结符,至少要在一条产生式中作为左部出现。 • Vn和VT不含公共的元素,即Vn∩VT=φ • 通常用V表示Vn∪VT,V称为文法G的字母表或字汇表
例 • 文法G=(Vn,VT,P,S),其中Vn={S},VT={0,1},P={S→0S1,S→01}。这里,非终结符集中只含一个元素S;终结符集由两个元素0和1组成;有两条产生式;开始符号是S • 一般约定:第一条产生式的左部是识别符号,大写字母表示非终结符号,小写字母表示终结符号,将G写成G[S],其中S是识别符号,
G:S→0S1 S→01或G[S]:S→0S1 S→01 • 有时,为书写简洁,常把相同左部的产生式,形如A→α1 A→α2 … A→αn缩写为:A→α1|α2|…|αn这里的元符号"|"读做"或"。
一个文法的几种写法 ②G:S→aAb A→ab A→aAb A→ε ④ G[S]: A→ab|aAb|ε S→aAb • ①G=({S,A},{a,b},P,S)其中P:S→aAb A→ab A→aAb A→ε • ③G[S]:A→ab A→aAb A→ε S→aAb
推导 • 即定义V*中的符号之间的关系:直接推导 、长度为n(n≥1)的推导 和长度为n(n≥0)的推导 • 如α→β是文法G=(Vn,VT,P,S)的规则(或说是P中的一产生式),γ和δ是V*中的任意符号,若有符号串v,w满足:v=γαδ,w=γβδ则说v(应用规则α→β)直接产生w,或者说,w是v的直接推导,也可以说,w直接归约到v,记作v w
例 • G[S]:S→0S1 S→01 • v=0S1,w=0011,直接推导:0S1 0011,使用的规则:S→01,这里γ=0,δ=1 • v=S,w=0S1,直接推导:S 0S1使用的规则:S→0S1,这里γ=ε,δ=ε • v=0S1,w=00S11,直接推导:0S1 00S11,使用的规则:S→0S1,这里γ=0,δ=1
如果存在直接推导的序列:v=w0 w1 w2… wn=w,(n>0)则称v推导出(产生)w(推导长度为n),或称w归约到v。记作v w。 • 若有v w,或v = w,则记作v w。 • 长度为n(n≥1)的推导 和长度为n(n≥0)的推导 • 存在直接推导序列v=0S1 00S11 000S111 00001111=w,即0S1 00001111,也可记作0S1 00001111
句型和句子 • 设G[S] 是一文法,如果符号串x是从识别符号推导出来的,即有S x,则称x是文法G[S]的句型 • 若x仅由终结符号组成,即S x,x∈VT*,则称x为G[S]的句子。 • S,0S1,000111都是文法G的句型,其中000111是G的句子。
例:文法G[E]: E→E+T | T T→T*F|F F→(E)|i 符号串E+T、E+T*F等以及符号E都是文法G的句型 即 所以终结符号串i+i*i是文法G的句子
语言:设S是文法G的识别符号,则文法G的语言定义为语言:设S是文法G的识别符号,则文法G的语言定义为 • 即文法的语言是文法的所有句子构成的集合 • 文法等价:若L(G1)=L(G2),则称文法G1和G2是等价的。
G[S]:S→0S1 S→01 • L(G)={0n1n | n≥1} • 文法G[A]: A→0R A→01 R→A1 和文法G[S]等价
文法的类型 • 乔姆斯基把文法分成四种类型,即0型、1型、2型和3型 • 这几类文法的差别在于对产生式施加不同的限制。 • 设G=(VN,VT,P,S),如果它的每个产生式α→β是这样一种结构:α∈( VN∪VT )*且至少含有一个非终结符,而β∈( VN∪VT )*,则G是一个0型文法。
设G=(VN,VT,P,S)为一文法,若P中的每一个产生式α→β均满足|β|≥|α| ,仅S→ε除外,则文法G是1型或上下文有关的。 • 设G=(VN,VT,P,S),若P中的每一个产生式α→β满足:α是一(个)非终结符,β∈( VN∪VT )*则此文法称为2型的或上下文无关的。 • 设G=(VN,VT,P,S),若P中的每一个产生式的形式都是A→aB或A→a,其中A和B都是非终结符,a是终结符,则G是3型文法或正规文法(右线形文法)。
G[S]:S→0S1 S→01 1型,2型文法 • G[S]:S→aB A→bAA S→bA B→b A→a B→bS A→aS B→aBB 2型文法 • 文法G[S]:S→0A A→1B S→1B B→1B S→0 B→1 A→0A B→0 A→0S 正规文法。
四个文法类的定义是逐渐增加限制的 • 因此每一种正规文法都是上下文无关的 • 每一种上下文无关文法都是上下文有关的 • 而每一种上下文有关文法都是0型文法
上下文无关文法及其语法树 • 语法树:也称推导树,是一种描述上下文无关文法的句型推导的直观方法. • 给定文法G=(VN,VT,P,S),对于G的任何句型都能构造与之关联的语法树(推导树)。 • 语法树满足下列4个条件:① 每个结点都有一个标记,此标记是V的一个符号。② 根的标记是S。③ 若一结点n至少有一个它自己除外的子孙,并且有标记A,则A肯定在Vn中。④ 如果结点n的直接子孙,从左到右的次序是结点n1,n2,…,nk,其标记分别为A1,A2,…,Ak,那么A→A1A2,…,Ak一定是P中的一个产生式。
例:文法G[E]: E→E+T T→T*F|F F→(E)|i 的句型E+(E+T)*F的语法树为:
推导一:S→aAS→aAa→aSbAa→aSbbaa→aabbaa推导二:S→aAS→aSbAS→aabAS→aabbaS→aabbaa推导三:S →aAS→aSbAS→aSbAa→aabAa→aabbaa
语法树表示了在推导过程中使用了哪些产生式和施用在哪个非终结符上,但并没有表明使用产生式的顺序。语法树表示了在推导过程中使用了哪些产生式和施用在哪个非终结符上,但并没有表明使用产生式的顺序。 • 一个句子不一定只对应唯一的一棵语法树 • 如果在推导的任何一步α β,其中α,β是句型,都是对α中的最左(最右)非终结符进行替换,则称这种推导为最左(最右)推导。 • 在形式语言中,最右推导常被称为规范推导。由规范推导所得的句型称为规范句型。
文法G[E]: E→E+T|T T→T*F|F F→(E)|i 对于句子i+i*i 有规范推导:
二义性 • 如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。 • 或者说,若一个文法中存在某个句子,它有两个不同的最左(最右)推导,则这个文法是二义的。 • 文法是二义的,其语言却不一定。 • 如果产生上下文无关语言的每一个文法都是二义的,则说此文法是先天二义的。
文法G=({E},{+,*,i,(,)},P,E)其中P为:E→i E→E+E E→E*E E→(E)文法G=({E},{+,*,i,(,)},P,E)其中P为:E→i E→E+E E→E*E E→(E) • 句型i*i+i,文法G是二义的 • 推导一:E→E+E→E*E+E→i*E+E→i*i+E→i*i+i推导二:E→E*E→i*E→i*E+E→i*i+E→i*i+i
无二义文法G[E]: E→T|E+T T→F|T*F F→(E)|i无二义文法G[E]: E→T|E+T T→F|T*F F→(E)|i • 文法G=({E},{+,*,i,(,)},P,E)其中P为:E→i E→E+E E→E*E E→(E)
上下文无关文法的句型分析 • 句型的分析就是识别一个符号串是否为某文法的句型,是某个推导的构造过程。 • 语法树将所给句型的结构很直观地显示出来, 是句型结构分析的极好工具。 • 因此语法树也称为语法分析树或分析树。 • 句型分析是识别一个输入符号串是否为语法上正确的程序的过程。 • 在语言的编译实现中,把完成句型分析的程序称为分析程序或识别程序