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