public ExpressNode parse()

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;
    }