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