编译原理第三章概要.ppt

消除左递归规则 A grammar is left recursive if it has a nonterminal A such that there is a derivation A =+ Aα for some string α. A left-recursive production is like:A →Aα in which the leftmost symbol on the right side is the same as the nonterminal on the left side. The general case is that a nonterminal A with two productions A →Aα| β where αand β are sequences of terminals and nonterminals that do not start with A. And the left recursive pair of productions A →Aα| β could replaced by the non-left-recursive productions: A →β A’ A’ →αA’| ε Here A’ is a new nonterminal. The production A’ →αA’ is right recursive. * 练习 1. 写一文法,使其语言是偶正整数的集合。 要求: 允许0打头 (2)?不允许0打头 ?2.证明下述文法G[〈表达式〉]是二义的。 〈表达式〉∷=a|(〈表达式〉)|〈表达式〉〈运算符〉〈表达式〉 〈运算符〉∷=+|-|*|/ ? 3. 令文法G[E]为: E→T|E+T|E-T T→F|T*F|T/F F→(E)|i 证明E+T*F是它的一个句型,指出这个句型的所有短语、直接短语和句柄。 * 练习 4. 给出生成下述语言的上下文无关文法: (1){ anbnambm| n,m=0} (2) { 1n0m 1m0n| n,m=0} 5. 给出生成下述语言的三型文法: (1) { anbm|n,m=1 } (2){anbmck|n,m,k=0 } ? 6. 给出下述文法所对应的正规式: S→0A|1B A→1S|1 B→0S|0 * 一棵语法树表示了一个句型的种种可能的(但未必是所有的)不同推导过程,包括最左(最右)推导。 但是,一个句型是否只对应唯一的一棵语法树呢? 一个句型是否只有唯一的一个最左(最右)推导呢? * 例:G[E]: E → i E → E+E E → E*E E → (E) * E E + E E * E i i i E E * E i E + E i i 句型 i*i+i 的两个不同的最左推导,且有2棵不同的语法树: 推导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 二义文法 若一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的 或者,若一个文法存在某个句子有两个不同的最左(右)推导,则称这个文法是二义的 判定任给的一个上下文无关文法是否二义,或它是否产生一个先天二义的上下文无关语言,这两个问题是递归不可解的,但可以为无二义性寻找一组充分条件。 * 文法的二义性和语言的二义性是两个不同的概念。因为可能有两个不同的文法G和G′,其中G是二义的,但是却有L(G)=L(G′),也就是说,这两个文法所产生的语言是相同的。 二义文法改造为无二义文法 G[E]: E → i G[E]:E → T|E+T E → E+E T → F|T*F E → E*E F → (E)|i E → (E) 规定优先顺序和结合律 如果产生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。对于一个程序设计语言来说,常常希望它的文法是无二义的,因为希望对它的每个语句的分析是唯一的。 * 句型的分析 句型分析就是识别一个符号串是否为某文法的句型,是某个推导的构造过程。 在语言的编译实现中,把完成句型分析的程序称为分析程序或识别程序。分析算法又称识别算法。 从左到右的分析算法,即总是从左到右地识别输入符号串,首先识别符号串中的最左符号,进而依次识

文档评论(0)

1亿VIP精品文档

相关文档