编译原理----算符优先级的分析(自底向上)

简介: 编译原理----算符优先级的分析(自底向上)

自底向上分析的分类如下所示:

算符优先关系表的构造

算符优先分析只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。

(一)若有文法G,如果G没有形如A->..BC..的产生式,其中B和C为非终结符,则称G为算符文法。

以下例子中G就是算符文法(没有连在一起的非终结符)

E->T|E+T|E-T

T->F|T*F|T/F

F->(E)|i

(二)



这里就用=,< 和 > 代替:


(1)a=b,当且仅当G中含有形如A--->..ab...或A---->...aBb...的产生式


(2)a<b,当且仅当G种含有形如A--->...aB...的产生式,且B能多步推导出右侧式子



(3)a>b,当且仅当G中含有形如A--->...Bb...的产生式,且B能多步推导出右侧式子



这里理解起来也很简单,a<b,那么a就要小于B推导出的式子中最前面的终结符b,a>b同理


这里的推导较为复杂,我们可以演化出下面这一方法:



这样a<b,a>b的定义就为:


a<b,当且仅当G种含有形如A--->...aB...的产生式,且a小于B的FIRSTVT集合中的所有终结符


a>b,当且仅当G中含有形如A--->...Bb...的产生式,且B的LASTVT的所有终结符大于b

构造规则:


FIRSTVT:


(1)若有T->a...或T->Ra...,则aFIRSTVT(T)


(2)若有aFIRSTVT(R),且有产生式T->R...,则aFIRSTVT(T)


LASTVT:


(1)若有T->...a或T->...aR,则aLASTVT(T)


(2)若aLASTVT(R),且产生式T->...R,则aLASTVT


(三)设有一个不含产生式的算符文法G,如果任一终结符对(a,b)之间至多只有<,>,=3种关系种的一种成立,则称G是一个算符优先文法。即,两个终结符之间的优先关系是有序的,允许有a>b,b<a同时存在,但是不允许有a<b,a>b,a=b3种关系中的任一两种关系同时存在。


示例:

FIRSTVT集合:


(1)首先根据E->E+T|T的E->E+T,可得(注:行代表终结符,列代表非终结符)



(2)再看E->E+T|T 的E->T,需要把T的FIRSTVT元素放到E中,但是此时T中没有✔元素,所以



(3)T->T*F|F中的T->T*F



(4)T->T*F|F中的T->F,而F没有✔项



(5)F->(E)|i 中的F->(E)



(6)F->(E)|i 中的F->i



这是第一遍遍历式子,因为表有变化,所以要继续进行遍历,直到表不变

(1)首先根据E->E+T|T的E->E+T,可得



(2)再看E->E+T|T 的E->T,需要把T的FIRSTVT元素放到E中



(3)T->T*F|F中的T->T*F



(4)T->T*F|F中的T->F,将F中的✔项放到T中



表依旧有改变,继续遍历,直到没有出现新的内容



所以得出结论:

E(FIRSTVT)={+,*,{,},i}


T(FIRSTVT)={*,(,i}


F(FIRSTVT)={(,i}

LASTVT的操作步骤同理,得到:



接下来继续回到算符优先关系中


竖列表示在前面的终结符,横列表示在后面的终结符



针对a=b


F->(E)|i,这里的“(”和“)”遵循a=b的定义,即A->..aBb...



针对a<b,就是要找到a后面跟的非终结符,这个非终结符中的FIRSTVT集合的元素就是满足要求的元素。


E->E+T|T中的+T,T(FIRSTVT)= {*,(,i}


T->T*F|F中的*F,F(FIRSYVT) = {(,i}


F->(E)|i中的(E,E(FIRSTVT)= {+,*,{,},i}



针对a>b,就是要找到a前面跟的非终结符,这个非终结符中的LASTVT集合的元素就是满足要求的元素:


E->E+T|T中的E+


T->T*F|F的T*


F->(E)|i 的E)

最终得到:

总结:

对于a<b,就要找终结符后面的非终结符(*F)的FIRSTVT集合(F的FIRSTVT集合)

对于a>b,就要找终结符前面的非终结符(F*)的LASTVT集合(F的LASTVT集合)

构造优先函数

例如:

其的优先函数为:这里假设列为f,行为g,接着由大的指向小的

构造优先函数表

对应的优先函数表如图所示,这里的数字代表的是可经过的结点数:

f+从f+出发,算一个经过的节点,再到g+,也算一个经过的节点,所以总数为2

f*可以经过以下4个节点

目录
相关文章
|
4月前
|
存储 数据可视化 安全
万字长文读懂低代码(Low-Code)前世今生、分类、能力、趋势及选型
低代码是一种可视化应用开发方式,通过拖拽、配置等方式快速构建系统,降低开发门槛,提升效率。它起源于上世纪80年代,发展至今已广泛应用于ERP、CRM、MES等企业系统。低代码平台具备可视化编程、预置组件、快速部署、多端支持等功能,适合不同规模企业的多样化需求。相比传统开发,其优势在于缩短开发周期、促进业务与技术融合。
|
JavaScript 搜索推荐 前端开发
理解服务器端渲染(SSR):提高网页性能与SEO的秘籍
理解服务器端渲染(SSR):提高网页性能与SEO的秘籍
构造LR(1)分析表和LALR(1)分析表
构造LR(1)分析表和LALR(1)分析表
439 3
|
8月前
|
开发框架 算法 Java
Java方法重写(Override)与重载(Overload)的详细对比
在Java编程中,多态性是面向对象编程的核心概念之一。Java通过两种重要的机制来实现多态:方法重写(Override)和方法重载(Overload)。虽然这两个概念都与方法的不同实现有关,但它们在本质上有很大的区别。本文将详细对比这两种机制,帮助开发者更好地理解和应用它们。
702 5
|
虚拟化
vmware虚拟机使用主机代理访问谷歌
vmware虚拟机使用主机代理访问谷歌
1208 4
|
SQL 存储 关系型数据库
Hologres SQL 查询优化技巧
【9月更文第1天】随着大数据处理的需求日益增长,如何高效地进行数据查询和分析变得尤为重要。Hologres 是阿里云推出的一款实时数仓产品,它基于 PostgreSQL 构建,并针对在线分析处理(OLAP)场景进行了优化,支持实时数据写入与查询,能够实现毫秒级的查询响应。本文将探讨在使用 Hologres 时如何编写高效的 SQL 查询,并介绍一些特定于 Hologres 的优化技巧。
763 2
编译原理----0型,1型,2型,3型文法
编译原理----0型,1型,2型,3型文法
483 1
|
机器学习/深度学习 自然语言处理 并行计算
【深度学习】Attention的原理、分类及实现
文章详细介绍了注意力机制(Attention)的原理、不同类型的分类以及如何在Keras中实现Attention。文章涵盖了Attention的基本概念、计算区域、所用信息、结构层次等方面,并提供了实现示例。
1879 0
使用代理IP池实现多线程的方法
使用代理IP池实现多线程的方法
210 2
编译原理-----逆波兰表示法,四元式,三元式,间接三元式
编译原理-----逆波兰表示法,四元式,三元式,间接三元式
630 0