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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  tree_gen.c  - tree library for GNU SQL precompiler
  3.  *                Generation tree ( part of parsing )
  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: tree_gen.c,v 1.246 1997/03/31 11:02:20 kml Exp $ */
  29. #include "tree_gen.h"
  30. #include "type_lib.h"
  31. #include <string.h>
  32. #include <assert.h>
  33. void
  34. set_location (TXTREF n, YYLTYPE p)
  35. {
  36.   LOCATION_TRN (n) = p.first_line;
  37. }
  38. TXTREF
  39. join_list (TXTREF lst, TXTREF e)
  40. {
  41.   register TXTREF n = lst;
  42.   if (n == TNULL)
  43.     return e;
  44.   while (RIGHT_TRN (n))
  45.     n = RIGHT_TRN (n);
  46.   RIGHT_TRN (n) = e;
  47.   return lst;
  48. }
  49. TXTREF
  50. get_param (LTRLREF l, i4_t disableadd, YYLTYPE p)
  51. {
  52.   register TXTREF n;
  53.   register i4_t   msk=0;
  54.   n = find_info (PARAMETER, l);
  55.   if (n)
  56.     return n;
  57.   if (disableadd)
  58.     {
  59.       char xx[80];
  60.       errno = 0;
  61.       file_pos = p.first_line;
  62.       strcpy (xx, "error :Unexpected parameter name "");
  63.       strcat (xx, STRING (l));
  64.       strcat (xx, """);
  65.       yyerror (xx);
  66.       for (n = LOCAL_VCB_ROOT; n; n = RIGHT_TRN (n))
  67.         {
  68.           debug_trn (n);
  69.           fprintf (STDERR, "n");
  70.         }
  71. #if 0
  72.       return TNULL;
  73. #else
  74.       SetF(msk,PSEUDO_F);
  75. #endif
  76.     }
  77.   n = gen_node1 (PARAMETER,msk);
  78.   PAR_NAME (n) = l;
  79.   add_info (n);
  80.   return n;
  81. }
  82. TXTREF
  83. get_parm_node (LTRLREF l, YYLTYPE p, i4_t disableadd)
  84. {
  85.   register TXTREF n, prm = get_param (l, disableadd, p);
  86.   n = gen_object (PARMPTR, p);
  87.   OBJ_DESC (n) = prm;
  88.   return n;
  89. }
  90. TXTREF
  91. get_ind (TXTREF n, TXTREF n1, YYLTYPE p)
  92. {
  93.   assert(!TstF_TRN(n1,INDICATOR_F));
  94.   assert(!TstF_TRN(n,INDICATOR_F));
  95.   SetF_TRN(n1,INDICATOR_F);
  96.   PAR_TTYPE(n1) = pack_type(SQLType_Int,10,0);
  97.   PAR_INDICATOR(n) = n1;
  98.   return get_parm_node(PAR_NAME(n),p,0);
  99. }
  100. TXTREF
  101. gen_column (TN * scn, LTRLREF l, YYLTYPE p)
  102. {
  103.   register TXTREF i, v;
  104.   i = gen_node (COLPTR);
  105.   set_location (i, p);
  106.   v = gen_node (COLUMN_HOLE);
  107.   if (scn)
  108.     {
  109.       CHOLE_AUTHOR (v) = scn->a;
  110.       CHOLE_TNAME (v) = scn->n;
  111.     }
  112.   CHOLE_CNAME (v) = l;
  113.   OBJ_DESC (i) = v;
  114.   return i;
  115. }
  116. TXTREF
  117. gen_colptr (VCBREF col)
  118. {
  119.   register TXTREF i;
  120.   i = gen_node (COLPTR);
  121.   OBJ_DESC (i) = col;
  122.   return i;
  123. }
  124. TXTREF
  125. gen_func (enum token code, YYLTYPE p, TXTREF obj, i4_t set_dist)
  126. {
  127.   register TXTREF t;
  128.   t = gen_node (code);
  129.   set_location (t, p);
  130.   FUNC_OBJ (t) = obj;
  131.   ARITY_TRN (t) = (obj == TNULL) ? 0 : 1;
  132.   if (set_dist)
  133.     SetF_TRN (t, DISTINCT_F);
  134.   if (code == COUNT)
  135.     OPRN_TYPE (t) = pack_type (SQLType_Int, 10, 0);
  136.   return t;
  137. }
  138. TXTREF
  139. gen_oper (enum token code, TXTREF l, TXTREF r, YYLTYPE p)
  140. {
  141.   if (code == DIV || code == SUB)       /* non assotiative operation */
  142.     {
  143.       register TXTREF c = gen_object (code, p);
  144.       ARITY_TRN (c) = 2;
  145.       RIGHT_TRN (l) = r;
  146.       DOWN_TRN (c) = l;
  147.       return c;
  148.     }
  149.   else
  150.     {
  151.       if (CODE_TRN (l) == code && CODE_TRN (r) == code)
  152.         {
  153.           register TXTREF c = DOWN_TRN (l);
  154.           while (RIGHT_TRN (c))
  155.             c = RIGHT_TRN (c);
  156.           RIGHT_TRN (c) = DOWN_TRN (r);
  157.           ARITY_TRN (l) += ARITY_TRN (r);
  158.           free_node (r);
  159.           return l;
  160.         }
  161.       else if (CODE_TRN (l) == code)
  162.         {
  163.           register TXTREF c = DOWN_TRN (l);
  164.           while (RIGHT_TRN (c))
  165.             c = RIGHT_TRN (c);
  166.           RIGHT_TRN (c) = r;
  167.           ARITY_TRN (l)++;
  168.           return l;
  169.         }
  170.       else if (CODE_TRN (r) == code)
  171.         {
  172.           RIGHT_TRN (l) = DOWN_TRN (r);
  173.           DOWN_TRN (r) = l;
  174.           ARITY_TRN (r)++;
  175.           return r;
  176.         }
  177.       else
  178.         {
  179.           register TXTREF c = gen_object (code, p);
  180.           ARITY_TRN (c) = 2;
  181.           RIGHT_TRN (l) = r;
  182.           DOWN_TRN (c) = l;
  183.           return c;
  184.         }
  185.     }
  186. }
  187. TXTREF
  188. gen_parent (enum token code, TXTREF list)
  189. {
  190.   register TXTREF p = gen_node (code), c;
  191.   register i4_t ar;
  192.   for (ar = 0, c = list; c; c = RIGHT_TRN (c))
  193.     ar++;
  194.   DOWN_TRN (p) = list;
  195.   ARITY_TRN (p) = ar;
  196.   return p;
  197. }
  198. TXTREF
  199. gen_up_node (enum token code, TXTREF child, YYLTYPE p)
  200. {
  201.   register TXTREF u = gen_node (code), c;
  202.   register i4_t ar;
  203.   set_location (u, p);
  204.   for (ar = 0, c = child; c; c = RIGHT_TRN (c))
  205.     ar++;
  206.   DOWN_TRN (u) = child;
  207.   ARITY_TRN (u) = ar;
  208.   return u;
  209. }
  210. TXTREF
  211. gen_object (enum token code, YYLTYPE p)
  212. {
  213.   register TXTREF n = gen_node (code);
  214.   set_location (n, p);
  215.   return n;
  216. }
  217. TXTREF
  218. gen_scanptr (TXTREF tbl, LTRLREF nm, YYLTYPE p)
  219. {
  220.   register TXTREF s = gen_node (SCAN);
  221.   register TXTREF t = gen_object (TBLPTR, p);
  222.   COR_TBL (s) = tbl;
  223.   add_info (s);
  224.   if (nm)
  225.     COR_NAME (s) = nm;
  226.   else
  227.     {
  228.       char str[100];
  229.       sprintf(str,"scan_%s_%s_%d",STRING(TBL_FNAME(tbl)),
  230.               STRING(TBL_NAME(tbl)),COR_NO(s));
  231.       COR_NAME(s) = ltr_rec(str);
  232.     }
  233.   TABL_DESC (t) = s;
  234.   return t;
  235. }
  236. TXTREF
  237. coltar_column (TXTREF cc)
  238. {
  239.   YYLTYPE a;
  240.   register TXTREF c = cc;
  241.   if (CODE_TRN (c) == VALUEHOLE)
  242.     {
  243.       a.first_line = 0;
  244.       c = gen_column (NULL, HOLE_NAME (c), a);
  245.       LOCATION_TRN (c) = LOCATION_TRN (cc);
  246.       free_node (cc);
  247.     }
  248.   if (CODE_TRN(c) != COLPTR)
  249.     {
  250.       YYLTYPE l;
  251.       l.first_line = file_pos = LOCATION_TRN(c);
  252.       yyerror("syntax error - must be column or parameter here");
  253.       free_tree(c);
  254.       c = get_parm_node(ltr_rec("Error_node_name"),l,0);
  255.     }
  256.   return c;
  257. }
  258. /*--------------------------------------------------*
  259. *                  common function                   *
  260. *--------------------------------------------------*/
  261. TXTREF
  262. last_parameter (TXTREF parent)
  263. {
  264.   register TXTREF c = DOWN_TRN (parent), c1;
  265.   if (c == TNULL)
  266.     return TNULL;
  267.   while ((c1 = RIGHT_TRN (c)) != TNULL)
  268.     c = c1;
  269.   return c;
  270. }
  271. void
  272. add_child (TXTREF parent, TXTREF child)
  273. {
  274.   register TXTREF l;
  275.   if (child == 0)
  276.     return;
  277.   l = last_parameter (parent);
  278.   if (l)
  279.     RIGHT_TRN (l) = child;
  280.   else
  281.     DOWN_TRN (parent) = child;
  282.   if (RIGHT_TRN (child) != TNULL)
  283.     RIGHT_TRN (child) = TNULL;
  284.   ARITY_TRN (parent)++;
  285. }