nextToken(); nextToken();
relativePathStatus = RELATIVE_PATH_REQUIRED;
  protected void LocationPathPattern() throws javax.xml.transform.TransformerException  {    int opPos = m_ops.m_opMap[OpMap.MAPINDEX_LENGTH];    appendOp(2, OpCodes.OP_LOCATIONPATHPATTERN);    if (lookahead('(', 1)            && (tokenIs(Keywords.FUNC_ID_STRING)                || tokenIs(Keywords.FUNC_KEY_STRING)))    {      IdKeyPattern();      if (tokenIs('/') && lookahead('/', 1))      {        appendOp(4, OpCodes.MATCH_ANY_ANCESTOR);        // Tell how long the step is without the predicate        m_ops.m_opMap[m_ops.m_opMap[OpMap.MAPINDEX_LENGTH] - 2] = 4;        m_ops.m_opMap[m_ops.m_opMap[OpMap.MAPINDEX_LENGTH] - 1] =          OpCodes.NODETYPE_FUNCTEST;        nextToken();        nextToken();      }    }    else if (tokenIs('/'))    {      if (lookahead('/', 1))      {        appendOp(4, OpCodes.MATCH_ANY_ANCESTOR);                // Added this to fix bug reported by Myriam for match="//x/a"        // patterns.  If you don't do this, the 'x' step will think it's part        // of a '//' pattern, and so will cause 'a' to be matched when it has        // any ancestor that is 'x'.        nextToken();      }      else      {        appendOp(4, OpCodes.FROM_ROOT);      }      // Tell how long the step is without the predicate      m_ops.m_opMap[m_ops.m_opMap[OpMap.MAPINDEX_LENGTH] - 2] = 4;      m_ops.m_opMap[m_ops.m_opMap[OpMap.MAPINDEX_LENGTH] - 1] =        OpCodes.NODETYPE_ROOT;      nextToken();    }    if (!tokenIs('|') && (null != m_token))    {      RelativePathPattern();    }    // Terminate for safety.    m_ops.m_opMap[m_ops.m_opMap[OpMap.MAPINDEX_LENGTH]] = OpCodes.ENDOP;    m_ops.m_opMap[OpMap.MAPINDEX_LENGTH] += 1;    m_ops.m_opMap[opPos + OpMap.MAPINDEX_LENGTH] =      m_ops.m_opMap[OpMap.MAPINDEX_LENGTH] - opPos;  }