scan_s.l
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:11k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. %{
  2. /*
  3.  *  scan_s.l - SQL scanner / server side.
  4.  *            
  5.  *  This file is a part of GNU SQL Server
  6.  *
  7.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  8.  *  Developed at the Institute of System Programming
  9.  *  This file is written by Michael Kimelman
  10.  * 
  11.  *  This program is free software; you can redistribute it and/or modify
  12.  *  it under the terms of the GNU General Public License as published by
  13.  *  the Free Software Foundation; either version 2 of the License, or
  14.  *  (at your option) any later version.
  15.  *
  16.  *  This program is distributed in the hope that it will be useful,
  17.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  *  GNU General Public License for more details.
  20.  *
  21.  *  You should have received a copy of the GNU General Public License
  22.  *  along with this program; if not, write to the Free Software
  23.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  *  Contact: gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: scan_s.l,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  29.   
  30. #include "xmem.h"
  31. #include "sql_decl.h"
  32. #include "trl.h"
  33. #include "parse.h"
  34. #include "const.h"
  35.   
  36.   
  37. #if defined(stderr)
  38. # undef stderr
  39. #endif
  40. #if defined(stdout)
  41. # undef stdout
  42. #endif
  43. #define stderr STDERR
  44. #define stdout STDOUT
  45. #define SQL_PROC(code)  if(code)
  46.   {
  47.     yylloc.first_line=line_num; file_pos=yylloc.last_line=line_num; 
  48.     if (code==TOK_IDENTIFIER && !strcmp(STRING(yylval.ltrp),"DEFINITION_SCHEMA")) 
  49.       yylval.ltrp = ltr_rec(SYSADM);
  50.     return code;
  51.   }
  52. #undef YY_INPUT
  53. #define YY_INPUT(buf,result,max_size) serv_scan_buf_inp(buf,&result,max_size)
  54. extern YYLTYPE yylloc;
  55. static i4_t line_num=0;
  56. static char *bufstring=NULL;
  57. static void 
  58. serv_scan_buf_inp(char *buf, i4_t *result, i4_t max_size)
  59.   register i4_t l = strlen (bufstring );
  60.   l= l > max_size ? max_size : l ;
  61.   if(l)
  62.     {
  63.       bcopy (bufstring, buf, l);
  64.       bufstring += l;
  65.       *result = l;
  66.     }
  67.   else
  68.     {
  69.       *result =  YY_NULL ;
  70.       *buf = 0 ;
  71.     }
  72. }
  73. /* void    SAVESTR(char *s,LTRLREF d); */
  74. #define SAVESTR(s,d)      d=ltr_rec(s)
  75. static str_buf s_scanner_buffer={0,0,NULL};
  76. #define sql_str(s,l)  buffer_string(&s_scanner_buffer,s,l)
  77. %}
  78. %x SQL_str SQL_comment Identifier
  79. WS              [ tf]+
  80. OPTWS           [ tf]*
  81. NOT_WS          [^ tfn]
  82. DIG             [0-9]
  83. LET             [A-Za-z]
  84. NOT_LET         [^A-Za-z0-9]
  85. NAME            {LET}({LET}|{DIG}|_)*
  86. NNS             [^A-Za-z0-9_]
  87. SIGN            ("+"|"-")?
  88. NUM_opt         {DIG}*
  89. NUM             {DIG}+
  90. INT             {NUM}
  91. EXACT           {NUM_opt}"."{NUM_opt}
  92. FLT_ERR         {EXACT}(e|E){SIGN}
  93. FLT             {EXACT}(e|E){SIGN}{INT}
  94. %%
  95.     yy_flex_debug=server_scanner_debug;
  96.   /*********************************************
  97.    *          embedded SQL lexics              *
  98.    *********************************************/
  99. WHENEVER        SQL_PROC(TOK_WHENEVER);
  100. FOUND           SQL_PROC(TOK_FOUND   );
  101. SQLERROR        SQL_PROC(TOK_SQLERROR);
  102. CONTINUE        SQL_PROC(TOK_CONTINUE);
  103. GO(TO)?/{NNS}   SQL_PROC(TOK_GOTO    );
  104. BEGIN           SQL_PROC(TOK_BEGIN   );
  105. END             SQL_PROC(TOK_END     );
  106. DECLARE         SQL_PROC(TOK_DECLARE );
  107. SECTION         SQL_PROC(TOK_SECTION );
  108. ":"{NAME}       {
  109.                    SAVESTR(yytext+1,yylval.ltrp);
  110.                    SQL_PROC(TOK_PARAM);
  111.                 }
  112.   /*********************************************
  113.    *          Dynamic  SQL lexics              *
  114.    *********************************************/
  115. ?             {
  116.                  static i4_t placeholders_counter = 0;
  117.                  char str[100];
  118.                  sprintf(str,"__%d",placeholders_counter++);
  119.                  SAVESTR(str,yylval.ltrp);
  120.                  SQL_PROC(TOK_PARAM);
  121.                }
  122.   /*********************************************
  123.    *          clean  SQL MODULE lexic          *
  124.    *********************************************/
  125. MODULE          SQL_PROC(TOK_MODULE      );
  126. LANGUAGE        SQL_PROC(TOK_LANGUAGE    );
  127. PROCEDURE       SQL_PROC(TOK_PROCEDURE   );
  128. SQLCODE         SQL_PROC(TOK_SQLCODE     );
  129. ";"             SQL_PROC(';'             );
  130.   /*********************************************
  131.    *          clean  SQL SCHEMA lexic          *
  132.    *********************************************/
  133. CREATE       SQL_PROC(TOK_CREATE    );
  134. DROP         SQL_PROC(TOK_DROP      );
  135. ALTER        SQL_PROC(TOK_ALTER     );
  136. SCHEMA       SQL_PROC(TOK_SCHEMA    );
  137. TABLE        SQL_PROC(TOK_TABLE     );
  138. VIEW         SQL_PROC(TOK_VIEW      );
  139. GRANT        SQL_PROC(TOK_GRANT     );
  140. REVOKE       SQL_PROC(TOK_REVOKE    );
  141. CHECK        SQL_PROC(TOK_CHECK     );
  142. TO/{NNS}     SQL_PROC(TOK_TO        );
  143. DEFAULT      SQL_PROC(TOK_DEFAULT   ); 
  144. FOREIGN      SQL_PROC(TOK_FOREIGN   );
  145. KEY          SQL_PROC(TOK_KEY       );
  146. PRIMARY      SQL_PROC(TOK_PRIMARY   );    
  147. INDEX        SQL_PROC(TOK_INDEX     );    
  148. OPTION       SQL_PROC(TOK_OPTION    );
  149. PRIVILEGES   SQL_PROC(TOK_PRIVILEGES);
  150. PUBLIC       SQL_PROC(TOK_PUBLIC    );
  151. REFERENCES   SQL_PROC(TOK_REFERENCES);    
  152. UNIQUE       SQL_PROC(TOK_UNIQUE    );
  153.   /*********************************************
  154.    *            clean  SQL lexic               *
  155.    *********************************************/
  156. AUTHORIZATION    SQL_PROC(TOK_AUTHORIZATION);
  157.   /*********************************************
  158.    *          common SQL  keywords             *
  159.    *********************************************/
  160. ALL/{NNS}       SQL_PROC(TOK_ALL       );
  161. ANY/{NNS}       SQL_PROC(TOK_ANY       );
  162. AS/{NNS}        SQL_PROC(TOK_AS        );
  163. ASC/{NNS}       SQL_PROC(TOK_ASC       );
  164. BETWEEN         SQL_PROC(TOK_BETWEEN   );
  165. BY/{NNS}        SQL_PROC(TOK_BY        );
  166. CLOSE           SQL_PROC(TOK_CLOSE     );
  167. COMMIT          SQL_PROC(TOK_COMMIT    );
  168. CURRENT         SQL_PROC(TOK_CURRENT   );
  169. CURSOR          SQL_PROC(TOK_CURSOR    );
  170. DELETE          SQL_PROC(TOK_DELETE    );
  171. DESC/{NNS}      SQL_PROC(TOK_DESC      );
  172. DISTINCT        SQL_PROC(TOK_DISTINCT  );
  173. ESCAPE          SQL_PROC(TOK_ESCAPE    );
  174. EXISTS          SQL_PROC(TOK_EXISTS    );
  175. FETCH           SQL_PROC(TOK_FETCH     );
  176. FOR/{NNS}       SQL_PROC(TOK_FOR       );
  177. FROM            SQL_PROC(TOK_FROM      );
  178. GROUP           SQL_PROC(TOK_GROUP     );
  179. HAVING          SQL_PROC(TOK_HAVING    );
  180. IN/{NNS}        SQL_PROC(TOK_IN        );
  181. INDICATOR       SQL_PROC(TOK_INDICATOR );
  182. INSERT          SQL_PROC(TOK_INSERT    );
  183. INTO            SQL_PROC(TOK_INTO      );
  184. IS/{NNS}        SQL_PROC(TOK_IS        );
  185. LIKE            SQL_PROC(TOK_LIKE      );
  186. NULL            SQL_PROC(TOK_NULL      );
  187. OF/{NNS}        SQL_PROC(TOK_OF        );
  188. ON/{NNS}        SQL_PROC(TOK_ON        );
  189. OPEN            SQL_PROC(TOK_OPEN      );
  190. ORDER           SQL_PROC(TOK_ORDER     );
  191. ROLLBACK        SQL_PROC(TOK_ROLLBACK  );
  192. SELECT          SQL_PROC(TOK_SELECT    );
  193. SET/{NNS}       SQL_PROC(TOK_SET       );
  194. SOME            SQL_PROC(TOK_SOME      );
  195. UNION           SQL_PROC(TOK_UNION     );
  196. UPDATE          SQL_PROC(TOK_UPDATE    );
  197. USER            SQL_PROC(TOK_USER      );
  198. VALUES          SQL_PROC(TOK_VALUES    );
  199. WHERE           SQL_PROC(TOK_WHERE     );
  200. WITH            SQL_PROC(TOK_WITH      );
  201. WORK            SQL_PROC(TOK_WORK      );
  202.   /******************************************
  203.    *  common SQL  keywords  for data type   *
  204.    ******************************************/
  205. CHAR(ACTER)?/{NNS}    SQL_PROC(TOK_T_CHAR);
  206. NUMERIC/{NNS}         SQL_PROC(TOK_T_NUM);
  207. DEC(IMAL)?/{NNS}      SQL_PROC(TOK_T_NUM);
  208. INT(EGER)?/{NNS}      SQL_PROC(TOK_T_INT);
  209. SMALLINT/{NNS}        SQL_PROC(TOK_T_SINT);
  210. FLOAT/{NNS}           SQL_PROC(TOK_T_FLT);
  211. REAL/{NNS}            SQL_PROC(TOK_T_REAL);
  212. DOUBLE/{NNS}          SQL_PROC(TOK_T_DOUBLE);
  213. PRECISION/{NNS}       SQL_PROC(TOK_T_PRECISION);
  214.   /******************************************
  215.    *  common SQL  keywords  for expression  *
  216.    ******************************************/
  217. AND/{NNS}             SQL_PROC(TOK_AND       );
  218. OR/{NNS}              SQL_PROC(TOK_OR        );
  219. NOT/{NNS}             SQL_PROC(TOK_NOT       );
  220. AVG/{NNS}             SQL_PROC(TOK_AVG   );
  221. MAX/{NNS}             SQL_PROC(TOK_MAX   );
  222. MIN/{NNS}             SQL_PROC(TOK_MIN   );
  223. SUM/{NNS}             SQL_PROC(TOK_SUM   );
  224. COUNT/{NNS}           SQL_PROC(TOK_COUNT );
  225. +              SQL_PROC('+'   );
  226. -              SQL_PROC('-'   );
  227. *              SQL_PROC('*'   );
  228. /              SQL_PROC('/'   );
  229. =              SQL_PROC('='   );
  230. "<>"            SQL_PROC(TOK_NE);
  231. ">"             SQL_PROC('>'   );
  232. "<"             SQL_PROC('<'   );
  233. ">="            SQL_PROC(TOK_GE);
  234. "<="            SQL_PROC(TOK_LE);
  235. (              SQL_PROC('('   );
  236. )              SQL_PROC(')'   );
  237. ,              SQL_PROC(','   );
  238. .              SQL_PROC('.'   );
  239. {NAME}          { SAVESTR(yytext,yylval.ltrp);
  240.                   SQL_PROC(TOK_IDENTIFIER);}
  241. {INT}           { /*  read decimal constant  */
  242.                   yylval.node=gen_const_node(SQLType_Int,yytext);
  243.                   SQL_PROC(TOK_INTEGER_CONST); }
  244. {EXACT}         { /*  read float constant  */
  245.                   yylval.node=gen_const_node(SQLType_Num,yytext);
  246.                   SQL_PROC(TOK_NUM_CONST); }
  247. {FLT}           {  /*  read float constant  */
  248.                   yylval.node=gen_const_node(SQLType_Real,yytext);
  249.                   SQL_PROC(TOK_REAL_CONST); }
  250. {FLT_ERR}       {  /*  read float constant with error in exponent */
  251.                   yyerror("Lex: error format for floating constant");
  252.                   sql_str(yytext,yyleng);
  253.                   sql_str("0",1);  /* recovery error as possible */
  254.                   {
  255.                     char *ptr=sql_str(NULL,0);
  256.                     yylval.node=gen_const_node(SQLType_Real,ptr);
  257.                   }
  258.                   SQL_PROC(TOK_REAL_CONST); }
  259. {WS}            /* do nothing */
  260. '              BEGIN(SQL_str);
  261. "              BEGIN(Identifier);
  262. "-"{2}          BEGIN(SQL_comment);  /* ? ? obsolete */
  263. n              line_num++;
  264. .               { 
  265.                   char strng[100];
  266.                   file_pos=line_num;
  267.   sprintf(strng,
  268.   "syntax error: unexpected char '%c'",
  269.   *yytext);
  270.                   yyerror(strng);
  271. }
  272.   /*********************************************
  273.    *             SQL string recognizer         *
  274.    *********************************************/
  275. <SQL_str>'{2}      sql_str("'",1);
  276. <SQL_str>n         {
  277.                       yyerror(" Unterminated SQL string ");
  278.                       line_num++;
  279.       BEGIN(INITIAL);
  280.                     }
  281. <SQL_str>[^'n]+   sql_str(yytext,yyleng);
  282. <SQL_str>'         {
  283.                       char *ptr=sql_str(NULL,0);
  284.                       BEGIN(INITIAL);
  285.                       yylval.node=gen_const_node(SQLType_Char,ptr);
  286.                       SQL_PROC(TOK_STRING_CONST); 
  287.     }
  288.   /*********************************************
  289.    *             SQL quoted identifiers        *
  290.    *********************************************/
  291. <Identifier>"{2}      sql_str(""",1);
  292. <Identifier>n         {
  293.                       yyerror(" Unterminated quoted identifier ");
  294.                       line_num++;
  295.       BEGIN(INITIAL);
  296.                     }
  297. <Identifier>[^"n]+   sql_str(yytext,yyleng);
  298. <Identifier>"         {
  299.                       BEGIN(INITIAL);
  300.       SAVESTR(sql_str(NULL,0),yylval.ltrp);
  301.       SQL_PROC(TOK_IDENTIFIER);
  302.     }
  303.   /*********************************************
  304.    *             SQL comment recognizer        *
  305.    *********************************************/
  306. <SQL_comment>.      /* do nothing */;
  307. <SQL_comment>n     { line_num++; BEGIN(INITIAL); }
  308. %%
  309. void
  310. restart_server_scanner(char *stmt,i4_t bline)
  311. {
  312.   yy_init=1;
  313.   line_num=bline;
  314.   bufstring=stmt;
  315. }