home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume43 / dbf / part01 / token.l < prev   
Text File  |  1994-06-27  |  7KB  |  324 lines

  1. %{
  2. /*
  3.  * Copyright (c) 1991, 1992 Brad Eacker,
  4.  *              (Music, Intuition, Software, and Computers)
  5.  * All Rights Reserved
  6.  */
  7. /*
  8.  *    tokenizer for dbf
  9.  */
  10. #ifdef FLEX_SCANNER
  11. extern char *yytext;
  12. #endif
  13. #ifdef DEBUG        /* debugging version */
  14. main()
  15. {
  16.     char    *p;
  17.  
  18.     while (p = (char *)yylex())
  19.         printf("%-10.10s is \"%s\"\n", p, yytext);
  20. }
  21.  
  22. s_lookup() {}
  23. yymark() {}
  24.  
  25. int yynerrrs = 0;
  26.  
  27. #define    token(x)    (int) "x"
  28.  
  29. #else /* ! DEBUG (ie production version) */
  30.  
  31. #include "xbase.tab.h"
  32. #define token(x)    x
  33.  
  34. #endif /* DEBUG */
  35.  
  36. #define    END_OF(v)    (v-1 + sizeof v / sizeof v[0])
  37. static int screen();
  38. %}
  39.  
  40. letter            [a-zA-Z_]
  41. digit            [0-9]
  42. letter_or_digit        [a-zA-Z0-9_]
  43. car_ret            [\n]
  44. blank            [ \t]
  45. slash            [/]
  46. double_quote        ["]
  47. single_quote        [']
  48. not_d_quote        [^"]
  49. not_s_quote        [^']
  50. other            .
  51. period            [.]
  52.  
  53. %%
  54.  
  55. ";"{car_ret}        ;
  56. {car_ret}        return token(CR);
  57.  
  58. ^{blank}*"*".*\n    ;
  59. "&&".*\n        return token(CR);
  60.  
  61. {period}        return token(PERIOD);
  62.  
  63. {double_quote}{not_d_quote}*{double_quote}        return token(STRING);
  64. {single_quote}{not_s_quote}*{single_quote}        return token(STRING);
  65.  
  66. "("            return token(L_PAREN);
  67. ")"            return token(R_PAREN);
  68. "@"            return token(AT);
  69. "?"            return token(QUEST);
  70. "??"            return token(QUEST);
  71. "&"            return token(AMPER);
  72.  
  73. "*"            return token(MULT);
  74. "/"            return token(DIVIDE);
  75.  
  76. "+"            return token(PLUS);
  77. "-"            return token(MINUS);
  78.  
  79. ","            return token(COMMA);
  80. ";"            ;
  81. ":"            return token(COLON);
  82. "!"            return token(BANG);
  83.  
  84. "="            return token(EQUAL);
  85. "<>"            return token(NOT_EQUAL);
  86. ">"            return token(GREATER);
  87. ">="            return token(GREATER_EQUAL);
  88. "<"            return token(LESS);
  89. "<="            return token(LESS_EQUAL);
  90. "$"            return token(DOLLAR);
  91. "->"            return token(PTR);
  92.  
  93. "\.OR\."        return token(OR);
  94. "\.AND\."        return token(AND);
  95. "\.NOT\."        return token(NOT);
  96.  
  97. {letter}{letter_or_digit}*    {
  98. #ifdef DEBUG
  99.                 return screen();
  100. #else
  101.                 int retval;
  102.                 if ((retval = screen()) == token(Identifier)){
  103.                     s_lookup(token(Identifier));
  104.                 }
  105.                 return retval;
  106. #endif
  107.                 }
  108. {digit}+            { s_lookup(token(Constant));
  109.                   return token(Constant);
  110.                 }
  111. {period}{digit}+        { s_lookup(token(Constant));
  112.                   return token(Constant);
  113.                 }
  114. {digit}+{period}{digit}+    { s_lookup(token(Constant));
  115.                   return token(Constant);
  116.                 }
  117.  
  118. {blank}+            ;
  119.  
  120. {other}                return token(yytext[0]);
  121.  
  122. %%
  123.  
  124. static struct rwtable {        /* reserved word table */
  125.     char    *rw_name;    /* representations */
  126.     int    rw_yylex;    /* yylex(value) */
  127. } rwtable[] = {            /* sorted */
  128.     "ACCE",        token(ACCEPT),
  129.     "ACCEPT",    token(ACCEPT),
  130.     "ALIA",        token(ALIAS),
  131.     "ALIAS",    token(ALIAS),
  132.     "ALL",        token(ALL),
  133.     "APPE",        token(APPEND),
  134.     "APPEND",    token(APPEND),
  135.     "ASSI",        token(ASSIST),
  136.     "ASSIST",    token(ASSIST),
  137.     "AVER",        token(AVERAGE),
  138.     "AVERAGE",    token(AVERAGE),
  139.     "BLAN",        token(BLANK),
  140.     "BLANK",    token(BLANK),
  141.     "BOTTOM",    token(BOTTOM),
  142.     "BROW",        token(BROWSE),
  143.     "BROWSE",    token(BROWSE),
  144.     "CALL",        token(CALL),
  145.     "CANC",        token(CANCEL),
  146.     "CANCEL",    token(CANCEL),
  147.     "CASE",        token(CASE),
  148.     "CHANGE",    token(CHANGE),
  149.     "CLEA",        token(CLEAR),
  150.     "CLEAR",    token(CLEAR),
  151.     "CLOS",        token(CLOSE),
  152.     "CLOSE",    token(CLOSE),
  153.     "CONT",        token(CONTINUE),
  154.     "CONTINUE",    token(CONTINUE),
  155.     "COPY",        token(COPY),
  156.     "COUNT",    token(COUNT),
  157.     "DATABASES",    token(DATABASES),
  158.     "DELETE",    token(DELETE),
  159.     "DELI",        token(DELIMITED),
  160.     "DELIMITED",    token(DELIMITED),
  161.     "DISP",        token(DISPLAY),
  162.     "DISPLAY",    token(DISPLAY),
  163.     "DO",        token(DO),
  164.     "EDIT",        token(EDIT),
  165.     "EJEC",        token(EJECT),
  166.     "EJECT",    token(EJECT),
  167.     "ELSE",        token(ELSE),
  168.     "ENDC",        token(ENDCASE),
  169.     "ENDCASE",    token(ENDCASE),
  170.     "ENDD",        token(ENDDO),
  171.     "ENDDO",    token(ENDDO),
  172.     "ENDI",        token(ENDIF),
  173.     "ENDIF",    token(ENDIF),
  174.     "ENDTEXT",    token(ENDTEXT),
  175.     "ERASE",    token(ERASE),
  176.     "EXCL",        token(EXCLUSIVE),
  177.     "EXCLUSIVE",    token(EXCLUSIVE),
  178.     "EXIT",        token(EXIT),
  179.     "EXPO",        token(EXPORT),
  180.     "EXPORT",    token(EXPORT),
  181.     "FIEL",        token(FIELDS),
  182.     "FIELDS",    token(FIELDS),
  183.     "FILE",        token(FILE_T),
  184.     "FIND",        token(FIND),
  185.     "FOR",        token(FOR),
  186.     "FORM",        token(FORM),
  187.     "FROM",        token(FROM),
  188.     "GET",        token(GET),
  189.     "GO",        token(GO),
  190.     "GOTO",        token(GO),
  191.     "HEAD",        token(HEADING),
  192.     "HEADING",    token(HEADING),
  193.     "HELP",        token(HELP),
  194.     "IF",        token(IF),
  195.     "INDE",        token(INDEX),
  196.     "INDEX",    token(INDEX),
  197.     "INPU",        token(INPUT),
  198.     "INPUT",    token(INPUT),
  199.     "INSE",        token(INSERT),
  200.     "INSERT",    token(INSERT),
  201.     "JOIN",        token(JOIN),
  202.     "LABE",        token(LABEL),
  203.     "LABEL",    token(LABEL),
  204.     "LIST",        token(LIST),
  205.     "LOAD",        token(LOAD),
  206.     "LOCA",        token(LOCATE),
  207.     "LOCATE",    token(LOCATE),
  208.     "LOCK",        token(LOCK),
  209.     "LOGO",        token(LOGOUT),
  210.     "LOGOUT",    token(LOGOUT),
  211.     "LOOP",        token(LOOP),
  212.     "MENU",        token(MENU),
  213.     "MODI",        token(MODIFY),
  214.     "MODIFY",    token(MODIFY),
  215.     "NEXT",        token(NEXT),
  216.     "NOEJ",        token(NOEJECT),
  217.     "NOEJECT",    token(NOEJECT),
  218.     "NOTE",        token(NOTE),
  219.     "OFF",        token(OFF),
  220.     "ON",        token(ON),
  221.     "OTHE",        token(OTHERWISE),
  222.     "OTHERWISE",    token(OTHERWISE),
  223.     "PACK",        token(PACK),
  224.     "PARA",        token(PARAMETERS),
  225.     "PARAMETERS",    token(PARAMETERS),
  226.     "PICT",        token(PICTURE),
  227.     "PICTURE",    token(PICTURE),
  228.     "PLAIN",    token(PLAIN),
  229.     "PLAI",        token(PLAIN),
  230.     "PRIN",        token(PRINT),
  231.     "PRINT",    token(PRINT),
  232.     "PRIV",        token(PRIVATE),
  233.     "PRIVATE",    token(PRIVATE),
  234.     "PROC",        token(PROCEDURE),
  235.     "PROCEDURE",    token(PROCEDURE),
  236.     "PROM",        token(PROMPT),
  237.     "PROMPT",    token(PROMPT),
  238.     "PUBL",        token(PUBLIC),
  239.     "PUBLIC",    token(PUBLIC),
  240.     "QUIT",        token(QUIT),
  241.     "RANGE",    token(RANGE),
  242.     "READ",        token(READ),
  243.     "RECA",        token(RECALL),
  244.     "RECALL",    token(RECALL),
  245.     "RECO",        token(RECORD),
  246.     "RECORD",    token(RECORD),
  247.     "REIN",        token(REINDEX),
  248.     "REINDEX",    token(REINDEX),
  249.     "RELE",        token(RELEASE),
  250.     "RELEASE",    token(RELEASE),
  251.     "RENA",        token(RENAME),
  252.     "RENAME",    token(RENAME),
  253.     "REPL",        token(REPLACE),
  254.     "REPLACE",    token(REPLACE),
  255.     "REPO",        token(REPORT),
  256.     "REPORT",    token(REPORT),
  257.     "RESTORE",    token(RESTORE),
  258.     "REST",        token(REST),
  259.     "RESU",        token(RESUME),
  260.     "RESUME",    token(RESUME),
  261.     "RETR",        token(RETRY),
  262.     "RETRY",    token(RETRY),
  263.     "RETU",        token(RETURN),
  264.     "RETURN",    token(RETURN),
  265.     "RUN",        token(RUN),
  266.     "SAY",        token(SAY),
  267.     "SEEK",        token(SEEK),
  268.     "SELE",        token(SELECT),
  269.     "SELECT",    token(SELECT),
  270.     "SET",        token(SET),
  271.     "SKIP",        token(SKIP),
  272.     "SORT",        token(SORT),
  273.     "STORE",    token(STORE),
  274.     "STRU",        token(STRUCTURE),
  275.     "STRUCTURE",    token(STRUCTURE),
  276.     "SUM",        token(SUM),
  277.     "SUMM",        token(SUMMARY),
  278.     "SUMMARY",    token(SUMMARY),
  279.     "SUSP",        token(SUSPEND),
  280.     "SUSPEND",    token(SUSPEND),
  281.     "TEXT",        token(TEXT),
  282.     "TO",        token(TO),
  283.     "TOP",        token(TOP),
  284.     "TOTAL",    token(TOTAL),
  285.     "TYPE",        token(TYPE),
  286.     "UNLO",        token(UNLOCK),
  287.     "UNLOCK",    token(UNLOCK),
  288.     "UNIQ",        token(UNIQUE),
  289.     "UNIQUE",    token(UNIQUE),
  290.     "USE",        token(USE),
  291.     "VIEW",        token(VIEW),
  292.     "WAIT",        token(WAIT),
  293.     "WHIL",        token(WHILE),
  294.     "WHILE",    token(WHILE),
  295.     "WITH",        token(WITH),
  296.     "ZAP",        token(ZAP),
  297.     };
  298.  
  299. static int screen()
  300. {
  301.     struct rwtable    *low = rwtable,
  302.             *high = END_OF(rwtable),
  303.             *mid;
  304.     register char    *yptr, *op, ochar[100];
  305.     int c;
  306.  
  307.     op = ochar;
  308.     for (yptr = yytext; *yptr; yptr++)
  309.         *op++ = toupper(*yptr);
  310.     *op = 0;
  311.     op = ochar;
  312.     while (low <= high) {
  313.         mid = low + (high - low)/2;
  314.         if ((c = strcmp(mid->rw_name, op)) == 0)
  315.             return mid->rw_yylex;
  316.         else if (c < 0)
  317.             low = mid + 1;
  318.         else
  319.             high = mid - 1;
  320.     }
  321.     s_lookup(token(Identifier));
  322.     return token(Identifier);
  323. }
  324.