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

📄 javaparser.cpp

📁 用bcg库编写的java IDE 源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	   return true;
	 }
   }return false;
}

bool CJavaParser::isType()
{
   if(isBasicType()||isIdentifier())
	  return true;
   return false;
}

bool CJavaParser::isBasicType()
{
  for(long I=0; m_lszpBasicTypes[I] != NULL; I++)
  {
    if(m_strCurToken.Compare(m_lszpBasicTypes[I]) == 0)
		return true;
  }
  return false;
}

bool CJavaParser::methodOrFieldDecl()//HANDLE:type
{
   return methodOrFieldRest();
}

bool CJavaParser::methodOrFieldRest()
{
   saveState(); if(!getNextToken()){popStack();return false;}

   if(m_strCurToken.Compare("(") == 0)
   {
	 popStack();//consume '('
	 m_nDeclType = METHOD_DECL;
     return methodDeclaratorRest();
   }
   else
   {
     m_nDeclType = FIELD_DECL;
	 resetState();
	 return variableDeclaratorsRest();
   }
   return false;
}


bool CJavaParser::getNextLine()
{
  int nLineCount = m_pDeclManager->getTextBuffer()->GetLineCount();
  ++m_nLineIndex;
  if(m_nLineIndex<nLineCount)
  {
     m_nLineLength  = m_pDeclManager->getTextBuffer()->GetLineLength(m_nLineIndex);
     m_lszpLine     = m_pDeclManager->getTextBuffer()->GetLineChars(m_nLineIndex);
	 m_nCharIndex   = 0;
	 //TRACE1("%d Line:\n",m_nLineIndex);
	 return true;
  }
  else
  {
	//ASSERT(m_stSaveInts.StackIsEmpty());
	  --m_nLineIndex;
    return false;
  }
}

bool CJavaParser::getLineAbove()
{
  --m_nLineIndex;
  if(m_nLineIndex>=0)
  {
     m_nLineLength  = m_pDeclManager->getTextBuffer()->GetLineLength(m_nLineIndex);
     m_lszpLine     = m_pDeclManager->getTextBuffer()->GetLineChars(m_nLineIndex);
	 m_nCharIndex   = m_nLineLength-1;

	 for(long I=0; I<m_nLineLength; I++)
	 {
	   if(m_lszpLine[I] == '/'&&
		   I<m_nLineLength-1&&
		   m_lszpLine[I+1] == '/')
	   {
          m_nCharIndex  = I-1;
		  m_nLineLength = I;
		  break;
	   }
	 }
	 return true;
  }
  else
  return false;
}

bool CJavaParser::methodDeclaratorRest()
{
  m_nDeclType = METHOD_DECL;
  if(formalParameters())
  {
     if(bracketsOpt())
	 {
       if(!getNextToken())return false;

	   if(m_strCurToken.Compare("throws") == 0)
	   {
		  if(qualifiedIdentifierList())
		  {
             if(!getNextToken())return false;
			 goto finalize;
		  }
		  else
		  {
			 return false;
		  }

	   }
       else
	   {
finalize:;
          //if(!getNextToken())return false;
		  if((m_strCurToken.Compare("{") == 0) || (m_strCurToken.Compare(";") == 0))
		  {
             m_bSuccess = true;
			 return true;
		  }else return false;
	   }
	 }else return false;
  }else return false;
  return false;
}


bool CJavaParser::formalParameters()
{
 // if(!getNextToken())return false;
 // if(m_strCurToken.Compare("(") == 0)
  {
    /**SEMANTIC**/m_strFullMethDescrpt += '(';/**SEMANTIC**/

	 //[FormalParameter { , FormalParameter} ]
     saveState(); if(!getNextToken()){popStack();return false;}

	 if((m_strCurToken.Compare("final") == 0) || isType())
	 {
		 resetState();
		//{ , FormalParameter }
        if(formalParameter())
		{
		  /**SEMANTIC**/m_strFullMethDescrpt += m_strParamType+' '+m_strParamName+',';/**SEMANTIC**/
		  /**SEMANTIC**/m_lstrMethodInfo.AddTail(m_strParamType);/**SEMANTIC**/
		  while(true)
		  {
            if(!getNextToken())return false;
		    
			if(m_strCurToken.Compare(",") == 0)
			{
               if(formalParameter())
			   {
                 /**SEMANTIC**/m_strFullMethDescrpt += m_strParamType+' '+m_strParamName+',';/**SEMANTIC**/
				 /**SEMANTIC**/m_lstrMethodInfo.AddTail(m_strParamType);/**SEMANTIC**/
				 continue;
			   }
			   else return false;
			}
			else
			{
				break;
			}
		  }
		}
	 }
	 else
	 {
       popStack();
	 }

     //if(!getNextToken())return false;
	 if(m_strCurToken.Compare(")") == 0)
	 {
        /**SEMANTIC**/m_strFullMethDescrpt.TrimRight(',');/**SEMANTIC**/
        /**SEMANTIC**/m_strFullMethDescrpt += ')';/**SEMANTIC**/
        return true;
	 }
  }
   return false;
}

bool CJavaParser::formalParameter()
{
  saveState(); if(!getNextToken()){popStack();return false;}


  if(m_strCurToken.Compare("final") == 0)
  {
    popStack();//consume "final"
  }
  else
  resetState();

  if(type())
  {
     /**SEMANTIC**/smtSetParamType(m_strCurToken);/**SEMANTIC**/
      return variableDeclaratorId();
  }
  return false;
}

bool CJavaParser::variableDeclaratorId()
{
   if(identifier())
   { 
	 /**SEMANTIC**/m_strParamName = m_strCurToken;/**SEMANTIC**/
	 if(bracketsOpt())
	 {
       /**SEMANTIC**/
	   if(!m_strCurToken.IsEmpty())
	   {
         if(m_strCurToken[0] == '[')
	    m_strParamName += m_strCurToken;
	   }
	   smtSetParamName(m_strParamName);
	   /**SEMANTIC**/
	   return true;
	 }else return false;
   }
   return false;
}


bool CJavaParser::qualifiedIdentifierList()
{
   if(qualifiedIdentifier())
   {
	 while(true)
	 {
       saveState(); if(!getNextToken()){popStack();return false;}

	    if(m_strCurToken.Compare(",") == 0)
		{
		   popStack();//consume ','
		   if(qualifiedIdentifier())
			   continue;
		   else
			  return false;
		}
		else
		{
		  resetState();
		  return true;
		}
	 }
   }
   return false;
}


bool CJavaParser::bracketsOpt()
{
	CString strSaveBrackets;
	while(true)
	{
	   saveState(); if(!getNextToken()){popStack();return false;}
       if(m_strCurToken.Compare("[") == 0)
	   {
          popStack();//consume '['
          /**SEMANTIC**/strSaveBrackets += '[';/**SEMANTIC**/

		  if(!getNextToken())return false;
		  if(m_strCurToken.Compare("]") == 0)
		  /**SEMANTIC**/strSaveBrackets += ']';/**SEMANTIC**/
		  else return false;
	   }
	   else
	   {

		  resetState();//backtrack
		  m_strCurToken = strSaveBrackets;
          return true;
	   }
	}return false;
}

/********************************************************************************
bool CJavaParser::peekNextToken()
{
  m_bPeeking = true;
  saveState("peekNextToken");
  bool bResult = getNextToken();
  resetState();
  m_bPeeking = false;
  return bResult;
}
*********************************************************************************/



bool CJavaParser::typeDeclaration()
{
	/*
  if(!peekNextToken())return false;
  if(m_strCurToken.Compare(";") == 0)
  {
     getNextToken();
	 return true;
  }
  else return classOrInterfaceDeclaration();
  */
	return false;
}

bool CJavaParser::variableDeclaratorRest()
{
  if(bracketsOpt())
  {
    saveState(); if(!getNextToken()){popStack();return false;}

    if(m_strCurToken.Compare("=") == 0)
	{
	  popStack();//consume '='
      return variableInitializer();
	}
	else
	resetState();

	return true;
  }
  return false;
}

bool CJavaParser::variableDeclaratorsRest()
{
  if(variableDeclaratorRest())
  {
    while(true)
	{
      saveState(); if(!getNextToken()){popStack();return false;}

      if(m_strCurToken.Compare(",") == 0)
	  {
         popStack();//consume ','
		 if(variableDeclarator())
			 continue;
		 else return false;
	  }    
	  else
      if(m_strCurToken.Compare(";") == 0)//stop symbol
	  {
	    popStack();//consume ';'
	    return true;
	  }
	  else
	  resetState();

	  return true;
	}
  }else return false;
}

bool CJavaParser::getNextToken()
{
  if(m_bDynamiclyParsing)
  {	
	if(getNextTokenImpl())
	{
	  //if we run into a declaration while parsing, then remove that declaration
	  //it needs to be updated.It could be that a modifier is being added to it
	  //use nTestIndex because of the possibility of a stop symbol

	  int nTestIndex = m_nCharIndex-m_strCurToken.GetLength();
	  POSITION startPos = (m_pLastBlock)?m_pLastBlock->getMainPos():m_pDeclManager->getDeclList()->GetHeadPosition();
      POSITION nPos = m_pDeclManager->PointInDecl(nTestIndex,m_nLineIndex,startPos);
	  if(nPos != NULL)
	  {
		  __CBaseDecl* pDecl = m_pDeclManager->getDeclList()->GetAt(nPos);
		  if(pDecl->getDeclName().Compare("}") != 0)
		  {
            delete m_pDeclManager->getDeclList()->GetAt(nPos);
	        m_pDeclManager->RemoveDecl(nPos); 
		  }
	  }
	  return true;
	}else return false;
  }return getNextTokenImpl();
}


bool CJavaParser::getNextTokenImpl()
{
  m_strCurToken.Empty();
  bool bFloat = false;
  while(true)
  {
    for(m_nCharIndex; m_nCharIndex<m_nLineLength; m_nCharIndex++)
	{
      char nChar = m_lszpLine[m_nCharIndex];
	  if(iswspace(nChar))
	  {
        if(!m_strCurToken.IsEmpty())
		    return true;
	  }
	  else
	  if(nChar == '/'&&m_nCharIndex<m_nLineLength-1&&m_lszpLine[m_nCharIndex+1] == '*')
	  {
        if(m_strCurToken.IsEmpty())
		{
           if(skipExtComment())
			   continue;
		   else return false;
		}else return true;
	  }
	  else
	  if(nChar == '/'&&(m_nCharIndex+1)<m_nLineLength&&m_lszpLine[m_nCharIndex+1] == '/')
	  {
         if(m_strCurToken.IsEmpty())
		 {
           if(skipSingleLineComment())
			   --m_nCharIndex;
		   else return false;
		 }else return true;
	  }
	  else
	  if(isoperator())
	  {
	     if(!bFloat&&
			 (nChar == '-' || nChar == '+')
			 &&(!m_strCurToken.IsEmpty()))//check for exponent
		 {
           if(m_lszpLine[m_nCharIndex-1] == 'e'||
			  m_lszpLine[m_nCharIndex-1] == 'E'
			 )
		   {
             if(IS_DIGIT(m_strCurToken[0])|| 
				 (m_strCurToken[0] == '.'&&m_strCurToken.GetLength()>1&&
				 IS_DIGIT(m_strCurToken[1])))
			 {
               m_strCurToken += nChar;
			   bFloat = true;//only do this once on each run of this method
			 }else return true;
		   }else return true;
		 }	     
	     else
         if(m_strCurToken.IsEmpty())//extract operator
           return getOperator();
	     else                      //return current token
         return true;
	  }
	  else
	  if(nChar == '"' || nChar == '\'')
	  {
		if(!m_strCurToken.IsEmpty())
		{
          return true;
		}
		else
		{
		  ++m_nCharIndex;//skip '"' || '\''
		  m_strCurToken = nChar;
          return getStringOrCharLiteral(nChar);   
		}
	  }
	  else
	  if(!IS_IDENTIFIERSYM(nChar))
	  {
		if(nChar == '.')//floating point
		{
		  if(!m_strCurToken.IsEmpty())
		  {
            if(m_nCharIndex>0&&IS_DIGIT(m_strCurToken.GetAt(0)))
			{
               m_strCurToken += nChar;
			   continue;
			}else return true;
		  }
          else
		  if((m_nCharIndex+1<m_nLineLength)&&IS_DIGIT(m_lszpLine[m_nCharIndex+1]))
		  {
              m_strCurToken += nChar;
			  continue;
		  }
		}

        if(m_strCurToken.IsEmpty())
		{
	 
	      /*****************CC**************************************/
          if(m_bCodeCompletionAction &&(m_nStopPos == m_nCharIndex)&&(nChar == '.'))
          {
             m_bCCSuccess = true;
             return false;
          }
          /*********************************************************/

          m_strCurToken += nChar;
          ++m_nCharIndex;//skip this index for next token retrieval
		}return true;
	  }
	  else
	  {

         m_strCurToken += nChar;
	  }
	}
   if(!m_strCurToken.IsEmpty())return true;
   if(!getNextLine())return false;
  }return false;
}

bool CJavaParser::getOperator()
{
   char nChar = m_lszpLine[m_nCharIndex];
   m_strCurToken = nChar;
   ++m_nCharIndex;//move head for next

   if(nChar == '=')
   {
     if(m_nLineLength>m_nCharIndex)
	 {
        if(m_lszpLine[m_nCharIndex] == '=')
		{
		  m_strCurToken = "==";
		  ++m_nCharIndex;
		  return true;	      
		}else return true;//'='
	 }else return true;//'='
   }
   else
   if(nChar == '+' || nChar == '-' || nChar == '*' || nChar == '/' || nChar == '&'
	   || nChar == '|' || nChar == '^' || nChar == '%'||nChar == '!')
   {
     if(m_nLineLength>m_nCharIndex)
	 {
       if(m_lszpLine[m_nCharIndex] == '=')//assignment operator
	   {
		 m_strCurToken += '=';
		 ++m_nCharIndex;//move head for next
		 return true;
	   }
	   else
	   if(m_lszpLine[m_nCharIndex] == '&')
	   {
		 if(nChar == '&')
		 {
           m_strCurToken = "&&";
           ++m_nCharIndex;//move head for next
		   return true;
		 }else return true;		   
	   }
	   else
	   if(m_lszpLine[m_nCharIndex] == '|')
	   {
		  if(nChar == '|')
		  {
            m_strCurToken = "||";
            ++m_nCharIndex;//move head for next
		    return true;
		  }else return true;		   
	   }
	   else
	   if(m_lszpLine[m_nCharIndex] == '-')
	   {
		  if(nChar == '-')
		  {
            m_strCurToken = "--";
            ++m_nCharIndex;//move head for next
		    return true;
		  }else return true;		   
	   }	   
	   else
	   if(m_lszpLine[m_nCharIndex] == '+')
	   {
		  if(nChar == '+')
		  {
            m_strCurToken = "++";
            ++m_nCharIndex;//move head for next
		    return true;
		  }else return true;		   
	   }else return true;
	 }else return true;
   }
   else
   if(nChar == '<')
   {
     if(m_nCharIndex<m_nLineLength)
	 {
       if(m_lszpLine[m_nCharIndex] == '<')//"<<"
	   {
		  m_strCurToken += '<';
		  ++m_nCharIndex;//move head for next
          if(m_nCharIndex<m_nLineLength)
		  {
            if(m_lszpLine[m_nCharIndex] == '=')//"<<="
			{
              m_strCurToken = "<<=";
		      ++m_nCharIndex;//move head for next
		      return true;
			}else return true;//"<<"
		  }else return true;//"<<"             
	   }
	   else
	   if(m_lszpLine[m_nCharIndex] == '=')//"<="
	   {
		 m_strCurToken += '=';
		 ++m_nCharIndex;//move head for next
		 return true;
	   }else return true;//'<'	   
	 }else return true;//'<'
   }
   else
   if(nChar == '>')
   {

⌨️ 快捷键说明

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