📄 javaparser.cpp
字号:
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 + -