编译原理 复习资料 下载本文

四类文法的定义是通过逐步增加限制条件进行的。即有: 3型文法?2型文法?1型文法?0型文法。 三、例题

判断下列文法类型:

例1:文法G[S]:S →aSYZ S→aYZ aY→ay yY→yy yZ→yz ZY→YZ zZ→zz 0,1

例2:文法G[S]:S →xSYZ S→xYZ xY→x yY→yy yZ→yz ZY→YZ zZ→zz 0,1

例3:文法G[S]:S→aT T→bT|cT|b|c 0,1,2,3

例4:文法G[S]:S→xB|c B→Az A→cS 0,1,2,3

授课顺序:3

教学目的:使学生掌握语法树的构造、句型分析的方法,了解二义性文法的改

造和有关文法实用性的一些说明。

教学重点:句型分析

教学难点:二义性文法的改造、句型分析 授课学时:2学时

教学方式:多媒体讲授 教学内容:

3.4 上下文无关文法及语法树

上下文无关文法有足够的能力来描述现今程序设计语言的语法结构。今后如无特别说明,“文法”一词均指上下文无关文法。 一、语法树

语法树也称推导树,给定文法G=(VN, VT,P,S),对于文法G的任意一个句型都存在一个相应的语法树,它满足:

(1)树中每一个结点都有一个标记,此标记是V= VN∪VT中的一个符号。 (2)根的标记是S。

(3)苦树的一结点A至少有一个子女,则A∈VN。

(4)如结点A的子女结点从左到右次序为B1,B2...Bn,则必有产生式A→B1B2...Bn。 例:G[S]: S→aAS | a

A→SbA |SS |ba

对句型aabbaa的推导过程可表示为下图所示语法树。

下面两个推导过程均可由上图表示。

(1) S?aAS?aSbAS?aabAS?aabbaS?aabbaa (2) S?aAS?aAa?aSbAa?aSbbaa?aabbaa

这说明同一语法树可以表示对同一句型不同的推导过程。

二、最左(右)推导

1、如果每一步α?β中,都是对α中最左(右)非终结符进行替换, 则称之为最左(右)推导。

2、最右推导称为规范推导,由规范推导所得的句型称为规范句型。 3、同一语法树最多对应唯一的最左(右)推导。 4、一个句型有可能对应着不同的语法树。 例:文法G[E]: E→i | E+E | E*E | (E),则句型 i*i+i可能对应着下面两个最右推导: (1) E?E+E?E+i?E*E+i?E*i+i?i*i+i (2) E?E*E?E*E+E?E*E+i?E*i+i?i*i+i

三、二义性语法树

1、如果一个文法存在某个句子对应着两棵不同的语法树,则称此文法是二义的。不存在一种算法能在有限步骤内判断一个2型文法是否是二义的。

2、实际应用中,常找出一组无二义性的充分条件来构造无二义性文法。 3、例子

例1:下列简单算术表达式的文法是二义性文法。

E→E+E|E-E|E*E|E/E|(E) |id

引入新的非终结符后可变换为非二义性文法。

E→E+T|E-T|T T→T*F|T/F|F F→(E) |id

例2:If语句的文法G[S]:

S→if E then S S→if E then S else S S→E E→a≠0|a>0|b=1|b=-1|b=0 假设执行下列语句前b=0,有If句子:if a≠0 then if a>0 then b=1 else b=-1 则当a=1时,b=1;当a=-1时,b=-1; 当a=0时,b=0。 通过引入新非终结符、加ε规则进行改造后得文法:

(1)S→U|M|E (2) U→if E then S (3) U→if E then M else U (4) M→if E then M else M (5) M→ S (6) M→ ε (7) E→a≠0|a>0|b=1|b=-1|b=0

课堂作业:为上述改造前和和改造后的文法构造唯一的语法树。

3.6句型的分析

句型的分析就是识别一个符号串是否为某文法的一个句型。本课程介绍的分析算法都是从左到右的分析算法。它们分为两大类:自顶向下分析、自底向上分析 一、自顶向下分析

自顶向下分析:由根向下逐步建立语法树,是一个逐步推导的过程。 例:文法G[S]: S→cAd A→ab |a

对输入串cabd进行识别过程为:S?cAd?cabd,构造语法树步骤如图所示:

识别过程也有可能是S?cAd?cad,此时无法识别出串cabd,需要回溯。

二、自底向上分析

自底向上分析:自叶向上构造语法树,是一个逐步约的过程。自底向上分析法的核心在于寻找“可归约串”。

例:对串cabd归约过程为 cabd?cAd?S,构造语法树步骤如图所示:

归约过程也有可能是cabd?cAbd,此时无法识别出串cabd,也需要回溯。

三、句型分析的有关问题 1、基本概念

(1)令G[S]是一文法,αβδ是文法G的一个句型,如果有:S =*> αAδ,且A =+>β,则称β是句型αβδ相对于非终结符A的短语,如有A?β,则称β是αβδ相对于非终结符A或相对于规则A→β的直接短语(也叫简单短语)。

(2)一个句型的最左直接短语称为该句型的句柄。

注意: 作为短语的β必须是需要分析的句型αβδ的一部分。 2、例子

例1:已知文法G[E]: E→E+T | T T→T*F | F F→(E) | i 对于给定的句型i*i+i,指出该句型的所有短语、直接短语和句柄。 解:将句型改写为i1*i2+i3,则:

1)因 E=+>i1*i2+i3, E=+>i1*i2,故句型相对于E的短语有:i1*i2+i3,i1*i2。 2)因 T=+>i1*i2,T=+>i1,T=+>i3,故句型相对于T的短语有i1*i2, i1, i3。 3)因 F=+>i1,F=+>i2, F=+>i3,故句型相对于F的短语为:i1, i2, i3;且i1, i2, i3均为句型相对于规则F→i 的直接短语,其中i1为句柄。 下面根据语法树进行分析:

例2: G[S]: S→aAS S→ a A→SbA A→ SS A→ ba 要求对句型aabbaa的进行分析。

解:将句型改写为a1a2b1b2a3a4,则:

1)该句型相对于S的短语: a1a2b1b2a3a4和 a4; 2)该句型相对于A的短语: a2b1b2a3和b2a3; 3)该句型相对于Sàa的直接短语: a2,a4; 4)该句型相对于Aàba的直接短语: b2a3; 5)句柄:a2。