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

📄 javaparser.cpp

📁 用bcg库编写的java IDE 源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  }
  else
  if(m_strCurToken.Compare("super") == 0)
     return superSuffix();
  else
  if(isLiteral())
  {
    /**CODE_COMPLETION**/
	exprEvaluator(m_strCurToken,TK_LITERAL);
    /**CODE_COMPLETION**/
    return true;
  }
  else
  if(m_strCurToken.Compare("new") == 0)
	 return creator();
  else
  if(isIdentifier())
  {
	 CString strSaveToken = m_strCurToken;
     while(true)
	 {	   
         saveState(); if(!getNextToken())
		 {
           /**CODE_COMPLETION**/exprEvaluator(strSaveToken,TK_IDENTIFIER);/**CODE_COMPLETION**/
		   popStack();return false;
		 }
         if(m_strCurToken.Compare(".") == 0)
		 {
			 if(!getNextToken()){popStack();return false;}
             if(!isIdentifier())
			 {
			   resetState();
			   break;
			 }else popStack();

             strSaveToken += '.'+m_strCurToken;
		 }else{resetState(); break;}
	 }
     
     saveState(); if(!getNextToken()){popStack();return false;}
     if(FIRSTidentifierSuffix())
	 {
		 m_stTokens.Push(strSaveToken);
		 popStack();//consume handle
         return identifierSuffix();
	 }
	 else
	 {
        /**CODE_COMPLETION**/exprEvaluator(strSaveToken,TK_IDENTIFIER);/**CODE_COMPLETION**/
        resetState();
	 }
	 return true;
  }
  else
  if(isBasicType())
  {
       if(bracketsOpt())
	   {
           if(!getNextToken())return false;
		   if(m_strCurToken.Compare(".") == 0)
		   {
              if(!getNextToken())return false;
			  if(m_strCurToken.Compare("class") == 0)
			   return true;
		   }
	   }return false;
  }
  else
  if(m_strCurToken.Compare("void") == 0)
  { 	 
	 if(!getNextToken())return false;
	 if(m_strCurToken.Compare(".") == 0)
	 {
       if(!getNextToken())return false;
	   if(m_strCurToken.Compare("class") == 0)
		 return true;
	 }
  }return false;
}


bool CJavaParser::selector()//HANDLE : ("." | "[")
{
  if(m_strCurToken.Compare(".") == 0)
  {
	 if(!getNextToken())return false;

	 if(isIdentifier())
	 {
        saveState(); if(!getNextToken()){popStack();return false;}
	    if(m_strCurToken.Compare("(") == 0)
		{
		   popStack(); //consume '('
           return arguments();
		}
	    else 
		{
		   resetState();//undo consumption
		   return true;
		}
	 }
	 else
	 if(m_strCurToken.Compare("this") == 0)
	 {
        return true;
	 }
	 else
	 if(m_strCurToken.Compare("super") == 0)
	 {
       return superSuffix();
	 }
	 else
	 if(m_strCurToken.Compare("new") == 0)
	 {
         return innercreator();
	 }else return false;
  }
  else
  if(m_strCurToken.Compare("[") == 0)
  {
     if(expr_0())
	 {
       if(!getNextToken())return false;
       return (m_strCurToken.Compare("]") == 0);
	 }
  }return false;
}


bool CJavaParser::arguments()//HANDLE :'('
{
   /*************************CC**********************************/
   if(m_bCodeCompletionAction &&(m_nStopPos == (m_nCharIndex-1)))
   {
     m_bCCSuccess = true;
     return false;
   }
   /************************************************************/

   saveState(); if(!getNextToken()){popStack();return false;}
   if(FIRSTexpr())
   {
	  resetState();//backtrack
      if(expr_0())
	  {
		 if(m_bCodeCompletionAction)
		 {
             _token token;
             m_exprAutomaton.m_stkOperandStack.Pop(token);
             m_lstrArgs.AddTail(token.strToken);
		 }
		 while(true)
		 {
		     saveState(); if(!getNextToken()){popStack();return false;}
		     if(m_strCurToken.Compare(",") == 0)
			 {
			    popStack();//consume ','
		        if(!expr_0())return false;
		        if(m_bCodeCompletionAction)
				{
                  _token token;
                  m_exprAutomaton.m_stkOperandStack.Pop(token);
                  m_lstrArgs.AddTail(token.strToken);
				}
			 }
		     else
		     if(m_strCurToken.Compare(")") == 0)
			 {
                popStack();//consume ')'
	            if(m_bCodeCompletionAction)
				{
		          getReturnType();
				}
			    return true;
			 }
			 else
			 {
			    popStack();	  
				return false;
			 }
		 }
	  }
   }
   else
   if(m_strCurToken.Compare(")") == 0)
   {
      popStack();//consume ')'
	  if(m_bCodeCompletionAction)
	  {
		 getReturnType();
	  }
	  return true;
   }else popStack(); return false;
}


bool CJavaParser::superSuffix()//HANDLE : "super"
{
  if(!getNextToken())return false;
      
  if(m_strCurToken.Compare("(") == 0)//base class constructor initialization
	return arguments();
  else
  if(m_strCurToken.Compare(".") == 0)
  {
     if(identifier())
	 {
        saveState(); if(!getNextToken()){popStack();return false;}
	    if(m_strCurToken.Compare("(") == 0)//explicit base class method invocation
		{
		   popStack();//consume '('         
		   return arguments();
		}else{resetState(); return true;}
	 }
  }return false;
}


bool CJavaParser::literal()
{
   if(!getNextToken())return false;
   m_nLiteralType = 0;

   if(m_strCurToken[0] == '\'')
   {
	 m_nLiteralType = TK_LITERAL_CHAR;
     return characterLiteral();
   }
   else
   if(m_strCurToken.Compare("true") == 0 || m_strCurToken.Compare("false") == 0)
   {
     m_nLiteralType = TK_LITERAL_BOOLEAN;
	 return true;
   }
   else
   if(m_strCurToken[0]== '"')
   {
     m_nLiteralType = TK_LITERAL_STRING;
     return stringLiteral();
   }
   else
   if(m_strCurToken.Compare("null") == 0)
   {
     m_nLiteralType = TK_LITERAL_NULL;
	 return true;
   }
   else
     return integerLiteral();	
}


bool CJavaParser::creator()//HANDLE : "new"
{
  if(qualifiedIdentifier())
  {
      if(!getNextToken())return false;
	  if(m_strCurToken.Compare("(") == 0)
		 return classCreatorRest();
	  else
      if(m_strCurToken.Compare("[") == 0)
         return arrayCreatorRest();
  }return false;
}

bool CJavaParser::qualifiedIdentifier()
{
  if(identifier())
  {
	 CString strSaveToken = m_strCurToken;
     while(true)
	 {	   
       saveState(); if(!getNextToken()){popStack();return false;}
       if(m_strCurToken.Compare(".") == 0)
	   {
		   popStack();//consume '.'
           if(!identifier())
			   return false;
          strSaveToken += '.'+m_strCurToken;
	   }
	   else
	   {		 
		 resetState();   
		 m_strCurToken = strSaveToken;
		 return true;
	   }
	 }
  }return false;
}


bool CJavaParser::arrayCreatorRest()//HANDLE:[
{
   
   if(!getNextToken())return false;
   if(m_strCurToken.Compare("]") == 0)
   {
       if(!getNextToken())return false;
       if(m_strCurToken.Compare("]") == 0)
	   {
          if(bracketsOpt())
		  {
            if(!getNextToken())return false;
			if(m_strCurToken.Compare("{") == 0)
               return arrayInitializer();
		  }
	   }
   }
   else
   {
      if(expr_0())
	  {
        if(!getNextToken())return false;
        if(m_strCurToken.Compare("]") == 0)
		{
		   while(true)
		   {
			  saveState();
		      if(!getNextToken())return false;
              if(m_strCurToken.Compare("[") == 0)
			  {
			     if(expr_0())
				 {
					popStack();
		            if(!getNextToken())return false;
                    if(m_strCurToken.Compare("]") == 0)
                       return bracketsOpt();
					else return false;
				 }
			     else
				 {
                   resetState();
				   return bracketsOpt();
				 }
			 }
			 else
			 {
               resetState();
			   return true;
			 }
		   }
		}
	  }
   }return false;
}


bool CJavaParser::classCreatorRest()//HANDLE : "("
{
  if(arguments())
  {
    saveState(); if(!getNextToken()){popStack();return false;}


	if(m_strCurToken.Compare("{") == 0)
	{
       popStack();//consume '{'
       genStack<char> stTokens;stTokens.Push('{');
	   while(getNextToken())
	   {
         if(m_strCurToken.Compare("{") == 0)
			 stTokens.Push('{');
		 else
		 if(m_strCurToken.Compare("}") == 0)
		 {
            stTokens.Pop();
			if(stTokens.StackIsEmpty())return true;
		 }
	   }	   
	}
	else
	{
      resetState();return true;
	}
  }
  
  return false;
}


bool CJavaParser::arrayInitializer()//HANDLE : "{"
{

	saveState(); if(!getNextToken()){popStack();return false;}
	if((m_strCurToken.Compare("{") == 0)||FIRSTexpr())
	{
	   resetState();//backtrack
       if(variableInitializer())
	   {
          while(true)
		  {
	         if(!getNextToken()){return false;}
	         if(m_strCurToken.Compare(",") == 0)
			 {
                saveState(); if(!getNextToken()){popStack();return false;}
                if((m_strCurToken.Compare("{") == 0)||FIRSTexpr())
				{
                   resetState();//backtrack
				   if(variableInitializer())continue;
				}
                else
	            if(m_strCurToken.Compare("}") == 0)
				{
                  popStack();return true;
				}
			 }
			 else
			 if(m_strCurToken.Compare("}") == 0)
				 return true;
			 else return false;
		  }
	   }else return false;
	}
	else
    if(m_strCurToken.Compare("}") == 0)
	{
       popStack();return true;
	}return false;
}


bool CJavaParser::assignmentOperator()
{
  if(!getNextToken())return false;
  for(int I=0; m_lszpAssignmentOps[I] != NULL; I++)
	  if(m_strCurToken.Compare(m_lszpAssignmentOps[I]) == 0)return true;
  return false;
}


bool CJavaParser::prefixOp()
{
  if(!getNextToken())return false;
  for(int I=0; m_lszpPrefixOps[I] != NULL; I++)
	  if(m_strCurToken.Compare(m_lszpPrefixOps[I]) == 0)return true;
  return false;
}

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

bool CJavaParser::postfixOp()
{
  if(!getNextToken())return false;
  for(int I=0; m_lszpPostFixOps[I] != NULL; I++)
	  if(m_strCurToken.Compare(m_lszpPostFixOps[I]) == 0)return true;
  return false;
}

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

bool CJavaParser::identifier()
{
  if(!getNextToken())return false;
  return isIdentifier();
}

bool CJavaParser::isIdentifier()
{
  //first charracter must be a letter or underscore
  if(!isalpha(m_strCurToken[0])&&m_strCurToken[0] != '_')return false;

  //scan for invalid characters
  int nLen = m_strCurToken.GetLength();
  for(int i=0; i<nLen; i++)
    if(!IS_IDENTIFIERSYM(m_strCurToken[i]))return false;

  //check that it's not a java keyword
  if(this->isJavaKeyword())
	  return false;
  if((m_strCurToken.Compare("null") ==0)||(m_strCurToken.Compare("true") ==0)||(m_strCurToken.Compare("false") ==0))
	  return false;

  return true;
}


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

bool CJavaParser::innercreator()//HANDLE : "new"
{ 
  if(identifier())
  {
    if(!getNextToken()){return false;}
	if(m_strCurToken.Compare("(") == 0)
       return classCreatorRest();
  }return false;
}


bool CJavaParser::identifierSuffix()//HANDLE : ("[" | "(" | ".")
{
	if((m_strCurToken.Compare("[")== 0))
	{
	   saveState();if(!getNextToken()){popStack();return false;}
       if(m_strCurToken.Compare("]") == 0)
	   {
		   popStack();//consume "]"
		   if(bracketsOpt())// not [Expression]
		   {
              if(!getNextToken())return false;
              if(m_strCurToken.Compare(".") == 0)
			  {
                 if(!getNextToken())return false;
                 return (m_strCurToken.Compare("class") == 0);
			  }else return false;
		   }
	   }
	   else
	   {
		  resetState();//backtrack
	      if(expr_0())
		  {
            if(!getNextToken())return false;
			return (m_strCurToken.Compare("]") == 0);
		  }
	   }
	}
	else
    if(m_strCurToken.Compare(".") == 0)
	{
        if(!getNextToken())return false;
		if(m_strCurToken.Compare("class") == 0)
          return true;
		else
        if(m_strCurToken.Compare("this") == 0)
          return true;
		else
        if(m_strCurToken.Compare("super") == 0)
		{
          if(!getNextToken())return false;
		  if(m_strCurToken.Compare("(") == 0)
             return arguments();
		  else return false;
		}
		else
        if(m_strCurToken.Compare("new") == 0)
           return innercreator();
	}
	else
    if(m_strCurToken.Compare("(") == 0)
       return arguments();

	return false;
}


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

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

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


bool CJavaParser::variableInitializer()//HANDLE : ["="]
{
   saveState(); if(!getNextToken()){popStack();return false;}


   if(m_strCurToken.Compare("{") == 0)
   {
	 popStack();// consume '{'
     return arrayInitializer();
   }
   else
   if(FIRSTexpr())
   {
	 resetState();
     return expr_0();
   }
   else
   {
	 return false;
   }
}

bool CJavaParser::parExpression()
{
  if(!getNextToken())return false;

⌨️ 快捷键说明

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