QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-语法制导翻译与递归子程序设计(编译原理)(5)简书被冻结-搬运】
原作时间:2019~2021年
此次共享,腾讯内网 / 外网同步发布。
内部代码地址:https://git.code.oa.com/fatboyli/QBDF
外部代码地址:GitHub - ventureli/QBDF
两年前的一个混淆包(无源码):GitHub - ventureli/VLOCInterpreter
作者:腾讯fatboyli(李文强)
终于说到了解释器里最核心的部分了,语法制导翻译与递归子程序设计。另外本章节和下一章节(中间代码指令设计与实现)的内容交叉很多,建议两个章节同步阅读。语义解析其实有很多的方法。但是我觉得递归子程序这个是最简单的最符合程序员逻辑的一种方式,虽然这种方法效率有点低,但是在真正的使用过程中,把QBDF-OC 编译成为中间码的过程可以离线的,并不一定要在客户端做,所以这一步最重要的并不是效率。语法制导翻译与递归子程序的我们可以这样通俗理解:
参考BNF表达式,把文法翻译成一个一个的子程序。每个子程序处理一个表达式。首先我们粗略的对比下 BNF表达式和表达式的翻译的方法列表就能看出来。
这里我节选了一段 普通表达式的BNF.大家仔细的看下,就能发现子程序设计的妙处。
QBDF的BNF示意图
这里大家注意红色的部分。就是我说的表达式的左部分(‘:’左边的部分),每一个左边的定义,都会对应一个方法。现在把QBDF的解释器的方法列表截图给大家看下。
QBDF解释器的方法列表
可以看到,每一个BNF表达式的左边都对应一个方法。比如 EXP / Add /Condition 等。现在我们那一个例子来解析。
那么每一个子程序是如果工作的呢?我们拿一个简单的方法做一个解析。
我们看下。这个表达式
exclusive_or_exp: and_exp (‘^' and_exp)*
我们从这个里面可以看到,这个 exclusive_or_exp 被定义为一个 and_exp 或者 and_exp^and_exp 或者 and_exp^and_exp ^and_exp 或者 and_exp^and_exp ^and_exp^.... 反正就是后面这个东西可以有很多个就是了。
那我们写代码的时候怎么处理这个事情?如果我们放弃编译原理,BNF表达式这一大堆唬人的概念,其实这个表达式非常的简单,随便一个程序员都能写出来。我们知道 and_exp 也是一个子程序,那么我们可以不用管and_exp 里怎么操作。我们只需要再需要他的地方调用就行了,剩下的其实就是匹配下'^' 这个字符和循环就可以了。
好了,现在我们看下代码。
-(NSDictionary *)_QBDF_EXP_EXCLUSIVE_OR{
NSDictionary*leftNode = [self_QBDF_EXP_AND];
if(_currentToken->tokenType == '^' ) {
int type = _currentToken->tokenType;
[self match:'^'];
NSDictionary*rightNode = [self _QBDF_EXP_AND];
NSMutableArray *operands = [NSMutableArray new];
[operands addObject:leftNode];
[operands addObject:rightNode];
while (_currentToken->tokenType == '^') {
[selfmatch:'^'];
NSDictionary*newnode = [self_QBDF_EXP_AND];
[operands addObject:newnode];
}
NSMutableDictionary*newRootNode = [self_createEXPOperatorNode:type left:operands right:nil thridNode:nil];
return newRootNode;
}else {
returnleftNode;
}
}
这个代码极其的简单。我们首先让我们的程序递归到左边,去找and_exp 的返回值,and_exp 会把单词;列表里他自己需要的那部分给吃掉。然后他递归出来后,我们就判断当前的单词是否是‘^’ 如果是的话,那么我们根据BNF表达式知道了,我们当前的至少是一个 and_exp ^ and_exp 至于后面还有没有 ,先不管,先调用[self _QBDF_EXP_AND]; 拿到第二个操作数,拿到后,开始循环判断即可。
至于这段代码
NSMutableDictionary*newRootNode = [self_createEXPOperatorNode:type left:operands right:nil thridNode:nil];
return newRootNode;
还有这段代码
NSDictionary*rightNode = [self _QBDF_EXP_AND];
NSMutableArray *operands = [NSMutableArray new];
[operands addObject:leftNode];
[operands addObject:rightNode];
的含义,我们放到下一章节和指令设计这块去处理。因为本章节和下一章是解释器最核心的部分,本章节先介绍下,QBDF解释器的程序设计结构。
所以就像我前面章节说的。BNF真的很重要,写代码其实就是翻译它的过程。
QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-语法制导翻译与递归子程序设计(编译原理)(5)简书被冻结-搬运】相关推荐
- QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-从C89简化的BNF范式(4)【简书被冻结-搬运】
原作:2019-2021年 此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ventu ...
- QQ浏览器HD iOS 动态化/热修复方案QBDF解释器-词法分析(3)【简书被冻结-搬运】
此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ventureli/QBDF 两年前的 ...
- QQ浏览器HD iOS 动态化/热修复方案QBDF(0) 【简书被冻结-搬运】
原作时间:2019-2021年 此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ven ...
- QQ浏览器HD的动态化方案QBDF的总体架构设计(2)【简书被冻结-搬运】
原作时间:2019-2021年 此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ven ...
- QQ浏览器HD的动态化方案QBDF的前世今生(1)【简书被冻结-搬运】
原作时间:2019-2021年 此次共享,腾讯内网 / 外网同步发布. 内部代码地址:https://git.code.oa.com/fatboyli/QBDF 外部代码地址:GitHub - ven ...
- Android 热修复方案Tinker(五) SO补丁加载
基于Tinker V1.7.5 Android 热修复方案Tinker(一) Application改造 Android 热修复方案Tinker(二) 补丁加载流程 Android 热修复方案Tink ...
- android热修复方案
热补丁方案有很多,其中比较出名的有腾讯Tinker.阿里的AndFix.美团的Robust以及QZone的超级补丁方案.他们的优劣如下: 一.Tinker 热修复 Tinker通过 Dexdiff 算 ...
- bat比较有意思的代码_腾讯开源的 Unity全系列 代码逻辑热修复方案--InjectFix
InjectFix 腾讯开源的 Unity 代码逻辑热修复方案 Unity代码逻辑热修复 可用于Unity业务的bug修复,支持Unity全系列,全平台. 几个亮点 直接在Unity工程上修改C#即可 ...
- JAndFix: 基于Java实现的Android实时热修复方案
简述 JAndFix是一种基于Java实现的Android实时热修复方案,它并不需要重新启动就能生效.JAndFix是在AndFix的基础上改进实现,AndFix主要是通过jni实现对method(A ...
最新文章
- python开发需要掌握哪些知识-Python基础进阶需要掌握哪些知识点?
- python监控服务器是否在线_python检测服务器是否正常
- java接口开发规范,干货满满
- 原根(详解+代码实现+例题+快速求解一个数的原根)
- 来啊,一起造作啊!10月仍然还有十多场新品发布会...
- [转] WinForm自定义函数FindControl实现按名称查找控件
- mysql.exe怎么全屏_监控怎么调为全屏
- Linux Mint 安装网易云音乐
- windows10一键修改开机动画
- mac系统安装win10双系统
- android 跑马灯带图片,Android自定义跑马灯效果(适合任意布局)
- Information Bottleneck 信息瓶颈
- vue error The code generator has deoptimised the styling exceeds the max of 100KB
- 【室内园艺】——栀子花
- closest() 方法
- 【转】图片热点链接使用方法
- 我喜欢计算机作文300字,关于我喜欢作文300字
- 台式电脑win10系统怎么开启无线服务器,台式电脑win10怎么连wifi_window10台式如何连接wifi...
- How Gradual Typing System Helps Us
- vite以及webpack(@vue/cli 5.x) vue3 alias别名配置
热门文章
- 牛年倒计时1天 | 华章图书祝大家牛运当头
- element ui 火狐_快速Firefox UI调整
- azure虚拟服务器,Azure 虚拟机价格详情_预算 - Azure 云计算
- Qt读写锁(QWriteLocker、QReadLocker)的理解和使用(含部分源码)
- 商城APP开发需要哪些功能,如何选择开发公司
- 在职阿里8年,一个31岁女软件测试工程师的心声
- 装机教程:VMWare下安装Linux系统(超级详细版 学不会你打我)
- Zerotier免费的虚拟局域网
- 将24位(任意位数)补码转换成有符号整数的方法
- SPN用三个队列C语言,SPN-DES-AES算法原理与应用