Exemplo n.º 1
0
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;
}
Exemplo n.º 3
0
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;
}