118753Sedward /*
2*62461Sbostic * Copyright (c) 1983, 1993
3*62461Sbostic * The Regents of the University of California. All rights reserved.
433514Sbostic *
542954Sbostic * This code is derived from software contributed to Berkeley by
642954Sbostic * Edward Wang at The University of California, Berkeley.
742954Sbostic *
842835Sbostic * %sccs.include.redist.c%
918753Sedward */
1018753Sedward
1133514Sbostic #ifndef lint
12*62461Sbostic static char sccsid[] = "@(#)parser3.c 8.1 (Berkeley) 06/06/93";
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 */
p_expr(v,flag)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 */
p_expr0(v,flag)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 */
p_expr1(v,flag)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 */
p_expr2(v,flag)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