00001 # include "parm.h"
00002
00003 # include "stree/ststructs.mh"
00004
00005 # include "sigs.h"
00006
00007 extern int indx_ValueOf;
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 NODE * coerce(p)
00027 NODE * p;
00028 {
00029 register NODE * nappl;
00030
00031 if(p -> signature == ERR_SIG) return(p);
00032
00033 if (p -> kind == BLOCKDENOTATION) {
00034 (void) replace_last(p -> bld_den_seq, coerce(last(p -> bld_den_seq)));
00035 chgfld(&(p -> signature), NIL);
00036 p -> sig_done = SIG_UNKNOWN;
00037 return(p);
00038 } else if (p -> kind == USELIST) {
00039 (void) replace_last(p -> usl_den_seq, coerce(last(p -> usl_den_seq)));
00040 chgfld(&(p -> signature), NIL);
00041 p -> sig_done = SIG_UNKNOWN;
00042 return(p);
00043 }
00044
00045 switch(p -> signature -> kind) {
00046 case VALSIGNATURE:
00047 return(p);
00048 break;
00049
00050 case VARSIGNATURE:
00051 {
00052 NODE * nop;
00053
00054 nop = mknode(LETTERID, indx_ValueOf);
00055 initfld(&(nop -> sel_type), p -> signature -> var_denotation);
00056 nop -> id_def_found = TRUE;
00057 nappl = mknode(APPLICATION, nop, mklist(p, -1));
00058 nappl -> vlineno = nop -> vlineno = p -> vlineno;
00059 nappl -> pre_num = nop -> pre_num = p -> pre_num;
00060 nappl -> post_num = nop -> post_num = p -> post_num;
00061 return(nappl);
00062 }
00063 break;
00064
00065 case FUNCSIGNATURE:
00066 if(length(p->signature->fsig_param_list) == 0) {
00067 nappl = mknode(APPLICATION, p, emptylist());
00068 nappl -> vlineno = p -> vlineno;
00069 nappl -> pre_num = p -> pre_num;
00070 nappl -> post_num = p -> post_num;
00071 return(nappl);
00072 } else {
00073
00074 return(p);
00075 }
00076 break;
00077
00078 default:
00079
00080 return(p);
00081 }
00082 }