@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); }
@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.greedy) { if (qn.headExact != null) { addOpcodeRelAddr(OPCode.JUMP, OPSize.PUSH_OR_JUMP_EXACT1); } else if (qn.nextHeadExact != null) { addOpcodeRelAddr(OPCode.JUMP, OPSize.PUSH_IF_PEEK_NEXT); } else { addOpcodeRelAddr(OPCode.JUMP, OPSize.PUSH); addOpcodeRelAddr(OPCode.JUMP, OPSize.JUMP); addOpcodeRelAddr(OPCode.PUSH_OR_JUMP_EXACT1, modTLen + OPSize.JUMP); StringNode sn = (StringNode)qn.headExact; addBytes(sn.bytes, sn.p, 1); compileTreeEmptyCheck(qn.target, emptyInfo); addOpcodeRelAddr(OPCode.JUMP, -(modTLen + OPSize.JUMP + OPSize.PUSH_OR_JUMP_EXACT1)); } else if (qn.nextHeadExact != null) { addOpcodeRelAddr(OPCode.PUSH_IF_PEEK_NEXT, modTLen + OPSize.JUMP); StringNode sn = (StringNode)qn.nextHeadExact; addBytes(sn.bytes, sn.p, 1); compileTreeEmptyCheck(qn.target, emptyInfo); addOpcodeRelAddr(OPCode.JUMP, -(modTLen + OPSize.JUMP + OPSize.PUSH_IF_PEEK_NEXT)); } else { addOpcodeRelAddr(OPCode.PUSH, modTLen + OPSize.JUMP); compileTreeEmptyCheck(qn.target, emptyInfo); addOpcodeRelAddr(OPCode.JUMP, -(modTLen + OPSize.JUMP + OPSize.PUSH)); addOpcodeRelAddr(OPCode.JUMP, modTLen); compileTreeEmptyCheck(qn.target, emptyInfo); addOpcodeRelAddr(OPCode.PUSH, -(modTLen + OPSize.PUSH));
if (qn.greedy) { if (qn.headExact != null) { addOpcodeRelAddr(OPCode.JUMP, OPSize.PUSH_OR_JUMP_EXACT1); } else if (qn.nextHeadExact != null) { addOpcodeRelAddr(OPCode.JUMP, OPSize.PUSH_IF_PEEK_NEXT); } else { addOpcodeRelAddr(OPCode.JUMP, OPSize.PUSH); addOpcodeRelAddr(OPCode.JUMP, OPSize.JUMP); addOpcodeRelAddr(OPCode.PUSH_OR_JUMP_EXACT1, modTLen + OPSize.JUMP); StringNode sn = (StringNode)qn.headExact; addBytes(sn.bytes, sn.p, 1); compileTreeEmptyCheck(qn.target, emptyInfo); addOpcodeRelAddr(OPCode.JUMP, -(modTLen + OPSize.JUMP + OPSize.PUSH_OR_JUMP_EXACT1)); } else if (qn.nextHeadExact != null) { addOpcodeRelAddr(OPCode.PUSH_IF_PEEK_NEXT, modTLen + OPSize.JUMP); StringNode sn = (StringNode)qn.nextHeadExact; addBytes(sn.bytes, sn.p, 1); compileTreeEmptyCheck(qn.target, emptyInfo); addOpcodeRelAddr(OPCode.JUMP, -(modTLen + OPSize.JUMP + OPSize.PUSH_IF_PEEK_NEXT)); } else { addOpcodeRelAddr(OPCode.PUSH, modTLen + OPSize.JUMP); compileTreeEmptyCheck(qn.target, emptyInfo); addOpcodeRelAddr(OPCode.JUMP, -(modTLen + OPSize.JUMP + OPSize.PUSH)); addOpcodeRelAddr(OPCode.JUMP, modTLen); compileTreeEmptyCheck(qn.target, emptyInfo); addOpcodeRelAddr(OPCode.PUSH, -(modTLen + OPSize.PUSH));
if (qn.greedy) { if (qn.lower == 1) { addOpcodeRelAddr(OPCode.JUMP, cknOn(ckn) ? OPSize.STATE_CHECK_PUSH : OPSize.PUSH); addRelAddr(modTLen + OPSize.JUMP); } else { addOpcodeRelAddr(OPCode.PUSH, modTLen + OPSize.JUMP); addOpcodeRelAddr(OPCode.JUMP, -(modTLen + OPSize.JUMP + (cknOn(ckn) ? OPSize.STATE_CHECK_PUSH : OPSize.PUSH))); } else { if (qn.lower == 0) { addOpcodeRelAddr(OPCode.JUMP, modTLen); addRelAddr(-(modTLen + OPSize.STATE_CHECK_PUSH_OR_JUMP)); } else { addOpcodeRelAddr(OPCode.PUSH, -(modTLen + OPSize.PUSH)); addOpcodeRelAddr(OPCode.JUMP, tlen); compileTree(qn.target); addRelAddr(tlen); } else { addOpcodeRelAddr(OPCode.PUSH, tlen); addRelAddr(OPSize.JUMP); } else {
if (qn.greedy) { if (qn.lower == 1) { addOpcodeRelAddr(OPCode.JUMP, cknOn(ckn) ? OPSize.STATE_CHECK_PUSH : OPSize.PUSH); addRelAddr(modTLen + OPSize.JUMP); } else { addOpcodeRelAddr(OPCode.PUSH, modTLen + OPSize.JUMP); addOpcodeRelAddr(OPCode.JUMP, -(modTLen + OPSize.JUMP + (cknOn(ckn) ? OPSize.STATE_CHECK_PUSH : OPSize.PUSH))); } else { if (qn.lower == 0) { addOpcodeRelAddr(OPCode.JUMP, modTLen); addRelAddr(-(modTLen + OPSize.STATE_CHECK_PUSH_OR_JUMP)); } else { addOpcodeRelAddr(OPCode.PUSH, -(modTLen + OPSize.PUSH)); addOpcodeRelAddr(OPCode.JUMP, tlen); compileTree(qn.target); addRelAddr(tlen); } else { addOpcodeRelAddr(OPCode.PUSH, tlen); addRelAddr(OPSize.JUMP); } else {
len += node.isRecursion() ? OPSize.MEMORY_END_REC : OPSize.MEMORY_END; addOpcodeRelAddr(OPCode.JUMP, len); addOpcodeRelAddr(OPCode.PUSH, len + OPSize.POP + OPSize.JUMP); compileTree(qn.target); addOpcode(OPCode.POP); addOpcodeRelAddr(OPCode.JUMP, -(OPSize.PUSH + len + OPSize.POP + OPSize.JUMP)); } else { addOpcode(OPCode.PUSH_STOP_BT); addRelAddr(len + OPSize.JUMP); addOpcodeRelAddr(OPCode.JUMP, len2); x = x.tail; len = compileLengthTree(node.target); addOpcode(OPCode.PUSH_ABSENT_POS); addOpcodeRelAddr(OPCode.ABSENT, len + OPSize.ABSENT_END); compileTree(node.target); addOpcode(OPCode.ABSENT_END);
len += node.isRecursion() ? OPSize.MEMORY_END_REC : OPSize.MEMORY_END; addOpcodeRelAddr(OPCode.JUMP, len); addOpcodeRelAddr(OPCode.PUSH, len + OPSize.POP + OPSize.JUMP); compileTree(qn.target); addOpcode(OPCode.POP); addOpcodeRelAddr(OPCode.JUMP, -(OPSize.PUSH + len + OPSize.POP + OPSize.JUMP)); } else { addOpcode(OPCode.PUSH_STOP_BT); addRelAddr(len + OPSize.JUMP); addOpcodeRelAddr(OPCode.JUMP, len2); x = x.tail; len = compileLengthTree(node.target); addOpcode(OPCode.PUSH_ABSENT_POS); addOpcodeRelAddr(OPCode.ABSENT, len + OPSize.ABSENT_END); compileTree(node.target); addOpcode(OPCode.ABSENT_END);
regex.requireStack = true; len = compileLengthTree(node.target); addOpcodeRelAddr(OPCode.PUSH_POS_NOT, len + OPSize.FAIL_POS); compileTree(node.target); addOpcode(OPCode.FAIL_POS); regex.requireStack = true; len = compileLengthTree(node.target); addOpcodeRelAddr(OPCode.PUSH_LOOK_BEHIND_NOT, len + OPSize.FAIL_LOOK_BEHIND_NOT); if (node.charLength < 0) { n = analyser.getCharLengthTree(node.target);
regex.requireStack = true; len = compileLengthTree(node.target); addOpcodeRelAddr(OPCode.PUSH_POS_NOT, len + OPSize.FAIL_POS); compileTree(node.target); addOpcode(OPCode.FAIL_POS); regex.requireStack = true; len = compileLengthTree(node.target); addOpcodeRelAddr(OPCode.PUSH_LOOK_BEHIND_NOT, len + OPSize.FAIL_LOOK_BEHIND_NOT); if (node.charLength < 0) { n = analyser.getCharLengthTree(node.target);