[BACK]Return to quote.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / parse

Diff for /OpenXM_contrib2/asir2000/parse/quote.c between version 1.13 and 1.14

version 1.13, 2004/03/11 09:52:56 version 1.14, 2004/07/07 07:40:19
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.12 2004/03/10 05:27:03 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.13 2004/03/11 09:52:56 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 340  void vartoquote(V v,QUOTE *c)
Line 340  void vartoquote(V v,QUOTE *c)
                         }                          }
                         MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));                          MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
                 }                  }
           }
   }
   
   typedef enum {
           A_arg,A_arf,A_int,A_str,A_internal,A_node,A_notimpl,A_func,A_end
   } farg_type;
   
   typedef struct fid_spec {
           fid id;
           farg_type type[10];
   } *fid_spec_p;
   
   struct fid_spec fid_spec_tab[] = {
           {I_BOP,A_arf,A_arg,A_arg,A_end},
           {I_COP,A_int,A_arg,A_arg,A_end},
           {I_AND,A_arg,A_arg,A_end},
           {I_OR,A_arg,A_arg,A_end},
           {I_NOT,A_arg,A_end},
           {I_CE,A_arg,A_arg,A_end},
           {I_PRESELF,A_arf,A_arg,A_end},
           {I_POSTSELF,A_arf,A_arg,A_end},
           {I_FUNC,A_func,A_arg,A_end},
           {I_FUNC_OPT,A_func,A_arg,A_arg,A_end},
           {I_IFUNC,A_arg,A_arg,A_end},
           {I_MAP,A_func,A_arg,A_end},
           {I_RECMAP,A_func,A_arg,A_end},
           {I_PFDERIV,A_notimpl,A_end},
           {I_ANS,A_int,A_end},
           {I_PVAR,A_int,A_node,A_end},
           {I_ASSPVAR,A_arg,A_arg,A_end},
           {I_FORMULA,A_internal,A_end},
           {I_LIST,A_node,A_end},
           {I_STR,A_str,A_end},
           {I_NEWCOMP,A_int,A_end},
           {I_CAR,A_arg,A_end},
           {I_CDR,A_arg,A_end},
           {I_CAST,A_notimpl,A_end},
           {I_INDEX,A_arg,A_node,A_end},
           {I_EV,A_node,A_end},
           {I_TIMER,A_arg,A_arg,A_arg,A_end},
           {I_GF2NGEN,A_end},
           {I_GFPNGEN,A_end},
           {I_GFSNGEN,A_end},
           {I_LOP,A_int,A_arg,A_arg,A_end},
           {I_OPT,A_str,A_arg,A_end},
           {I_GETOPT,A_str,A_end},
           {I_POINT,A_arg,A_str,A_end},
           {I_PAREN,A_arg,A_end},
           {I_MINUS,A_arg,A_end},
           {I_NARYOP,A_notimpl,A_end}
   };
   
   #define N_FID_SPEC (sizeof(fid_spec_tab)/sizeof(struct fid_spec))
   
   void get_fid_spec(fid id,fid_spec_p *spec)
   {
           int i;
   
           for ( i = 0; i < N_FID_SPEC; i++ )
                   if ( fid_spec_tab[i].id == id ) {
                           *spec = &fid_spec_tab[i];
                           return;
                   }
           *spec = 0;
   }
   
   FNODE flatten_fnode(FNODE f,char *opname)
   {
           fid_spec_p spec;
           farg_type *type;
           fid id;
           FNODE f1,f2,r;
           int i;
   
           if ( !f ) return f;
           id = f->id;
           get_fid_spec(id,&spec);
           /* unknown fid */
           if ( !spec ) return f;
           if ( id == I_BOP && !strcmp(((ARF)FA0(f))->name,opname) ) {
                   f1 = (pointer)flatten_fnode(FA1(f),opname);
                   f2 = (pointer)flatten_fnode(FA2(f),opname);
                   if ( f1->id == I_BOP && !strcmp(((ARF)FA0(f1))->name,opname) ) {
                           /* [+ [+ A B] C] => [+ A [+ B C]] */
                           return mkfnode(3,I_BOP,(ARF)FA0(f),FA1(f1),
                                   mkfnode(3,I_BOP,(ARF)FA0(f),FA2(f1),f2));
                   } else
                           return mkfnode(3,I_BOP,(ARF)FA0(f),f1,f2);
           } else {
                   type = spec->type;
                   for ( i = 0; type[i] != A_end; i++ );
                   NEWFNODE(r,i); ID(r) = f->id;
                   for ( i = 0; type[i] != A_end; i++ ) {
                           if ( type[i] == A_arg )
                                   r->arg[i] = (pointer)flatten_fnode(f->arg[i],opname);
                           else
                                   r->arg[i] = f->arg[i];
                   }
                   return r;
         }          }
 }  }

Legend:
Removed from v.1.13  
changed lines
  Added in v.1.14

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>