可以设置每个项目的图片,但是需要在脚本中指定属性,再分别知道每个项目的icon

1/******************************************//* File:Unit2.h (scan.h)                  *//* A Scanner for lexical analysis for C++ *//* Author:zhanjiantao(compower)           *//******************************************/#include <vcl.h>#define MAXNO 48typedef struct TypeToken{  int line;  AnsiString words;  AnsiString type;}aToken;typedef aToken *Listnd;class scan{public:        bool IsReserveWord(AnsiString Token);        void InitRW();        void DoScan(char *infile);        void Print(int lineno, AnsiString stoken, int strgrdl, AnsiString Type);        void MakeTL(int line,AnsiString words,AnsiString type);        void Compress(char *zipFname);public:        char *file;        char ch;        AnsiString strToken;        AnsiString ReserveWs[MAXNO];        TList *TokenList;        Listnd Anode;};#endif/******************************************//* File:Unit2.cpp (scan.cpp)              *//* A Scanner for lexical analysis for C++ *//* Author:zhanjiantao(compower)           *//******************************************/#include "Unit2.h"#include <string.h>#include <fstream.h>//initiate Reserved Words listvoid scan::InitRW(){     const int buflen = 10;     char buf[buflen];     AnsiString gotWord = "";     ifstream iniRw("InitRW.ini");     int i = 0;     while(iniRw.getline(buf,buflen))     {      gotWord = buf;      ReserveWs[i++] = gotWord;     }     iniRw.close();     TokenList = new TList;}//judge the ch in the RW list or notbool scan::IsReserveWord(AnsiString Token){  bool result = false;  int low = 0;  int high = MAXNO-1;  while(low<=high)  {    int mid = (low + high)/2;    int rsComp = Token.AnsiCompare(ReserveWs[mid]);    if(rsComp==0)    {      result = true;      break;    }    if(rsComp<0)    {      high = mid-1;    }    else    {      low = mid+1;    }  }  return result;}//print on StringGridvoid scan::Print(int lineno, AnsiString stoken, int strgrdl, AnsiString Type){   Form1->StringGrid1->RowCount++;   Form1->StringGrid1->Cells[0][strgrdl] = lineno;   Form1->StringGrid1->Cells[1][strgrdl] = stoken;   Form1->StringGrid1->Cells[2][strgrdl] = Type;}//make a token listvoid scan::MakeTL(int line,AnsiString words,AnsiString type){   Anode = new aToken;   Anode->line = line;   Anode->words = words;   Anode->type = type;   TokenList->Add(Anode);}//scan--the hardcore of the scannervoid scan::DoScan(char *infile){   file = infile ;   ifstream scanFile(file);   int LineCount = 1;         //the word in which line   strToken = "";           //member of class scan   int strgrdLine = 1;       //temp var for show result on StringGrid   const int bflength = 254;  //length of getline buffer   char buffer[bflength];     //getline buffer   bool comment = false;      //for this kind of comment--"/**/"   char prech = '@';          //pre char for /**/ comment   AnsiString preToken = "";   //pre Token for judging pointee and multi '*'   while(scanFile.getline(buffer,bflength))   //get each line of the .cpp file   {     int lnscptr = 0;     while(buffer[lnscptr]==' ')  //trim left space       lnscptr++;     ch = buffer[lnscptr]; /*scan:important arithmetic*/    if(comment)    {     prech = ch;     goto flag1;    }    else    {     while(ch!='\0')   //while not the line finish symbol do analyse     {        if(isalpha(ch) || ch=='_')  // ID or KeyWord        {          while(isalpha(ch) || isdigit(ch) || ch=='_')          {           strToken = strToken + ch;           ch = buffer[++lnscptr];          }          if(IsReserveWord(strToken))     //is ReserveWord          {           Print(LineCount,strToken,strgrdLine,"保留字");           MakeTL(LineCount,strToken,"保留字");          }          else                    //is ID          {           Print(LineCount,strToken,strgrdLine,"标识符");           MakeTL(LineCount,strToken,"标识符");          }          preToken = strToken;          strgrdLine++;          strToken.Delete(1,strToken.Length());        }        else if(isdigit(ch))     // Numerci        {          while(isdigit(ch) || ch=='.')          {           strToken = strToken + ch;           ch = buffer[++lnscptr];          }          bool isInt = true;          for(int pos=1; pos<=strToken.Length(); pos++)          {           if(strToken[pos]=='.')           {             isInt = false;             break;           }          }          if(isInt)         //is Int          {            Print(LineCount,strToken,strgrdLine,"整数");            MakeTL(LineCount,strToken,"整数");          }          else             //is Float          {            Print(LineCount,strToken,strgrdLine,"浮点数");            MakeTL(LineCount,strToken,"浮点数");          }          strgrdLine++;          strToken.Delete(1,strToken.Length());        }        else if(ch==' ' || ch=='\t' || ch=='\n') //skip space,tab and enter        {          ch = buffer[++lnscptr];        }        else        //other special symbols        {          switch(ch)          {            case '#':                strToken = strToken + ch;                ch = buffer[++lnscptr];                while(ch!='\0' && ch!='/')                 {                  strToken = strToken + ch;                  ch = buffer[++lnscptr];                 }                Print(LineCount,strToken,strgrdLine,"预定义");                MakeTL(LineCount,strToken,"预定义");                break;            case '\'':                strToken = strToken + ch;                ch = buffer[++lnscptr];                while(ch!='\'')                {                  strToken = strToken + ch;                  ch = buffer[++lnscptr];                }                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"字符常量");                MakeTL(LineCount,strToken,"字符常量");                break;            case '"':                strToken = strToken + ch;                ch = buffer[++lnscptr];                while(ch!='"')                {                  strToken = strToken + ch;                  ch = buffer[++lnscptr];                }                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"字符串");                MakeTL(LineCount,strToken,"字符串");                break;            case '=':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='=')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"逻辑等");                 MakeTL(LineCount,strToken,"逻辑等");                }                else                {                 Print(LineCount,strToken,strgrdLine,"赋值号");                 MakeTL(LineCount,strToken,"赋值号");                }                break;            case '+':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='=')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"+=运算符");                 MakeTL(LineCount,strToken,"+=运算符");                }                else if(ch=='+')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"递增运算符");                 MakeTL(LineCount,strToken,"递增运算符");                }                else                {                 Print(LineCount,strToken,strgrdLine,"加号运算符");                 MakeTL(LineCount,strToken,"加号运算符");                }                break;            case '-':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='=')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"-=运算符");                 MakeTL(LineCount,strToken,"-=运算符");                }                else if(ch=='>')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"指针运算符");                 MakeTL(LineCount,strToken,"指针运算符");                }                else if(ch=='-')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"递减运算符");                 MakeTL(LineCount,strToken,"递减运算符");                }                else                {                 Print(LineCount,strToken,strgrdLine,"减号运算符");                 MakeTL(LineCount,strToken,"减号运算符");                }                break;            case '*':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='=')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"*=运算符");                 MakeTL(LineCount,strToken,"*=运算符");                }                else if(IsReserveWord(preToken))                {                 Print(LineCount,strToken,strgrdLine,"指针定义符");                 MakeTL(LineCount,strToken,"指针定义符");                }                else                {                 Print(LineCount,strToken,strgrdLine,"乘号运算符");                 MakeTL(LineCount,strToken,"乘号运算符");                }                break;            case '/':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='/')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 while(ch!='\0')                 {                  strToken = strToken + ch;                  ch = buffer[++lnscptr];                 }                 Print(LineCount,strToken,strgrdLine,"注释");                }                else if(ch=='*')                {           flag1:strToken = strToken + ch;                 ch = buffer[++lnscptr];                 while((prech!='*' || ch!='/') && ch!='\0')                 {                  strToken = strToken + ch;                  ch = buffer[++lnscptr];                  prech = buffer[lnscptr-1];                 }                 if(ch!='\0')                   {strToken = strToken + ch;}                 if(prech=='*' && ch=='/')                 { comment = false;}                 else                 { comment = true;}                 if(ch!='\0')                   {ch = buffer[++lnscptr];}                 Print(LineCount,strToken,strgrdLine,"注释");                }                else if(ch=='=')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"/=运算符");                 MakeTL(LineCount,strToken,"/=运算符");                }                else                {                 Print(LineCount,strToken,strgrdLine,"除号运算符");                 MakeTL(LineCount,strToken,"除号运算符");                }                break;            case '%':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='=')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"%=运算符");                 MakeTL(LineCount,strToken,"%=运算符");                }                else                {                 Print(LineCount,strToken,strgrdLine,"模运算符");                 MakeTL(LineCount,strToken,"模运算符");                }                break;            case '<':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='=')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"小于等于号");                 MakeTL(LineCount,strToken,"小于等于号");                }                else                {                 Print(LineCount,strToken,strgrdLine,"小于号");                 MakeTL(LineCount,strToken,"小于号");                }                break;            case '>':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='=')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"大于等于号");                 MakeTL(LineCount,strToken,"大于等于号");                }                else                {                 Print(LineCount,strToken,strgrdLine,"大于号");                 MakeTL(LineCount,strToken,"大于号");                }                break;            case '!':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='=')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"不等于号");                 MakeTL(LineCount,strToken,"不等于号");                }                else                {                 Print(LineCount,strToken,strgrdLine,"逻辑非");                 MakeTL(LineCount,strToken,"逻辑非");                }                break;            case '&':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='&')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"逻辑与");                 MakeTL(LineCount,strToken,"逻辑与");                }                else                {                 Print(LineCount,strToken,strgrdLine,"位与运算符");                 MakeTL(LineCount,strToken,"位与运算符");                }                break;            case '|':                strToken = strToken + ch;                ch = buffer[++lnscptr];                if(ch=='|')                {                 strToken = strToken + ch;                 ch = buffer[++lnscptr];                 Print(LineCount,strToken,strgrdLine,"逻辑或");                 MakeTL(LineCount,strToken,"逻辑或");                }                else                {                 Print(LineCount,strToken,strgrdLine,"位或运算符");                 MakeTL(LineCount,strToken,"位或运算符");                }                break;            case '^':                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"异或运算符");                MakeTL(LineCount,strToken,"异或运算符");                break;            case '[':                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"左方括号");                MakeTL(LineCount,strToken,"左方括号");                break;            case ']':                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"右方括号");                MakeTL(LineCount,strToken,"右方括号");                break;            case '(':                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"左圆括号");                MakeTL(LineCount,strToken,"左圆括号");                break;            case ')':                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"右圆括号");                MakeTL(LineCount,strToken,"右圆括号");                break;            case '{':                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"左花括号");                MakeTL(LineCount,strToken,"左花括号");                break;            case '}':                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"右花括号");                MakeTL(LineCount,strToken,"右花括号");                break;            case ',':            case ';':                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"分界符");                MakeTL(LineCount,strToken,"分界符");                break;            default:                strToken = strToken + ch;                ch = buffer[++lnscptr];                Print(LineCount,strToken,strgrdLine,"其他特殊符号");                MakeTL(LineCount,strToken,"其他特殊符号");                break;          }//switch          strgrdLine++;          strToken.Delete(1,strToken.Length());        }//else     }//_while buffer[]!='/0'    } /*scan:important arithmetic*/    LineCount++;   } //_while getline  scanFile.close();}void scan::Compress(char *zipFname){   ofstream compress(zipFname,ios::app);   for(int i=0; i<TokenList->Count; i++)   {        Anode = (Listnd)TokenList->Items[i];        if(Anode->type=="预定义")        {         compress<<Anode->words.c_str()<<endl;        }        else if(Anode->type=="保留字")        {         compress<<Anode->words.c_str();         compress<<" ";        }        else        {         compress<<Anode->words.c_str();        }   }   compress.close();}
posted on 2005-10-09 18:05  偶卖糕的  阅读(1129)  评论(1编辑  收藏  举报