3型文法 G[S]: S→0A|1B|0 A→0A|1B|0S B→1B|1|0 G[I]: I → lT I → l T → lT T → dT T → l T → d 文法的类型 2型文法 1型文法 0型文法 四种文法之间的逐级“包含”关系 3型文法 文法和语言 0型文法产生的语言称为0型语言 1型文法或上下文有关文法( CSG )产生的语言称为1型语言或上下文有关语言(CSL) 2型文法或上下文无关文法( CFG )产生的语言称为2型语言或上下文无关语言( CF L ) 3型文法或正则(正规)文法( RG )产生的语言称为3型语言正则(正规)语言( RL ) 2.5 上下文无关文法及其语法树 从0型到3型文法,其后一类都是前一类的子集,且限制是逐步增强,而描述语言的功能是逐步减弱。 上下文无关文法有足够的能力描述现今程序设计语言的语法结构,比如描述算术表达式,描述各种语句等。 例文法G=({E},{+,*,i,(,)},P,E)其中P为: {E→i , E→E+E , E→E*E , E→(E) , 〈赋值语句〉→i∶=E } E表示算术表达式, i表示程序的“变量”,该文法定义了由变量,+,*,(和)组成的算术表达式的语法结构,即: 变量是算术表达式;若E1和E2是算术表达式,则E1+ E2,E1*E2和(E1)也是算术表达式 描述一种简单赋值语句的产生式: 〈赋值语句〉→i∶=E 描述条件语句的产生式: 〈条件语句〉→if〈条件〉then〈语句〉| if〈条件〉then〈语句〉else〈语句〉 2.5 上下文无关文法及其语法树 语法树:是一种描述上下文无关文法的句型推导的直观方法,也称推导树。 给定文法G=( VN,VT,P,S),对于G的任何句型都能构成与之关联的语法树(推导树)。这棵树满足下列4个条件: 每个结点都有一个标记,此标记是V的一个符号; 根的标记是S; 若一结点n至少有一个它自己除外的子孙,并且有标记A,则A肯定在VN中; 如果结点n的直接子孙,从左到右的次序是结点n1,n2,…,nk,其标记分别为A1,A2,…,AK,那么A ?A1A2A3…AK,一定是P中的一个产生式。 上下文无关文法的语法树的用处 用于描述上下文无关文法句型推导的直观方法 例: G[S]: S→aAS A→SbA A→SS S→a A→ba S a A S S b A a a b a 句型aabbaa的语法树(推导树) 叶子结点:树中没有子孙的结点。从左到右读出推导树的叶子标记连接成的文法符号串,为G[S]的句型。也把该推导树称为该句型的语法树。 上下文无关文法的语法树 推导过程中施用产生式的顺序 例: G[S]: S→aAS A→SbA A→SS S→a A→ba S a A S S b A a a b a 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)|aE?E+T ?T+T ?F+T ?a+T ?a+T*F ?a+F*F ?a+a*F ?a+a*a E?E+T ?E+T*F ?E+T*a ?E+F*a ?E+a*a ?T+a*a ?F+a*a ?a+a*a E?E+T ?T+T ?T+T*F ?F+T*F ?F+F*F ?a+F*F ?a+F*a ?a+a*a不同的推导过程,都可以得到一个相同的结果。 规范推导 规范句型 最左(最右)推导:在推导的任何一步α?β,其中α、β是句型,都是对α中的最左(右)非终结符进行替换 最右推导被称为规范推导。 由规范推导所得的句型称为规范句型 一棵语法树表示了一个句型的种种可能的(但未必是所有的)不
原创力文档

文档评论(0)