home *** CD-ROM | disk | FTP | other *** search
/ Boston 2 / boston-2.iso / DOS / PROGRAM / C / LEX / SPIKE.LXI < prev    next >
Text File  |  1993-12-01  |  6KB  |  160 lines

  1. /*
  2.  * Lexical Analyzer for SPIKE
  3.  */
  4. alpha    = [A-Za-z];                     /* Letters */
  5. digit    = [0-9];                        /* Digits */
  6. prefix   = [-[-_.:>+*&%<={}$!|];         /* Prefixes */
  7. join     = [-[-_.:>/*+&%<={}$!|];        /* Connectors */
  8. alphanum = (alpha|digit|prefix)(alpha|digit|join)*;  /* Alphnumeric sequence */
  9. text     = [ -~];                        /* All printing characters */
  10. white    = [\r\t\b ];                    /* White space */
  11. eol      = [\n];                         /* End of the line */
  12. illegal  = [\0-\377];                    /* Junk */
  13.  
  14. %{
  15. #include "sys$library:stdio.h"
  16. #include "sys$library:math.h"
  17. #include "sys$library:ctype.h"
  18.  
  19. #define lexreturn(x)    {return(x);}
  20.  
  21. char lastyytext[1000],yytext[1000]= "";
  22. int yyival;
  23. float yyfval;
  24.  
  25. STRING uc_command[] = {"CREATE","LOAD","STORE","OBJECT","INSTAN","OBJSYN",
  26.                        "DELETE","RENAME","PRINT","PRINTO","STOREO","LOADO",
  27.                        "SLOT","SLOTSYN","RENAMES","DELETES","PRINTS","FACET",
  28.                        "DELETEF","MSG","RMSG","NOTICE","PUT","GET","APPEND",
  29.                        "REMOVE","TOG","STOREG","PUTUP","GETUP","EXIT",
  30.                        "KBMS_OPEN_KB","KBMS_CLOSE_KB",
  31.                        "KBMS_CREATE_INDEX","KBMS_DEFINE_INDEX",
  32.                        "KBMS_FETCH_OBJECTS",
  33.                        "COLLECT","STATS","DO","XLISP","XTESTX",""};
  34.  
  35. STRING lc_command[] = {"create","load","store","object","instan","objsyn",
  36.                        "delete","rename","print","printo","storeo","loado",
  37.                        "slot","slotsyn","renames","deletes","prints","facet",
  38.                        "deletef","msg","rmsg","notice","put","get","append",
  39.                        "remove","tog","storeg","putup","getup","exit",
  40.                        "kbms_open_kb","kbms_close_kb",
  41.                        "kbms_create_index","kbms_define_index",
  42.                        "kbms_fetch_objects",
  43.                        "collect","stats","do","xlisp","xtestx",""};
  44.  
  45. INTEGER command_token[] = {CKB,LKB,SKB,OBJ,INJ,SYJ,DBJ,RNJ,PBJ,PBJ,SBJ,LBJ,
  46.                            SLT,SYT,RNT,DLT,PLT,FAC,DAC,MSG,RMG,NKB,PUT,GET,
  47.                            APP,REM,TOG,STG,PUP,GUP,EXT,
  48.                            KOP,KCL,KCI,KDI,KFO,
  49.                            GBG,MST,DOT,LSP,TST};
  50.  
  51. %}
  52. %%
  53.  
  54. alphanum        {{char *p; BOOLEAN digitp, floatp, alphap; INTEGER i;
  55.                  digitp = floatp = alphap = FALSE;
  56.                  strcpy(lastyytext, yytext);
  57.                  gettoken(yytext, sizeof(yytext));
  58.                  if(((i = utl_index(lc_command, yytext)) != -1) ||
  59.                     ((i = utl_index(uc_command, yytext)) != -1))
  60.                      return(command_token[i]);
  61.                  for(p = yytext; *p; p++) {
  62.                      /*printf("%c(%o)",*p,*p);*/
  63.                      if(isdigit(*p))      digitp = TRUE;
  64.                      else if(*p == '.')   floatp = TRUE;
  65.                      else                 alphap = TRUE;
  66.                  }
  67.                  if(alphap) {
  68.                      /*printf("'%s' is TEXT\n", yytext);*/
  69.                      lexreturn(TEXT);
  70.                  } else if(!floatp) {
  71.                      yyival = atoi(yytext);
  72.                      /*sscanf(yytext,"%d", &yyival);*/
  73.                      /*printf("'%s' is ICON with value %d\n", yytext, yyival);*/
  74.  
  75.                      lexreturn(ICON);
  76.                  } else {
  77.                      yyfval = atof(yytext);
  78.                      /*sscanf(yytext, "%f", &yyfval);*/
  79.                      /*printf("'%s' is FCON with value %f\n", yytext, yyfval);*/
  80.  
  81.                      lexreturn(FCON);
  82.                  }}}
  83.  
  84. "\""(text)*"\"" {strcpy(lastyytext, yytext);
  85.                  gettoken(yytext, sizeof(yytext));
  86.                  strcpy(yytext, yytext+1);
  87.                  yytext[strlen(yytext)-1] = '\0';
  88.                  lexreturn(STNG);
  89.                 }
  90.  
  91. "'"             {strcpy(lastyytext, yytext);
  92.                  gettoken(yytext, sizeof(yytext));
  93.                  lexreturn(TEXT);
  94.                 }
  95.  
  96. "("             {return(LPR);}
  97.  
  98. ")"             {return(RPR);}
  99.  
  100. eol             {return(EOL);}
  101.  
  102. "/*"            {comment("*/");}
  103.  
  104. white(white)*   {return(LEXSKIP);}
  105.  
  106. %%
  107.  
  108. int lexgetc()
  109. {
  110.         static BOOLEAN virgin = TRUE;
  111.         static int newlines = 2;
  112.         register int c;
  113.  
  114.         if(virgin) {
  115.             printf(" --- SPIKE version 1.7.X ---\n");
  116.             virgin = FALSE;
  117.         }
  118.  
  119.     if(*kbname == 0 && SysKB && SysKB->kbkey)
  120.         strcpy(kbname, SysKB->kbkey);
  121.  
  122.         if(indirect) {
  123.             if((c = getc(iop)) != EOF) {
  124.             if(c == '\\') {
  125.                     while((c = getc(iop)) != '\n');
  126.                 return(lexgetc());
  127.             } else
  128.                 return(c);
  129.             } else {
  130.                 if(--indirect)
  131.                     rewind(iop);
  132.                 else
  133.                     fclose(iop);
  134.                 return(' ');
  135.             }
  136.         }
  137.  
  138.         if(newlines == 1) {
  139.             newlines = 2;
  140.             return(' ');
  141.         } else if(newlines == 2)
  142.             printf("%s>", kbname);
  143.             
  144.         c = getc(lexin);
  145.  
  146.         if(c == -1)
  147.             exit();
  148.  
  149.         if(c == '\n')
  150.             newlines = 1;
  151.         else
  152.             newlines = 0;       
  153.  
  154.         if(c == '\\') {
  155.             while((c = getc(lexin)) != '\n');
  156.             return(lexgetc());
  157.         } else
  158.             return(c);
  159. }
  160.