当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: http://www.delphibbs.com/delphibbs/dispq.asp?lid=1817254 mastering™ delphi™ 7 by marco cantù list price: us $59.99 | can $95.95 | uk £45.99 sybex online price: u......
 ·这句sql应该如何写    »显示摘要«
    摘要: 表1: item u_value ---------------- a 2 表2: item u_value --------------- a 1 a 3 a 5 要求结果为 表1.item 表1.u_value 表2.u_value --------------------------------------- a 2 3 即: 表1.item=表2.item and 表2......


求用C或C++写的编译语言源代码

哪里有这样的代码?  
  分不够可以再加。

NO.1   作者: hold2001

写一个词法分析的给你参考下:[1]Basedata.h  
  #ifndef   _BASETYPE_H  
  #define   _BASETYPE_H  
   
  #define   FALSE             0  
  #define   TRUE               1  
  #define   SPACE             0x20  
  #define   BACKSPACE     0x08  
  #define   ENTER             0x0d  
  #define   ESC                 0x1b  
  #define   TABLE             0x09  
                      #define   ENDFILE         -1  
  #endif  
   
  [2]Symbol.h  
                    #ifndef   _SYMBOL_H  
  #define   _SYMBOL_H  
   
  #include   <stdio.h>  
  #include   <stdlib.h>  
   
   
  #define   WORDLEN           13       //保留字个数  
  #define   MAXIDLEN         50       //标识符最长长度  
  #define   SYMBOLNUM       32       //种别码个数  
   
  typedef   enum   SYMBOL  
                      {NOL,IDENT,NUMBER,PLUS,MINUS,TIMES,SLASH,  
                      ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,  
                      RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,  
                      BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM,  
                      WRITESYM,READSYM,DOSYM,CALLSYM,CONSTSYM,  
                    VARSYM,PROCSYM}     SYMBOL;//定义种别码  
   
   
  void   Getchar(void);  
  //取下一个字符  
   
  void   Getbc(void);  
  //如当前字符为白字符,则读字符至不为白字符时停止  
   
  void   Concat(void);  
  //将当前字符加入token字  
   
  void   Retract(void);  
  //回退一字符  
   
  int   Reserve(void);  
  //判断token字中单词是否是保留字  
   
  int   Getsym(void);  
  //从当前文件中识别出一单词,并给出其类型和值  
   
  void   Errorsym(void);  
  //打印错误信息  
  #endif  
   
  [3]Symbol.c  
  #include   "basedata.h"  
  #include   "symbol.h"  
  #include   <conio.h>  
  #include   <string.h>  
  #include   <ctype.h>  
   
  char   *WORD[WORDLEN]={"BEGIN","CALL","CONST","DO",  
    "END","IF","ODD","PROCEDURE",  
    "READ","THEN","VAR","WHILE",  
    "WRITE"  
    };//保留字字符串表,用于将保留字种别码转为字符串输出  
  SYMBOL   WSYM[WORDLEN]={BEGINSYM,CALLSYM,CONSTSYM,  
        DOSYM,ENDSYM,IFSYM,ODDSYM,  
        PROCSYM,READSYM,THENSYM,  
        VARSYM,WHILESYM,WRITESYM};//保留字种别码表  
  char*   SNAME[SYMBOLNUM]=  
      {"NOL","IDENT","NUMBER","PLUS","MINUS","TIMES",  
        "SLASH","ODDSYM","EQL","NEQ","LSS","LEQ","GTR",  
        "GEQ","LPAREN","RPAREN","COMMA","SEMICOLON",  
        "PERIOD","BECOMES","BEGINSYM","ENDSYM","IFSYM",  
        "THENSYM","WHILESYM","WRITESYM","READSYM",  
        "DOSYM","CALLSYM","CONSTSYM","VARSYM","PROCSYM"};  
  //单词字符串表,用于将保留字种别码转为字符串输出  
   
   
   
   
   
  SYMBOL   sym;//最近已识的单词种别码  
  char       token[MAXIDLEN+1];//最近已识别的单词  
  int   num;//最近已识别的数字值  
  char   ch;//最近已识别的字符  
   
  int   col=1,row=1;//当前行和列值  
  FILE   *fd;//指向待编译文件  
  extern   FILE   *fout;//指向存放结果文件  
   
  void   Getchar(void)  
  {  
   
      ch=fgetc(fd);  
      if(ch!=EOF   &&   ch!=\n)  
    col++;  
      return;  
  }  
   
  void   Getbc(void)  
  {  
      while(ch==SPACE   ||ch==TABLE   ||ch==\n)  
  {  
      if(ch==\n)   {row++;col=1;}  
      Getchar();  
  }//为空字符则一直读至不为空字符  
  }  
   
   
  void   Retract(void)  
  {  
      fseek(fd,-1l,SEEK_CUR);  
      col--;  
  }  
   
  void   Concat(void)  
  {  
      char   temp[2];  
      temp[0]=ch;temp[1]=\0;  
      strcat(token,temp);  
  }  
   
  int   Reserve(void)  
  {  
      int   i,j;  
      char   temp[60];  
      j=strlen(token);  
      for(i=0;i<j;i++)  
        {  
  temp[i]=toupper(token[i]);//将当前token字以大写形式存入temp中  
        }  
      temp[i]=\0;  
   
    for(i=0;i<WORDLEN;i++)  
  {  
   
        if(!strcmp(WORD[i],temp))  
    break;  
  }//判断当前token是否是保留字  
    if(i>=WORDLEN)   i=-1;  
    return   i;  
  }  
   
  void   Errorsym(void)  
  {  
      fprintf(fout,  
  "There   is   error   @row:   %5d,   @col:   %5d",  
  row,col);  
  }  
   
   
   
   
  int   Getsym(void)  
  {  
      int   k;  
      int   flag=TRUE;  
      Getchar();  
      Getbc();//滤掉白字符  
      strcpy(token,"");  
      if(isalpha(ch))  
  {  
      //以字母开头则是标识符  
      num=0;  
      Concat();  
      Getchar();  
      while(isalnum(ch))  
  {  
    Concat();  
    Getchar();  
  }  
      Retract();//由于超前搜索了,所以回退一个字符  
      k=Reserve();//判断此标识符是否是保留字  
      if(k!=-1)  
  {  
      sym=WSYM[k];//将保留字种别码存入sym中  
  }  
      else  
  {  
      sym=IDENT;//将一般标识符种别码存入sym中  
  }//end   else   k!=-1;  
   
  }//end   of   if   isalpha  
      else   if(isdigit(ch))  
        {  
          //以数字开头则为无符号整数  
  Concat();  
  Getchar();  
  while(isdigit(ch))  
  {  
    Concat();  
    Getchar();  
  }  
  if(isalpha(ch))  
    {  
        flag=FALSE;  
  while(isalnum(ch))  
  {  
    Concat();  
    Getchar();  
  }  
    }//end   of   flag=FALSE  
        Retract();//回退  
        if(flag)//若是无符号整数,则将整数值存于num中  
      {sym=NUMBER;num=atoi(token);}  
        }//end   of   if   isdigit  
      else  
        {  
    num=0;  
    switch   (ch)  
    {  
    case   +:Concat();sym=PLUS;break;  
    case   -:Concat();sym=MINUS;break;  
    case   *:Concat();sym=TIMES;break;  
    case   /:Concat();sym=SLASH;break;  
    case   (:Concat();sym=LPAREN;break;  
    case   ):Concat();sym=RPAREN;break;  
    case   =:Concat();sym=EQL;break;  
    case   #:Concat();sym=NEQ;break;  
  /*  
        ODDSYM,EQL,NEQ,LSS,LEQ,GTR,GEQ,LPAREN,  
        RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,  
  */  
   
    case   ,:Concat();sym=COMMA;break;  
    case   .:Concat();sym=PERIOD;break;  
    case   ;:Concat();sym=SEMICOLON;break;  
    case   >:  
      Concat();Getchar();  
      if(ch!==)//若后不跟=,则回退  
  {sym=GTR;Retract();}  
      else  
  {Concat();sym=GEQ;}  
      break;  
    case   <:Concat();Getchar();  
      if(ch!==)  
  {sym=LSS;Retract();}  
      else  
  {Concat();sym=LEQ;}  
      break;  
    case   ::Concat();Getchar();  
      if(ch!==)  
  {flag=FALSE;Retract();}  
      else  
  {Concat();sym=BECOMES;}  
      break;  
   
    default   :flag=FALSE;break;  
   
        }//end   of   switch   else   char  
      }//end   of   else   char  
      return   flag;  
  }  
         
        [4]Testsym.c  
  #include   "basedata.h"  
  #include   "symbol.h"  
  #include   <conio.h>  
   
   
   
  extern   char   *WORD[WORDLEN];  
  extern   int   WSYM[WORDLEN];  
  extern   char*   SNAME[SYMBOLNUM];  
  extern   SYMBOL   sym;//last   readed   word   type;  
  extern   char       token[MAXIDLEN+1];//last   readed   word  
  extern   int   num;//last   readed   num;  
  extern   char   ch;//last   readed   char;  
  extern   int   col,row;  
  extern   FILE   *fd;  
   
   
  FILE   *fout;  
  void   Init(void);  
  void   Quit(void);  
   
  void   main()  
  {  
      int   flag;  
      Init();  
   
      fprintf(fout,"\n           TOKEN               SYM                   NUM");  
      do{  
   
  flag=Getsym();  
  if(flag)  
    {  
      fprintf(fout,"\n%10s         %10s                 %d",token,SNAME[sym],num);  
    }  
  else   if(ch!=EOF)  
    {  
      fprintf(fout,"\n%10s",token);  
      Errorsym();  
    }  
  }while(ch!=EOF);//反复调用Getsym()识别单词,将输出结果存入fout中  
   
      Quit();  
   
  }  
   
   
  //======================================  
  void   Init(void)  
  {  
      char   temp[30];  
      printf("\nPlease   input   your   file   name:");  
      gets(temp);  
      if   ((fd   =   fopen(temp,"rt"))  
  ==   NULL)  
      {  
        fprintf(stderr,   "Cannot   open   input   file   %s.\n",temp);  
        getch();  
        return   ;  
      }//将fd指针指向待分析源文件  
      if   ((fout   =   fopen("mydata.dat",   "wt"))  
  ==   NULL)  
      {  
        fprintf(stderr,   "Cannot   open   input   file.\n");  
        getch();  
        return   ;  
      }//将fout指向文件mydata.dat  
  }  
  void   Quit(void)  
  {  
      fclose(fd);  
      fclose(fout);  
  }  
 

NO.2   作者: sirouni2003

http://member.netease.com/~inetsoft/downloads/sourcecode/compiler/index.htm  
  里面有太多编译器的源代码


    摘要: 现有一个项目,使用的是filter-hook driver进行网络包过滤。现已根据http://www.codeproject.com/useritems/drvfltip.asp中提供的步骤和代码构建了一个过滤平台,而且可以正常工作。 现在的问题是,根据项目的要求,必须对每个发出的tcp/udp包的内容进行分析。但是通过以下这个函数原型好像根本无法得到发送包的内容: typedef pf......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE