|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)parser3.c 3.7 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include "parser.h"
23:
24: /*
25: * =
26: * ? :
27: * ||
28: * &&
29: * |
30: * ^
31: * &
32: * == !=
33: * <= >=
34: * << >>
35: * + -
36: * * / %
37: * unary - + ~ !
38: */
39: p_expr(v, flag)
40: register struct value *v;
41: char flag;
42: {
43: struct value t;
44: int ret;
45:
46: if (p_expr0(&t, flag) < 0)
47: return -1;
48:
49: if (token != T_ASSIGN) {
50: *v = t;
51: return 0;
52: }
53: switch (t.v_type) {
54: case V_NUM:
55: p_error("%d: Not a variable.", t.v_num);
56: case V_ERR:
57: t.v_str = 0;
58: break;
59: }
60: ret = p_assign(t.v_str, v, flag);
61: if (t.v_str != 0)
62: str_free(t.v_str);
63: return ret;
64: }
65:
66: /*
67: * ? :
68: */
69: p_expr0(v, flag)
70: register struct value *v;
71: char flag;
72: {
73: struct value t;
74: char true;
75:
76: if (p_expr1(v, flag) < 0)
77: return -1;
78: if (token != T_QUEST)
79: return 0;
80: switch (v->v_type) {
81: case V_NUM:
82: true = v->v_num != 0;
83: break;
84: case V_STR:
85: p_error("?: Numeric left operand required.");
86: str_free(v->v_str);
87: v->v_type = V_ERR;
88: case V_ERR:
89: flag = 0;
90: break;
91: }
92: (void) s_gettok();
93: v->v_type = V_ERR;
94: if ((flag && true ? p_expr1(v, 1) : p_expr1(&t, 0)) < 0)
95: return -1;
96: if (token != T_COLON) {
97: val_free(*v);
98: p_synerror();
99: return -1;
100: }
101: (void) s_gettok();
102: return flag && !true ? p_expr1(v, 1) : p_expr1(&t, 0);
103: }
104:
105: /*
106: * ||
107: */
108: p_expr1(v, flag)
109: register struct value *v;
110: char flag;
111: {
112: char true = 0;
113:
114: if (p_expr2(v, flag) < 0)
115: return -1;
116: if (token != T_OROR)
117: return 0;
118: for (;;) {
119: switch (v->v_type) {
120: case V_NUM:
121: v->v_num = true = true || v->v_num != 0;
122: break;
123: case V_STR:
124: p_error("||: Numeric operands required.");
125: str_free(v->v_str);
126: v->v_type = V_ERR;
127: case V_ERR:
128: flag = 0;
129: break;
130: }
131: if (token != T_OROR)
132: return 0;
133: (void) s_gettok();
134: if (p_expr2(v, flag && !true) < 0)
135: return -1;
136: }
137: }
138:
139: /*
140: * &&
141: */
142: p_expr2(v, flag)
143: register struct value *v;
144: char flag;
145: {
146: char true = 1;
147:
148: if (p_expr3_10(3, v, flag) < 0)
149: return -1;
150: if (token != T_ANDAND)
151: return 0;
152: for (;;) {
153: switch (v->v_type) {
154: case V_NUM:
155: v->v_num = true = true && v->v_num != 0;
156: break;
157: case V_STR:
158: p_error("&&: Numeric operands required.");
159: str_free(v->v_str);
160: v->v_type = V_ERR;
161: case V_ERR:
162: flag = 0;
163: break;
164: }
165: if (token != T_ANDAND)
166: return 0;
167: (void) s_gettok();
168: if (p_expr3_10(3, v, flag && true) < 0)
169: return -1;
170: }
171: /*NOTREACHED*/
172: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.