18
18
static Scanner * scan = 0 ;
19
19
20
20
typedef struct {
21
+ /* One of the EXPR_xxx values defined below. */
21
22
int op ;
23
+ /* op == EXPR_OP: value is the token specifying which operator.
24
+ *
25
+ * op == EXPR_VALUE && svalue == NULL: Numeric expression value.
26
+ *
27
+ * Otherwise unused.
28
+ */
22
29
long value ;
30
+ /* op == EXPR_VALUE: If non-NULL, string expression value; if NULL see value.
31
+ *
32
+ * Otherwise unused.
33
+ */
23
34
String * svalue ;
24
35
} exprval ;
25
36
26
37
#define EXPR_TOP 1
27
38
#define EXPR_VALUE 2
28
39
#define EXPR_OP 3
29
40
#define EXPR_GROUP 4
30
- #define EXPR_UMINUS 100
41
+
42
+ /* Special token value used here to distinguish from SWIG_TOKEN_MINUS
43
+ * (which we use here for a two argument minus).
44
+ */
45
+ #define OP_UMINUS 100
31
46
32
47
static exprval stack [256 ]; /* Parsing stack */
33
48
static int sp = 0 ; /* Stack pointer */
@@ -38,7 +53,7 @@ static const char *errmsg = 0; /* Parsing error */
38
53
/* Initialize the precedence table for various operators. Low values have higher precedence */
39
54
static void init_precedence () {
40
55
prec [SWIG_TOKEN_NOT ] = 10 ;
41
- prec [EXPR_UMINUS ] = 10 ;
56
+ prec [OP_UMINUS ] = 10 ;
42
57
prec [SWIG_TOKEN_STAR ] = 20 ;
43
58
prec [SWIG_TOKEN_SLASH ] = 20 ;
44
59
prec [SWIG_TOKEN_PERCENT ] = 20 ;
@@ -63,7 +78,7 @@ static void init_precedence() {
63
78
64
79
#define UNARY_OP (token ) (((token) == SWIG_TOKEN_NOT) || \
65
80
((token) == SWIG_TOKEN_LNOT) || \
66
- ((token) == EXPR_UMINUS ))
81
+ ((token) == OP_UMINUS ))
67
82
68
83
/* Reduce a single operator on the stack */
69
84
/* return 0 on failure, 1 on success */
@@ -183,7 +198,7 @@ static int reduce_op() {
183
198
stack [sp - 1 ].value = !stack [sp ].value ;
184
199
sp -- ;
185
200
break ;
186
- case EXPR_UMINUS :
201
+ case OP_UMINUS :
187
202
stack [sp - 1 ].value = - stack [sp ].value ;
188
203
sp -- ;
189
204
break ;
@@ -278,13 +293,15 @@ int Preprocessor_expr(DOH *s, int *error) {
278
293
279
294
/* Put initial state onto the stack */
280
295
stack [sp ].op = EXPR_TOP ;
281
- stack [sp ].value = 0 ;
282
296
283
297
while (1 ) {
284
298
/* Look at the top of the stack */
285
299
switch (stack [sp ].op ) {
286
300
case EXPR_TOP :
287
- /* An expression. Can be a number or another expression enclosed in parens */
301
+ /* EXPR_TOP is a place-holder which can only appear on the top of the
302
+ * stack. We can reduce it to any expression - a number, a string, an
303
+ * unary operator, or another expression enclosed in parentheses.
304
+ */
288
305
token = expr_token (scan );
289
306
if (!token ) {
290
307
errmsg = "Expected an expression" ;
@@ -296,26 +313,27 @@ int Preprocessor_expr(DOH *s, int *error) {
296
313
char * c = Char (Scanner_text (scan ));
297
314
stack [sp ].value = (long ) strtol (c , 0 , 0 );
298
315
stack [sp ].svalue = 0 ;
299
- /* stack[sp].value = (long) atol(Char(Scanner_text(scan))); */
300
316
stack [sp ].op = EXPR_VALUE ;
301
317
} else if (token == SWIG_TOKEN_PLUS ) {
302
318
} else if ((token == SWIG_TOKEN_MINUS ) || (token == SWIG_TOKEN_LNOT ) || (token == SWIG_TOKEN_NOT )) {
303
319
if (token == SWIG_TOKEN_MINUS )
304
- token = EXPR_UMINUS ;
320
+ token = OP_UMINUS ;
305
321
stack [sp ].value = token ;
306
- stack [sp ++ ].op = EXPR_OP ;
322
+ stack [sp ].op = EXPR_OP ;
323
+ sp ++ ;
307
324
stack [sp ].op = EXPR_TOP ;
308
- stack [sp ].svalue = 0 ;
309
325
} else if (token == SWIG_TOKEN_LPAREN ) {
310
- stack [sp ++ ].op = EXPR_GROUP ;
326
+ stack [sp ].op = EXPR_GROUP ;
327
+ sp ++ ;
311
328
stack [sp ].op = EXPR_TOP ;
312
- stack [sp ].value = 0 ;
313
- stack [sp ].svalue = 0 ;
314
329
} else if (token == SWIG_TOKEN_ENDLINE ) {
315
330
} else if (token == SWIG_TOKEN_STRING ) {
316
331
stack [sp ].svalue = NewString (Scanner_text (scan ));
317
332
stack [sp ].op = EXPR_VALUE ;
318
333
} else if (token == SWIG_TOKEN_ID ) {
334
+ /* Defined macros have been expanded already so this is an unknown
335
+ * macro, which gets treated as zero.
336
+ */
319
337
stack [sp ].value = 0 ;
320
338
stack [sp ].svalue = 0 ;
321
339
stack [sp ].op = EXPR_VALUE ;
@@ -327,7 +345,9 @@ int Preprocessor_expr(DOH *s, int *error) {
327
345
goto syntax_error ;
328
346
break ;
329
347
case EXPR_VALUE :
330
- /* A value is on the stack. We may reduce or evaluate depending on what the next token is */
348
+ /* A value is on top of the stack. We may reduce or evaluate depending
349
+ * on what the next token is.
350
+ */
331
351
token = expr_token (scan );
332
352
if (!token ) {
333
353
/* End of input. Might have to reduce if an operator is on stack */
@@ -371,7 +391,6 @@ int Preprocessor_expr(DOH *s, int *error) {
371
391
stack [sp ].value = token ;
372
392
sp ++ ;
373
393
stack [sp ].op = EXPR_TOP ;
374
- stack [sp ].value = 0 ;
375
394
} else {
376
395
if (stack [sp - 1 ].op != EXPR_OP )
377
396
goto syntax_error_expected_operator ;
@@ -390,7 +409,6 @@ int Preprocessor_expr(DOH *s, int *error) {
390
409
stack [sp ].value = token ;
391
410
sp ++ ;
392
411
stack [sp ].op = EXPR_TOP ;
393
- stack [sp ].value = 0 ;
394
412
}
395
413
break ;
396
414
case SWIG_TOKEN_RPAREN :
0 commit comments