|
|
|
|
|
|
|
*/ |
|
/* |
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
|
* contributor license agreements. See the NOTICE file distributed with |
|
* this work for additional information regarding copyright ownership. |
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
|
* (the "License"); you may not use this file except in compliance with |
|
* the License. You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
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; |
|
} |
|
} |
|
} |