⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 booleanexp.cpp

📁 我写的抽象语法树
💻 CPP
字号:
#include <vector>
#include <ComCtrls.hpp>
#include "BooleanExp.h"


//2007.08 宋双
VariableExp::VariableExp(AnsiString name,AnsiString of,AnsiString val)
{
  fieldName=name;
  op=of;
  fieldVal=val;
}

void VariableExp::destory()
{
   delete this;
}


bool VariableExp::isFloat(TListView* view,int index)
{
    bool flag=true;
    for(int i=view->Items->Count-1;i>=0&&flag==true;i--)
    {
       AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
       for(int j=tmp.Length();j>=1;j--)
       {
          if(tmp[j]>='0'&&tmp[j]<='9'||tmp[j]=='.')
            flag=true;
          else
          {
            flag=false;
            break;
          }
        }
    }
    return flag;
}

vector<int> VariableExp::FiltListView(TListView* view)
{
   vector<int> vec;
   int index;
   for(int i=1;i<view->Columns->Count;i++)
   {
     if(view->Columns->Items[i]->Caption.Trim()==fieldName.Trim())
       {
         index=i-1;
         break;
       }
    }
    char operate=op[1];

   switch(operate)
   {
     case '> ':
      if(isFloat(view,index))
      {
       for(int i=0;i<=view->Items->Count-1;i++)
       {
         if(fieldVal.ToDouble()<view->Items->Item[i]->SubItems->Strings[index].ToDouble())
           vec.push_back(i);
       }
      }
      else{
       fieldVal=fieldVal.Trim();
        for(int i=0;i<=view->Items->Count-1;i++)
        {
          AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
          int tmpp=fieldVal.AnsiCompare(tmp);
          if(tmpp<0)
            vec.push_back(i);
        }
      }
      return vec;

     case'<':
      if(isFloat(view,index))
      {
       for(int i=0;i<=view->Items->Count-1;i++)
       {
         if(fieldVal.ToDouble()>view->Items->Item[i]->SubItems->Strings[index].ToDouble())
           vec.push_back(i);
       }
      }
      else{
       fieldVal=fieldVal.Trim();
        for(int i=0;i<=view->Items->Count-1;i++)
        {
          AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
         int tmpp=fieldVal.AnsiCompare(tmp);
          if(tmpp>0)
            vec.push_back(i);
        }
      }
      return vec;

     case'=':
        fieldVal=fieldVal.Trim();
        for(int i=0;i<=view->Items->Count-1;i++)
        {
           AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
           if(fieldVal==tmp)
           vec.push_back(i);
        }
        return vec;

     case'l':
       fieldVal=fieldVal.Trim();
       for(int i=0;i<view->Items->Count-1;i++)
       {
         AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
         if(tmp.Pos(fieldVal)!=0)
          vec.push_back(i);
       }
       return vec;   

   }   
}

AnsiString   VariableExp::FiltDateSet()
{
   return fieldName+op+"'"+fieldVal+"'";
}   




AndExp::AndExp(BooleanExp* left,BooleanExp* right)
{
   _operand1=left;
   _operand2=right;
}
vector<int> AndExp::FiltListView(TListView* view)
{
  vector<int> temp1=_operand1->FiltListView(view);
  vector<int> temp2=_operand2->FiltListView(view);
  sort(temp1.begin(),temp1.end());
  sort(temp2.begin(),temp2.end());
  vector<int>::iterator begin1=temp1.begin();
  vector<int>::iterator begin2=temp2.begin();
  vector<int>::const_iterator end1=temp1.end();
  vector<int>::const_iterator end2=temp2.end();
  vector<int> result;
  while(begin1!=end1&&begin2!=end2)
  {
     if(*begin1<*begin2)
       ++begin1;
     else if(*begin2<*begin1)
       ++begin2;
     else{
      result.push_back(*begin1);
      ++begin1;
      ++begin2;
      }
  }                                                           //求并集
  return result;
}

void AndExp::destory()
{
  _operand1->destory();
  _operand2->destory();
  delete this;
}


AnsiString AndExp::FiltDateSet()
{
  return _operand1->FiltDateSet()+" and "+_operand2->FiltDateSet();
}




OrExp::OrExp(BooleanExp* left,BooleanExp* right)
{
  _operand1=left;
  _operand2=right;
}


vector<int> OrExp::FiltListView(TListView* view)
{
  vector<int> temp1=_operand1->FiltListView(view);
  vector<int> temp2=_operand2->FiltListView(view);
  sort(temp1.begin(),temp1.end());
  sort(temp2.begin(),temp2.end());
  vector<int>::iterator begin1=temp1.begin();
  vector<int>::iterator begin2=temp2.begin();
  vector<int>::iterator end1=temp1.end();
  vector<int>::iterator end2=temp2.end();
  vector<int> result;
  while(begin1!=end1&& begin2!=end2)
  {
    if(*begin1<*begin2)
     {
       result.push_back(*begin1);
       ++begin1;
     }
     else if(*begin2<*begin1)
     {
       result.push_back(*begin2);
       ++begin2;
     }
     else
     {
       result.push_back(*begin1);
       ++begin1;
       ++begin2;
     }
    
  }
  if(begin1!=end1)
  {
    while(begin1!=end1)
    {
      result.push_back(*begin1);
      ++begin1;
     }
   }
   else{
    while(begin2!=end2)
    {
       result.push_back(*begin2);
       ++begin2;                                               //求交集
     }
   }
  return result;
}

void OrExp::destory()
{
  _operand1->destory();
  _operand2->destory();
  delete this;
}  

AnsiString OrExp::FiltDateSet()
{
   return _operand1->FiltDateSet()+" or "+_operand2->FiltDateSet();
}

















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -