一. 主要流程分析
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(Mat