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