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

📄 javaparser.cpp

📁 用bcg库编写的java IDE 源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  if(m_strCurToken.Compare("(") == 0)
  {
    if(expr_0())
	{
      if(!getNextToken())return false;
	  return (m_strCurToken.Compare(")") == 0);
	}else return false;
  }else return false;
  return false;
}

bool CJavaParser::blockStatement()
{
 /* if(!peekNextToken())return false;

  if((m_strCurToken.Compare("final") == 0) /*|| isType()*)
     return localVariableDeclarationStatement();
  else
  if(isModifier())
    return classOrInterfaceDeclaration();
  else*/
  return false;
}

bool CJavaParser::classOrInterfaceDeclaration()//HANDLE: "class" or "interface"
{

  //if(modifiersOpt())
  {
	  /*
    if(!getNextToken())
	{
	  return false;
	}
*/
    if(m_strCurToken.Compare("class") == 0)
	{
      return classDeclaration();
	}
    else
    if(m_strCurToken.Compare("interface") == 0)
	{
	  return interfaceDeclaration();
	}
    else
	{
	  return false;
	}
  }/*else*/ return false;
}

bool CJavaParser::modifiersOpt()
{
  while(true)
  {
      //saveState("");
      if(!getNextToken())
	  {
	    //popStack();
	    return false;
	  }

      if(isModifier()) 
	  {
        // popStack();
	  }
	  else
	  {
		//resetState();
		break;
	  }
  }return true;
}

bool CJavaParser::classDeclaration()
{
  m_nDeclType = CLASS_DECL;
  //if(!getNextToken())return false;

  //if(m_strCurToken.Compare("class") == 0)
  {
    if(identifier())
	{
	  /**SEMANTIC**/smtSetClassOrInterfaceName(m_strCurToken);/**SEMANTIC**/
      if(!getNextToken())
	     return false;

	  if(m_strCurToken.Compare("extends") == 0)
	  {
        if(!type())	  
			return false;
		/**SEMANTIC**/smtSetSuper(m_strCurToken);/**SEMANTIC**/

        if(!getNextToken())
	     return false;
	  }
	  


	  if(m_strCurToken.Compare("implements") == 0)
	  {
        if(!typeList())return false;

        //if(!getNextToken())
	    //   return false;
	  }
	  
	  //if(!getNextToken())return false;
	  return (m_strCurToken.Compare("{") == 0);

	}
	else return false;
  } return false;
}


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

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


      if(m_strCurToken.Compare("throws") == 0)
	  {
        popStack();//consume "throws"
        if(!qualifiedIdentifierList())
		  return false;

	    saveState(); if(!getNextToken()){popStack();return false;}
	  }
      popStack();
	  //if(!getNextToken())return false;
      return ((m_strCurToken.Compare(";") == 0) || (m_strCurToken.Compare("{")));

  }else return false;
}


bool CJavaParser::interfaceDeclaration()
{
  m_nDeclType = INTERFACE_DECL;
  //if(!getNextToken())return false;
  //if(m_strCurToken.Compare("interface") == 0)
  {
    if(identifier())
	{
	  /**SEMANTIC**/smtSetClassOrInterfaceName(m_strCurToken);/**SEMANTIC**/
      if(!getNextToken())
	     return false;

	  if(m_strCurToken.Compare("extends") == 0)
	  {
        if(!typeList())return false;

        //if(!getNextToken()) return false;
	  }

	  return (m_strCurToken.Compare("{") == 0);
	}else return false;
  }
  return false;
}

bool CJavaParser::typeList()
{
   if(type())
   {
	 /**SEMANTIC**/smtAddImplIntf(m_strCurToken);/**SEMANTIC**/
	 /**SEMANTIC**/smtAddSuperInterface(m_strCurToken);/**SEMANTIC**/
     while(true)
	 {
       //saveState();
       if(!getNextToken())
	   {
	     //popStack();
	     return false;
	   }

	   if(m_strCurToken.Compare(",") == 0)
	   {
         //popStack();//consume ','
		 if(type())
		 {
			 /**SEMANTIC**/smtAddImplIntf(m_strCurToken);/**SEMANTIC**/
             /**SEMANTIC**/smtAddSuperInterface(m_strCurToken);/**SEMANTIC**/
			 continue;
		 }
		 else return false;
	   }
	   else
	   {
		 // resetState();
		  return true;
	   }
	 }
   }else return false;
}


bool CJavaParser::modifier()
{
  if(!getNextToken())return false;
  for(int I=0; m_lszpModifiers[I] != NULL; I++)
  {
    if(m_strCurToken.Compare(m_lszpModifiers[I]) == 0)
	{
      if(isAccessModifier())
		  smtSetAccessModifier(m_strCurToken);
	  smtAddModifier(m_strCurToken);
	  return true;
	}
  }
  return false;
}

bool CJavaParser::isAccessModifier()
{
  return (m_strCurToken == "private" || m_strCurToken == "public" || m_strCurToken == "protected" );
}

bool CJavaParser::isModifier()
{
  for(int I=0; m_lszpModifiers[I] != NULL; I++)
  {
    if(m_strCurToken.Compare(m_lszpModifiers[I]) == 0)
	{
      if(isAccessModifier())
		  smtSetAccessModifier(m_strCurToken);
	  smtAddModifier(m_strCurToken);
	  return true;		
	}
  }
  return false;
}

bool CJavaParser::packageDeclaration()
{
  if(qualifiedIdentifier())
  {
	m_strPackage = m_strCurToken;
    if(!getNextToken())return false;
	if(m_strCurToken.Compare(";") == 0)
		return true;
	else
		return false;
  }return false;
}

bool CJavaParser::importDeclaration()
{
  m_nDeclType = IMPORT_DECL;
  //if(!getNextToken())return false;
  //if(m_strCurToken.Compare("import") == 0)
  {
    if(identifier())
	{
		/**SEMANTIC**/m_strImport = m_strCurToken;/**SEMANTIC**/
       while(true)//{. Identifier }
	   {
          if(!getNextToken()) return false;

	     if(m_strCurToken.Compare(".") == 0)
		 {
		   /**SEMANTIC**/m_strImport +='.';/**SEMANTIC**/

           if(!getNextToken())
		   {
	         return false;
		   }

		   if(m_strCurToken.Compare("*") == 0)
		   {
             /**SEMANTIC**/m_strImport += '*';/**SEMANTIC**/
			 if(!getNextToken()) return false;
			 break;
		   }
		   else
		   if(isIdentifier())
		   {
			/**SEMANTIC**/m_strImport += m_strCurToken;/**SEMANTIC**/
			   continue;
		   }
		   else
		   {		   
			  return false;
		   }
		 }
		 else //should be ';'
		 {
			 break;
		 }
       }
       //if(!getNextToken())return false;
	   return (m_strCurToken.Compare(";") == 0);
	}else return false;
  }return false;
}


bool CJavaParser::memberdecl()//HANDLE:baisctype,"void" or constructor Name
{
  if(isBasicType())//can't be a contructor declaration
  {
	 CString strSave = m_strCurToken;
	 if(bracketsOpt())
	 {
	   if(!m_strCurToken.IsEmpty() &&m_strCurToken[0] == '[')
       /**SEMANTIC**/strSave += m_strCurToken;/**SEMANTIC**/
       /**SEMANTIC**/m_strCurToken = strSave;/**SEMANTIC**/

	   /**SEMANTIC**/smtSetReturnType(m_strCurToken);/**SEMANTIC**/
	   /**SEMANTIC**/smtSetFieldType(m_strCurToken);/**SEMANTIC**/
	   if(identifier())
	   {
		 /**SEMANTIC**/smtSetMethodName(m_strCurToken);/**SEMANTIC**/
         /**SEMANTIC**/smtSetVariableName(m_strCurToken);/**SEMANTIC**/		 
	     return methodOrFieldRest();
	   }else return false;
	 }else return false;
  }
  else
  if(m_strCurToken.Compare("void") == 0)
  {
	 if(identifier())
	 {
		 /**SEMANTIC**/smtSetMethodName(m_strCurToken);/**SEMANTIC**/
	     return methodOrFieldRest();
	 }else return false;
  }
  else
  if(isIdentifier())//LL(2)
  {
     CString strSaveToken = m_strCurToken;
     if(!getNextToken())return false;

	 if(m_strCurToken.Compare("(") == 0)
	 {
        /**SEMANTIC**/smtSetMethodName(strSaveToken);/**SEMANTIC**/
		/**SEMANTIC**/m_nDeclType = METHOD_DECL;/**SEMANTIC**/
		return constructorDeclaratorRest();
	 }
	 else
	 if(isIdentifier())
	 {
	    /**SEMANTIC**/smtSetReturnType(strSaveToken);/**SEMANTIC**/
	    /**SEMANTIC**/smtSetFieldType(strSaveToken);/**SEMANTIC**/

		/**SEMANTIC**/smtSetMethodName(m_strCurToken);/**SEMANTIC**/
        /**SEMANTIC**/smtSetVariableName(m_strCurToken);/**SEMANTIC**/

		return methodOrFieldRest();
	 }
  }else  return classOrInterfaceDeclaration();	
  return false;
}

bool CJavaParser::classBodyDeclaration()//HANDLE type or constructor name
{
   /*
   saveState();
   if(!getNextToken())
   {
     popStack();
     return false;
   }
   */

   /*
   else
   if(m_strCurToken.Compare("static") == 0 || (m_strCurToken.Compare("{") == 0))
   {
	  if(m_strCurToken.Compare("{") == 0)
	  {
        m_nDeclType = BLOCK_DECL;
		return /*block()*true;
	  }
	  else
	  {

	    saveState("classBodyDeclaration");
        if(!getNextToken())
		{
		  //**BUGGY*
		  resetState();
		  //**BUGGY**
		  return false;
		}

        if(m_strCurToken.Compare("{") == 0)
		{
		  m_nDeclType = BLOCK_DECL;
          resetState();//backtrack 
		  return block();
		}
	    else
		{
          resetState();
          goto a_1;
		}
	  }
   }
a_1:
   resetState();
   if(modifiersOpt())
   */
      return memberdecl();
   return false;
}

bool CJavaParser::block()
{
   if(!getNextToken())return false;
   return (m_strCurToken.Compare("{") == 0);
}

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

	if(m_strCurToken.Compare("throws") == 0)
	{
      if(!qualifiedIdentifierList())
		  return false;	 

	  if(!getNextToken())return false;
	}

    if(m_strCurToken.Compare("{") == 0)
	{
      m_bSuccess = true;
	  return true;
	}
	else
	return false;
  }
  return false;
}



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


  if(isType())//
  {
	popStack();
    return interfaceMethodOrFieldDecl();
  }
  else
  if(m_strCurToken.Compare("void") == 0)
  {
    popStack();//"void"
	if(identifier())
	return voidInterfaceMethodDeclaratorRest();
	else
	return false;
  }
  else
  {
	resetState();
    return classOrInterfaceDeclaration();
  }
}

bool CJavaParser::interfaceMethodOrFieldDecl()
{
   if(type())
	   if(identifier())
		   return interfaceMethodOrFieldRest();
   return false;
}

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

   if(isIdentifier())
   {
	 popStack();
     if(constantDeclaratorsRest())
	 {
       if(!getNextToken())return false;
	   return (m_strCurToken.Compare(";") == 0);
	 }else return false;
   }
   else
   {
	 popStack();
     return interfaceMethodDeclaratorRest();
   }
}

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

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

bool CJavaParser::interfaceMethodDeclaratorRest()
{
  if(formalParameters())
  {
	if(bracketsOpt())
	{
      if(!getNextToken())return false;

      if(m_strCurToken.Compare("throws") == 0)
	  {
        if(!qualifiedIdentifierList())
		  return false;

        if(!getNextToken())return false;
	  }
      return (m_strCurToken.Compare(";") == 0);
	}else return false;
  }else return false;
}

bool CJavaParser::constantDeclarator()
{
   if(identifier())
     return constantDeclaratorRest();
   else return false;
}

bool CJavaParser::constantDeclaratorRest()
{
   if(bracketsOpt())
   {
      if(!getNextToken())return false;
      if(m_strCurToken.Compare("=") == 0)
		  return variableInitializer();
	  else
		  return false;
   }else return false;
}


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

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

      return (m_strCurToken.Compare(";") == 0);
  }else return false;
}

bool CJavaParser::type()
{
   saveState(); if(!getNextToken()){popStack();return false;}
   if(isBasicType()){popStack(); return true;}
   
   resetState();//backtrack;
   if(qualifiedIdentifier())
   {  
	 /**SEMATIC**/CString strSaveType = m_strCurToken;/**SEMANTIC**/
	 if(bracketsOpt())
	 {
	   if(!m_strCurToken.IsEmpty() &&m_strCurToken[0] == '[')
       /**SEMANTIC**/strSaveType += m_strCurToken;/**SEMANTIC**/
       /**SEMANTIC**/m_strCurToken = strSaveType;/**SEMANTIC**/

⌨️ 快捷键说明

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