public boolean createInstruction()

in src/main/java/com/ql/util/express/instruction/LambdaInstructionFactory.java [16:53]


    public boolean createInstruction(ExpressRunner expressRunner, InstructionSet result,
        Stack<ForRelBreakContinue> forStack, ExpressNode node, boolean isRoot) throws Exception {
        ExpressNode[] children = node.getChildrenArray();
        if (children.length != 2) {
            throw new QLException("lambda 操作符需要2个操作数");

        }

        InstructionSet lambdaSet = new InstructionSet(InstructionSet.TYPE_FUNCTION);

        // lambda 参数列表
        ExpressNode lambdaVarDefine = children[0];
        if ("CHILD_EXPRESS".equals(lambdaVarDefine.getNodeType().getName())) {
            // 带括号的参数写法
            for (ExpressNode varDefine : lambdaVarDefine.getChildrenArray()) {
                OperateDataLocalVar tmpVar = new OperateDataLocalVar(varDefine.getValue(), null);
                lambdaSet.addParameter(tmpVar);
            }
        } else {
            // 单参数省略括号的写法
            lambdaSet.addParameter(new OperateDataLocalVar(lambdaVarDefine.getValue(), null));
        }

        // lambda 逻辑体
        ExpressNode lambdaBodyRoot = new ExpressNode(expressRunner.getNodeTypeManager()
            .findNodeType("FUNCTION_DEFINE"), LAMBDA_NODE_NAME);
        if ("STAT_BLOCK".equals(node.getNodeType().getName())) {
            for (ExpressNode tempNode : children[1].getChildrenArray()) {
                lambdaBodyRoot.addChild(tempNode);
            }
        } else {
            lambdaBodyRoot.addChild(children[1]);
        }

        expressRunner.createInstructionSet(lambdaBodyRoot, lambdaSet);
        result.addInstruction(new InstructionLoadLambda(lambdaSet));
        return false;
    }