@@ -110,7 +110,7 @@ private BigInteger evalOneChildAst(AstNode exprAst) {
110110 if ("bool" .equals (nodeType )) {
111111 return evalBool (exprAst .getTokenValue ());
112112 }
113- return evalToInt (exprAst .getChild ( 0 )); //@todo deprecated getChild
113+ return evalToInt (exprAst .getFirstChild ( ));
114114 }
115115
116116 private BigInteger evalComplexAst (AstNode exprAst ) {
@@ -176,33 +176,45 @@ BigInteger evalCharacter(String charValue) {
176176 return "'\0 '" .equals (charValue ) ? BigInteger .ZERO : BigInteger .ONE ;
177177 }
178178
179+ AstNode getNextOperand (AstNode node ) {
180+ if ( node != null ) {
181+ node = node .getNextSibling ();
182+ if ( node != null ) {
183+ node = node .getNextSibling ();
184+ }
185+ }
186+ return node ;
187+ }
188+
179189 // ////////////// logical expressions ///////////////////////////
180190 BigInteger evalLogicalOrExpression (AstNode exprAst ) {
181- int noChildren = exprAst .getNumberOfChildren ();
182- boolean result = eval (exprAst . getChild ( 0 )); //@todo deprecated getChild
183- for ( int i = 2 ; i < noChildren && result != true ; i += 2 ) {
184- AstNode operand = exprAst . getChild ( i ); //@todo deprecated getChild
191+ AstNode operand = exprAst .getFirstChild ();
192+ boolean result = eval (operand );
193+
194+ while (( result != true ) && (( operand = getNextOperand ( operand )) != null )) {
185195 result = result || eval (operand );
186196 }
187197
188198 return result ? BigInteger .ONE : BigInteger .ZERO ;
189199 }
190200
191201 BigInteger evalLogicalAndExpression (AstNode exprAst ) {
192- int noChildren = exprAst .getNumberOfChildren ();
193- boolean result = eval (exprAst . getChild ( 0 )); //@todo deprecated getChild
194- for ( int i = 2 ; i < noChildren && result != false ; i += 2 ) {
195- AstNode operand = exprAst . getChild ( i ); //@todo deprecated getChild
202+ AstNode operand = exprAst .getFirstChild ();
203+ boolean result = eval (operand );
204+
205+ while (( result != false ) && (( operand = getNextOperand ( operand )) != null )) {
196206 result = result && eval (operand );
197207 }
198208
199209 return result ? BigInteger .ONE : BigInteger .ZERO ;
200210 }
201211
202212 BigInteger evalEqualityExpression (AstNode exprAst ) {
203- String operator = exprAst .getChild (1 ).getTokenValue (); //@todo deprecated getChild
204- AstNode lhs = exprAst .getChild (0 ); //@todo deprecated getChild
205- AstNode rhs = exprAst .getChild (2 ); //@todo deprecated getChild
213+ AstNode lhs = exprAst .getFirstChild ();
214+ AstNode op = lhs .getNextSibling ();
215+ AstNode rhs = op .getNextSibling ();
216+ String operator = op .getTokenValue ();
217+
206218 boolean result ;
207219 if ("==" .equals (operator )) {
208220 result = evalToInt (lhs ).compareTo (evalToInt (rhs )) == 0 ;
@@ -212,10 +224,9 @@ BigInteger evalEqualityExpression(AstNode exprAst) {
212224 throw new EvaluationException ("Unknown equality operator '" + operator + "'" );
213225 }
214226
215- int noChildren = exprAst .getNumberOfChildren ();
216- for (int i = 4 ; i < noChildren ; i += 2 ) {
217- operator = exprAst .getChild (i - 1 ).getTokenValue (); //@todo deprecated getChild
218- rhs = exprAst .getChild (i ); //@todo deprecated getChild
227+ while ((op = rhs .getNextSibling ()) != null ) {
228+ operator = op .getTokenValue ();
229+ rhs = op .getNextSibling ();
219230 if ("==" .equals (operator )) {
220231 result = result == eval (rhs );
221232 } else if ("!=" .equals (operator )) {
@@ -229,9 +240,11 @@ BigInteger evalEqualityExpression(AstNode exprAst) {
229240 }
230241
231242 BigInteger evalRelationalExpression (AstNode exprAst ) {
232- String operator = exprAst .getChild (1 ).getTokenValue (); //@todo deprecated getChild
233- AstNode lhs = exprAst .getChild (0 ); //@todo deprecated getChild
234- AstNode rhs = exprAst .getChild (2 ); //@todo deprecated getChild
243+ AstNode lhs = exprAst .getFirstChild ();
244+ AstNode op = lhs .getNextSibling ();
245+ AstNode rhs = op .getNextSibling ();
246+ String operator = op .getTokenValue ();
247+
235248 boolean result ;
236249 if ("<" .equals (operator )) {
237250 result = evalToInt (lhs ).compareTo (evalToInt (rhs )) < 0 ;
@@ -246,10 +259,9 @@ BigInteger evalRelationalExpression(AstNode exprAst) {
246259 }
247260
248261 BigInteger resultAsInt ;
249- int noChildren = exprAst .getNumberOfChildren ();
250- for (int i = 4 ; i < noChildren ; i += 2 ) {
251- operator = exprAst .getChild (i - 1 ).getTokenValue (); //@todo deprecated getChild
252- rhs = exprAst .getChild (i ); //@todo deprecated getChild
262+ while ((op = rhs .getNextSibling ()) != null ) {
263+ operator = op .getTokenValue ();
264+ rhs = op .getNextSibling ();
253265
254266 resultAsInt = result ? BigInteger .ONE : BigInteger .ZERO ;
255267 if ("<" .equals (operator )) {
@@ -270,32 +282,32 @@ BigInteger evalRelationalExpression(AstNode exprAst) {
270282
271283 // ///////////////// bitwise expressions ///////////////////////
272284 BigInteger evalAndExpression (AstNode exprAst ) {
273- int noChildren = exprAst .getNumberOfChildren ();
274- BigInteger result = evalToInt (exprAst . getChild ( 0 )); //@todo deprecated getChild
275- for ( int i = 2 ; i < noChildren ; i += 2 ) {
276- AstNode operand = exprAst . getChild ( i ); //@todo deprecated getChild
285+ AstNode operand = exprAst .getFirstChild ();
286+ BigInteger result = evalToInt (operand );
287+
288+ while (( operand = getNextOperand ( operand )) != null ) {
277289 result = result .and (evalToInt (operand ));
278290 }
279291
280292 return result ;
281293 }
282294
283295 BigInteger evalInclusiveOrExpression (AstNode exprAst ) {
284- int noChildren = exprAst .getNumberOfChildren ();
285- BigInteger result = evalToInt (exprAst . getChild ( 0 )); //@todo deprecated getChild
286- for ( int i = 2 ; i < noChildren ; i += 2 ) {
287- AstNode operand = exprAst . getChild ( i ); //@todo deprecated getChild
296+ AstNode operand = exprAst .getFirstChild ();
297+ BigInteger result = evalToInt (operand );
298+
299+ while (( operand = getNextOperand ( operand )) != null ) {
288300 result = result .or (evalToInt (operand ));
289301 }
290302
291303 return result ;
292304 }
293305
294306 BigInteger evalExclusiveOrExpression (AstNode exprAst ) {
295- int noChildren = exprAst .getNumberOfChildren ();
296- BigInteger result = evalToInt (exprAst . getChild ( 0 )); //@todo deprecated getChild
297- for ( int i = 2 ; i < noChildren ; i += 2 ) {
298- AstNode operand = exprAst . getChild ( i ); //@todo deprecated getChild
307+ AstNode operand = exprAst .getFirstChild ();
308+ BigInteger result = evalToInt (operand );
309+
310+ while (( operand = getNextOperand ( operand )) != null ) {
299311 result = result .xor (evalToInt (operand ));
300312 }
301313
@@ -306,8 +318,10 @@ BigInteger evalExclusiveOrExpression(AstNode exprAst) {
306318 BigInteger evalUnaryExpression (AstNode exprAst ) {
307319 // only 'unary-operator cast-expression' production is allowed in #if-context
308320
309- String operator = exprAst .getChild (0 ).getTokenValue (); //@todo deprecated getChild
310- AstNode operand = exprAst .getChild (1 ); //@todo deprecated getChild
321+ AstNode op = exprAst .getFirstChild ();
322+ AstNode operand = op .getNextSibling ();
323+ String operator = op .getTokenValue ();
324+
311325 if ("+" .equals (operator )) {
312326 return evalToInt (operand );
313327 } else if ("-" .equals (operator )) {
@@ -324,17 +338,15 @@ BigInteger evalUnaryExpression(AstNode exprAst) {
324338 }
325339
326340 BigInteger evalShiftExpression (AstNode exprAst ) {
327- String operator ;
328- AstNode rhs ;
329- BigInteger result = evalToInt (exprAst .getChild (0 )); //@todo deprecated getChild
330- int noChildren = exprAst .getNumberOfChildren ();
341+ AstNode rhs = exprAst .getFirstChild ();
342+ AstNode op ;
343+ BigInteger result = evalToInt (rhs );
331344
332- for ( int i = 2 ; i < noChildren ; i += 2 ) {
333- operator = exprAst . getChild ( i - 1 ). getTokenValue (); //@todo deprecated getChild
334- rhs = exprAst . getChild ( i ); //@todo deprecated getChild
345+ while (( op = rhs . getNextSibling ()) != null ) {
346+ String operator = op . getTokenValue ();
347+ rhs = op . getNextSibling ();
335348
336349 if ("<<" .equals (operator )) {
337- //todo: limit to UINT64_MAX?
338350 result = result .shiftLeft (evalToInt (rhs ).intValue ()).and (UINT64_MAX );
339351 } else if (">>" .equals (operator )) {
340352 result = result .shiftRight (evalToInt (rhs ).intValue ());
@@ -347,14 +359,13 @@ BigInteger evalShiftExpression(AstNode exprAst) {
347359 }
348360
349361 BigInteger evalAdditiveExpression (AstNode exprAst ) {
350- String operator ;
351- AstNode rhs ;
352- BigInteger result = evalToInt (exprAst .getChild (0 )); //@todo deprecated getChild
353- int noChildren = exprAst .getNumberOfChildren ();
362+ AstNode rhs = exprAst .getFirstChild ();
363+ AstNode op ;
364+ BigInteger result = evalToInt (rhs );
354365
355- for ( int i = 2 ; i < noChildren ; i += 2 ) {
356- operator = exprAst . getChild ( i - 1 ). getTokenValue (); //@todo deprecated getChild
357- rhs = exprAst . getChild ( i ); //@todo deprecated getChild
366+ while (( op = rhs . getNextSibling ()) != null ) {
367+ String operator = op . getTokenValue ();
368+ rhs = op . getNextSibling ();
358369
359370 if ("+" .equals (operator )) {
360371 result = result .add (evalToInt (rhs ));
@@ -369,14 +380,13 @@ BigInteger evalAdditiveExpression(AstNode exprAst) {
369380 }
370381
371382 BigInteger evalMultiplicativeExpression (AstNode exprAst ) {
372- String operator ;
373- AstNode rhs ;
374- BigInteger result = evalToInt (exprAst .getChild (0 )); //@todo deprecated getChild
375- int noChildren = exprAst .getNumberOfChildren ();
383+ AstNode rhs = exprAst .getFirstChild ();
384+ AstNode op ;
385+ BigInteger result = evalToInt (rhs );
376386
377- for ( int i = 2 ; i < noChildren ; i += 2 ) {
378- operator = exprAst . getChild ( i - 1 ). getTokenValue (); //@todo deprecated getChild
379- rhs = exprAst . getChild ( i ); //@todo deprecated getChild
387+ while (( op = rhs . getNextSibling ()) != null ) {
388+ String operator = op . getTokenValue ();
389+ rhs = op . getNextSibling ();
380390
381391 if ("*" .equals (operator )) {
382392 result = result .multiply (evalToInt (rhs ));
@@ -394,35 +404,44 @@ BigInteger evalMultiplicativeExpression(AstNode exprAst) {
394404
395405 BigInteger evalConditionalExpression (AstNode exprAst ) {
396406 if (exprAst .getNumberOfChildren () == 5 ) {
397- AstNode decisionOperand = exprAst .getChild (0 ); //@todo deprecated getChild
398- AstNode trueCaseOperand = exprAst .getChild (2 ); //@todo deprecated getChild
399- AstNode falseCaseOperand = exprAst .getChild (4 ); //@todo deprecated getChild
407+ AstNode decisionOperand = exprAst .getFirstChild ();
408+ AstNode operator = decisionOperand .getNextSibling ();
409+ AstNode trueCaseOperand = operator .getNextSibling ();
410+ operator = trueCaseOperand .getNextSibling ();
411+ AstNode falseCaseOperand = operator .getNextSibling ();
400412 return eval (decisionOperand ) ? evalToInt (trueCaseOperand ) : evalToInt (falseCaseOperand );
401413 } else {
402- AstNode decisionOperand = exprAst .getChild (0 ); //@todo deprecated getChild
403- AstNode falseCaseOperand = exprAst .getChild (3 ); //@todo deprecated getChild
414+ AstNode decisionOperand = exprAst .getFirstChild ();
415+ AstNode operator = decisionOperand .getNextSibling ();
416+ operator = operator .getNextSibling ();
417+ AstNode falseCaseOperand = operator .getNextSibling ();
404418 BigInteger decision = evalToInt (decisionOperand );
405419 return decision .compareTo (BigInteger .ZERO ) != 0 ? decision : evalToInt (falseCaseOperand );
406420 }
407421 }
408422
409423 BigInteger evalPrimaryExpression (AstNode exprAst ) {
410424 // case "( expression )"
411- return evalToInt (exprAst .getChild (1 )); //@todo deprecated getChild
425+ AstNode caseNode = exprAst .getFirstChild ();
426+ return evalToInt (caseNode .getNextSibling ());
412427 }
413428
414429 BigInteger evalDefinedExpression (AstNode exprAst ) {
415- int posOfMacroName = exprAst .getNumberOfChildren () == 2 ? 1 : 2 ;
416- String macroName = exprAst .getChild (posOfMacroName ).getTokenValue (); //@todo deprecated getChild
417- String value = preprocessor .valueOf (macroName );
430+ AstNode child = exprAst .getFirstChild ();
418431
432+ if (exprAst .getNumberOfChildren () != 2 ) {
433+ child = child .getNextSibling ();
434+ }
435+
436+ String macroName = child .getNextSibling ().getTokenValue ();
437+ String value = preprocessor .valueOf (macroName );
419438 LOG .trace ("expanding '{}' to '{}'" , macroName , value );
420439
421440 return value == null ? BigInteger .ZERO : BigInteger .ONE ;
422441 }
423442
424443 BigInteger evalFunctionlikeMacro (AstNode exprAst ) {
425- String macroName = exprAst .getChild ( 0 ).getTokenValue (); //@todo deprecated getChild
444+ String macroName = exprAst .getFirstChild ( ).getTokenValue ();
426445 List <Token > tokens = exprAst .getTokens ();
427446 List <Token > restTokens = tokens .subList (1 , tokens .size ());
428447 String value = preprocessor .expandFunctionLikeMacro (macroName , restTokens );
0 commit comments