bool mhmakefileparser::IsExprTrue(const string &EqualExpr) const { string Expr=ExpandExpression(EqualExpr); string Rest; Expr=ResolveExpression(Expr,Rest); if (Expr.empty() || Expr==s_FalseString) return false; else return true; }
bool NativeParserTest::TestExpression(wxString& expression, const TokenIdxSet& searchScope, TokenIdxSet& result) { // find all other matches std::queue<ParserComponent> components; BreakUpComponents(expression, components); ResolveExpression(m_Parser.GetTokenTree(), components, searchScope, result, true, true /*isPrefix*/); if (s_DebugSmartSense) CCLogger::Get()->DebugLog(F(_T("NativeParserTest::TestExpression, returned %lu results"), static_cast<unsigned long>(result.size()))); return true; }
string mhmakefileparser::ResolveExpression(const string &InExpr,string &Rest) const { unsigned i=0; string Ret; string Expr=InExpr; Rest=g_EmptyString; while (i<Expr.length()) { while (strchr(" \t\r",Expr[i])) i++; switch (Expr[i]) { case '!': if (i==Expr.length()-1) { i++; // to break out of the loop Ret=s_TrueString; /* the input was ! which means true */ } else if (Expr[i+1]!='=') { Ret=ResolveExpression(Expr.substr(i+1),Expr); Ret = Ret.empty() || Ret==s_FalseString ? s_TrueString : g_EmptyString; i=0; } else { Ret = Ret!=ResolveExpression(Expr.substr(i+2),Expr) ? s_TrueString : g_EmptyString; i=0; } break; case '&': #ifdef _DEBUG if (i==Expr.length()-1) { throw(string("Error in expression near ")+Expr[i]+": "+InExpr); } else #endif if (Expr[i+1]!='&') { Ret+=Expr[i++]; } else { Ret=AndExpression(Ret,ResolveExpression(Expr.substr(i+2),Expr)); i=0; } break; case '|': #ifdef _DEBUG if (i==Expr.length()-1) { throw(string("Error in expression near ")+Expr[i]+": "+InExpr); } else #endif if (Expr[i+1]!='|') { Ret+=Expr[i++]; } else { Ret=OrExpression(Ret,ResolveExpression(Expr.substr(i+2),Expr)); i=0; } break; case '(': if (Ret=="defined") { Ret=IsDefined(ResolveExpression(Expr.substr(i+1),Expr)) ? s_TrueString : g_EmptyString; } else { Ret+=ResolveExpression(Expr.substr(i+1),Expr); } i=0; break; case ')': Rest=Expr.substr(i+1); return Ret; break; case '"': { i++; while (i<Expr.length()) { char Char=Expr[i++]; if (Char=='"') break; Ret+=Char; } } break; case '=': if (i==Expr.length()-1) { i++; // To break out of the loop } else if (Expr[i+1]!='=') { Ret+=Expr[i++]; } else { Ret = Ret==ResolveExpression(Expr.substr(i+2),Expr) ? s_TrueString : g_EmptyString; i=0; } break; default: Ret+=Expr[i++]; break; } } return Ret; }