编译原理——算符优先分析法详解
概述
算符优先分析法(Operator Precedence Parse)是仿效四则运算的计算过程而构造的一种语法分析方法。算符优先分析法的关键是比较两个相继出现的终结符的优先级而决定应采取的动作。
优点:简单,有效,适合表达式的分析。
缺点:只适合于算符优先文法,是一个不大的文法类。
名词解释
定义:
短语:设有文法G,S是开始符号,设abd是G的一个句型,若有SÞabd且AÞb则称b是句型abd关于A的短语。
直接短语:在上面定义中,如果A直接推出b,即AÞb,则称b是句型abd关于A®b的直接短语。
句柄:一个句型的最左直接短语称为句柄。
素短语:文法G某句型的一个短语是素短语,当且仅当它至少含有一个终结符,且除它自身之外不再含更小的素短语。
最左素短语:在具有多个素短语的句型中处于最左边的那个素短语。
求法:
短语:从根结点出发一层一层地找出所有非叶子结点的非终结符,每一个非终结符延伸下去的所有叶子结点从左到右排列起来就是一个短语。
直接短语:找出所有仅有两代的子树,并将它的所有叶子从左到右排列起来就是一个直接短语。
句柄:从直接短语集合中找出最左边的短语。
素短语:从短语集合中找出所有含有终结符的短语,然后选出除它自身之外不再含更小的素短语(这个小的概念是集合中没有被包含的元素,如有两个短语aAA和aAAA,aAA含于aAAA,所以aAA比aAAA小)
最左素短语:从素短语集合中找出最左边的素短语。
FIRSTVT集和LASTVT集
FIRSTVT集
定义:FIRSTVT(P)={a|P=>a…,或P=>Qa…,a属于VT,Q 属于VN}
求法:
若P→a…或P→Qa…, 则a属于FIRSTVT(P);
若P→Q…, 则FIRSTVT(Q)含于FIRSTVT(P);
直至FIRSTVT(P)不再增大。
LASTVT集
定义:LASTVT(P)={a|P=>...a,或P=>…aQ,a含于VT,Q 含于VN}
求法:
若P→...a或P→…aQ, 则a属于LASTVT(P);
若P→...Q, 则LASTVT(Q)含于LASTVT(P);
直至LASTVT(P)不再增大。
构造算符优先关系表
以以下文法为例:
E→E+T|T
T→T*F|F
F→(E)|i
终结符之间的优先关系
对算符文法G, a,b属于VT 定义
(1)a=b: G中有P→. . .ab. . .或P→. . .aQb. . .
(2)a<b: G中有P→. . .aQ. . .且Q=>b…或Q=>Rb...
(3)a>b: G中有P→. . .Qb. . . 且Q=>. ..a或Q=>…aR
算符优先关系表的构造
(1) 在文法中添加E→#E#。
(2) 求出FIRSTVT和LASTVT集
(3) 找出所有终结符,并画出关系表的结构
(4) 从文法中找出形为aQb(终结符+非终结符+终结符)和ab(终结符+终结符)的部分,本例中为(E)和#E#,然后在(和)与#和#相应的表格填=。
(5) 从文法中找出形为aQ(终结符+非终结符)的部分,a与Q的FIRSTVT集合中每一个元素在表格中的交叉点填小于号。
i.找出形为aQ的部分
ii.填小于号(终结符为竖排,非终结符中的元素为横排,以横排为基准填符号)
(6) 从文法中找出形为Qa(非终结符+终结符)的部分, Q的LASTVT集合中每一个元素与a在表格中的交叉点填大于号。
i.找出形如Qa的部分
ii.填大于号(非终结符中的元素为横排,终结符中的元素为竖排,以竖排为基准填符号)
(7) 合并后的结果为
从上表可知:
(1)相同终结符之间的优先关系未必是=
(2)有a<b,未必有b>a
(3)a、b之间未必一定有优先关系
故=、<、>不同于关系运算符“等于”、“小于”、“大于”
————————————————
版权声明:本文为CSDN博主「Ayratt」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37977106/article/details/80301761
算符优先分析法(Operator Precedence Parse)是仿效四则运算的计算过程而构造的一种语法分析方法。算符优先分析法的关键是比较两个相继出现的终结符的优先级而决定应采取的动作。
优点:简单,有效,适合表达式的分析。
缺点:只适合于算符优先文法,是一个不大的文法类。
名词解释
定义:
短语:设有文法G,S是开始符号,设abd是G的一个句型,若有SÞabd且AÞb则称b是句型abd关于A的短语。
直接短语:在上面定义中,如果A直接推出b,即AÞb,则称b是句型abd关于A®b的直接短语。
句柄:一个句型的最左直接短语称为句柄。
素短语:文法G某句型的一个短语是素短语,当且仅当它至少含有一个终结符,且除它自身之外不再含更小的素短语。
最左素短语:在具有多个素短语的句型中处于最左边的那个素短语。
求法:
短语:从根结点出发一层一层地找出所有非叶子结点的非终结符,每一个非终结符延伸下去的所有叶子结点从左到右排列起来就是一个短语。
直接短语:找出所有仅有两代的子树,并将它的所有叶子从左到右排列起来就是一个直接短语。
句柄:从直接短语集合中找出最左边的短语。
素短语:从短语集合中找出所有含有终结符的短语,然后选出除它自身之外不再含更小的素短语(这个小的概念是集合中没有被包含的元素,如有两个短语aAA和aAAA,aAA含于aAAA,所以aAA比aAAA小)
最左素短语:从素短语集合中找出最左边的素短语。
FIRSTVT集和LASTVT集
FIRSTVT集
定义:FIRSTVT(P)={a|P=>a…,或P=>Qa…,a属于VT,Q 属于VN}
求法:
若P→a…或P→Qa…, 则a属于FIRSTVT(P);
若P→Q…, 则FIRSTVT(Q)含于FIRSTVT(P);
直至FIRSTVT(P)不再增大。
LASTVT集
定义:LASTVT(P)={a|P=>...a,或P=>…aQ,a含于VT,Q 含于VN}
求法:
若P→...a或P→…aQ, 则a属于LASTVT(P);
若P→...Q, 则LASTVT(Q)含于LASTVT(P);
直至LASTVT(P)不再增大。
构造算符优先关系表
以以下文法为例:
E→E+T|T
T→T*F|F
F→(E)|i
终结符之间的优先关系
对算符文法G, a,b属于VT 定义
(1)a=b: G中有P→. . .ab. . .或P→. . .aQb. . .
(2)a<b: G中有P→. . .aQ. . .且Q=>b…或Q=>Rb...
(3)a>b: G中有P→. . .Qb. . . 且Q=>. ..a或Q=>…aR
算符优先关系表的构造
(1) 在文法中添加E→#E#。
(2) 求出FIRSTVT和LASTVT集
(3) 找出所有终结符,并画出关系表的结构
(4) 从文法中找出形为aQb(终结符+非终结符+终结符)和ab(终结符+终结符)的部分,本例中为(E)和#E#,然后在(和)与#和#相应的表格填=。
(5) 从文法中找出形为aQ(终结符+非终结符)的部分,a与Q的FIRSTVT集合中每一个元素在表格中的交叉点填小于号。
i.找出形为aQ的部分
ii.填小于号(终结符为竖排,非终结符中的元素为横排,以横排为基准填符号)
(6) 从文法中找出形为Qa(非终结符+终结符)的部分, Q的LASTVT集合中每一个元素与a在表格中的交叉点填大于号。
i.找出形如Qa的部分
ii.填大于号(非终结符中的元素为横排,终结符中的元素为竖排,以竖排为基准填符号)
(7) 合并后的结果为
从上表可知:
(1)相同终结符之间的优先关系未必是=
(2)有a<b,未必有b>a
(3)a、b之间未必一定有优先关系
故=、<、>不同于关系运算符“等于”、“小于”、“大于”
————————————————
版权声明:本文为CSDN博主「Ayratt」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37977106/article/details/80301761
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2020-05-20 使用Docker构建开发环境
2020-05-20 Ubuntu 下如何查看已安装的软件
2020-05-20 hosts文件位置
2020-05-20 脑机接口:挑战在于非侵入地准确读取脑内信号,又如何传回脑内
2019-05-20 强大全面的C++框架和库推荐!
2017-05-20 自己动手写编译器
2017-05-20 C1编译器的实现