[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.15 and 1.25

version 1.15, 2004/07/08 02:58:19 version 1.25, 2005/09/30 02:20:06
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.14 2004/07/07 07:40:19 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.24 2005/09/28 08:40:31 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 6 
Line 6 
 void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
           objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 14  void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 16  void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
           objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 22  void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 26  void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
           objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 30  void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 36  void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
           objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 38  void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 46  void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)  void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
         if ( !b || OID(b) != O_QUOTE )          objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
                 error("pwrquote : invalid argument");  
         fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));          fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
Line 48  void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
Line 56  void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 void chsgnquote(QUOTE a,QUOTE *c)  void chsgnquote(QUOTE a,QUOTE *c)
 {  {
         FNODE fn;          FNODE fn;
           QUOTE t;
   
         fn = mkfnode(3,I_BOP,subfs,0,BDY(a));          objtoquote((Obj)a,&t); a = t;
           fn = mkfnode(1,I_MINUS,BDY(a));
         MKQUOTE(*c,fn);          MKQUOTE(*c,fn);
 }  }
   
Line 318  void vartoquote(V v,QUOTE *c)
Line 328  void vartoquote(V v,QUOTE *c)
                         if ( x && OID(x)==O_P && !NEXT(DC(x))                          if ( x && OID(x)==O_P && !NEXT(DC(x))
                                 && UNIQ(DEG(DC(x))) && UNIQ(COEF(DC(x))) ) {                                  && UNIQ(DEG(DC(x))) && UNIQ(COEF(DC(x))) ) {
                                 /* use a as is */                                  /* use a as is */
                                 u = a;  
                         } else {                          } else {
                                 /* a => (a) */                                  /* a => (a) */
                                 MKQUOTE(u,mkfnode(1,I_PAREN,BDY(a)));                                  MKQUOTE(u,mkfnode(1,I_PAREN,BDY(a))); a = u;
                         }                          }
                         objtoquote(ad[1].arg,&b);                          objtoquote(ad[1].arg,&b);
                         pwrquote(CO,u,b,c);                          pwrquote(CO,a,b,c);
                 } else {                  } else {
                         for ( i = 0; i < pf->argc; i++ )                          for ( i = 0; i < pf->argc; i++ )
                                 if ( ad[i].d )                                  if ( ad[i].d )
Line 343  void vartoquote(V v,QUOTE *c)
Line 352  void vartoquote(V v,QUOTE *c)
         }          }
 }  }
   
 typedef enum {  /*
         A_arg,A_arf,A_int,A_str,A_internal,A_node,A_notimpl,A_func,A_end   * A_arf : arithmetic function
 } farg_type;   * A_int : machine integer
    * A_fnode : FNODE
    * A_node : NODE with FNODE bodies
    * A_internal : internal object
    * A_str : string
    * A_end : terminal
    * A_func : FUNC
    * A_notimpl : not implemented
    */
   
 typedef struct fid_spec {  
         fid id;  
         farg_type type[10];  
 } *fid_spec_p;  
   
 struct fid_spec fid_spec_tab[] = {  struct fid_spec fid_spec_tab[] = {
         {I_BOP,A_arf,A_arg,A_arg,A_end},          {I_BOP,A_arf,A_fnode,A_fnode,A_end},
         {I_COP,A_int,A_arg,A_arg,A_end},          {I_COP,A_int,A_fnode,A_fnode,A_end},
         {I_AND,A_arg,A_arg,A_end},          {I_AND,A_fnode,A_fnode,A_end},
         {I_OR,A_arg,A_arg,A_end},          {I_OR,A_fnode,A_fnode,A_end},
         {I_NOT,A_arg,A_end},          {I_NOT,A_fnode,A_end},
         {I_CE,A_arg,A_arg,A_end},          {I_CE,A_fnode,A_fnode,A_end},
         {I_PRESELF,A_arf,A_arg,A_end},          {I_PRESELF,A_arf,A_fnode,A_end},
         {I_POSTSELF,A_arf,A_arg,A_end},          {I_POSTSELF,A_arf,A_fnode,A_end},
         {I_FUNC,A_func,A_arg,A_end},          {I_FUNC,A_func,A_fnode,A_end},
         {I_FUNC_OPT,A_func,A_arg,A_arg,A_end},          {I_FUNC_OPT,A_func,A_fnode,A_fnode,A_end},
         {I_IFUNC,A_arg,A_arg,A_end},          {I_IFUNC,A_fnode,A_fnode,A_end},
         {I_MAP,A_func,A_arg,A_end},          {I_MAP,A_func,A_fnode,A_end},
         {I_RECMAP,A_func,A_arg,A_end},          {I_RECMAP,A_func,A_fnode,A_end},
         {I_PFDERIV,A_notimpl,A_end},          {I_PFDERIV,A_notimpl,A_end},
         {I_ANS,A_int,A_end},          {I_ANS,A_int,A_end},
         {I_PVAR,A_int,A_node,A_end},          {I_PVAR,A_int,A_node,A_end},
         {I_ASSPVAR,A_arg,A_arg,A_end},          {I_ASSPVAR,A_fnode,A_fnode,A_end},
         {I_FORMULA,A_internal,A_end},          {I_FORMULA,A_internal,A_end},
         {I_LIST,A_node,A_end},          {I_LIST,A_node,A_end},
         {I_STR,A_str,A_end},          {I_STR,A_str,A_end},
         {I_NEWCOMP,A_int,A_end},          {I_NEWCOMP,A_int,A_end},
         {I_CAR,A_arg,A_end},          {I_CAR,A_fnode,A_end},
         {I_CDR,A_arg,A_end},          {I_CDR,A_fnode,A_end},
         {I_CAST,A_notimpl,A_end},          {I_CAST,A_notimpl,A_end},
         {I_INDEX,A_arg,A_node,A_end},          {I_INDEX,A_fnode,A_node,A_end},
         {I_EV,A_node,A_end},          {I_EV,A_node,A_end},
         {I_TIMER,A_arg,A_arg,A_arg,A_end},          {I_TIMER,A_fnode,A_fnode,A_fnode,A_end},
         {I_GF2NGEN,A_end},          {I_GF2NGEN,A_end},
         {I_GFPNGEN,A_end},          {I_GFPNGEN,A_end},
         {I_GFSNGEN,A_end},          {I_GFSNGEN,A_end},
         {I_LOP,A_int,A_arg,A_arg,A_end},          {I_LOP,A_int,A_fnode,A_fnode,A_end},
         {I_OPT,A_str,A_arg,A_end},          {I_OPT,A_str,A_fnode,A_end},
         {I_GETOPT,A_str,A_end},          {I_GETOPT,A_str,A_end},
         {I_POINT,A_arg,A_str,A_end},          {I_POINT,A_fnode,A_str,A_end},
         {I_PAREN,A_arg,A_end},          {I_PAREN,A_fnode,A_end},
         {I_MINUS,A_arg,A_end},          {I_MINUS,A_fnode,A_end},
         {I_NARYOP,A_notimpl,A_end}          {I_NARYOP,A_arf,A_node,A_end},
           {I_CONS,A_node,A_fnode,A_end}
 };  };
   
 #define N_FID_SPEC (sizeof(fid_spec_tab)/sizeof(struct fid_spec))  #define N_FID_SPEC (sizeof(fid_spec_tab)/sizeof(struct fid_spec))
Line 414  FNODE strip_paren(FNODE f)
Line 427  FNODE strip_paren(FNODE f)
         }          }
 }  }
   
   NODE flatten_fnodenode(NODE n,char *opname);
   FNODE flatten_fnode(FNODE f,char *opname);
   
   NODE flatten_fnodenode(NODE n,char *opname)
   {
           NODE r0,r,t;
   
           r0 = 0;
           for ( t = n; t; t = NEXT(t) ) {
                   NEXTNODE(r0,r);
                   BDY(r) = (pointer)flatten_fnode((FNODE)BDY(t),opname);
           }
           if ( r0 ) NEXT(r) = 0;
           return r0;
   }
   
 FNODE flatten_fnode(FNODE f,char *opname)  FNODE flatten_fnode(FNODE f,char *opname)
 {  {
         fid_spec_p spec;          fid_spec_p spec;
Line 433  FNODE flatten_fnode(FNODE f,char *opname)
Line 462  FNODE flatten_fnode(FNODE f,char *opname)
                 f2 = (pointer)flatten_fnode(FA2(f),opname);                  f2 = (pointer)flatten_fnode(FA2(f),opname);
                 f2 = strip_paren(f2);                  f2 = strip_paren(f2);
                 if ( f1->id == I_BOP && !strcmp(((ARF)FA0(f1))->name,opname) ) {                  if ( f1->id == I_BOP && !strcmp(((ARF)FA0(f1))->name,opname) ) {
                         /* [+ [+ A B] C] => [+ A [+ B C]] */                          /* [op [op A B] C] => [op A [op B C]] */
                         return mkfnode(3,I_BOP,(ARF)FA0(f),FA1(f1),                          f2 = flatten_fnode(mkfnode(3,I_BOP,(ARF)FA0(f),FA2(f1),f2),opname);
                                 mkfnode(3,I_BOP,(ARF)FA0(f),FA2(f1),f2));                          return mkfnode(3,I_BOP,(ARF)FA0(f),FA1(f1),f2);
                 } else                  } else
                         return mkfnode(3,I_BOP,(ARF)FA0(f),f1,f2);                          return mkfnode(3,I_BOP,(ARF)FA0(f),f1,f2);
         } else {          } else {
Line 443  FNODE flatten_fnode(FNODE f,char *opname)
Line 472  FNODE flatten_fnode(FNODE f,char *opname)
                 for ( i = 0; type[i] != A_end; i++ );                  for ( i = 0; type[i] != A_end; i++ );
                 NEWFNODE(r,i); ID(r) = f->id;                  NEWFNODE(r,i); ID(r) = f->id;
                 for ( i = 0; type[i] != A_end; i++ ) {                  for ( i = 0; type[i] != A_end; i++ ) {
                         if ( type[i] == A_arg )                          if ( type[i] == A_fnode )
                                 r->arg[i] = (pointer)flatten_fnode(f->arg[i],opname);                                  r->arg[i] = (pointer)flatten_fnode(f->arg[i],opname);
                           else if ( type[i] == A_node )
                                   r->arg[i] = (pointer)flatten_fnodenode(f->arg[i],opname);
                         else                          else
                                 r->arg[i] = f->arg[i];                                  r->arg[i] = f->arg[i];
                 }                  }
                 return r;                  return r;
         }          }
   }
   
   /* comparison of QUOTE */
   
   int compquote(VL vl,QUOTE q1,QUOTE q2)
   {
           return compfnode(BDY(q1),BDY(q2));
   }
   
   /* comparison of QUOTEARG */
   /* XXX : executes a non-sense comparison for bodies */
   
   int compqa(VL vl,QUOTEARG q1,QUOTEARG q2)
   {
           if ( !q1 ) return q2?-1:0;
           else if ( !q2 ) return 1;
           else if ( OID(q1) > OID(q2) ) return 1;
           else if ( OID(q1) < OID(q2) ) return -1;
           else if ( q1->type > q2->type ) return 1;
           else if ( q1->type < q2->type ) return -1;
           else switch ( q1->type ) {
                   case A_func:
                           return strcmp(((FUNC)q1->body)->name,((FUNC)q2->body)->name);
                   case A_arf:
                           return strcmp(((ARF)q1->body)->name,((ARF)q2->body)->name);
                   default:
                           if ( (unsigned)q1->body  > (unsigned)q2->body ) return 1;
                           else if ( (unsigned)q1->body  < (unsigned)q2->body ) return -1;
                           else return 0;
           }
   }
   
   int compfnode(FNODE f1,FNODE f2)
   {
           fid_spec_p spec;
           int t,s1,s2,i;
           NODE n1,n2;
   
           if ( !f1 ) return f2 ? -1 : 1;
           else if ( !f2 ) return 1;
       else if ( f1->id > f2->id ) return 1;
           else if ( f1->id < f2->id ) return -1;
           spec = fid_spec_tab+f1->id;
           for ( i = 0; spec->type[i] != A_end; i++ ) {
                   switch ( spec->type[i] ) {
                           case A_fnode:
                                   t = compfnode((FNODE)f1->arg[i],(FNODE)f2->arg[i]);
                                   if ( t ) return t;
                                   break;
                           case A_int:
                                   s1 = (int)f1->arg[i];
                                   s2 = (int)f2->arg[i];
                                   if ( s1 > s2 ) return 1;
                                   else if ( s1 < s2 ) return -1;
                                   break;
                           case A_str:
                                   t = strcmp((char *)f1->arg[i],(char *)f2->arg[i]);
                                   if ( t ) return t;
                                   break;
                           case A_internal:
                                   t = arf_comp(CO,(Obj)f1->arg[i],(Obj)f2->arg[i]);
                                   if ( t ) return t;
                                   break;
                           case A_node:
                                   n1 = (NODE)f1->arg[i];
                                   n2 = (NODE)f2->arg[i];
                                   for ( ; n1 && n2; n1 = NEXT(n1), n2 = NEXT(n2) ) {
                                           t = compfnode(BDY(n1),BDY(n2));
                                           if ( t ) return t;
                                   }
                                   if ( n1 ) return 1;
                                   else if ( n2 ) return -1;
                                   break;
                           case A_arf:
                                    t = strcmp(((ARF)f1->arg[i])->name,((ARF)f2->arg[i])->name);
                                   if ( t ) return t;
                                   break;
                           case A_func:
                                    t = strcmp(((FUNC)f1->arg[i])->name,((FUNC)f2->arg[i])->name);
                                   if ( t ) return t;
                                   break;
                           case A_notimpl:
                           default:
                                   error("compfnode : not implemented");
                                   break;
                   }
           }
           return 0;
 }  }

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.25

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