in rhino/src/main/java/org/mozilla/javascript/regexp/NativeRegExp.java [316:563]
private static void prettyPrintRE(RECompiled regexp) {
for (int pc = 0; regexp.program[pc] != REOP_END; ) {
System.out.print(pc + ": ");
byte op = regexp.program[pc];
pc++; // Increment pc after reading op
switch (op) {
case REOP_EMPTY:
System.out.println("EMPTY");
break;
case REOP_BOL:
System.out.println("BOL");
break;
case REOP_EOL:
System.out.println("EOL");
break;
case REOP_WBDRY:
System.out.println("WBDRY");
break;
case REOP_WNONBDRY:
System.out.println("WNONBDRY");
break;
case REOP_DOT:
System.out.println("DOT");
break;
case REOP_DIGIT:
System.out.println("DIGIT");
break;
case REOP_NONDIGIT:
System.out.println("NONDIGIT");
break;
case REOP_ALNUM:
System.out.println("ALNUM");
break;
case REOP_NONALNUM:
System.out.println("NONALNUM");
break;
case REOP_SPACE:
System.out.println("SPACE");
break;
case REOP_NONSPACE:
System.out.println("NONSPACE");
break;
case REOP_BACKREF:
int backrefIndex = getIndex(regexp.program, pc);
System.out.println("BACKREF " + backrefIndex);
pc += INDEX_LEN;
break;
case REOP_NAMED_BACKREF:
int namedBackrefIndex = getIndex(regexp.program, pc);
int namedBackrefLength = getIndex(regexp.program, pc + INDEX_LEN);
System.out.println(
"NAMED_BACKREF "
+ new String(
regexp.source, namedBackrefIndex, namedBackrefLength));
pc += 2 * INDEX_LEN;
break;
case REOP_FLAT:
int flatIndex = getIndex(regexp.program, pc);
int flatLength = getIndex(regexp.program, pc + INDEX_LEN);
System.out.print("FLAT: ");
for (int i = 0; i < flatLength; i++) {
System.out.print(regexp.source[flatIndex + i]);
}
System.out.println();
pc += 2 * INDEX_LEN;
break;
case REOP_FLAT1:
char flat1Char = (char) (regexp.program[pc] & 0xFF);
System.out.println("FLAT1: " + flat1Char);
pc += 1;
break;
case REOP_FLATi:
int flatiIndex = getIndex(regexp.program, pc);
int flatiLength = getIndex(regexp.program, pc + INDEX_LEN);
System.out.print("FLATi: ");
for (int i = 0; i < flatiLength; i++) {
System.out.print(regexp.source[flatiIndex + i]);
}
System.out.println();
pc += 2 * INDEX_LEN;
break;
case REOP_FLAT1i:
char flat1iChar = (char) (regexp.program[pc] & 0xFF);
System.out.println("FLAT1i: " + flat1iChar);
pc += 1;
break;
case REOP_UCFLAT1:
char ucFlat1Char = (char) getIndex(regexp.program, pc);
System.out.println("UCFLAT1: " + ucFlat1Char);
pc += INDEX_LEN;
break;
case REOP_UCFLAT1i:
char ucFlat1iChar = (char) getIndex(regexp.program, pc);
System.out.println("UCFLAT1i: " + ucFlat1iChar);
pc += INDEX_LEN;
break;
case REOP_CLASS:
int classIndex = getIndex(regexp.program, pc);
System.out.println("CLASS: " + classIndex);
pc += INDEX_LEN;
break;
case REOP_NCLASS:
int nclassIndex = getIndex(regexp.program, pc);
System.out.println("NCLASS: " + nclassIndex);
pc += INDEX_LEN;
break;
case REOP_STAR:
case REOP_PLUS:
case REOP_OPT:
case REOP_MINIMALSTAR:
case REOP_MINIMALPLUS:
case REOP_MINIMALOPT:
case REOP_MINIMALQUANT:
case REOP_QUANT:
{
boolean greedy;
int min, max;
greedy =
op == REOP_STAR
|| op == REOP_PLUS
|| op == REOP_OPT
|| op == REOP_QUANT;
// set min and max
if (op == REOP_STAR || op == REOP_MINIMALSTAR) {
min = 0;
max = Integer.MAX_VALUE;
} else if (op == REOP_PLUS || op == REOP_MINIMALPLUS) {
min = 1;
max = Integer.MAX_VALUE;
} else if (op == REOP_OPT || op == REOP_MINIMALOPT) {
min = 0;
max = 1;
} else {
min = getIndex(regexp.program, pc);
max = getIndex(regexp.program, pc + INDEX_LEN);
pc += 2 * INDEX_LEN;
}
int parenCount = getIndex(regexp.program, pc);
int parenIndex = getIndex(regexp.program, pc + INDEX_LEN);
pc += 2 * INDEX_LEN;
int next = getIndex(regexp.program, pc) + pc;
System.out.println(
"QUANT "
+ "greedy="
+ greedy
+ " min="
+ min
+ " max="
+ (max == Integer.MAX_VALUE ? "MAX" : max)
+ " parenCount="
+ parenCount
+ " parenIndex="
+ parenIndex
+ " next="
+ next);
pc += INDEX_LEN;
}
break;
case REOP_LPAREN:
int parenIndex = getIndex(regexp.program, pc);
System.out.println("LPAREN: " + parenIndex);
pc += INDEX_LEN;
break;
case REOP_RPAREN:
System.out.println("RPAREN");
pc += INDEX_LEN;
break;
case REOP_ALT:
int altIndex = getIndex(regexp.program, pc);
System.out.println("ALT: " + altIndex);
pc += INDEX_LEN;
break;
case REOP_JUMP:
int jumpIndex = getIndex(regexp.program, pc) + pc;
System.out.println("JUMP: " + jumpIndex);
pc += INDEX_LEN;
break;
case REOP_ASSERT:
int assertNextPc = pc + getIndex(regexp.program, pc);
System.out.println("ASSERT: " + assertNextPc);
pc += INDEX_LEN;
break;
case REOP_ASSERT_NOT:
int assertNotNextPc = pc + getIndex(regexp.program, pc);
System.out.println("ASSERT_NOT: " + assertNotNextPc);
pc += INDEX_LEN;
break;
case REOP_ASSERTBACK:
int assertBackNextPc = pc + getIndex(regexp.program, pc);
System.out.println("ASSERTBACK: " + assertBackNextPc);
pc += INDEX_LEN;
break;
case REOP_ASSERTBACK_NOT:
int assertBackNotNextPc = pc + getIndex(regexp.program, pc);
System.out.println("ASSERTBACK_NOT: " + assertBackNotNextPc);
pc += INDEX_LEN;
break;
case REOP_ASSERTTEST:
System.out.println("ASSERTTEST");
break;
case REOP_ASSERTNOTTEST:
System.out.println("ASSERTNOTTEST");
break;
case REOP_ASSERTBACKTEST:
System.out.println("ASSERTBACKTEST");
break;
case REOP_ASSERTBACKNOTTEST:
System.out.println("ASSERTBACKNOTTEST");
break;
case REOP_ENDCHILD:
System.out.println("ENDCHILD");
break;
case REOP_REPEAT:
System.out.println("REPEAT");
break;
case REOP_MINIMALREPEAT:
System.out.println("MINIMALREPEAT");
break;
case REOP_ALTPREREQ:
case REOP_ALTPREREQi:
case REOP_ALTPREREQ2:
String opCode =
(op == REOP_ALTPREREQ)
? "REOP_ALTPREREQ"
: (op == REOP_ALTPREREQi)
? "REOP_ALTPREREQi"
: "REOP_ALTPREREQ2";
char matchCh1 = (char) getIndex(regexp.program, pc);
pc += INDEX_LEN;
char matchCh2 = (char) getIndex(regexp.program, pc);
pc += INDEX_LEN;
int nextPc = pc + getIndex(regexp.program, pc);
pc += INDEX_LEN;
System.out.println(opCode + " " + matchCh1 + " " + matchCh2 + " " + nextPc);
break;
case REOP_END:
System.out.println("END");
break;
default:
System.out.println("UNKNOWN: " + op);
break;
}
}
}