@Override protected void compileOptionNode(EncloseNode node) { int prev = regex.options; if (Config.USE_DYNAMIC_OPTION && isDynamic(prev ^ node.option)) { addOpcodeOption(OPCode.SET_OPTION_PUSH, node.option); addOpcodeOption(OPCode.SET_OPTION, prev); addOpcode(OPCode.FAIL); } regex.options = node.option; compileTree(node.target); regex.options = prev; if (Config.USE_DYNAMIC_OPTION && isDynamic(prev ^ node.option)) { addOpcodeOption(OPCode.SET_OPTION, prev); } }
compileTree(qn.target); } else if (!infinite && qn.greedy && (qn.upper == 1 || (tlen + OPSize.PUSH) * qn.upper <= QUANTIFIER_EXPAND_LIMIT_SIZE)) { compileTree(qn.target); compileTree(qn.target); } else { compileRangeRepeatNode(qn, modTLen, emptyInfo);
compileTree(node.target); compileTree(qn.target); addOpcode(OPCode.POP); addOpcodeRelAddr(OPCode.JUMP, -(OPSize.PUSH + len + OPSize.POP + OPSize.JUMP)); } else { addOpcode(OPCode.PUSH_STOP_BT); compileTree(node.target); addOpcode(OPCode.POP_STOP_BT); x = (ListNode)node.target; addRelAddr(len + OPSize.JUMP); compileTree(x.value); /* yes-node */ addOpcodeRelAddr(OPCode.JUMP, len2); x = x.tail; compileTree(x.value); /* no-node */ } else { newInternalException(PARSER_BUG); addOpcode(OPCode.PUSH_ABSENT_POS); addOpcodeRelAddr(OPCode.ABSENT, len + OPSize.ABSENT_END); compileTree(node.target); addOpcode(OPCode.ABSENT_END); break;
compileTree(qn.target); } else if (!infinite && qn.greedy && (qn.upper == 1 || (tlen + OPSize.PUSH) * qn.upper <= QUANTIFIER_EXPAND_LIMIT_SIZE)) { compileTree(qn.target); compileTree(qn.target); } else { compileRangeRepeatNode(qn, modTLen, emptyInfo);
@Override protected void compileOptionNode(EncloseNode node) { int prev = regex.options; if (Config.USE_DYNAMIC_OPTION && isDynamic(prev ^ node.option)) { addOpcodeOption(OPCode.SET_OPTION_PUSH, node.option); addOpcodeOption(OPCode.SET_OPTION, prev); addOpcode(OPCode.FAIL); } regex.options = node.option; compileTree(node.target); regex.options = prev; if (Config.USE_DYNAMIC_OPTION && isDynamic(prev ^ node.option)) { addOpcodeOption(OPCode.SET_OPTION, prev); } }
compileTree(node.target); compileTree(qn.target); addOpcode(OPCode.POP); addOpcodeRelAddr(OPCode.JUMP, -(OPSize.PUSH + len + OPSize.POP + OPSize.JUMP)); } else { addOpcode(OPCode.PUSH_STOP_BT); compileTree(node.target); addOpcode(OPCode.POP_STOP_BT); x = (ListNode)node.target; addRelAddr(len + OPSize.JUMP); compileTree(x.value); /* yes-node */ addOpcodeRelAddr(OPCode.JUMP, len2); x = x.tail; compileTree(x.value); /* no-node */ } else { newInternalException(PARSER_BUG); addOpcode(OPCode.PUSH_ABSENT_POS); addOpcodeRelAddr(OPCode.ABSENT, len + OPSize.ABSENT_END); compileTree(node.target); addOpcode(OPCode.ABSENT_END); break;
if (qn.isRefered) { /* /(?<n>..){0}/ */ addOpcodeRelAddr(OPCode.JUMP, tlen); compileTree(qn.target); compileTree(qn.target); } else if (!qn.greedy && qn.upper == 1 && qn.lower == 0){ /* '??' */ if (cknOn(ckn)) { compileTree(qn.target); } else { compileRangeRepeatNode(qn, modTLen, emptyInfo);
@Override protected void compileAltNode(ListNode node) { ListNode aln = node; int len = 0; do { len += compileLengthTree(aln.value); if (aln.tail != null) { len += OPSize.PUSH + OPSize.JUMP; } } while ((aln = aln.tail) != null); int pos = codeLength + len; /* goal position */ aln = node; do { len = compileLengthTree(aln.value); if (aln.tail != null) { regex.requireStack = true; addOpcodeRelAddr(OPCode.PUSH, len + OPSize.JUMP); } compileTree(aln.value); if (aln.tail != null) { len = pos - (codeLength + OPSize.JUMP); addOpcodeRelAddr(OPCode.JUMP, len); } } while ((aln = aln.tail) != null); }
if (qn.isRefered) { /* /(?<n>..){0}/ */ addOpcodeRelAddr(OPCode.JUMP, tlen); compileTree(qn.target); compileTree(qn.target); } else if (!qn.greedy && qn.upper == 1 && qn.lower == 0){ /* '??' */ if (cknOn(ckn)) { compileTree(qn.target); } else { compileRangeRepeatNode(qn, modTLen, emptyInfo);
@Override protected void compileAltNode(ListNode node) { ListNode aln = node; int len = 0; do { len += compileLengthTree(aln.value); if (aln.tail != null) { len += OPSize.PUSH + OPSize.JUMP; } } while ((aln = aln.tail) != null); int pos = codeLength + len; /* goal position */ aln = node; do { len = compileLengthTree(aln.value); if (aln.tail != null) { regex.requireStack = true; addOpcodeRelAddr(OPCode.PUSH, len + OPSize.JUMP); } compileTree(aln.value); if (aln.tail != null) { len = pos - (codeLength + OPSize.JUMP); addOpcodeRelAddr(OPCode.JUMP, len); } } while ((aln = aln.tail) != null); }
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 */ } }
regex.requireStack = true; addOpcode(OPCode.PUSH_POS); compileTree(node.target); addOpcode(OPCode.POP_POS); break; len = compileLengthTree(node.target); addOpcodeRelAddr(OPCode.PUSH_POS_NOT, len + OPSize.FAIL_POS); compileTree(node.target); addOpcode(OPCode.FAIL_POS); break; compileTree(node.target); break; compileTree(node.target); addOpcode(OPCode.FAIL_LOOK_BEHIND_NOT); break;
regex.requireStack = true; addOpcode(OPCode.PUSH_POS); compileTree(node.target); addOpcode(OPCode.POP_POS); break; len = compileLengthTree(node.target); addOpcodeRelAddr(OPCode.PUSH_POS_NOT, len + OPSize.FAIL_POS); compileTree(node.target); addOpcode(OPCode.FAIL_POS); break; compileTree(node.target); break; compileTree(node.target); addOpcode(OPCode.FAIL_LOOK_BEHIND_NOT); break;