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

📄 java.cpp

📁 用bcg库编写的java IDE 源码
💻 CPP
字号:
///////////////////////////////////////////////////////////////////////////
//  File:    java.cpp
//  Version: 1.1.0.4
//  Updated: 19-Jul-1998
//
//  Copyright:  Ferdinand Prantl, portions by Stcherbatchenko Andrei
//  E-mail:     prantl@ff.cuni.cz
//
//  Java syntax highlighing definition
//
//  You are free to use or modify this code to the following restrictions:
//  - Acknowledge me somewhere in your about box, simple "Parts of code by.."
//  will be enough. If you can't (or don't want to), contact me personally.
//  - LEAVE THIS HEADER INTACT
////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "VisualJavaView.h"
#include "VisualJavaDoc.h"
#include "JavaDeclManager.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//  C++ keywords (MSVC5.0 + POET5.0)
static LPTSTR s_apszJavaKeywordList[] =
  {
    _T ("abstract"),
    _T ("default"),
    _T ("goto"),
    _T ("null"),
    _T ("synchronized"),
    _T ("boolean"),
    _T ("do"),
    _T ("if"),
    _T ("package"),
    _T ("this"),
    _T ("break"),
    _T ("double"),
    _T ("implements"),
    _T ("private"),
    _T ("threadsafe"),
    _T ("byte"),
    _T ("else"),
    _T ("import"),
    _T ("protected"),
    _T ("throw"),
    _T ("byvalue"),
    _T ("extends"),
    _T ("instanceof"),
    _T ("public"),
    _T ("transient"),
    _T ("case"),
    _T ("false"),
    _T ("int"),
    _T ("return"),
    _T ("true"),
    _T ("catch"),
    _T ("final"),
    _T ("interface"),
    _T ("short"),
    _T ("try"),
    _T ("char"),
    _T ("finally"),
    _T ("long"),
    _T ("static"),
    _T ("void"),
    _T ("class"),
    _T ("float"),
    _T ("native"),
    _T ("super"),
    _T ("while"),
    _T ("const"),
    _T ("for"),
    _T ("new"),
    _T ("switch"),
    _T ("continue"),
    NULL
  };

static LPCTSTR m_szpBeginWizCode = _T("{{...Dynamic_Coding_Update");
static LPCTSTR m_szpEndWizCode   = _T("...}}Dynamic_Coding_Update");

static BOOL IsBeginWizardCodeSeg(LPCTSTR szpLine,int nLen)
{
  int nLen1 = lstrlen(m_szpBeginWizCode);
  //MessageBox(0,"Debugg break",0,MB_OK);
  for(int I=0;I<nLen;I++)
  {
      if(I<nLen1&&(szpLine[I] == m_szpBeginWizCode[I]))
	  {
		  //MessageBox(0,CString(szpLine[I]),0,MB_OK);
		  continue;
	  }
	  else
	  if(I==nLen1&&!__iscsym(szpLine[I]))
	  {
		  return TRUE;
	  }
	  else
	  {
		  /*CString str;
		  str.Format("%d",nLen);
		MessageBox(0,"Debug returned on:"+CString(szpLine[I])+":"+str,0,MB_OK);*/
	    return FALSE;
	  }
  }//MessageBox(0,"Debugging",0,MB_OK);
  return(I == nLen1);
}

static BOOL IsEndWizardCodeSeg(LPCTSTR szpLine,int nLen)
{
  int nLen1 = lstrlen(m_szpEndWizCode);  
  for(int I=0; I<nLen; I++)
  {
	  if(I<nLen1&&(szpLine[I] == m_szpEndWizCode[I]))
	  {
			continue;
	  }
	  else
	  if(I==nLen1&&!__iscsym(szpLine[I]))
	  {
		  return TRUE;
	  }
	  else
	  return FALSE;
  }return (I== nLen1);
}

static BOOL IsXKeyword (LPTSTR apszKeywords[], LPCTSTR pszChars, int nLength)
{
  for (int L = 0; apszKeywords[L] != NULL; L++)
    {
      if (_tcsncmp (apszKeywords[L], pszChars, nLength) == 0
            && apszKeywords[L][nLength] == 0)
        return TRUE;
    }
  return FALSE;
}

static BOOL IsJavaKeyword (LPCTSTR pszChars, int nLength)
{
  return IsXKeyword (s_apszJavaKeywordList, pszChars, nLength);
}

static BOOL IsJavaNumber (LPCTSTR pszChars, int nLength)
{
  if (nLength > 2 && pszChars[0] == '0' && pszChars[1] == 'x')
    {
      for (int I = 2; I < nLength; I++)
        {
          if (_istdigit (pszChars[I]) || (pszChars[I] >= 'A' && pszChars[I] <= 'F') ||
                (pszChars[I] >= 'a' && pszChars[I] <= 'f'))
            continue;
          return FALSE;
        }
      return TRUE;
    }
  if (!_istdigit (pszChars[0]))
    return FALSE;
  for (int I = 1; I < nLength; I++)
    {
      if (!_istdigit (pszChars[I]) && pszChars[I] != '+' &&
            pszChars[I] != '-' && pszChars[I] != '.' && pszChars[I] != 'e' &&
            pszChars[I] != 'E')
        return FALSE;
    }
  return TRUE;
}

#define DEFINE_BLOCK(pos, colorindex)   \
ASSERT((pos) >= 0 && (pos) <= nLength);\
if (pBuf != NULL)\
  {\
    if (nActualItems == 0 || pBuf[nActualItems - 1].m_nCharPos <= (pos)){\
        pBuf[nActualItems].m_nCharPos = (pos);\
        pBuf[nActualItems].m_nColorIndex = (colorindex);\
        nActualItems ++;}\
  }

#define COOKIE_COMMENT          0x0001
#define COOKIE_PREPROCESSOR     0x0002
#define COOKIE_EXT_COMMENT      0x0004
#define COOKIE_STRING           0x0008
#define COOKIE_CHAR             0x0010
#define COOKIE_WIZARD_CODE      0x0020
#define COOKIE_COLAPSIBLE       0x0040
#define COOKIE_ROOTNODE         0x0080
#define COOKIE_COLAPSED         0x0100

DWORD CVisualJavaView::ParseLineJava(DWORD dwCookie, int nLineIndex,
									             CCrystalTextView::TEXTBLOCK * pBuf, int &nActualItems)
{
  int nLength = GetLineLength(nLineIndex);
  if(nLength <= 0)
  {
    if((dwCookie & COOKIE_WIZARD_CODE) != 0)
	  return dwCookie;
	else
      return dwCookie & COOKIE_EXT_COMMENT;
  }


  //turn off all colapsing attributes from above line
  dwCookie = (dwCookie & ~COOKIE_COLAPSIBLE);
  //dwCookie = (dwCookie & ~COOKIE_ROOTNODE);
  //dwCookie = (dwCookie & ~COOKIE_COLAPSED);

  LPCTSTR pszChars = GetLineChars (nLineIndex);
  BOOL bFirstChar  = (dwCookie & ~COOKIE_EXT_COMMENT) == 0;

  BOOL bRedefineBlock = TRUE;
  BOOL bWasCommentStart = FALSE;

  BOOL bDecIndex = FALSE;
  int nIdentBegin = -1;

  for(int I = 0;; I++)
  {
      
	 if(bRedefineBlock)
	 {
        int nPos = I;
        if(bDecIndex)
            nPos--;

        if(dwCookie & (COOKIE_COMMENT | COOKIE_EXT_COMMENT))
		{
           DEFINE_BLOCK(nPos,COLORINDEX_COMMENT);
		}
		else
	    if(dwCookie & COOKIE_WIZARD_CODE)
		{
           DEFINE_BLOCK(nPos,COLORINDEX_WIZARDCODE);
		}
        else 
		if(dwCookie & (COOKIE_CHAR | COOKIE_STRING))
		{
           DEFINE_BLOCK (nPos, COLORINDEX_STRING);
		}
        else 
		if(dwCookie & COOKIE_PREPROCESSOR)
		{
           DEFINE_BLOCK (nPos, COLORINDEX_PREPROCESSOR);
		}
        else
        {
            if(xisalnum(pszChars[nPos]) || pszChars[nPos] == '.' && nPos > 0 && (!xisalpha (pszChars[nPos - 1]) && !xisalpha (pszChars[nPos + 1])))
			{
               DEFINE_BLOCK(nPos,COLORINDEX_NORMALTEXT);
			}
            else
			{	  
               DEFINE_BLOCK(nPos,COLORINDEX_OPERATOR);
               bRedefineBlock = TRUE;
               bDecIndex = TRUE;
               goto out;
			}
		}
        bRedefineBlock = FALSE;
        bDecIndex = FALSE;
	 }
out:

     if(I == nLength)
        break;

     if(dwCookie & COOKIE_COMMENT)
	 {
       DEFINE_BLOCK(I,COLORINDEX_COMMENT);
       dwCookie |= COOKIE_COMMENT;
       break;
	 }

      //  String constant "...."
     if(dwCookie & COOKIE_STRING)
	 {
        if(pszChars[I] == '"' && (I == 0 || I == 1 && pszChars[I - 1] != '\\' || I >= 2 && (pszChars[I - 1] != '\\' || pszChars[I - 1] == '\\' && pszChars[I - 2] == '\\')))
		{
           dwCookie &= ~COOKIE_STRING;
           bRedefineBlock = TRUE;
		}
        continue;
	 }

      //  Char constant '..'
     if(dwCookie & COOKIE_CHAR)
	 {
        if(pszChars[I] == '\'' && (I == 0 || I == 1 && pszChars[I - 1] != '\\' || I >= 2 && (pszChars[I - 1] != '\\' || pszChars[I - 1] == '\\' && pszChars[I - 2] == '\\')))
		{
           dwCookie &= ~COOKIE_CHAR;
           bRedefineBlock = TRUE;
		}
        continue;
	 }

      //  Extended comment /*....*/
     if(dwCookie & COOKIE_EXT_COMMENT)
	 {
          // if (I > 0 && pszChars[I] == '/' && pszChars[I - 1] == '*')
        if((I > 1 && pszChars[I] == '/' && pszChars[I - 1] == '*' /*&& pszChars[I - 2] != '/'*/ && !bWasCommentStart) || (I == 1 && pszChars[I] == '/' && pszChars[I - 1] == '*'))
		{
           dwCookie &= ~COOKIE_EXT_COMMENT;
           bRedefineBlock = TRUE;
		}
        bWasCommentStart = FALSE;
        continue;
	 }

	  
     if(I > 0 && pszChars[I] == '/' && pszChars[I - 1] == '/')
	 {
        DEFINE_BLOCK (I - 1, COLORINDEX_COMMENT);
          //dwCookie |= COOKIE_COMMENT;
		if((dwCookie & COOKIE_WIZARD_CODE) == 0)
           dwCookie =0;

		  //start of wizard code segment
        if((I+1<nLength)&&pszChars[I+1] == '{')
		{
		   if(IsBeginWizardCodeSeg(pszChars+I+1,nLength-I-1))
		   {
			 DEFINE_BLOCK (nLength, COLORINDEX_COMMENT);
			 dwCookie = COOKIE_WIZARD_CODE;
		   }
		}
		else
        if((dwCookie & COOKIE_WIZARD_CODE)&&((I+1<nLength)&&pszChars[I+1] == '.'))
		{
		   if(IsEndWizardCodeSeg(pszChars+I+1,nLength-I-1))
             dwCookie &= ~COOKIE_WIZARD_CODE;
		}
        break;
	 }

      //  Preprocessor directive #....
      if(dwCookie & COOKIE_PREPROCESSOR)
	  {
          if(I > 0 && pszChars[I] == '*' && pszChars[I - 1] == '/')
		  {
             DEFINE_BLOCK (I - 1, COLORINDEX_COMMENT);
             dwCookie |= COOKIE_EXT_COMMENT;
          }
          continue;
	  }

      //  Normal text
      if(pszChars[I] == '"')
	  {
		  /**if((dwCookie & COOKIE_WIZARD_CODE) != 0)
		  {


		  }
		  else**/
		  {
            DEFINE_BLOCK (I, COLORINDEX_STRING);
            dwCookie |= COOKIE_STRING;
		  }
          continue;
	  }
      if(pszChars[I] == '\'')
	  {
          // if (I + 1 < nLength && pszChars[I + 1] == '\'' || I + 2 < nLength && pszChars[I + 1] != '\\' && pszChars[I + 2] == '\'' || I + 3 < nLength && pszChars[I + 1] == '\\' && pszChars[I + 3] == '\'')
         if(!I || !xisalnum (pszChars[I - 1]))
		 {
		   /**
		   if((dwCookie & COOKIE_WIZARD_CODE) != 0)
		   {

		   }
		   else
		   **/
		   {
               DEFINE_BLOCK (I, COLORINDEX_STRING);
               dwCookie |= COOKIE_CHAR;
		   }
           continue;	  
		 }
	  }


      if(I > 0 && pszChars[I] == '*' && pszChars[I - 1] == '/')
	  {
         DEFINE_BLOCK (I - 1, COLORINDEX_COMMENT);
         dwCookie |= COOKIE_EXT_COMMENT;
         bWasCommentStart = TRUE;
         continue;
	  }

	  //for colapsible coding
	  if((pszChars[I] == '{')/*&&((dwCookie & COOKIE_COLAPSIBLE) == 0)*/)
	  {
		 dwCookie |= COOKIE_COLAPSIBLE;
		 /**
		 DWORD dwTempCookie =0;
		 CJavaTextBuffer* pTemp = (CJavaTextBuffer*)m_pTextBuffer;
         if(pTemp->getDeclMgr()->PointInBlockDecl(I,nLineIndex, dwTempCookie))
		 {
           dwCookie |= COOKIE_COLAPSIBLE;
		   dwCookie |= dwTempCookie;
		 }
		 else
         if(m_bEnableColapsingAllBlocks)//'{'
           dwCookie |= COOKIE_COLAPSIBLE;
		 //else//function|class|interface
		 **/
	  }

      bWasCommentStart = FALSE;

      if(bFirstChar)
	  {
        if(pszChars[I] == '#')
		{
		   if((dwCookie & COOKIE_WIZARD_CODE) != 0)
		   {

		   }
		   else
		   {
              DEFINE_BLOCK(I,COLORINDEX_PREPROCESSOR);
              dwCookie |= COOKIE_PREPROCESSOR;
		   }
           continue;
		}
        if(!isspace (pszChars[I]))
            bFirstChar = FALSE;
	  }

      if(pBuf == NULL)
        continue;               //  We don't need to extract keywords,
      //  for faster parsing skip the rest of loop

      if(xisalnum(pszChars[I]) || pszChars[I] == '.' && I > 0 && (!xisalpha(pszChars[I - 1]) && !xisalpha (pszChars[I + 1])))
	  {
         if(nIdentBegin == -1)
            nIdentBegin = I;
      }
      else
	  {
          
		 if(nIdentBegin >= 0)
		 {
              if(IsJavaKeyword (pszChars + nIdentBegin, I - nIdentBegin))
			  {
				  if((dwCookie & COOKIE_WIZARD_CODE)!=0)
				  {

				  }
				  else
				  {
                    DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);
				  }
			  }
              else 
			  if(IsJavaNumber (pszChars + nIdentBegin, I - nIdentBegin))
			  {
				  if((dwCookie & COOKIE_WIZARD_CODE)!=0)
				  {

				  }
				  else
				  {
                    DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);
				  }
			  }
              else
			  {
                 bool bFunction = FALSE;

                 for(int j = I; j < nLength; j++)
				 {
                    if(!isspace (pszChars[j]))
					{
                      if(pszChars[j] == '(')
					  {
                         bFunction = TRUE;
					  }
                      break;
					}
				 }

                 if(bFunction)
				 {
				    if((dwCookie & COOKIE_WIZARD_CODE)!=0)
					{
					
					}
					else
					{
					  //ASSERT(FALSE);
                      //DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);
					}
				 }
			  }
              bRedefineBlock = TRUE;
              bDecIndex = TRUE;
              nIdentBegin = -1;
		 }
	  }
 }

 if(nIdentBegin >= 0)
 {
     if(IsJavaKeyword (pszChars + nIdentBegin, I - nIdentBegin))
	 {
		  if((dwCookie & COOKIE_WIZARD_CODE)!=0)
		  {


		  }
		  else
		  {
            DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);
		  }
	 }
     else
	 if(IsJavaNumber (pszChars + nIdentBegin, I - nIdentBegin))
	 {
		if((dwCookie & COOKIE_WIZARD_CODE)!=0)
		{

		}
		else
		{
           DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);
		}
	 }
     else
	 {
        bool bFunction = FALSE;

        for(int j = I; j < nLength; j++)
		{
            if(!isspace (pszChars[j]))
			{
               if(pszChars[j] == '(')
			   {
                  bFunction = TRUE;
			   }
               break;
			}
		}
        
		if(bFunction)
		{
			  if((dwCookie & COOKIE_WIZARD_CODE)!=0)
			  {

			  }
			  else
			  {
				 //ASSERT(FALSE);
				 //DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);
			  }
		}
	 }
 }
 


  if(((dwCookie & COOKIE_WIZARD_CODE) == 0)&&
	 ((dwCookie & COOKIE_COLAPSIBLE) == 0))
  {
     if(pszChars[nLength - 1] != '\\')
     dwCookie &= COOKIE_EXT_COMMENT;
  }
  return dwCookie;
}


⌨️ 快捷键说明

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