115851Sedward #ifndef lint 2*16713Sedward static char sccsid[] = "@(#)parser3.c 3.4 07/13/84"; 315851Sedward #endif 415851Sedward 515851Sedward #include "parser.h" 615851Sedward 715851Sedward /* 815851Sedward * = 915851Sedward * ? : 1015851Sedward * || 1115851Sedward * && 1215851Sedward * | 1315851Sedward * ^ 1415851Sedward * & 1515851Sedward * == != 1615851Sedward * <= >= 1715851Sedward * << >> 1815851Sedward * + - 1915851Sedward * * / % 2015851Sedward * unary - + ~ ! 2115851Sedward */ 2215851Sedward p_expr(v, flag) 2315851Sedward register struct value *v; 2415851Sedward char flag; 2515851Sedward { 2615851Sedward struct value t; 2715851Sedward int ret; 2815851Sedward 2915851Sedward if (p_expr0(&t, flag) < 0) 3015851Sedward return -1; 3115851Sedward 3215851Sedward if (token != T_ASSIGN) { 3315851Sedward *v = t; 3415851Sedward return 0; 3515851Sedward } 3615851Sedward switch (t.v_type) { 3716449Sedward case V_NUM: 3816449Sedward p_error("%d: Not a variable.", t.v_num); 3915851Sedward case V_ERR: 4015851Sedward t.v_str = 0; 4115851Sedward break; 4215851Sedward } 4315851Sedward ret = p_assign(t.v_str, v, flag); 4415851Sedward if (t.v_str != 0) 4515851Sedward str_free(t.v_str); 4615851Sedward return ret; 4715851Sedward } 4815851Sedward 4915851Sedward /* 5015851Sedward * ? : 5115851Sedward */ 5215851Sedward p_expr0(v, flag) 5315851Sedward register struct value *v; 5415851Sedward char flag; 5515851Sedward { 5615851Sedward struct value t; 5715851Sedward char true; 5815851Sedward 5915851Sedward if (p_expr1(v, flag) < 0) 6015851Sedward return -1; 6115851Sedward if (token != T_QUEST) 6215851Sedward return 0; 6315851Sedward switch (v->v_type) { 6415851Sedward case V_NUM: 6515851Sedward true = v->v_num != 0; 6615851Sedward break; 6715851Sedward case V_STR: 68*16713Sedward p_error("?: Numeric left operand required."); 6915851Sedward str_free(v->v_str); 7015851Sedward v->v_type = V_ERR; 7115851Sedward case V_ERR: 7215851Sedward flag = 0; 7315851Sedward break; 7415851Sedward } 7515851Sedward (void) s_gettok(); 7615851Sedward v->v_type = V_ERR; 7715851Sedward if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0) 7815851Sedward return -1; 7915851Sedward if (token != T_COLON) { 8015851Sedward val_free(*v); 8115851Sedward p_synerror(); 8215851Sedward return -1; 8315851Sedward } 8415851Sedward (void) s_gettok(); 8515851Sedward return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0); 8615851Sedward } 8715851Sedward 8815851Sedward /* 8915851Sedward * || 9015851Sedward */ 9115851Sedward p_expr1(v, flag) 9215851Sedward register struct value *v; 9315851Sedward char flag; 9415851Sedward { 9515851Sedward char true = 0; 9615851Sedward 9715851Sedward if (p_expr2(v, flag) < 0) 9815851Sedward return -1; 9915851Sedward if (token != T_OROR) 10015851Sedward return 0; 10115851Sedward for (;;) { 10215851Sedward switch (v->v_type) { 10315851Sedward case V_NUM: 10415851Sedward v->v_num = true = true || v->v_num != 0; 10515851Sedward break; 10615851Sedward case V_STR: 107*16713Sedward p_error("||: Numeric operands required."); 10815851Sedward str_free(v->v_str); 10915851Sedward v->v_type = V_ERR; 11015851Sedward case V_ERR: 11115851Sedward flag = 0; 11215851Sedward break; 11315851Sedward } 11415851Sedward if (token != T_OROR) 11515851Sedward return 0; 11615851Sedward (void) s_gettok(); 11715851Sedward if (p_expr2(v, flag && !true) < 0) 11815851Sedward return -1; 11915851Sedward } 12015851Sedward } 12115851Sedward 12215851Sedward /* 12315851Sedward * && 12415851Sedward */ 12515851Sedward p_expr2(v, flag) 12615851Sedward register struct value *v; 12715851Sedward char flag; 12815851Sedward { 12915851Sedward char true = 1; 13015851Sedward 13115851Sedward if (p_expr3_10(3, v, flag) < 0) 13215851Sedward return -1; 13315851Sedward if (token != T_ANDAND) 13415851Sedward return 0; 13515851Sedward for (;;) { 13615851Sedward switch (v->v_type) { 13715851Sedward case V_NUM: 13815851Sedward v->v_num = true = true && v->v_num != 0; 13915851Sedward break; 14015851Sedward case V_STR: 141*16713Sedward p_error("&&: Numeric operands required."); 14215851Sedward str_free(v->v_str); 14315851Sedward v->v_type = V_ERR; 14415851Sedward case V_ERR: 14515851Sedward flag = 0; 14615851Sedward break; 14715851Sedward } 14815851Sedward if (token != T_ANDAND) 14915851Sedward return 0; 15015851Sedward (void) s_gettok(); 15115851Sedward if (p_expr3_10(3, v, flag && true) < 0) 15215851Sedward return -1; 15315851Sedward } 15415851Sedward /*NOTREACHED*/ 15515851Sedward } 156