blob: 22820328bf78e94ffadd0a49418e8109d77b0da3 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache
* XMLBeans", nor may "Apache" appear in their name, without prior
* written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2000-2003 BEA Systems
* Inc., <http://www.bea.com/>. For more information on the Apache Software
* Foundation, please see <http://www.apache.org/>.
*/
package org.apache.xmlbeans.impl.regex;
import java.util.Vector;
/**
*/
class Op {
static final int DOT = 0;
static final int CHAR = 1; // Single character
static final int RANGE = 3; // [a-zA-Z]
static final int NRANGE = 4; // [^a-zA-Z]
static final int ANCHOR = 5; // ^ $ ...
static final int STRING = 6; // literal String
static final int CLOSURE = 7; // X*
static final int NONGREEDYCLOSURE = 8; // X*?
static final int QUESTION = 9; // X?
static final int NONGREEDYQUESTION = 10; // X??
static final int UNION = 11; // X|Y
static final int CAPTURE = 15; // ( and )
static final int BACKREFERENCE = 16; // \1 \2 ...
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; // (?ims-ims:...)
static final int CONDITION = 26; // (?(..)yes|no)
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 ++;
//System.err.println("Creates UnionOp");
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;
}
int type;
Op next = null;
protected Op(int type) {
this.type = type;
}
int size() { // for UNION
return 0;
}
Op elementAt(int index) { // for UNIoN
throw new RuntimeException("Internal Error: type="+this.type);
}
Op getChild() { // for CLOSURE, QUESTION
throw new RuntimeException("Internal Error: type="+this.type);
}
// ModifierOp
int getData() { // CharOp for CHAR, BACKREFERENCE, CAPTURE, ANCHOR,
throw new RuntimeException("Internal Error: type="+this.type);
}
int getData2() { // ModifierOp
throw new RuntimeException("Internal Error: type="+this.type);
}
RangeToken getToken() { // RANGE, NRANGE
throw new RuntimeException("Internal Error: type="+this.type);
}
String getString() { // STRING
throw new RuntimeException("Internal Error: type="+this.type);
}
// ================================================================
static class CharOp extends Op {
int charData;
CharOp(int type, int data) {
super(type);
this.charData = data;
}
int getData() {
return this.charData;
}
}
// ================================================================
static class UnionOp extends Op {
Vector branches;
UnionOp(int type, int size) {
super(type);
this.branches = new Vector(size);
}
void addElement(Op op) {
this.branches.addElement(op);
}
int size() {
return this.branches.size();
}
Op elementAt(int index) {
return (Op)this.branches.elementAt(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 {
int v1;
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 {
Token tok;
RangeOp(int type, Token tok) {
super(type);
this.tok = tok;
}
RangeToken getToken() {
return (RangeToken)this.tok;
}
}
// ================================================================
static class StringOp extends Op {
String string;
StringOp(int type, String literal) {
super(type);
this.string = literal;
}
String getString() {
return this.string;
}
}
// ================================================================
static class ConditionOp extends Op {
int refNumber;
Op condition;
Op yes;
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;
}
}
}