/*
 * 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 org.apache.xerces.impl.xpath.regex;

import java.util.Vector;

@xerces.internal
Version:$Id: Op.java 572108 2007-09-02 18:48:31Z mrglavas $
/** * @xerces.internal * * @version $Id: Op.java 572108 2007-09-02 18:48:31Z mrglavas $ */
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; } final 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 { final int charData; CharOp(int type, int data) { super(type); this.charData = data; } int getData() { return this.charData; } } // ================================================================ static class UnionOp extends Op { final 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 { 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; } } }