in src/main/java/com/ql/util/express/parse/ExpressParse.java [370:432]
public ExpressNode parse(ExpressPackage rootExpressPackage, Word[] words, String express, boolean isTrace,
Map<String, String> selfDefineClass, boolean mockRemoteJavaClass) throws Exception {
List<ExpressNode> tempList = this.transferWord2ExpressNode(rootExpressPackage, words, selfDefineClass,
!QLExpressRunStrategy.isSandboxMode());
if (isTrace) {
System.out.println("单词分析结果:" + printInfo(tempList, ","));
}
//比如用在远程配置脚本,本地jvm并不包含这个java类,可以
if (mockRemoteJavaClass) {
List<ExpressNode> tempList2 = new ArrayList<>();
for (int i = 0; i < tempList.size(); i++) {
ExpressNode node = tempList.get(i);
if ("new".equals(node.getValue()) && node.getNodeType().getKind() == NodeTypeKind.KEYWORD
&& i + 1 < tempList.size() && !"CONST_CLASS".equals(tempList.get(i + 1).getNodeType().getName())) {
tempList2.add(node);
//取出 ( 前面的类路径作为configClass名称
int end = i + 1;
StringBuilder configClass = new StringBuilder(tempList.get(end).getValue());
end++;
while (!"(".equals(tempList.get(end).getValue())) {
configClass.append(tempList.get(end).getValue());
end++;
}
NodeType nodeType = nodeTypeManager.findNodeType("VClass");
ExpressNode vClassNode = new ExpressNode(nodeType, configClass.toString());
tempList2.add(vClassNode);
//因为循环之后,i++,所以i=end-1
i = end - 1;
} else {
tempList2.add(node);
}
}
tempList = tempList2;
if (isTrace) {
System.out.println("修正后单词分析结果:" + printInfo(tempList, ","));
}
}
QLMatchResult result = QLPattern.findMatchStatement(this.nodeTypeManager, this.nodeTypeManager
.findNodeType("PROGRAM").getPatternNode(), tempList, 0);
if (result == null) {
throw new QLCompileException("语法匹配失败");
}
if (result.getMatchLastIndex() < tempList.size()) {
int maxPoint = result.getMatchLastIndex();
ExpressNode tempNode = tempList.get(maxPoint);
throw new QLCompileException(
"还有单词没有完成语法匹配:" + result.getMatchLastIndex() + "[" + tempNode.getValue() + ":line=" + tempNode.getLine()
+ ",col=" + tempNode.getCol() + "] 之后的单词 \n" + express);
}
result.getMatches().get(0).buildExpressNodeTree();
ExpressNode root = (ExpressNode)result.getMatches().get(0).getRef();
//为了生成代码时候进行判断,需要设置每个节点的父亲
resetParent(root, null);
if (isTrace) {
System.out.println("最后的语法树:");
printTreeNode(root, 1);
}
return root;
}