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