private void compileTreeEmptyCheck(Node node, int emptyInfo) { int savedNumNullCheck = regex.numNullCheck; if (emptyInfo != 0) { regex.requireStack = true; addOpcode(OPCode.NULL_CHECK_START); addMemNum(regex.numNullCheck); /* NULL CHECK ID */ regex.numNullCheck++; } compileTree(node); if (emptyInfo != 0) { switch(emptyInfo) { case TargetInfo.IS_EMPTY: addOpcode(OPCode.NULL_CHECK_END); break; case TargetInfo.IS_EMPTY_MEM: addOpcode(OPCode.NULL_CHECK_END_MEMST); break; case TargetInfo.IS_EMPTY_REC: addOpcode(OPCode.NULL_CHECK_END_MEMST_PUSH); break; } // switch addMemNum(savedNumNullCheck); /* NULL CHECK ID */ } }
private void compileTreeEmptyCheck(Node node, int emptyInfo) { int savedNumNullCheck = regex.numNullCheck; if (emptyInfo != 0) { regex.requireStack = true; addOpcode(OPCode.NULL_CHECK_START); addMemNum(regex.numNullCheck); /* NULL CHECK ID */ regex.numNullCheck++; } compileTree(node); if (emptyInfo != 0) { switch(emptyInfo) { case TargetInfo.IS_EMPTY: addOpcode(OPCode.NULL_CHECK_END); break; case TargetInfo.IS_EMPTY_MEM: addOpcode(OPCode.NULL_CHECK_END_MEMST); break; case TargetInfo.IS_EMPTY_REC: addOpcode(OPCode.NULL_CHECK_END_MEMST_PUSH); break; } // switch addMemNum(savedNumNullCheck); /* NULL CHECK ID */ } }
private void compileRangeRepeatNode(QuantifierNode qn, int targetLen, int emptyInfo) { regex.requireStack = true; int numRepeat = regex.numRepeat; addOpcode(qn.greedy ? OPCode.REPEAT : OPCode.REPEAT_NG); addMemNum(numRepeat); /* OP_REPEAT ID */ regex.numRepeat++; addRelAddr(targetLen + OPSize.REPEAT_INC); entryRepeatRange(numRepeat, qn.lower, qn.upper); compileTreeEmptyCheck(qn.target, emptyInfo); if ((Config.USE_SUBEXP_CALL && regex.numCall > 0) || qn.isInRepeat()) { addOpcode(qn.greedy ? OPCode.REPEAT_INC_SG : OPCode.REPEAT_INC_NG_SG); } else { addOpcode(qn.greedy ? OPCode.REPEAT_INC : OPCode.REPEAT_INC_NG); } addMemNum(numRepeat); /* OP_REPEAT ID */ }
private void compileRangeRepeatNode(QuantifierNode qn, int targetLen, int emptyInfo) { regex.requireStack = true; int numRepeat = regex.numRepeat; addOpcode(qn.greedy ? OPCode.REPEAT : OPCode.REPEAT_NG); addMemNum(numRepeat); /* OP_REPEAT ID */ regex.numRepeat++; addRelAddr(targetLen + OPSize.REPEAT_INC); entryRepeatRange(numRepeat, qn.lower, qn.upper); compileTreeEmptyCheck(qn.target, emptyInfo); if ((Config.USE_SUBEXP_CALL && regex.numCall > 0) || qn.isInRepeat()) { addOpcode(qn.greedy ? OPCode.REPEAT_INC_SG : OPCode.REPEAT_INC_NG_SG); } else { addOpcode(qn.greedy ? OPCode.REPEAT_INC : OPCode.REPEAT_INC_NG); } addMemNum(numRepeat); /* OP_REPEAT ID */ }
addMemNum(node.regNum); compileTree(node.target); addOpcode(node.isRecursion() ? OPCode.MEMORY_END_REC : OPCode.MEMORY_END); addMemNum(node.regNum); addOpcode(OPCode.RETURN); } else if (Config.USE_SUBEXP_CALL && node.isRecursion()) { // USE_SUBEXP_CALL addOpcode(OPCode.MEMORY_END_REC); addMemNum(node.regNum); } else { if (bsAt(regex.btMemEnd, node.regNum)) { addOpcode(OPCode.MEMORY_END); addMemNum(node.regNum); addMemNum(node.regNum); if (node.target.getType() == NodeType.ALT) { ListNode x = (ListNode)node.target;
addMemNum(node.regNum); compileTree(node.target); addOpcode(node.isRecursion() ? OPCode.MEMORY_END_REC : OPCode.MEMORY_END); addMemNum(node.regNum); addOpcode(OPCode.RETURN); } else if (Config.USE_SUBEXP_CALL && node.isRecursion()) { // USE_SUBEXP_CALL addOpcode(OPCode.MEMORY_END_REC); addMemNum(node.regNum); } else { if (bsAt(regex.btMemEnd, node.regNum)) { addOpcode(OPCode.MEMORY_END); addMemNum(node.regNum); addMemNum(node.regNum); if (node.target.getType() == NodeType.ALT) { ListNode x = (ListNode)node.target;