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

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

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

算符优先关系表的构造

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

(一)若有文法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个节点

目录
相关文章
第k小的数(2种快排解法、1种堆排解法)
第k小的数(2种快排解法、1种堆排解法)
335 0
|
安全
如何查询阿里云账号uid?
阿里云账号UID查询方法
5914 0
如何查询阿里云账号uid?
|
JavaScript 搜索推荐 前端开发
理解服务器端渲染(SSR):提高网页性能与SEO的秘籍
理解服务器端渲染(SSR):提高网页性能与SEO的秘籍
|
安全 关系型数据库 Linux
高危漏洞CVE-2024-38077的修复指南
根据2024年8月9日,国家信息安全漏洞共享平台(CNVD)收录了Windows远程桌面许可服务远程代码执行漏洞(CNVD-2024-34918,对应CVE-2024-38077)。未经身份认证的攻击者可利用漏洞远程执行代码,获取服务器控制权限。目前,该漏洞的部分技术原理和概念验证伪代码已公开,厂商已发布安全更新完成修复。CNVD建议受影响的单位和用户安全即刻升级到最新版本。
DFA与NFA的区别,由正规表达式构造DFA,以及DFA的相关化简
DFA与NFA的区别,由正规表达式构造DFA,以及DFA的相关化简
2272 1
DFA与NFA的区别,由正规表达式构造DFA,以及DFA的相关化简
|
存储 自然语言处理 Unix
编译原理 实验一:词法分析器的自动实现(Lex词法分析)
编译原理 实验一:词法分析器的自动实现(Lex词法分析)
2013 1
编译原理 实验一:词法分析器的自动实现(Lex词法分析)
构造LR(1)分析表和LALR(1)分析表
构造LR(1)分析表和LALR(1)分析表
640 3
|
Ubuntu 安全 Linux
WinSCP传文件到Ubuntu提示Permission denied解决办法
使用WinSCP传文件到一台Ubuntu服务器时,提示Permission denied。整理了解决办法,希望对大家日常工作有所帮助。
2373 1
|
机器学习/深度学习 算法 数据可视化
基于计算机视觉手势识别控制系统YoloGesture (利用YOLO实现) 有详细代码+部署+在线服务器尝试+开源可复现
基于计算机视觉手势识别控制系统YoloGesture (利用YOLO实现) 有详细代码+部署+在线服务器尝试+开源可复现
|
Ubuntu Linux
如何关闭或重新启动Ubuntu Linux?这四个命令希望你能熟练使用!
如何关闭或重新启动Ubuntu Linux?这四个命令希望你能熟练使用!
2427 0
如何关闭或重新启动Ubuntu Linux?这四个命令希望你能熟练使用!

热门文章

最新文章