118753Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42835Sbostic * %sccs.include.redist.c% 618753Sedward */ 718753Sedward 833514Sbostic #ifndef lint 9*42835Sbostic static char sccsid[] = "@(#)parser3.c 3.8 (Berkeley) 06/02/90"; 1033514Sbostic #endif /* not lint */ 1133514Sbostic 1215851Sedward #include "parser.h" 1315851Sedward 1415851Sedward /* 1515851Sedward * = 1615851Sedward * ? : 1715851Sedward * || 1815851Sedward * && 1915851Sedward * | 2015851Sedward * ^ 2115851Sedward * & 2215851Sedward * == != 2315851Sedward * <= >= 2415851Sedward * << >> 2515851Sedward * + - 2615851Sedward * * / % 2715851Sedward * unary - + ~ ! 2815851Sedward */ 2915851Sedward p_expr(v, flag) 3015851Sedward register struct value *v; 3115851Sedward char flag; 3215851Sedward { 3315851Sedward struct value t; 3415851Sedward int ret; 3515851Sedward 3615851Sedward if (p_expr0(&t, flag) < 0) 3715851Sedward return -1; 3815851Sedward 3915851Sedward if (token != T_ASSIGN) { 4015851Sedward *v = t; 4115851Sedward return 0; 4215851Sedward } 4315851Sedward switch (t.v_type) { 4416449Sedward case V_NUM: 4516449Sedward p_error("%d: Not a variable.", t.v_num); 4615851Sedward case V_ERR: 4715851Sedward t.v_str = 0; 4815851Sedward break; 4915851Sedward } 5015851Sedward ret = p_assign(t.v_str, v, flag); 5115851Sedward if (t.v_str != 0) 5215851Sedward str_free(t.v_str); 5315851Sedward return ret; 5415851Sedward } 5515851Sedward 5615851Sedward /* 5715851Sedward * ? : 5815851Sedward */ 5915851Sedward p_expr0(v, flag) 6015851Sedward register struct value *v; 6115851Sedward char flag; 6215851Sedward { 6315851Sedward struct value t; 6415851Sedward char true; 6515851Sedward 6615851Sedward if (p_expr1(v, flag) < 0) 6715851Sedward return -1; 6815851Sedward if (token != T_QUEST) 6915851Sedward return 0; 7015851Sedward switch (v->v_type) { 7115851Sedward case V_NUM: 7215851Sedward true = v->v_num != 0; 7315851Sedward break; 7415851Sedward case V_STR: 7516713Sedward p_error("?: Numeric left operand required."); 7615851Sedward str_free(v->v_str); 7715851Sedward v->v_type = V_ERR; 7815851Sedward case V_ERR: 7915851Sedward flag = 0; 8015851Sedward break; 8115851Sedward } 8215851Sedward (void) s_gettok(); 8315851Sedward v->v_type = V_ERR; 8415851Sedward if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0) 8515851Sedward return -1; 8615851Sedward if (token != T_COLON) { 8715851Sedward val_free(*v); 8815851Sedward p_synerror(); 8915851Sedward return -1; 9015851Sedward } 9115851Sedward (void) s_gettok(); 9215851Sedward return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0); 9315851Sedward } 9415851Sedward 9515851Sedward /* 9615851Sedward * || 9715851Sedward */ 9815851Sedward p_expr1(v, flag) 9915851Sedward register struct value *v; 10015851Sedward char flag; 10115851Sedward { 10215851Sedward char true = 0; 10315851Sedward 10415851Sedward if (p_expr2(v, flag) < 0) 10515851Sedward return -1; 10615851Sedward if (token != T_OROR) 10715851Sedward return 0; 10815851Sedward for (;;) { 10915851Sedward switch (v->v_type) { 11015851Sedward case V_NUM: 11115851Sedward v->v_num = true = true || v->v_num != 0; 11215851Sedward break; 11315851Sedward case V_STR: 11416713Sedward p_error("||: Numeric operands required."); 11515851Sedward str_free(v->v_str); 11615851Sedward v->v_type = V_ERR; 11715851Sedward case V_ERR: 11815851Sedward flag = 0; 11915851Sedward break; 12015851Sedward } 12115851Sedward if (token != T_OROR) 12215851Sedward return 0; 12315851Sedward (void) s_gettok(); 12415851Sedward if (p_expr2(v, flag && !true) < 0) 12515851Sedward return -1; 12615851Sedward } 12715851Sedward } 12815851Sedward 12915851Sedward /* 13015851Sedward * && 13115851Sedward */ 13215851Sedward p_expr2(v, flag) 13315851Sedward register struct value *v; 13415851Sedward char flag; 13515851Sedward { 13615851Sedward char true = 1; 13715851Sedward 13815851Sedward if (p_expr3_10(3, v, flag) < 0) 13915851Sedward return -1; 14015851Sedward if (token != T_ANDAND) 14115851Sedward return 0; 14215851Sedward for (;;) { 14315851Sedward switch (v->v_type) { 14415851Sedward case V_NUM: 14515851Sedward v->v_num = true = true && v->v_num != 0; 14615851Sedward break; 14715851Sedward case V_STR: 14816713Sedward p_error("&&: Numeric operands required."); 14915851Sedward str_free(v->v_str); 15015851Sedward v->v_type = V_ERR; 15115851Sedward case V_ERR: 15215851Sedward flag = 0; 15315851Sedward break; 15415851Sedward } 15515851Sedward if (token != T_ANDAND) 15615851Sedward return 0; 15715851Sedward (void) s_gettok(); 15815851Sedward if (p_expr3_10(3, v, flag && true) < 0) 15915851Sedward return -1; 16015851Sedward } 16115851Sedward /*NOTREACHED*/ 16215851Sedward } 163