编译原理第六章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
定义6.2 设G是一个不含ε产生式的算符文法,a和b 是任何两个非终结符,算符优先关系的定义如下: ⑴a=b 当且仅当G中含有形如A→…ab…或 A→…aBb…的产生式 ⑵a<b 当且仅当G中含有形如A→…aB…的产生 式,且B + b或B + Cb ⑶a>b 当且仅当G中含有形如A→…Bb…的产生 + a或B + Ac 式,且B 定义6.3 设G是一个不含ε产生式的速符文法, 如 果任意两个非终结符对a和b,之间至多只有三种关 系中的一种成立,则G是一个算符优先文法即OPG 文法
3
两种分析法的优缺点: 1.简单优先分析法准确,规范,但是分析效率低, 实际使用价值不大. 2.算符优先分析虽然是不规范的,但是它的分 析速度快,特别是使用与表达式的分析,因此在实际 应用中常常采取适当措施克服其缺点.
4
6.2 简单优先分析
6.2.1 优先关系 1.优先关系的表示:
X=Y 表示X和Y的优先关系相等. X>Y 表示X的优先性比Y的优先性大. X<Y 表示X的优先性比Y的优先性小.
14
优先函数分析的主要缺点:
我们在利用优先关系矩阵进行分析时,当两 个终结符对无优先关系的情况时,优先矩阵的相应 元素为出错信息,而用优先函数进行优先分析时, 对两个终结符对没有优先关系的情况不能进行区 分,因而出错时不能准确的指出出错位置.
15
6.3.5 算符优先分析算法的局限性:
由于算符优先分析法去掉了单非终结符之 间的归约,尽管在分析过程中,当决定是否为句柄 时采取一些检查措施,但仍难完全避免把错误的 句子得到正确的归约. 此外,通常一个通用语言的文法很难满足算 符优先文法的条件,因而致使算符优先分析法仅 适用于表达式的语法分析.
2.根据符号在句型中出现的相临关系来确定优先 关系:
① X=Y 当且仅当G中存在产生式规则A→…XY… ② X>Y 当且仅当G中存在产生式规则A→…BD…,且 B + …X和D * Y… ③ X<Y 当且仅当G中存在产生式规则A→…XB…,且 B * Y…
5
6.2.2 简单优先文法的定义: 若一个文法是简单优先文法必须满足以下条件: ⑴在文法符号集V中,任何两个符号之间最多只有 一种优先关系成立 ⑵在文法中任意两个产生式没有相同的右部. 6.2.3 简单优先分析法的操作步骤: 由简单优先分析法的基本思想可设计如下优 先分析算法,首先根据以知优先文法构造相应优先 关系矩阵,并将文法的产生式保存,设置符号栈S,算 法步骤如下: ⑴将输入符号串a1a2…an#依次逐个存入符号栈S 中,直到遇到栈顶符号ai>下一个待输入符号aj为止.
10
6.3.3 算符优先分析法
算符优先分析句型的性质 如果aNb或an出现在句型r中,则a和b之间只有 一种优先关系,即: 若a<b则在r中必含有b而不含a的短语存在 若a>b则在r中必含有a而不含b的短语存在 若a=b则在r中含有a的短语必含有b,反之亦然.
定义6.4 设有文法G[S],其句型的素短语是一个短 语,它至少包含一个终结符,并除自身外不包含其他 素短语,最左边的素短语称最左素短语.
12
优先函数的构造: A. 由定义直接构造优先函数
若已知文法G终结符之间的优先关系,可按如下步骤构 造其优先函数f,g 1.对每个终结符a∈Vt(包括#号在内)令f(a)=g(a)=1. 2.对每一终结符对逐一比较, 如果a>b,而f(a)≤g(b), 则令f(a)=g(b)+1 如果a<b,而f(a)≥g(b), 则令g(b)=f(a)+1 如果a=b,而f(a)≠g(b), 则令min{f(a),g(b)}=max{f(a),g(b)} 重复2, 直到过程收敛,如果重复过程中有一个值大于2n,则 表明该算符优先文法不存在算符优先函数.
11
6.3.4 优先函数
使用优先函数的优点: 表示算符之间的优先关系时,比起优先矩阵表 示,可以节省大量的存储空间.
百度文库
定义:
我们可以定义两个函数f,g满足如下条件: 当a=b时,则令f(a)=g(b) 当a<b时,则令f(a)<g(b) 当a>b时,则令f(a)>g(b) 对f,g,我们称它为优先函数.
6
⑵栈顶当前符号ai为句柄尾,由此向左在栈中找句柄 的头符号ak,即找到ak-1<ak为止 ⑶由句柄ak…ai在文法的产生式中查找ak…ai的产生 式,若找到则用相应左部代替句柄,若找不到则为出 错,这时可断定输入串不是该文法的句子. ⑷重复上述⑴、⑵、⑶步骤直到归约完输入 符号串, 栈中只剩文法的开始符号为止
2
优先分析可分为简单优先分析和算符优先分析. 1.简单优先分析的基本思想是对一个文法按 一定原则求出该文法所有符号即包括终结符和非 终结符之间的优先关系,按照这种关系确定归约过 程中的句柄,它的归约实际上是一种规范归约. 2.算符优先分析的基本思想则是只规定算符 之间的优先关系,也就是只考虑终结符之间的优先 关系,由于算符优先分析不考虑非终结符之间的优 先关系,在归约过程中只要找到可归约串就归约,并 不考虑归约到那个非终结符名,因此算符优先归约 不是规范归约.
7
6.3 算符优先分析法
算符优先分析法只考虑算符(广义为终结符)之间 的优先关系. 6.3.1 直观算符优先分析法 对于有些表达式,我们直观的给出算符之间的 优先关系,并且这种关系是唯一确定的,这样,对于 某些具有二义性的文法,其归约过程是唯一确定的. 注意:我们所说的算符之间的优先关系,是具有 有序性的.
1
6.1 自底向上优先分析概述
自底向上分析,也称移进-归约分析,它的实现思想 是对输入串自左向右进行扫描,并将输入符逐个移 入一个后进先出栈,边移入边分析,一旦栈顶符号串 形成某个句子的句柄或可归约串时,就用该产生式 的左部非终结符代替相应右部的文法符号串,这称 为一步归约.重复这一过程直到归约到栈中只剩下 文法的开始符号时则为分析成功,也就确认输入串 是文法的句子. 自底向上优先分析的关键问题是在分析的过程中 如何确定句柄,只有当句柄出现在栈顶符号串中时, 才可以用句柄归约.
8
6.3.2 算符优先文法的定义 定义6.1 设有一文法G,如果G中没有形如 A→…BC…的产生式,则称G为算符文法(Operater grammar)也称OG文法. 该文法的特征是任何一个产生式中都不包含 两个非终结符号相临的情况. 性质1 在算符文法中任何句型都不包含两个相临 的非终结符. 性质2 如果Ab(或bA)出现在算符文法的句型γ中, 其中A∈Vn,b∈Vt,则γ中任何含此b的短语 必含有A.
第6章 自底向上优先分析
6.1 自底向上优先分析概述 6.2 简单优先分析
6.2.1 优先关系 6.2.2 简单优先文法的定义 6.2.3 简单优先分析法的操作步骤
6.3 算符优先分析法
6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 直观算符优先法 算符优先文法的定义 算符优先分析算法 优先函数 算符优先分析法的局限性
16
13
B. 用关系图法构造优先函数
对于存在优先函数的优先矩阵,我们也可以用关系图法 构造优先函数,步骤如下: 1.对所有终结符a(包括#号)用有下脚标的fa,ga为结点名, 画出2n个结点. 2.若ai>aj或ai=aj,则从fai到gaj画一条箭弧 若ai<aj或ai=aj,则从gaj到fai画一条箭弧 3.给每个结点赋一个数,此数等于从该结点出发所能到达 的结点(包括该结点自身在内)的个数,赋给结点fai的数,就是 函数f(ai)的值,赋给gaj的数,就是函数g(aj)的值. 4.对构造出的优先函数,按优先关系矩阵检查一遍是否满 足优先关系的条件,若不满足时,则说明关系图中存在3个或 3个以上结点的回路,不存在优先函数.
定义6.2 设G是一个不含ε产生式的算符文法,a和b 是任何两个非终结符,算符优先关系的定义如下: ⑴a=b 当且仅当G中含有形如A→…ab…或 A→…aBb…的产生式 ⑵a<b 当且仅当G中含有形如A→…aB…的产生 式,且B + b或B + Cb ⑶a>b 当且仅当G中含有形如A→…Bb…的产生 + a或B + Ac 式,且B 定义6.3 设G是一个不含ε产生式的速符文法, 如 果任意两个非终结符对a和b,之间至多只有三种关 系中的一种成立,则G是一个算符优先文法即OPG 文法
3
两种分析法的优缺点: 1.简单优先分析法准确,规范,但是分析效率低, 实际使用价值不大. 2.算符优先分析虽然是不规范的,但是它的分 析速度快,特别是使用与表达式的分析,因此在实际 应用中常常采取适当措施克服其缺点.
4
6.2 简单优先分析
6.2.1 优先关系 1.优先关系的表示:
X=Y 表示X和Y的优先关系相等. X>Y 表示X的优先性比Y的优先性大. X<Y 表示X的优先性比Y的优先性小.
14
优先函数分析的主要缺点:
我们在利用优先关系矩阵进行分析时,当两 个终结符对无优先关系的情况时,优先矩阵的相应 元素为出错信息,而用优先函数进行优先分析时, 对两个终结符对没有优先关系的情况不能进行区 分,因而出错时不能准确的指出出错位置.
15
6.3.5 算符优先分析算法的局限性:
由于算符优先分析法去掉了单非终结符之 间的归约,尽管在分析过程中,当决定是否为句柄 时采取一些检查措施,但仍难完全避免把错误的 句子得到正确的归约. 此外,通常一个通用语言的文法很难满足算 符优先文法的条件,因而致使算符优先分析法仅 适用于表达式的语法分析.
2.根据符号在句型中出现的相临关系来确定优先 关系:
① X=Y 当且仅当G中存在产生式规则A→…XY… ② X>Y 当且仅当G中存在产生式规则A→…BD…,且 B + …X和D * Y… ③ X<Y 当且仅当G中存在产生式规则A→…XB…,且 B * Y…
5
6.2.2 简单优先文法的定义: 若一个文法是简单优先文法必须满足以下条件: ⑴在文法符号集V中,任何两个符号之间最多只有 一种优先关系成立 ⑵在文法中任意两个产生式没有相同的右部. 6.2.3 简单优先分析法的操作步骤: 由简单优先分析法的基本思想可设计如下优 先分析算法,首先根据以知优先文法构造相应优先 关系矩阵,并将文法的产生式保存,设置符号栈S,算 法步骤如下: ⑴将输入符号串a1a2…an#依次逐个存入符号栈S 中,直到遇到栈顶符号ai>下一个待输入符号aj为止.
10
6.3.3 算符优先分析法
算符优先分析句型的性质 如果aNb或an出现在句型r中,则a和b之间只有 一种优先关系,即: 若a<b则在r中必含有b而不含a的短语存在 若a>b则在r中必含有a而不含b的短语存在 若a=b则在r中含有a的短语必含有b,反之亦然.
定义6.4 设有文法G[S],其句型的素短语是一个短 语,它至少包含一个终结符,并除自身外不包含其他 素短语,最左边的素短语称最左素短语.
12
优先函数的构造: A. 由定义直接构造优先函数
若已知文法G终结符之间的优先关系,可按如下步骤构 造其优先函数f,g 1.对每个终结符a∈Vt(包括#号在内)令f(a)=g(a)=1. 2.对每一终结符对逐一比较, 如果a>b,而f(a)≤g(b), 则令f(a)=g(b)+1 如果a<b,而f(a)≥g(b), 则令g(b)=f(a)+1 如果a=b,而f(a)≠g(b), 则令min{f(a),g(b)}=max{f(a),g(b)} 重复2, 直到过程收敛,如果重复过程中有一个值大于2n,则 表明该算符优先文法不存在算符优先函数.
11
6.3.4 优先函数
使用优先函数的优点: 表示算符之间的优先关系时,比起优先矩阵表 示,可以节省大量的存储空间.
百度文库
定义:
我们可以定义两个函数f,g满足如下条件: 当a=b时,则令f(a)=g(b) 当a<b时,则令f(a)<g(b) 当a>b时,则令f(a)>g(b) 对f,g,我们称它为优先函数.
6
⑵栈顶当前符号ai为句柄尾,由此向左在栈中找句柄 的头符号ak,即找到ak-1<ak为止 ⑶由句柄ak…ai在文法的产生式中查找ak…ai的产生 式,若找到则用相应左部代替句柄,若找不到则为出 错,这时可断定输入串不是该文法的句子. ⑷重复上述⑴、⑵、⑶步骤直到归约完输入 符号串, 栈中只剩文法的开始符号为止
2
优先分析可分为简单优先分析和算符优先分析. 1.简单优先分析的基本思想是对一个文法按 一定原则求出该文法所有符号即包括终结符和非 终结符之间的优先关系,按照这种关系确定归约过 程中的句柄,它的归约实际上是一种规范归约. 2.算符优先分析的基本思想则是只规定算符 之间的优先关系,也就是只考虑终结符之间的优先 关系,由于算符优先分析不考虑非终结符之间的优 先关系,在归约过程中只要找到可归约串就归约,并 不考虑归约到那个非终结符名,因此算符优先归约 不是规范归约.
7
6.3 算符优先分析法
算符优先分析法只考虑算符(广义为终结符)之间 的优先关系. 6.3.1 直观算符优先分析法 对于有些表达式,我们直观的给出算符之间的 优先关系,并且这种关系是唯一确定的,这样,对于 某些具有二义性的文法,其归约过程是唯一确定的. 注意:我们所说的算符之间的优先关系,是具有 有序性的.
1
6.1 自底向上优先分析概述
自底向上分析,也称移进-归约分析,它的实现思想 是对输入串自左向右进行扫描,并将输入符逐个移 入一个后进先出栈,边移入边分析,一旦栈顶符号串 形成某个句子的句柄或可归约串时,就用该产生式 的左部非终结符代替相应右部的文法符号串,这称 为一步归约.重复这一过程直到归约到栈中只剩下 文法的开始符号时则为分析成功,也就确认输入串 是文法的句子. 自底向上优先分析的关键问题是在分析的过程中 如何确定句柄,只有当句柄出现在栈顶符号串中时, 才可以用句柄归约.
8
6.3.2 算符优先文法的定义 定义6.1 设有一文法G,如果G中没有形如 A→…BC…的产生式,则称G为算符文法(Operater grammar)也称OG文法. 该文法的特征是任何一个产生式中都不包含 两个非终结符号相临的情况. 性质1 在算符文法中任何句型都不包含两个相临 的非终结符. 性质2 如果Ab(或bA)出现在算符文法的句型γ中, 其中A∈Vn,b∈Vt,则γ中任何含此b的短语 必含有A.
第6章 自底向上优先分析
6.1 自底向上优先分析概述 6.2 简单优先分析
6.2.1 优先关系 6.2.2 简单优先文法的定义 6.2.3 简单优先分析法的操作步骤
6.3 算符优先分析法
6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 直观算符优先法 算符优先文法的定义 算符优先分析算法 优先函数 算符优先分析法的局限性
16
13
B. 用关系图法构造优先函数
对于存在优先函数的优先矩阵,我们也可以用关系图法 构造优先函数,步骤如下: 1.对所有终结符a(包括#号)用有下脚标的fa,ga为结点名, 画出2n个结点. 2.若ai>aj或ai=aj,则从fai到gaj画一条箭弧 若ai<aj或ai=aj,则从gaj到fai画一条箭弧 3.给每个结点赋一个数,此数等于从该结点出发所能到达 的结点(包括该结点自身在内)的个数,赋给结点fai的数,就是 函数f(ai)的值,赋给gaj的数,就是函数g(aj)的值. 4.对构造出的优先函数,按优先关系矩阵检查一遍是否满 足优先关系的条件,若不满足时,则说明关系图中存在3个或 3个以上结点的回路,不存在优先函数.