1*15851Sedward #ifndef lint 2*15851Sedward static char *sccsid = "@(#)parser3.c 3.1 84/01/12"; 3*15851Sedward #endif 4*15851Sedward 5*15851Sedward #include "parser.h" 6*15851Sedward 7*15851Sedward /* 8*15851Sedward * = 9*15851Sedward * ? : 10*15851Sedward * || 11*15851Sedward * && 12*15851Sedward * | 13*15851Sedward * ^ 14*15851Sedward * & 15*15851Sedward * == != 16*15851Sedward * <= >= 17*15851Sedward * << >> 18*15851Sedward * + - 19*15851Sedward * * / % 20*15851Sedward * unary - + ~ ! 21*15851Sedward */ 22*15851Sedward p_expr(v, flag) 23*15851Sedward register struct value *v; 24*15851Sedward char flag; 25*15851Sedward { 26*15851Sedward struct value t; 27*15851Sedward int ret; 28*15851Sedward 29*15851Sedward #ifdef DEBUG 30*15851Sedward error("expr: %d.", flag); 31*15851Sedward #endif 32*15851Sedward if (p_expr0(&t, flag) < 0) 33*15851Sedward return -1; 34*15851Sedward 35*15851Sedward if (token != T_ASSIGN) { 36*15851Sedward *v = t; 37*15851Sedward return 0; 38*15851Sedward } 39*15851Sedward switch (t.v_type) { 40*15851Sedward case V_ERR: 41*15851Sedward t.v_str = 0; 42*15851Sedward break; 43*15851Sedward case V_NUM: 44*15851Sedward if ((t.v_str = str_itoa(t.v_num)) == 0) { 45*15851Sedward p_memerror(); 46*15851Sedward return -1; 47*15851Sedward } 48*15851Sedward } 49*15851Sedward ret = p_assign(t.v_str, v, flag); 50*15851Sedward if (t.v_str != 0) 51*15851Sedward str_free(t.v_str); 52*15851Sedward return ret; 53*15851Sedward } 54*15851Sedward 55*15851Sedward /* 56*15851Sedward * ? : 57*15851Sedward */ 58*15851Sedward p_expr0(v, flag) 59*15851Sedward register struct value *v; 60*15851Sedward char flag; 61*15851Sedward { 62*15851Sedward struct value t; 63*15851Sedward char true; 64*15851Sedward 65*15851Sedward if (p_expr1(v, flag) < 0) 66*15851Sedward return -1; 67*15851Sedward if (token != T_QUEST) 68*15851Sedward return 0; 69*15851Sedward switch (v->v_type) { 70*15851Sedward case V_NUM: 71*15851Sedward true = v->v_num != 0; 72*15851Sedward break; 73*15851Sedward case V_STR: 74*15851Sedward p_error("Numeric value required for ?."); 75*15851Sedward str_free(v->v_str); 76*15851Sedward v->v_type = V_ERR; 77*15851Sedward case V_ERR: 78*15851Sedward flag = 0; 79*15851Sedward break; 80*15851Sedward } 81*15851Sedward (void) s_gettok(); 82*15851Sedward v->v_type = V_ERR; 83*15851Sedward if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0) 84*15851Sedward return -1; 85*15851Sedward if (token != T_COLON) { 86*15851Sedward val_free(*v); 87*15851Sedward p_synerror(); 88*15851Sedward return -1; 89*15851Sedward } 90*15851Sedward (void) s_gettok(); 91*15851Sedward return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0); 92*15851Sedward } 93*15851Sedward 94*15851Sedward /* 95*15851Sedward * || 96*15851Sedward */ 97*15851Sedward p_expr1(v, flag) 98*15851Sedward register struct value *v; 99*15851Sedward char flag; 100*15851Sedward { 101*15851Sedward char true = 0; 102*15851Sedward 103*15851Sedward if (p_expr2(v, flag) < 0) 104*15851Sedward return -1; 105*15851Sedward if (token != T_OROR) 106*15851Sedward return 0; 107*15851Sedward for (;;) { 108*15851Sedward switch (v->v_type) { 109*15851Sedward case V_NUM: 110*15851Sedward v->v_num = true = true || v->v_num != 0; 111*15851Sedward break; 112*15851Sedward case V_STR: 113*15851Sedward p_error("Numeric value required for ||."); 114*15851Sedward str_free(v->v_str); 115*15851Sedward v->v_type = V_ERR; 116*15851Sedward case V_ERR: 117*15851Sedward flag = 0; 118*15851Sedward break; 119*15851Sedward } 120*15851Sedward if (token != T_OROR) 121*15851Sedward return 0; 122*15851Sedward (void) s_gettok(); 123*15851Sedward if (p_expr2(v, flag && !true) < 0) 124*15851Sedward return -1; 125*15851Sedward } 126*15851Sedward } 127*15851Sedward 128*15851Sedward /* 129*15851Sedward * && 130*15851Sedward */ 131*15851Sedward p_expr2(v, flag) 132*15851Sedward register struct value *v; 133*15851Sedward char flag; 134*15851Sedward { 135*15851Sedward char true = 1; 136*15851Sedward 137*15851Sedward if (p_expr3_10(3, v, flag) < 0) 138*15851Sedward return -1; 139*15851Sedward if (token != T_ANDAND) 140*15851Sedward return 0; 141*15851Sedward for (;;) { 142*15851Sedward switch (v->v_type) { 143*15851Sedward case V_NUM: 144*15851Sedward v->v_num = true = true && v->v_num != 0; 145*15851Sedward break; 146*15851Sedward case V_STR: 147*15851Sedward p_error("Numeric value required for &&."); 148*15851Sedward str_free(v->v_str); 149*15851Sedward v->v_type = V_ERR; 150*15851Sedward case V_ERR: 151*15851Sedward flag = 0; 152*15851Sedward break; 153*15851Sedward } 154*15851Sedward if (token != T_ANDAND) 155*15851Sedward return 0; 156*15851Sedward (void) s_gettok(); 157*15851Sedward if (p_expr3_10(3, v, flag && true) < 0) 158*15851Sedward return -1; 159*15851Sedward } 160*15851Sedward /*NOTREACHED*/ 161*15851Sedward } 162