00001 # include "parm.h"
00002
00003 # include "stree/ststructs.mh"
00004
00005 # include "precedence.h"
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 NODE ** outermost_op(h, t)
00037 NODE **h, **t;
00038 {
00039 NODE ** op;
00040 int lowest_prec;
00041
00042
00043
00044
00045 { int i;
00046 NODE ** p;
00047
00048 lowest_prec = INFINITE;
00049 for (p = h; p != t+1; p++) {
00050 i = precedence(*p);
00051 if ( i < lowest_prec )
00052 lowest_prec = i;
00053 }
00054 }
00055
00056
00057 switch ( lowest_prec ) {
00058 case INFINITE:
00059
00060 { NODE ** p;
00061 boolean has_left_arg,
00062 has_right_arg;
00063 int len;
00064
00065 op = NIL;
00066 for (p = h; p != t+1; p++) {
00067 if ( !is_list(*p) )
00068 op = p;
00069 }
00070 if ( op == NIL ) {
00071
00072 break;
00073 }
00074
00075 len = t - h + 1;
00076 has_left_arg = ( op == h ? FALSE : is_list(*h) );
00077 has_right_arg = ( op == t ? FALSE : is_list(*t) );
00078 if ( !( has_left_arg && has_right_arg && len == 3
00079 || !has_left_arg && has_right_arg && len == 2
00080 || has_left_arg && !has_right_arg && len == 2
00081 ) ) {
00082
00083 op = NIL;
00084 break;
00085 }
00086 }
00087 break;
00088
00089 case EXPLEVEL:
00090 case ASGNLEVEL:
00091 case DEREFLEVEL:
00092
00093 { NODE ** p;
00094
00095 for (p = h;;p++)
00096 if ( precedence(*p) == lowest_prec ) {
00097 op = p;
00098 break;
00099 }
00100 }
00101 break;
00102
00103 default:
00104
00105 { NODE ** p;
00106 boolean in_seq;
00107
00108 in_seq = FALSE;
00109 for (p = h; p != t+1; p++) {
00110 if ( precedence(*p) == lowest_prec ) {
00111 if ( !in_seq )
00112 op = p;
00113 } else
00114 in_seq = FALSE;
00115 }
00116 }
00117 }
00118
00119 return ( op );
00120
00121 }