118753Sedward /* 2*33514Sbostic * Copyright (c) 1983 Regents of the University of California. 3*33514Sbostic * All rights reserved. 4*33514Sbostic * 5*33514Sbostic * Redistribution and use in source and binary forms are permitted 6*33514Sbostic * provided that this notice is preserved and that due credit is given 7*33514Sbostic * to the University of California at Berkeley. The name of the University 8*33514Sbostic * may not be used to endorse or promote products derived from this 9*33514Sbostic * software without specific prior written permission. This software 10*33514Sbostic * is provided ``as is'' without express or implied warranty. 1118753Sedward */ 1218753Sedward 13*33514Sbostic #ifndef lint 14*33514Sbostic static char sccsid[] = "@(#)parser3.c 3.6 (Berkeley) 02/21/88"; 15*33514Sbostic #endif /* not lint */ 16*33514Sbostic 1715851Sedward #include "parser.h" 1815851Sedward 1915851Sedward /* 2015851Sedward * = 2115851Sedward * ? : 2215851Sedward * || 2315851Sedward * && 2415851Sedward * | 2515851Sedward * ^ 2615851Sedward * & 2715851Sedward * == != 2815851Sedward * <= >= 2915851Sedward * << >> 3015851Sedward * + - 3115851Sedward * * / % 3215851Sedward * unary - + ~ ! 3315851Sedward */ 3415851Sedward p_expr(v, flag) 3515851Sedward register struct value *v; 3615851Sedward char flag; 3715851Sedward { 3815851Sedward struct value t; 3915851Sedward int ret; 4015851Sedward 4115851Sedward if (p_expr0(&t, flag) < 0) 4215851Sedward return -1; 4315851Sedward 4415851Sedward if (token != T_ASSIGN) { 4515851Sedward *v = t; 4615851Sedward return 0; 4715851Sedward } 4815851Sedward switch (t.v_type) { 4916449Sedward case V_NUM: 5016449Sedward p_error("%d: Not a variable.", t.v_num); 5115851Sedward case V_ERR: 5215851Sedward t.v_str = 0; 5315851Sedward break; 5415851Sedward } 5515851Sedward ret = p_assign(t.v_str, v, flag); 5615851Sedward if (t.v_str != 0) 5715851Sedward str_free(t.v_str); 5815851Sedward return ret; 5915851Sedward } 6015851Sedward 6115851Sedward /* 6215851Sedward * ? : 6315851Sedward */ 6415851Sedward p_expr0(v, flag) 6515851Sedward register struct value *v; 6615851Sedward char flag; 6715851Sedward { 6815851Sedward struct value t; 6915851Sedward char true; 7015851Sedward 7115851Sedward if (p_expr1(v, flag) < 0) 7215851Sedward return -1; 7315851Sedward if (token != T_QUEST) 7415851Sedward return 0; 7515851Sedward switch (v->v_type) { 7615851Sedward case V_NUM: 7715851Sedward true = v->v_num != 0; 7815851Sedward break; 7915851Sedward case V_STR: 8016713Sedward p_error("?: Numeric left operand required."); 8115851Sedward str_free(v->v_str); 8215851Sedward v->v_type = V_ERR; 8315851Sedward case V_ERR: 8415851Sedward flag = 0; 8515851Sedward break; 8615851Sedward } 8715851Sedward (void) s_gettok(); 8815851Sedward v->v_type = V_ERR; 8915851Sedward if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0) 9015851Sedward return -1; 9115851Sedward if (token != T_COLON) { 9215851Sedward val_free(*v); 9315851Sedward p_synerror(); 9415851Sedward return -1; 9515851Sedward } 9615851Sedward (void) s_gettok(); 9715851Sedward return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0); 9815851Sedward } 9915851Sedward 10015851Sedward /* 10115851Sedward * || 10215851Sedward */ 10315851Sedward p_expr1(v, flag) 10415851Sedward register struct value *v; 10515851Sedward char flag; 10615851Sedward { 10715851Sedward char true = 0; 10815851Sedward 10915851Sedward if (p_expr2(v, flag) < 0) 11015851Sedward return -1; 11115851Sedward if (token != T_OROR) 11215851Sedward return 0; 11315851Sedward for (;;) { 11415851Sedward switch (v->v_type) { 11515851Sedward case V_NUM: 11615851Sedward v->v_num = true = true || v->v_num != 0; 11715851Sedward break; 11815851Sedward case V_STR: 11916713Sedward p_error("||: Numeric operands required."); 12015851Sedward str_free(v->v_str); 12115851Sedward v->v_type = V_ERR; 12215851Sedward case V_ERR: 12315851Sedward flag = 0; 12415851Sedward break; 12515851Sedward } 12615851Sedward if (token != T_OROR) 12715851Sedward return 0; 12815851Sedward (void) s_gettok(); 12915851Sedward if (p_expr2(v, flag && !true) < 0) 13015851Sedward return -1; 13115851Sedward } 13215851Sedward } 13315851Sedward 13415851Sedward /* 13515851Sedward * && 13615851Sedward */ 13715851Sedward p_expr2(v, flag) 13815851Sedward register struct value *v; 13915851Sedward char flag; 14015851Sedward { 14115851Sedward char true = 1; 14215851Sedward 14315851Sedward if (p_expr3_10(3, v, flag) < 0) 14415851Sedward return -1; 14515851Sedward if (token != T_ANDAND) 14615851Sedward return 0; 14715851Sedward for (;;) { 14815851Sedward switch (v->v_type) { 14915851Sedward case V_NUM: 15015851Sedward v->v_num = true = true && v->v_num != 0; 15115851Sedward break; 15215851Sedward case V_STR: 15316713Sedward p_error("&&: Numeric operands required."); 15415851Sedward str_free(v->v_str); 15515851Sedward v->v_type = V_ERR; 15615851Sedward case V_ERR: 15715851Sedward flag = 0; 15815851Sedward break; 15915851Sedward } 16015851Sedward if (token != T_ANDAND) 16115851Sedward return 0; 16215851Sedward (void) s_gettok(); 16315851Sedward if (p_expr3_10(3, v, flag && true) < 0) 16415851Sedward return -1; 16515851Sedward } 16615851Sedward /*NOTREACHED*/ 16715851Sedward } 168