annotate calc64.c @ 27:c4e2ca100ab9 default tip

llvm worked
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 25 Oct 2024 17:10:11 +0900
parents aecd80408312
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
1 /*
6bf66c125dbc Initial revision
kono
parents:
diff changeset
2 Simple Calculator
6bf66c125dbc Initial revision
kono
parents:
diff changeset
3 $Id$
6bf66c125dbc Initial revision
kono
parents:
diff changeset
4 */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
5
6bf66c125dbc Initial revision
kono
parents:
diff changeset
6 #include <stdio.h>
6bf66c125dbc Initial revision
kono
parents:
diff changeset
7
6bf66c125dbc Initial revision
kono
parents:
diff changeset
8 char *ptr,*last_ptr;
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
9 long value,lvalue;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
10 long last_token;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
11 long variable[48];
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
12
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
13 static long expr();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
14 static long aexpr();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
15 static long mexpr();
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
16 static long term();
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
17
6bf66c125dbc Initial revision
kono
parents:
diff changeset
18
6bf66c125dbc Initial revision
kono
parents:
diff changeset
19 #define T_EQUAL (0x100|'=')
6bf66c125dbc Initial revision
kono
parents:
diff changeset
20 #define T_NEQUAL (0x100|'!')
6bf66c125dbc Initial revision
kono
parents:
diff changeset
21 #define T_LSHIFT (0x100|'<')
6bf66c125dbc Initial revision
kono
parents:
diff changeset
22 #define T_RSHIFT (0x100|'>')
6bf66c125dbc Initial revision
kono
parents:
diff changeset
23
6bf66c125dbc Initial revision
kono
parents:
diff changeset
24 static void
6bf66c125dbc Initial revision
kono
parents:
diff changeset
25 line_skip()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
26 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
27 while(*ptr++);
6bf66c125dbc Initial revision
kono
parents:
diff changeset
28 last_ptr = ptr;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
29 last_token = EOF;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
30 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
31
6bf66c125dbc Initial revision
kono
parents:
diff changeset
32 static void
6bf66c125dbc Initial revision
kono
parents:
diff changeset
33 error(description)
6bf66c125dbc Initial revision
kono
parents:
diff changeset
34 char *description;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
35 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
36 fprintf(stderr,"%s on %s\n",description,last_ptr);
6bf66c125dbc Initial revision
kono
parents:
diff changeset
37 line_skip();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
38 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
39
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
40 static long
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
41 token()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
42 {
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
43 long c,d;
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
44
6bf66c125dbc Initial revision
kono
parents:
diff changeset
45 last_ptr = ptr; /* for error position */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
46 c= *ptr;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
47 while(c<=' ' && c) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
48 c = *++ptr;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
49 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
50 if(!c) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
51 last_token = EOF;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
52 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
53 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
54 ptr++;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
55 if ('/'==c && ('/'== *ptr || '*'== *ptr)) { /* comment */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
56 line_skip();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
57 return EOF;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
58 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
59 if('1'<=c && c<='9') { /* Decimal */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
60 d = c-'0';
17
e5c8532ab38d fix for Mountain lion
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
61 while((c= *ptr++)) {
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
62 if('0'<=c && c<='9') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
63 d = d*10 + (c - '0');
6bf66c125dbc Initial revision
kono
parents:
diff changeset
64 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
65 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
66 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
67 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
68 c && ptr--;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
69 value = d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
70 last_token = '0';
6bf66c125dbc Initial revision
kono
parents:
diff changeset
71 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
72 } else if ('0'==c && 'x'== *ptr) { /* Hex */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
73 ptr++;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
74 d = 0;
17
e5c8532ab38d fix for Mountain lion
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
75 while((c= *ptr++)) {
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
76 if('0'<=c && c<='9') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
77 d = d*16 + (c - '0');
6bf66c125dbc Initial revision
kono
parents:
diff changeset
78 } else if('a'<=c && c<='f') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
79 d = d*16 + (c - 'a' + 10);
6bf66c125dbc Initial revision
kono
parents:
diff changeset
80 } else if('A'<=c && c<='F') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
81 d = d*16 + (c - 'a' + 10);
6bf66c125dbc Initial revision
kono
parents:
diff changeset
82 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
83 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
84 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
85 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
86 c && ptr--;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
87 value = d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
88 last_token = '0';
6bf66c125dbc Initial revision
kono
parents:
diff changeset
89 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
90 } else if ('0'==c) { /* Octal */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
91 d = c-'0';
17
e5c8532ab38d fix for Mountain lion
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
92 while((c= *ptr++)) {
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
93 if('0'<=c && c<='7') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
94 d = d*8 + (c - '0');
6bf66c125dbc Initial revision
kono
parents:
diff changeset
95 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
96 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
97 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
98 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
99 c && ptr--;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
100 value = d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
101 last_token = '0';
6bf66c125dbc Initial revision
kono
parents:
diff changeset
102 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
103 } else if ('\''==c) { /* Ascii */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
104 d = 0;
17
e5c8532ab38d fix for Mountain lion
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
105 while((c= *ptr++)) {
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
106 if('\''!=c && c<=0x7f) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
107 d = d*256 + c;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
108 } else if(c>=0x80 && *ptr) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
109 d = d*256*256 + c*256 + *ptr++;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
110 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
111 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
112 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
113 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
114 c && ptr--;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
115 value = d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
116 last_token = '0';
6bf66c125dbc Initial revision
kono
parents:
diff changeset
117 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
118 } else if (('a'<=c && c<='z') || /* variable */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
119 ('A'<=c && c<='Z')) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
120 value = ((c>'Z')?c-'a'+'Z'-'A'+1:c-'A');
6bf66c125dbc Initial revision
kono
parents:
diff changeset
121 last_token = 'v';
6bf66c125dbc Initial revision
kono
parents:
diff changeset
122 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
123 } else if ('='==c && '='== *ptr) { /* equal */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
124 ptr++;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
125 last_token = T_EQUAL;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
126 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
127 } else if ('!'==c && '='== *ptr) { /* equal */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
128 ptr++;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
129 last_token = T_NEQUAL;
17
e5c8532ab38d fix for Mountain lion
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
130 return last_token;
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
131 } else if ('<'==c && '<'== *ptr) { /* shift */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
132 ptr++;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
133 last_token = T_LSHIFT;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
134 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
135 } else if ('>'==c && '>'== *ptr) { /* shift */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
136 ptr++;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
137 last_token = T_RSHIFT;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
138 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
139 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
140 last_token = c;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
141 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
142 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
143 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
144
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
145 static long
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
146 expr()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
147 {
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
148 long d,assign;
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
149
6bf66c125dbc Initial revision
kono
parents:
diff changeset
150 d = aexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
151 assign = lvalue;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
152 while(last_token!=EOF) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
153 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
154 case '<':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
155 d = (d < aexpr());
6bf66c125dbc Initial revision
kono
parents:
diff changeset
156 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
157 case '>':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
158 d = (d > aexpr());
6bf66c125dbc Initial revision
kono
parents:
diff changeset
159 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
160 case T_EQUAL:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
161 d = (d == aexpr());
6bf66c125dbc Initial revision
kono
parents:
diff changeset
162 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
163 case T_NEQUAL:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
164 d = (d != aexpr());
6bf66c125dbc Initial revision
kono
parents:
diff changeset
165 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
166 case T_LSHIFT:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
167 d <<= aexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
168 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
169 case T_RSHIFT:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
170 d >>= aexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
171 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
172 case '?':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
173 {
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
174 long true;
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
175 true = expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
176 if(last_token != ':') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
177 error("? expression not terminated with :");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
178 return true;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
179 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
180 if(d) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
181 expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
182 return true;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
183 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
184 return expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
185 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
186 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
187 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
188 case '=':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
189 if(assign>=0) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
190 d = expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
191 variable[assign] = d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
192 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
193 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
194 error("Bad assignment");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
195 return 0;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
196 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
197 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
198 case ':':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
199 case ')':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
200 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
201 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
202 error("Bad expression");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
203 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
204 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
205 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
206 last_token = EOF;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
207 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
208 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
209
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
210 static long
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
211 aexpr()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
212 {
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
213 long d;
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
214
6bf66c125dbc Initial revision
kono
parents:
diff changeset
215 d = mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
216 while(last_token!=EOF) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
217 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
218 case '^':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
219 d ^= mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
220 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
221 case '|':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
222 d |= mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
223 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
224 case '&':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
225 d &= mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
226 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
227 case '-':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
228 d -= mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
229 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
230 case '+':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
231 d += mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
232 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
233 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
234 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
235 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
236 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
237 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
238 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
239
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
240 static long
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
241 mexpr()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
242 {
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
243 long d;
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
244
6bf66c125dbc Initial revision
kono
parents:
diff changeset
245 d = term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
246 while(last_token!=EOF) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
247 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
248 case '*':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
249 d *= term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
250 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
251 case '/':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
252 d /= term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
253 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
254 case '%':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
255 d %= term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
256 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
257 case '^':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
258 d ^= term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
259 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
260 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
261 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
262 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
263 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
264 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
265 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
266
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
267 static long term()
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
268 {
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
269 long d;
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
270
6bf66c125dbc Initial revision
kono
parents:
diff changeset
271 lvalue= -1;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
272 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
273 if(last_token==EOF) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
274 error("Term expected");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
275 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
276 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
277 case '0':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
278 d = value;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
279 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
280 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
281 case 'v':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
282 d = lvalue = value;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
283 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
284 return variable[d];
6bf66c125dbc Initial revision
kono
parents:
diff changeset
285 case '-':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
286 return - term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
287 case '!':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
288 return ! term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
289 case '(':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
290 d = expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
291 if(last_token != ')') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
292 error("Unbalanced parenthsis");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
293 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
294 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
295 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
296 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
297 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
298 error("Unknown term");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
299 return 0;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
300 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
301 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
302
6bf66c125dbc Initial revision
kono
parents:
diff changeset
303 int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
304 main(int ac,char *av[])
6bf66c125dbc Initial revision
kono
parents:
diff changeset
305 {
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
306 long d;
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
307 char buf[BUFSIZ];
6bf66c125dbc Initial revision
kono
parents:
diff changeset
308
6bf66c125dbc Initial revision
kono
parents:
diff changeset
309 while (fgets(buf,BUFSIZ,stdin)) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
310 ptr = buf;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
311 d = expr();
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
312 printf("%s = 0x%016lx = %ld\n",buf,d,d);
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
313 fflush(stdout);
6bf66c125dbc Initial revision
kono
parents:
diff changeset
314 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
315 return 0;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
316 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
317
6bf66c125dbc Initial revision
kono
parents:
diff changeset
318 /* end */