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