TokenFactory.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:15k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 2001, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Log: TokenFactory.cpp,v $
  58.  * Revision 1.5  2001/06/07 20:55:39  tng
  59.  * Fix no newline at the end warning.  By Pei Yong Zhang.
  60.  *
  61.  * Revision 1.4  2001/05/11 13:26:51  tng
  62.  * Copyright update.
  63.  *
  64.  * Revision 1.3  2001/05/03 18:17:52  knoaman
  65.  * Some design changes:
  66.  * o Changed the TokenFactory from a single static instance, to a
  67.  *    normal class. Each RegularExpression object will have its own
  68.  *    instance of TokenFactory, and that instance will be passed to
  69.  *    other classes that need to use a TokenFactory to create Token
  70.  *    objects (with the exception of RangeTokenMap).
  71.  * o Added a new class RangeTokenMap to map a the different ranges
  72.  *    in a given category to a specific RangeFactory object. In the old
  73.  *    design RangeFactory had dual functionality (act as a Map, and as
  74.  *    a factory for creating RangeToken(s)). The RangeTokenMap will
  75.  *    have its own copy of the TokenFactory. There will be only one
  76.  *    instance of the RangeTokenMap class, and that instance will be
  77.  *    lazily deleted when XPlatformUtils::Terminate is called.
  78.  *
  79.  * Revision 1.2  2001/03/22 13:23:34  knoaman
  80.  * Minor modifications to eliminate compiler warnings.
  81.  *
  82.  * Revision 1.1  2001/03/02 19:23:00  knoaman
  83.  * Schema: Regular expression handling part I
  84.  *
  85.  */
  86. // ---------------------------------------------------------------------------
  87. //  Includes
  88. // ---------------------------------------------------------------------------
  89. #include <util/regx/TokenFactory.hpp>
  90. #include <util/regx/TokenInc.hpp>
  91. #include <util/regx/XMLRangeFactory.hpp>
  92. #include <util/regx/ASCIIRangeFactory.hpp>
  93. #include <util/regx/UnicodeRangeFactory.hpp>
  94. #include <util/regx/BlockRangeFactory.hpp>
  95. #include <util/regx/RangeTokenMap.hpp>
  96. #include <util/regx/RegxDefs.hpp>
  97. // ---------------------------------------------------------------------------
  98. //  TokenFactory: Constructors and Destructor
  99. // ---------------------------------------------------------------------------
  100. TokenFactory::TokenFactory() :
  101.     fRangeInitialized(0)
  102.     , fTokens(new RefVectorOf<Token> (16, true))
  103.     , fEmpty(0)
  104.     , fLineBegin(0)
  105.     , fLineBegin2(0)
  106.     , fLineEnd(0)
  107.     , fStringBegin(0)
  108.     , fStringEnd(0)
  109.     , fStringEnd2(0)
  110.     , fWordEdge(0)
  111.     , fNotWordEdge(0)
  112.     , fWordEnd(0)
  113.     , fWordBegin(0)
  114.     , fDot(0)
  115.     , fCombiningChar(0)
  116.     , fGrapheme(0)
  117. {
  118. }
  119. TokenFactory::~TokenFactory() {
  120. delete fTokens;
  121. fTokens = 0;
  122. }
  123. // ---------------------------------------------------------------------------
  124. //  TokenFactory - Factory methods
  125. // ---------------------------------------------------------------------------
  126. Token* TokenFactory::createToken(const unsigned short tokType) {
  127. if (tokType == Token::EMPTY && fEmpty != 0)
  128. return fEmpty;
  129. Token* tmpTok = new Token(tokType);
  130. if (tokType == Token::EMPTY) {
  131. fEmpty = tmpTok;
  132.     }
  133. fTokens->addElement(tmpTok);
  134. return tmpTok;
  135. }
  136. ParenToken* TokenFactory::createLook(const unsigned short tokType,
  137.  Token* const token) {
  138. ParenToken* tmpTok = new ParenToken(tokType, token, 0);
  139. fTokens->addElement(tmpTok);
  140. return tmpTok;
  141. }
  142. ParenToken* TokenFactory::createParenthesis(Token* const token,
  143. const int noGroups) {
  144. ParenToken* tmpTok = new ParenToken(Token::PAREN, token, noGroups);
  145. fTokens->addElement(tmpTok);
  146. return tmpTok;
  147. }
  148. ClosureToken* TokenFactory::createClosure(Token* const token,
  149.   bool isNonGreedy) {
  150. ClosureToken* tmpTok = isNonGreedy ? new ClosureToken(Token::NONGREEDYCLOSURE, token)
  151.    : new ClosureToken(Token::CLOSURE, token);
  152. fTokens->addElement(tmpTok);
  153. return tmpTok;
  154. }
  155. ConcatToken* TokenFactory::createConcat(Token* const token1,
  156.                                         Token* const token2) {
  157.     ConcatToken* tmpTok = new ConcatToken(token1, token2);
  158.     fTokens->addElement(tmpTok);
  159.     return tmpTok;
  160. }
  161. UnionToken* TokenFactory::createUnion(const bool isConcat) {
  162. UnionToken* tmpTok = isConcat ? new UnionToken(Token::CONCAT)
  163.   : new UnionToken(Token::UNION);
  164. fTokens->addElement(tmpTok);
  165. return tmpTok;
  166. }
  167. RangeToken* TokenFactory::createRange(const bool isNegRange){
  168. RangeToken* tmpTok = isNegRange ? new RangeToken(Token::NRANGE)
  169.    : new RangeToken(Token::RANGE);
  170. fTokens->addElement(tmpTok);
  171. return tmpTok;
  172. return 0;
  173. }
  174. CharToken* TokenFactory::createChar(const XMLUInt32 ch, const bool isAnchor) {
  175. CharToken* tmpTok = isAnchor ? new CharToken(Token::ANCHOR, ch)
  176. : new CharToken(Token::CHAR, ch);
  177. fTokens->addElement(tmpTok);
  178. return tmpTok;
  179. }
  180. StringToken* TokenFactory::createBackReference(const int noRefs) {
  181. StringToken* tmpTok = new StringToken(Token::BACKREFERENCE, 0, noRefs);
  182. fTokens->addElement(tmpTok);
  183. return tmpTok;
  184. }
  185. StringToken* TokenFactory::createString(const XMLCh* const literal) {
  186. StringToken* tmpTok = new StringToken(Token::STRING, literal, 0);
  187. fTokens->addElement(tmpTok);
  188. return tmpTok;
  189. }
  190. ModifierToken* TokenFactory::createModifierGroup(Token* const child,
  191.                                                  const int add,
  192.                                                  const int mask) {
  193. ModifierToken* tmpTok = new ModifierToken(child, add, mask);
  194. fTokens->addElement(tmpTok);
  195. return tmpTok;
  196. }
  197. ConditionToken* TokenFactory::createCondition(const int refNo,
  198.                                               Token* const condition,
  199.                                               Token* const yesFlow,
  200.                                               Token* const noFlow) {
  201. ConditionToken* tmpTok = new ConditionToken(refNo, condition, yesFlow,
  202.                                                 noFlow);
  203. fTokens->addElement(tmpTok);
  204. return tmpTok;
  205. }
  206. // ---------------------------------------------------------------------------
  207. //  TokenFactory - Getter methods
  208. // ---------------------------------------------------------------------------
  209. RangeToken* TokenFactory::getRange(const XMLCh* const keyword,
  210.                                    const bool complement) {
  211.     if (!fRangeInitialized) {
  212. initializeRegistry();
  213. }
  214. return RangeTokenMap::instance()->getRange(keyword, complement);
  215. }
  216. Token* TokenFactory::getLineBegin() {
  217. if (fLineBegin == 0)
  218.         fLineBegin = createChar(chCaret, true);
  219.     return fLineBegin;
  220. }
  221. Token* TokenFactory::getLineBegin2() {
  222. if (fLineBegin2 == 0)
  223.         fLineBegin2 = createChar(chAt, true);
  224.     return fLineBegin2;
  225. }
  226. Token* TokenFactory::getLineEnd() {
  227. if (fLineEnd == 0)
  228.         fLineEnd = createChar(chDollarSign, true);
  229.     return fLineEnd;
  230. }
  231. Token* TokenFactory::getStringBegin() {
  232. if (fStringBegin == 0)
  233.         fStringBegin = createChar(chLatin_A, true);
  234.     return fStringBegin;
  235. }
  236. Token* TokenFactory::getStringEnd() {
  237. if (fStringEnd == 0)
  238.         fStringEnd = createChar(chLatin_z, true);
  239.     return fStringEnd;
  240. }
  241. Token* TokenFactory::getStringEnd2() {
  242. if (fStringEnd2 == 0)
  243.         fStringEnd2 = createChar(chLatin_Z, true);
  244.     return fStringEnd2;
  245. }
  246. Token* TokenFactory::getWordEdge() {
  247. if (fWordEdge == 0)
  248.         fWordEdge = createChar(chLatin_b, true);
  249.     return fWordEdge;
  250. }
  251. Token* TokenFactory::getNotWordEdge(){
  252. if (fNotWordEdge == 0)
  253.         fNotWordEdge = createChar(chLatin_B, true);
  254.     return fNotWordEdge;
  255. }
  256. Token* TokenFactory::getWordBegin() {
  257. if (fWordBegin == 0)
  258.         fWordBegin = createChar(chOpenAngle, true);
  259.     return fWordBegin;
  260. }
  261. Token* TokenFactory::getWordEnd() {
  262. if (fWordEnd == 0)
  263.         fWordEnd = createChar(chCloseAngle, true);
  264.     return fWordEnd;
  265. }
  266. Token* TokenFactory::getDot() {
  267. if (fDot == 0)
  268.         fDot = createToken(Token::DOT);
  269.     return fDot;
  270. }
  271. Token* TokenFactory::getCombiningCharacterSequence() {
  272. if (fCombiningChar == 0) {
  273. Token* foo = createClosure(getRange(fgUniMark)); // pM*
  274. foo = createConcat(getRange(fgUniMark, true), foo); // PM + pM*
  275. fCombiningChar = foo;
  276. }
  277. return fCombiningChar;
  278. }
  279. //    static final String viramaString =
  280. Token* TokenFactory::getGraphemePattern() {
  281. if (fGrapheme == 0) {
  282.         Token* base_char = createRange();  // [{ASSIGNED}]-[{M},{C}]
  283.         base_char->mergeRanges(getRange(fgUniAssigned));
  284.         base_char->subtractRanges(getRange(fgUniMark));
  285.         base_char->subtractRanges(getRange(fgUniControl));
  286.         Token* virama = createRange();
  287. virama->addRange(0x094D, 0x094D);
  288. virama->addRange(0x09CD, 0x09CD);
  289. virama->addRange(0x0A4D, 0x0A4D);
  290. virama->addRange(0x0ACD, 0x0ACD);
  291. virama->addRange(0x0B4D, 0x0B4D);
  292. virama->addRange(0x0BCD, 0x0BCD);
  293. virama->addRange(0x0C4D, 0x0C4D);
  294. virama->addRange(0x0CCD, 0x0CCD);
  295. virama->addRange(0x0D4D, 0x0D4D);
  296. virama->addRange(0x0E3A, 0x0E3A);
  297. virama->addRange(0x0F84, 0x0F84);
  298.         Token* combiner_wo_virama = createRange();
  299.         combiner_wo_virama->mergeRanges(getRange(fgUniMark));
  300.         combiner_wo_virama->addRange(0x1160, 0x11FF); // hangul_medial and hangul_final
  301.         combiner_wo_virama->addRange(0xFF9F, 0xFF9F); // extras
  302.         Token* left = TokenFactory::createUnion();       // base_char?
  303.         left->addChild(base_char, this);
  304.         left->addChild(createToken(Token::EMPTY), this);
  305.         Token* foo = createUnion();
  306.         foo->addChild(TokenFactory::createConcat(virama,getRange(fgUniLetter)), this);
  307.         foo->addChild(combiner_wo_virama, this);
  308.         foo = createClosure(foo);
  309.         foo = createConcat(left, foo);
  310.         fGrapheme = foo;
  311. }
  312. return fGrapheme;
  313. }
  314. // ---------------------------------------------------------------------------
  315. //  TokenFactory - Helper methods
  316. // ---------------------------------------------------------------------------
  317. void TokenFactory::initializeRegistry() {
  318. XMLMutexLock lockInit(&fMutex);
  319.     if (fRangeInitialized)
  320.         return;
  321.     RangeTokenMap::instance()->initializeRegistry();
  322.     // Add categories
  323.     RangeTokenMap::instance()->addCategory(fgXMLCategory);
  324.     RangeTokenMap::instance()->addCategory(fgASCIICategory);
  325.     RangeTokenMap::instance()->addCategory(fgUnicodeCategory);
  326.     RangeTokenMap::instance()->addCategory(fgBlockCategory);
  327. // Add xml range factory
  328.     RangeFactory* rangeFact = new XMLRangeFactory();
  329.     RangeTokenMap::instance()->addRangeMap(fgXMLCategory, rangeFact);
  330.     rangeFact->initializeKeywordMap();
  331.     // Add ascii range factory
  332.     rangeFact = new ASCIIRangeFactory();
  333.     RangeTokenMap::instance()->addRangeMap(fgASCIICategory, rangeFact);
  334.     rangeFact->initializeKeywordMap();
  335.     // Add unicode range factory
  336.     rangeFact = new UnicodeRangeFactory();
  337.     RangeTokenMap::instance()->addRangeMap(fgUnicodeCategory, rangeFact);
  338.     rangeFact->initializeKeywordMap();
  339.     // Add block range factory
  340.     rangeFact = new BlockRangeFactory();
  341.     RangeTokenMap::instance()->addRangeMap(fgBlockCategory, rangeFact);
  342.     rangeFact->initializeKeywordMap();
  343.     fRangeInitialized = true;
  344. }
  345. /*
  346. #if defined (XML_USE_ICU_TRANSCODER)
  347.    #include <unicode/unicode.h>
  348. #endif
  349. #include <stdio.h>
  350. void TokenFactory::printUnicode() {
  351. #if defined (XML_USE_ICU_TRANSCODER)
  352.     //
  353.     //  Write it out to a temp file to be read back into this source later.
  354.     //
  355. printf("Printingn");
  356. //sprintf(msg, "Printingn");
  357.     FILE* outFl = fopen("table.out", "wt+");
  358.     fprintf(outFl, "const XMLByte fgUniCharsTable[0x10000] =n{    ");
  359.     for (unsigned int index = 0; index <= 0xFFFF; index += 16)
  360.     {
  361.         fprintf(outFl
  362.                 , "    , 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02Xn"
  363.                 , (unsigned int)Unicode::getType(index)
  364.                 , (unsigned int)Unicode::getType(index+1)
  365.                 , (unsigned int)Unicode::getType(index+2)
  366.                 , (unsigned int)Unicode::getType(index+3)
  367.                 , (unsigned int)Unicode::getType(index+4)
  368.                 , (unsigned int)Unicode::getType(index+5)
  369.                 , (unsigned int)Unicode::getType(index+6)
  370.                 , (unsigned int)Unicode::getType(index+7)
  371. , (unsigned int)Unicode::getType(index+8)
  372.                 , (unsigned int)Unicode::getType(index+9)
  373.                 , (unsigned int)Unicode::getType(index+10)
  374.                 , (unsigned int)Unicode::getType(index+11)
  375. , (unsigned int)Unicode::getType(index+12)
  376.                 , (unsigned int)Unicode::getType(index+13)
  377.                 , (unsigned int)Unicode::getType(index+14)
  378.                 , (unsigned int)Unicode::getType(index+15));
  379.     }
  380.     fprintf(outFl, "};n");
  381.     fclose(outFl);
  382. #endif
  383. }
  384. */
  385. /**
  386.   * End of file TokenFactory.cpp
  387.   */