一. 主要流程分析
1:整体处理被 ExpressRunner 托管,可以在这个类里开启一些运行时辅助功能,比如 是否使用Cache中的指令集、是否输出详细的执行指令信息 等等,。

首先调用这个方法 ExpressRunner#execute(Sting,IExpressContext):Object ,第一个参数是表达式,第二个是上下文。

2:然后调用 ExpressRunner#parseInstructionSet(String): InstructionSet,把表达式转为指令集。这个方法主要调用两个方法

ExpressParse#parse(String):ExpressNode
ExpressNode 属性有值有类型,还有左子节点集合和右子节点集合,可以理解为树的根节点。
先调用
ExpressParse#splitWords(String): Word[] 根据定义的 splitWord 进行解析把单词提取出来,分隔符号有:空格、换行、位操作、四则运算、Boolean运算符号、等于、注释符号等等,Word 有行号、列号、index、值属性。
再调用
ExpressParse#(transferWord2ExpressNode(String, Word[]): ExpressNode ,ExpressNode 是带有类型的返回值,这里会根据 Word 的值来判断是什么类型,比如 数字、字符串、boolean、关键字等。NodeTypeManager 中保存了很多关键字,像四则运算符就是关键字。根据 Word 的值和 类型构造 ExpressNode。

到这里还只是单词,还没有树的概念,下面会转为树。

QLPattern#findMatchStatementWithAddRootOptimizeStack(MatchParamsPack,QLPatternNode): QLMatchResult 这个递归方法,根据 pattern 和 nodetype 来进行解析成 QLMatchResultTree,再掉用 QLMatchResultTree#buildExpressNodeTree() 方法进行中序遍历,生成树。

3: 然后调用 ExpressRunner#createInstructionSet(ExpressNode, String): InstructionSet,根据 ExpressNode 中的 NodeType 找到 对应的 InstructionFactory 的实现类,比如 Block、Break、Cast、CallFunction、If、In 等等。
InstructionSet 是指令集的集合,不同的指令,有不同的 excute(RunEnvironment): void 实现方法,比如 GoTo、CloseNewArea、ClearDataStack、CallMacro、Operator。

4: 指令集合生成后,调用 InstructionSetRunner#executeOuter(ExpressRunner, InstructionSet, ExpressLoader,IExpressContext): Object ,调用 InstructionSet#excute(RunEnvironment, InstructionSetContext): CallResult ,调用 InstructionSet#executeInnerOriginInstruction(Runenvironment): void ,把结果生成到 RunEnvironment 中。最后调用 CallResult#getReturnValue(): Object 返回结果。

主要流程: 分隔表达式 -> 转为带有类型的词法 -> 解析词法生成可执行的树 -> 根据树中 nodetype 的pattern 生成 instruction -> 根据不同指令的类型去执行指令。

表达式示例: 10 * 10 + 1 + 2 * 3 + 5 * 2

二. QLPatternNode
模式匹配,即使用 定义好的表达式,去解析传入的字符串

比如这个表达式: “OP_LEVEL4:TYPE=OPERATOR,DEFINE=*|/|mod|%”,name 是 OP_LEVEL4,类型是 运算符,有五种定义,乘、除、mod、取余、和 instassof 。

定义的常量在 KeyWordDefine4Java.nodeTypedefines[] 中。

QLPatternNode.isTreeNode ,是否是根节点,上面的 * 乘法表达式 就是根节点。

QLPatternNode#splitChild() ,把子节点加入到 pattern 中,比如 * QLPatternNode 乘法运算符的 List children 子匹配中,存在 CONST_INTEGER 类型的 QLPatternNode。在递归的时候,会遍历乘法运算符的子 pattern,即整数匹配模式,使用整数匹配模式,匹配乘法前后的数值单词。

在 splitChild() 的时候,根据 nodeTypeDefines 同一个表达式的分隔符的定义,会确定 pattern 的模式。 同一级别的如 加减乘除 就是 OR 模式,而一些函数就是 AND 模式。

三. 构造树
词法分析较为简单,根据传入的表达式内容,按照对应的分隔符进行分隔,然后匹配类型即可。
QLexpress 使用了 findMatchStatementWithAddRootOptimizeStack(MatchParamsPack, QLPatternNode, int point, int deep) 递归函数来进行树的构造。

看递归表达式,应该着眼于 每次递归变化后传递下去的 和 用来保存递归结果的部分。

递归表达式中的变量是 QLPatternNode,表达式中,根据 node 的三种 matchMode :DETAIL、AND、OR,进行处理。

OR:遍历 patter.children,寻找合适的词法解析格式。

AND: 也是遍历 pattern.children 但是最后有一些变量的处理和缓存处理

DETAIL:左括号、右括号、注释符、EOF 等使用

递归表达式较为复杂,最终函数的副作用,就是生成了一个树形结构 QLMatchResultTree。

然后在递归表达式的外层,即调用方,拿到树的根节点,即 ExpressNode。

遍历 ExpressNode 的左右子节点,设置其 parent 节点。

把 ExpressNode 转换为 InstructionSet。

createInstructionSetPrivate(InstructionSet, Stack, ExpressNode) ,根据 node 的 type,获取 不同子类 InstructionoFactory,调用 createInstrctionSet(ExpressRunner, InstructionSet) 方法。

跟节点的 ExpressNode 对应的 nodetypekind 是 block,即先调用 BolckInstructionFactory#createInstructionSet(ExpressRunner, InstructionSet),在 block 的 factory 方法中,会遍历所有 children 节点的 nodetypekind 对应的的 factory 方法 ,来创建 instructionSet。

node 获取 children 的顺序是先左边全部,再右边全部。

最终会 return 一个 instructionSet 对象,对象中有个属性是 Instruction[],用来存放 parse 的结果。

四. 执行指令集
调用 InstructionSetRunner#execute(ExpressRunner, InstuctionSet, ExpressLoader, IExpressContext, List,…),先把参数解析封装到 context 中。

InstructionSetContext context = OperateDataCacheManager.fetchInstructionSetContext (true,runner,aContext,loader,isSupportDynamicFieldName);
再获取 RunEnvironment,

RunEnvironment environmen = OperateDataCacheManager.fetRunEnvironment(set,(InstructionSetContext) context, isTrace);
最终指令的执行,在 InstructionSet 对象中,

public void executeInnerOrigiInstruction(RunEnvironment environmen,List errorList,Log aLog)
throws Exception
{
Instruction instruction =null;
while (environmen.programPoint < this.instructionList.length)
{
QLExpressTimer.assertTimeOut();
instruction = this.instructionList[environmen.programPoint];
instruction.setLog(aLog);
// 设置loginstruction.execute(environmen, errorList);
}
}
一个指令一个执行的执行。

spring源码解析,vip视频解析源码相关推荐

  1. 如何用油猴解析VIP视频

    如何用油猴破解vip视频 首先需要给Chrome浏览器安装Tampermonkey,首先要打开谷歌扩展应用商店,搜索Tampermonkey扩展程序,安装到Chrome https://chrome. ...

  2. 基于源码仿建视频解析网站

    0源码下载 1仿建网站 1.1网址:video.lnkjdx.com 1.2效果图 1.3使用方法 将视频的链接地址或视频所在网页粘贴解析播放即可 2源码解析 2.1index.html-视频区域BO ...

  3. html代码在线解析,VIP在线解析HTML源码(修改论坛的源码、加搜索功能)

    本帖最后由 闷骚小贱男 于 2017-3-28 00:08 编辑 今天有朋友问我要TX的VIP看视频来着,就给了他一个在线的网站,心想着自己也弄一个解析的吧.在论坛搜到一个源码 传送门:看到有需要直接 ...

  4. 一对一交友源码,一对一视频交友源码,这些功能是主流

    市面上有许许多多的一对一交友APP,而通过一对一交友源码可以轻松实现这类社交交友平台的搭建,然而在功能选取和产品定位方面有时会让人犯难.随着视频直播和小视频的强势崛起,传统的一对一交友平台也在发生着悄 ...

  5. VIP视频解析的一丢丢骚操作

    大周末的挺多人窝在家看剧的,现在普遍要各种VIP了.所以很多人也会找一些VIP解析网站来观看. 我看剧少,偶尔也会用上这么些网站,平常的操作是:打开视频复制网址→打开解析网站粘贴网址,然后开始享受龟速 ...

  6. 2022年2月计划(osgearth源码调试+ue4视频+ogreMain源码抄写)

    根据规划,内容不变,分量调节. osgearth源码调试,是每天一博客. ue4视频是每天客户端,服务器和完整游戏各一节轮番进行,多了更好.再加上一个ue4文档. ogre源码每天100行即可. 很明 ...

  7. 2022年2月7日-2月13日(osgearth源码调试+ue4视频+ogreMain源码抄写,本周8小时,合计1176小时,剩8824小时。)

    按照月计划, osgearth源码调试,是每天一博客. ue4视频是每天客户端,服务器和完整游戏各一节轮番进行,多了更好.再加上一个ue4文档. ogre源码每天100行即可. 很明显,重点在Ue上. ...

  8. 短视频询盘系统源码,短视频系统源码,矩阵系统源码,源头源码技术

    短视频平台的用户量还是很大的,2016年以来短视频的用户量一直在增加.相比图片和文字,短视频可以更快速.更直接地传递信息.这也是大多数人选择短视频推广引流的原因.在这个庞大的流量群中,有各行各业感兴趣 ...

  9. 医疗小程序源码 在线就诊 视频问诊源码 智慧医院源码

    主要功能: 在线问诊:支持视频问诊.图文问诊.电话问诊,问诊消息医生和患者都能通过微信来进行提醒,可设置付费问诊. 在线处方:医生在线给患者诊断开处方,可在线查看患者处方记录 电子病历:医生可手机在线 ...

最新文章

  1. 论文笔记:CycleGAN
  2. 【风控】团伙挖掘中的14大关系类型
  3. arcgis怎么用python重新排序,使用ArcGIS脚本工具将点数据进行排序并编号
  4. 简单mysql优化_mysql常见语句的简单优化策略
  5. IDEA 查看本地历史版本
  6. Linux 命令行常用快捷键
  7. 在拼多多上班,是一种什么样的体验?我心态崩了呀!
  8. c语言定义函数return,在C语言的函数定义中,如果不需要返回结果,就可以省略return语句。...
  9. Spring AOP(面向切面)
  10. Python 爬虫---初窥门径
  11. 这种性生活伤女人尿道
  12. 宁夏召开外派教师家属新春慰问座谈会
  13. 生成式语言大模型压缩技术思考——以ChatGPT为例
  14. Step7中有关时间和定时器的使用和例程2
  15. 机器学习 使用三分法找最优解参数
  16. win10电脑wifi连不上,一直显示正在检测网络要求
  17. 手把手教你学财报01
  18. 图片头顶距离顶部百分比怎么修改_ps图片处理修改文字:学习如何用PS制作金色华丽的立体文字...
  19. sysvol 域控制器 文件_WinServer域控制器中重定位SYSVOL树
  20. Java 根据生日日期计算距离生日还有多少天(工具类)

热门文章

  1. 【Java加解密系列】- SM2生成密钥
  2. Java分解整型质因数
  3. bat计算机清理原理,科技教程:电脑如何一键清除垃圾bat
  4. 游戏服务器编程-iocp及封包处理
  5. 智能座舱开启「万物交互」新革命,隐形冠军们如何突围?
  6. 台式计算机如何设置屏幕亮度,怎么调整台式电脑屏幕亮度的方法,如何调整显示器...
  7. 开发一个 app 有多难?需要多少钱?
  8. edu邮箱填写服务器,学生邮箱Outlook使用设置
  9. 【论文阅读】【综述】从Optical Flow到Scene Flow
  10. php如何把文字加粗,HTML中如何将字体加粗