scan.l
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:6k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. %{
  2. /**********************************************************************
  3.  * scan.l - Scanner for the PL/pgSQL
  4.  *   procedural language
  5.  *
  6.  * IDENTIFICATION
  7.  *    $Header: /usr/local/cvsroot/pgsql/src/pl/plpgsql/src/scan.l,v 1.3 1999/05/26 20:55:06 momjian Exp $
  8.  *
  9.  *    This software is copyrighted by Jan Wieck - Hamburg.
  10.  *
  11.  *    The author hereby grants permission  to  use,  copy,  modify,
  12.  *    distribute,  and  license this software and its documentation
  13.  *    for any purpose, provided that existing copyright notices are
  14.  *    retained  in  all  copies  and  that  this notice is included
  15.  *    verbatim in any distributions. No written agreement, license,
  16.  *    or  royalty  fee  is required for any of the authorized uses.
  17.  *    Modifications to this software may be  copyrighted  by  their
  18.  *    author  and  need  not  follow  the licensing terms described
  19.  *    here, provided that the new terms are  clearly  indicated  on
  20.  *    the first page of each file where they apply.
  21.  *
  22.  *    IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTORS BE LIABLE TO ANY
  23.  *    PARTY  FOR  DIRECT,   INDIRECT,   SPECIAL,   INCIDENTAL,   OR
  24.  *    CONSEQUENTIAL   DAMAGES  ARISING  OUT  OF  THE  USE  OF  THIS
  25.  *    SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN
  26.  *    IF  THE  AUTHOR  HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
  27.  *    DAMAGE.
  28.  *
  29.  *    THE  AUTHOR  AND  DISTRIBUTORS  SPECIFICALLY   DISCLAIM   ANY
  30.  *    WARRANTIES,  INCLUDING,  BUT  NOT  LIMITED  TO,  THE  IMPLIED
  31.  *    WARRANTIES  OF  MERCHANTABILITY,  FITNESS  FOR  A  PARTICULAR
  32.  *    PURPOSE,  AND NON-INFRINGEMENT.  THIS SOFTWARE IS PROVIDED ON
  33.  *    AN "AS IS" BASIS, AND THE AUTHOR  AND  DISTRIBUTORS  HAVE  NO
  34.  *    OBLIGATION   TO   PROVIDE   MAINTENANCE,   SUPPORT,  UPDATES,
  35.  *    ENHANCEMENTS, OR MODIFICATIONS.
  36.  *
  37.  **********************************************************************/
  38. static char *plpgsql_source;
  39. static int plpgsql_bytes_left;
  40. static int scanner_functype;
  41. static int scanner_typereported;
  42. int plpgsql_SpaceScanned = 0;
  43. extern int yylineno;
  44. static void plpgsql_input(char *buf, int *result, int max);
  45. #define YY_INPUT(buf,res,max) plpgsql_input(buf, &res, max)
  46. %}
  47. WS [[:alpha:]_"]
  48. WC [[:alnum:]_"]
  49. %x IN_STRING IN_COMMENT
  50. %%
  51.     /* ----------
  52.      * Local variable in scanner to remember where
  53.      * a string or comment started
  54.      * ----------
  55.      */
  56.     int start_lineno = 0;
  57.     /* ----------
  58.      * Reset the state when entering the scanner
  59.      * ----------
  60.      */
  61.     BEGIN INITIAL;
  62.     plpgsql_SpaceScanned = 0;
  63.     /* ----------
  64.      * On the first call to a new source report the
  65.      * functions type (T_FUNCTION or T_TRIGGER)
  66.      * ----------
  67.      */
  68.     if (!scanner_typereported) {
  69.         scanner_typereported = 1;
  70. return scanner_functype;
  71.     }
  72.     /* ----------
  73.      * The keyword rules
  74.      * ----------
  75.      */
  76. := { return K_ASSIGN; }
  77. = { return K_ASSIGN; }
  78. .. { return K_DOTDOT; }
  79. alias { return K_ALIAS; }
  80. begin { return K_BEGIN; }
  81. bpchar { return T_BPCHAR; }
  82. char { return T_CHAR; }
  83. constant { return K_CONSTANT; }
  84. debug { return K_DEBUG; }
  85. declare { return K_DECLARE; }
  86. default { return K_DEFAULT; }
  87. else { return K_ELSE; }
  88. end { return K_END; }
  89. exception { return K_EXCEPTION; }
  90. exit { return K_EXIT; }
  91. for { return K_FOR; }
  92. from { return K_FROM; }
  93. if { return K_IF; }
  94. in { return K_IN; }
  95. into { return K_INTO; }
  96. loop { return K_LOOP; }
  97. not { return K_NOT; }
  98. notice { return K_NOTICE; }
  99. null { return K_NULL; }
  100. perform { return K_PERFORM; }
  101. raise { return K_RAISE; }
  102. record { return K_RECORD; }
  103. rename { return K_RENAME; }
  104. return { return K_RETURN; }
  105. reverse { return K_REVERSE; }
  106. select { return K_SELECT; }
  107. then { return K_THEN; }
  108. to { return K_TO; }
  109. type { return K_TYPE; }
  110. varchar { return T_VARCHAR; }
  111. when { return K_WHEN; }
  112. while { return K_WHILE; }
  113. ^#option { return O_OPTION; }
  114. dump { return O_DUMP; }
  115.     /* ----------
  116.      * Special word rules
  117.      * ----------
  118.      */
  119. {WS}{WC}* { return plpgsql_parse_word(yytext); }
  120. {WS}{WC}*.{WS}{WC}* { return plpgsql_parse_dblword(yytext); }
  121. {WS}{WC}*.{WS}{WC}*.{WS}{WC}* { return plpgsql_parse_tripword(yytext); }
  122. {WS}{WC}*%TYPE { return plpgsql_parse_wordtype(yytext); }
  123. {WS}{WC}*.{WS}{WC}*%TYPE { return plpgsql_parse_dblwordtype(yytext); }
  124. {WS}{WC}*%ROWTYPE { return plpgsql_parse_wordrowtype(yytext); }
  125. $[0-9]+ { return plpgsql_parse_word(yytext); }
  126. [0-9]+ { return T_NUMBER; }
  127.     /* ----------
  128.      * Ignore whitespaces but remember this happened
  129.      * ----------
  130.      */
  131. [ tn]+ { plpgsql_SpaceScanned = 1; }
  132.     /* ----------
  133.      * Eat up comments
  134.      * ----------
  135.      */
  136. --[^n]* ;
  137. /* { start_lineno = yylineno;
  138.   BEGIN IN_COMMENT;
  139. }
  140. <IN_COMMENT>*/ { BEGIN INITIAL; }
  141. <IN_COMMENT>n ;
  142. <IN_COMMENT>. ;
  143. <IN_COMMENT><<EOF>> { plpgsql_comperrinfo();
  144.   elog(ERROR, "unterminated comment starting on line %d",
  145. start_lineno);
  146. }
  147.     /* ----------
  148.      * Collect anything inside of ''s and return one STRING
  149.      * ----------
  150.      */
  151. ' { start_lineno = yylineno;
  152.   BEGIN IN_STRING;
  153.   yymore();
  154. }
  155. <IN_STRING>\. |
  156. <IN_STRING>'' { yymore(); }
  157. <IN_STRING>' { BEGIN INITIAL;
  158.   return T_STRING;
  159. }
  160. <IN_STRING><<EOF>> { plpgsql_comperrinfo();
  161.   elog(ERROR, "unterminated string starting on line %d", 
  162. start_lineno);
  163. }
  164. <IN_STRING>[^'\]* { yymore(); }
  165.     /* ----------
  166.      * Any unmatched character is returned as is
  167.      * ----------
  168.      */
  169. . { return yytext[0]; }
  170. %%
  171. int yywrap()
  172. {
  173.     return 1;
  174. }
  175. static void plpgsql_input(char *buf, int *result, int max)
  176. {
  177.     int n = max;
  178.     if (n > plpgsql_bytes_left) {
  179.         n = plpgsql_bytes_left;
  180.     }
  181.     if (n == 0) {
  182.         *result = YY_NULL;
  183. return;
  184.     }
  185.     *result = n;
  186.     memcpy(buf, plpgsql_source, n);
  187.     plpgsql_source += n;
  188.     plpgsql_bytes_left -= n;
  189. }
  190. void plpgsql_setinput(char *source, int functype)
  191. {
  192.     yyrestart(NULL);
  193.     yylineno = 1;
  194.     plpgsql_source = source;
  195.     if (*plpgsql_source == 'n')
  196.         plpgsql_source++;
  197.     plpgsql_bytes_left = strlen(plpgsql_source);
  198.     scanner_functype     = functype;
  199.     scanner_typereported = 0;
  200. }