void clsAnalysis::AnalyzeBasicBlock(clsBasicBlock * pBasicBlock, clsEvent * pEvent) { vector<clsStatement *>::iterator it_pStatement; for (it_pStatement = pBasicBlock->m_pStatements.begin(); it_pStatement != pBasicBlock->m_pStatements.end(); ++it_pStatement) { AnalyzeStatement(*it_pStatement, pBasicBlock, pEvent); } }
void TAsmAnalyze::Analyze(void) { AsmTokenType Token = TOKENERROR; AsmTokenType TokenTemp; String TokenID; int TempHex; pHash = new HashTable; while (Token!=ENDFILE) { Token=getToken(); if (Token==ENDFILE) break; //cout<<"Debug: "<<tokenString<<endl; if (TokenPos == 1) { switch (Token) { case KEYWORDS: AnalyzeStatement(CurrentKeyWords); // 转到相应处理函数。 break; case ID: TokenID = tokenString; TokenTemp = getToken(); if (TokenTemp == COLON) { // 发现一个相对地址标示符,存储到符号表中。 //cout<<"ID - "<<TokenID<<" - "<<hex<<(unsigned int)(BaseAddress+CurrentAddress)<<endl; if (!pHash->insert(TokenID,CurrentAddress,true)) { //cout<<"ID Existed!"<<endl; FoundError(ID_DEFINED,lineno,"标示符已存在!"); } //if (getToken()==ENDLINE) break; getToken(); AnalyzeStatement(CurrentKeyWords); //cout<<lineno; // 转到相应处理函数。 } else if (TokenTemp == EQUAL) { getToken(); if (IsHex(tokenString)) { // 发现一个绝对标示符,存储到符号表中。 if (DebugMode) TempHex = HexStr2Int(tokenString) - DebugAddress; else TempHex = HexStr2Int(tokenString); if (!pHash->insert(TokenID, TempHex, false)) { //cout<<"ID Existed!"<<endl; FoundError(ID_DEFINED,lineno,"标示符已存在!"); } } else { FoundError(SYNTAX_ERROR,lineno,"语法错误!"); //cout<<"Line Error - "<<lineno<<endl; } } else { FoundError(SYNTAX_ERROR,lineno,"语法错误!"); //cout<<"Line Error - "<<lineno<<endl; } break; case ATCHAR: TokenTemp = getToken(); if (TokenTemp == TOKENERROR) { FoundError(SYNTAX_ERROR,lineno,"语法错误!"); } else if (TokenTemp == STRING) { LinkFileName = tokenString; } else if (TokenTemp == SHARP && IsHex(tokenString)) { // 设置调试模式 DebugMode = true; // 设置起始地址 BaseAddress = HexStr2Int(tokenString); } else if (IsHex(tokenString)) { // 设置起始地址 BaseAddress = HexStr2Int(tokenString); } else { FoundError(SYNTAX_ERROR,lineno,"语法错误!"); //cout<<"Line Error - "<<lineno<<endl; } break; case ENDLINE: break; default: FoundError(SYNTAX_ERROR,lineno,"语法错误!"); //cout<<"Line Error - "<<lineno<<endl; } } } // 获取本次汇编的字节数 TotalSize = CurrentAddress; }