⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexer.java

📁 java1.6众多例子参考
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Copyright 1999-2004 The Apache Software Foundation. * * Licensed 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. *//* * $Id: Lexer.java,v 1.2.4.1 2005/09/10 03:55:45 jeffsuttor Exp $ */package com.sun.org.apache.xpath.internal.compiler;import java.util.Vector;import com.sun.org.apache.xml.internal.utils.PrefixResolver;import com.sun.org.apache.xpath.internal.res.XPATHErrorResources;/** * This class is in charge of lexical processing of the XPath * expression into tokens. */class Lexer{  /**   * The target XPath.   */  private Compiler m_compiler;  /**   * The prefix resolver to map prefixes to namespaces in the XPath.   */  PrefixResolver m_namespaceContext;  /**   * The XPath processor object.   */  XPathParser m_processor;  /**   * This value is added to each element name in the TARGETEXTRA   * that is a 'target' (right-most top-level element name).   */  static final int TARGETEXTRA = 10000;  /**   * Ignore this, it is going away.   * This holds a map to the m_tokenQueue that tells where the top-level elements are.   * It is used for pattern matching so the m_tokenQueue can be walked backwards.   * Each element that is a 'target', (right-most top level element name) has   * TARGETEXTRA added to it.   *   */  private int m_patternMap[] = new int[100];  /**   * Ignore this, it is going away.   * The number of elements that m_patternMap maps;   */  private int m_patternMapSize;  /**   * Create a Lexer object.   *   * @param compiler The owning compiler for this lexer.   * @param resolver The prefix resolver for mapping qualified name prefixes    *                 to namespace URIs.   * @param xpathProcessor The parser that is processing strings to opcodes.   */  Lexer(Compiler compiler, PrefixResolver resolver,        XPathParser xpathProcessor)  {    m_compiler = compiler;    m_namespaceContext = resolver;    m_processor = xpathProcessor;  }  /**   * Walk through the expression and build a token queue, and a map of the top-level   * elements.   * @param pat XSLT Expression.   *   * @throws javax.xml.transform.TransformerException   */  void tokenize(String pat) throws javax.xml.transform.TransformerException  {    tokenize(pat, null);  }  /**   * Walk through the expression and build a token queue, and a map of the top-level   * elements.   * @param pat XSLT Expression.   * @param targetStrings Vector to hold Strings, may be null.   *   * @throws javax.xml.transform.TransformerException   */  void tokenize(String pat, Vector targetStrings)          throws javax.xml.transform.TransformerException  {    m_compiler.m_currentPattern = pat;    m_patternMapSize = 0;     // This needs to grow too.    m_compiler.m_opMap = new OpMapVector(OpMap.MAXTOKENQUEUESIZE * 5, OpMap.BLOCKTOKENQUEUESIZE * 5, OpMap.MAPINDEX_LENGTH);    int nChars = pat.length();    int startSubstring = -1;     int posOfNSSep = -1;    boolean isStartOfPat = true;    boolean isAttrName = false;    boolean isNum = false;    // Nesting of '[' so we can know if the given element should be    // counted inside the m_patternMap.    int nesting = 0;    // char[] chars = pat.toCharArray();    for (int i = 0; i < nChars; i++)    {      char c = pat.charAt(i);      switch (c)      {      case '\"' :      {        if (startSubstring != -1)        {          isNum = false;          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);          isAttrName = false;          if (-1 != posOfNSSep)          {            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);          }          else          {            addToTokenQueue(pat.substring(startSubstring, i));          }        }        startSubstring = i;        for (i++; (i < nChars) && ((c = pat.charAt(i)) != '\"'); i++);        if (c == '\"' && i < nChars)        {          addToTokenQueue(pat.substring(startSubstring, i + 1));          startSubstring = -1;        }        else        {          m_processor.error(XPATHErrorResources.ER_EXPECTED_DOUBLE_QUOTE,                            null);  //"misquoted literal... expected double quote!");        }      }      break;      case '\'' :        if (startSubstring != -1)        {          isNum = false;          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);          isAttrName = false;          if (-1 != posOfNSSep)          {            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);          }          else          {            addToTokenQueue(pat.substring(startSubstring, i));          }        }        startSubstring = i;        for (i++; (i < nChars) && ((c = pat.charAt(i)) != '\''); i++);        if (c == '\'' && i < nChars)        {          addToTokenQueue(pat.substring(startSubstring, i + 1));          startSubstring = -1;        }        else        {          m_processor.error(XPATHErrorResources.ER_EXPECTED_SINGLE_QUOTE,                            null);  //"misquoted literal... expected single quote!");        }        break;      case 0x0A :      case 0x0D :      case ' ' :      case '\t' :        if (startSubstring != -1)        {          isNum = false;          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);          isAttrName = false;          if (-1 != posOfNSSep)          {            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);          }          else          {            addToTokenQueue(pat.substring(startSubstring, i));          }          startSubstring = -1;        }        break;      case '@' :        isAttrName = true;      // fall-through on purpose      case '-' :        if ('-' == c)        {          if (!(isNum || (startSubstring == -1)))          {            break;          }          isNum = false;        }      // fall-through on purpose      case '(' :      case '[' :      case ')' :      case ']' :      case '|' :      case '/' :      case '*' :      case '+' :      case '=' :      case ',' :      case '\\' :  // Unused at the moment      case '^' :  // Unused at the moment      case '!' :  // Unused at the moment      case '$' :      case '<' :      case '>' :        if (startSubstring != -1)        {          isNum = false;          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);          isAttrName = false;          if (-1 != posOfNSSep)          {            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);          }          else          {            addToTokenQueue(pat.substring(startSubstring, i));          }          startSubstring = -1;        }        else if (('/' == c) && isStartOfPat)        {          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);        }        else if ('*' == c)        {          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);          isAttrName = false;        }        if (0 == nesting)        {          if ('|' == c)          {            if (null != targetStrings)            {              recordTokenString(targetStrings);            }            isStartOfPat = true;          }        }        if ((')' == c) || (']' == c))        {          nesting--;        }        else if (('(' == c) || ('[' == c))        {          nesting++;        }        addToTokenQueue(pat.substring(i, i + 1));        break;      case ':' :        if (i>0)        {          if (posOfNSSep == (i - 1))          {            if (startSubstring != -1)            {              if (startSubstring < (i - 1))                addToTokenQueue(pat.substring(startSubstring, i - 1));            }            isNum = false;            isAttrName = false;            startSubstring = -1;            posOfNSSep = -1;            addToTokenQueue(pat.substring(i - 1, i + 1));            break;          }          else          {            posOfNSSep = i;          }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -