package com.sun.org.apache.xerces.internal.impl.xpath.regex;
import java.util.ArrayList;
class Op {
static final int DOT = 0;
static final int CHAR = 1;
static final int RANGE = 3;
static final int NRANGE = 4;
static final int ANCHOR = 5;
static final int STRING = 6;
static final int CLOSURE = 7;
static final int NONGREEDYCLOSURE = 8;
static final int QUESTION = 9;
static final int NONGREEDYQUESTION = 10;
static final int UNION = 11;
static final int CAPTURE = 15;
static final int BACKREFERENCE = 16;
static final int LOOKAHEAD = 20;
static final int NEGATIVELOOKAHEAD = 21;
static final int LOOKBEHIND = 22;
static final int NEGATIVELOOKBEHIND = 23;
static final int INDEPENDENT = 24;
static final int MODIFIER = 25;
static final int CONDITION = 26;
static int nofinstances = 0;
static final boolean COUNT = false;
static Op createDot() {
if (Op.COUNT) Op.nofinstances ++;
return new Op(Op.DOT);
}
static CharOp createChar(int data) {
if (Op.COUNT) Op.nofinstances ++;
return new CharOp(Op.CHAR, data);
}
static CharOp createAnchor(int data) {
if (Op.COUNT) Op.nofinstances ++;
return new CharOp(Op.ANCHOR, data);
}
static CharOp createCapture(int number, Op next) {
if (Op.COUNT) Op.nofinstances ++;
CharOp op = new CharOp(Op.CAPTURE, number);
op.next = next;
return op;
}
static UnionOp createUnion(int size) {
if (Op.COUNT) Op.nofinstances ++;
return new UnionOp(Op.UNION, size);
}
static ChildOp createClosure(int id) {
if (Op.COUNT) Op.nofinstances ++;
return new ModifierOp(Op.CLOSURE, id, -1);
}
static ChildOp createNonGreedyClosure() {
if (Op.COUNT) Op.nofinstances ++;
return new ChildOp(Op.NONGREEDYCLOSURE);
}
static ChildOp createQuestion(boolean nongreedy) {
if (Op.COUNT) Op.nofinstances ++;
return new ChildOp(nongreedy ? Op.NONGREEDYQUESTION : Op.QUESTION);
}
static RangeOp createRange(Token tok) {
if (Op.COUNT) Op.nofinstances ++;
return new RangeOp(Op.RANGE, tok);
}
static ChildOp createLook(int type, Op next, Op branch) {
if (Op.COUNT) Op.nofinstances ++;
ChildOp op = new ChildOp(type);
op.setChild(branch);
op.next = next;
return op;
}
static CharOp createBackReference(int refno) {
if (Op.COUNT) Op.nofinstances ++;
return new CharOp(Op.BACKREFERENCE, refno);
}
static StringOp createString(String literal) {
if (Op.COUNT) Op.nofinstances ++;
return new StringOp(Op.STRING, literal);
}
static ChildOp createIndependent(Op next, Op branch) {
if (Op.COUNT) Op.nofinstances ++;
ChildOp op = new ChildOp(Op.INDEPENDENT);
op.setChild(branch);
op.next = next;
return op;
}
static ModifierOp createModifier(Op next, Op branch, int add, int mask) {
if (Op.COUNT) Op.nofinstances ++;
ModifierOp op = new ModifierOp(Op.MODIFIER, add, mask);
op.setChild(branch);
op.next = next;
return op;
}
static ConditionOp createCondition(Op next, int ref, Op conditionflow, Op yesflow, Op noflow) {
if (Op.COUNT) Op.nofinstances ++;
ConditionOp op = new ConditionOp(Op.CONDITION, ref, conditionflow, yesflow, noflow);
op.next = next;
return op;
}
final int type;
Op next = null;
protected Op(int type) {
this.type = type;
}
int size() {
return 0;
}
Op elementAt(int index) {
throw new RuntimeException("Internal Error: type="+this.type);
}
Op getChild() {
throw new RuntimeException("Internal Error: type="+this.type);
}
int getData() {
throw new RuntimeException("Internal Error: type="+this.type);
}
int getData2() {
throw new RuntimeException("Internal Error: type="+this.type);
}
RangeToken getToken() {
throw new RuntimeException("Internal Error: type="+this.type);
}
String getString() {
throw new RuntimeException("Internal Error: type="+this.type);
}
static class CharOp extends Op {
final int charData;
CharOp(int type, int data) {
super(type);
this.charData = data;
}
int getData() {
return this.charData;
}
}
static class UnionOp extends Op {
final ArrayList<Op> branches;
UnionOp(int type, int size) {
super(type);
this.branches = new ArrayList<>(size);
}
void addElement(Op op) {
this.branches.add(op);
}
int size() {
return this.branches.size();
}
Op elementAt(int index) {
return this.branches.get(index);
}
}
static class ChildOp extends Op {
Op child;
ChildOp(int type) {
super(type);
}
void setChild(Op child) {
this.child = child;
}
Op getChild() {
return this.child;
}
}
static class ModifierOp extends ChildOp {
final int v1;
final int v2;
ModifierOp(int type, int v1, int v2) {
super(type);
this.v1 = v1;
this.v2 = v2;
}
int getData() {
return this.v1;
}
int getData2() {
return this.v2;
}
}
static class RangeOp extends Op {
final Token tok;
RangeOp(int type, Token tok) {
super(type);
this.tok = tok;
}
RangeToken getToken() {
return (RangeToken)this.tok;
}
}
static class StringOp extends Op {
final String string;
StringOp(int type, String literal) {
super(type);
this.string = literal;
}
String getString() {
return this.string;
}
}
static class ConditionOp extends Op {
final int refNumber;
final Op condition;
final Op yes;
final Op no;
ConditionOp(int type, int refno, Op conditionflow, Op yesflow, Op noflow) {
super(type);
this.refNumber = refno;
this.condition = conditionflow;
this.yes = yesflow;
this.no = noflow;
}
}
}