@@ -391,25 +391,40 @@ statement [block]
391391
392392
393393 | {
394- while_stat = block.newStatement(" while" )
394+ if_stat = while_stat = block.newStatement(" while" )
395395 }
396- # ("while" while_expr = expression[block, False]
397- statement[ while_stat] )
396+ # (wh:"while"
397+ {
398+ useif = block.hasAssignInExpr(wh.getFirstChild())
399+ if (useif):
400+ if_stat = while_stat.newStatement(" if" )
401+ while_stat.setExpression(" True" )
402+ if_stat.newStatement(" break" )
403+ }
404+ while_expr = expression[ if_stat, False]
405+ statement[ while_stat] )
398406 {
399- while_stat.setExpression(while_expr)
407+ if useif:
408+ if_stat.setExpression((" not %s " , while_expr))
409+ else :
410+ if_stat.setExpression(while_expr)
400411 }
401412
402413
403414 | {
404415 while_stat = block.newStatement(" while" )
405416 while_stat.setExpression(" True" )
406417 }
407- # ("do" statement[while_stat] do_exp = expression[block, False])
408- {
418+ # ("do"
419+ statement[ while_stat]
420+ {
409421 if_stat = while_stat.newStatement(" if" )
410- if_stat.setExpression((" not %s " , do_exp))
411422 if_stat.newStatement(" break" )
412- }
423+ }
424+ do_exp = expression[ if_stat, False] )
425+ {
426+ if_stat.setExpression((" not %s " , do_exp))
427+ }
413428
414429
415430 | {
@@ -550,61 +565,117 @@ returns [seq]
550565
551566expression [ block, append= True]
552567returns [ exp]
553- : # (EXPR exp = expr[block])
568+ : {
569+ fixAssign = not append
570+ }
571+ # (EXPR exp = expr[block, fixAssign])
554572 {
555573 if append:
556574 block.addSource(exp)
575+ if block.postIncDecInExprFixed:
576+ exp = block.fixPostIncDecInExprAfter(exp)
557577 }
558578 ;
559579
560580
561- expr [ block]
581+ expr [ block, fixAssign = True ]
562582returns [ exp = block.unknownExpression]
563583 : # (QUESTION a0=expr[block] b0=expr[block] c0=expr[block])
564584 { exp = (" %s %s " , ((" %s " , b0), (" %s %s " , ((" if %s " , a0), (" else %s " , c0)))))}
565585
566586 | # (ASSIGN left=expr[block] right=expr[block])
567- { exp = ( " %s = %s " , (left, right))}
587+ { exp = block.fixAssignInExpr(fixAssign, ( " %s = %s " , (left, right)), left )}
568588
569589 | # (PLUS_ASSIGN left=expr[block] right=expr[block])
570- { exp = ( " %s += %s " , (left, right))}
590+ { exp = block.fixAssignInExpr(fixAssign, ( " %s += %s " , (left, right)), left )}
571591
572592 | # (MINUS_ASSIGN left=expr[block] right=expr[block])
573- { exp = ( " %s -= %s " , (left, right))}
593+ { exp = block.fixAssignInExpr(fixAssign, ( " %s -= %s " , (left, right)), left )}
574594
575595 | # (STAR_ASSIGN left=expr[block] right=expr[block])
576- { exp = ( " %s *= %s " , (left, right))}
596+ { exp = block.fixAssignInExpr(fixAssign, ( " %s *= %s " , (left, right)), left )}
577597
578598 | # (DIV_ASSIGN left=expr[block] right=expr[block])
579- { exp = ( " %s /= %s " , (left, right))}
599+ { exp = block.fixAssignInExpr(fixAssign, ( " %s /= %s " , (left, right)), left )}
580600
581601 | # (MOD_ASSIGN left=expr[block] right=expr[block])
582- { exp = ( " %s %% = %s " , (left, right))}
602+ { exp = block.fixAssignInExpr(fixAssign, ( " %s %% = %s " , (left, right)), left )}
583603
584604 | # (SR_ASSIGN left=expr[block] right=expr[block])
585- { exp = ( " %s >>= %s " , (left, right))}
605+ { exp = block.fixAssignInExpr(fixAssign, ( " %s >>= %s " , (left, right)), left )}
586606
587607 | # (BSR_ASSIGN left=expr[block] right=expr[block])
588608 // raise an exception during parsing, not at runtime
589609 { raise NotImplementedError(" BSR_ASSIGN" )}
590610
591611 | # (SL_ASSIGN left=expr[block] right=expr[block])
592- { exp = ( " %s <<= %s " , (left, right))}
612+ { exp = block.fixAssignInExpr(fixAssign, ( " %s <<= %s " , (left, right)), left )}
593613
594614 | # (BAND_ASSIGN left=expr[block] right=expr[block])
595- { exp = ( " %s &= %s " , (left, right))}
615+ { exp = block.fixAssignInExpr(fixAssign, ( " %s &= %s " , (left, right)), left )}
596616
597617 | # (BXOR_ASSIGN left=expr[block] right=expr[block])
598- { exp = ( " %s ^= %s " , (left, right))}
618+ { exp = block.fixAssignInExpr(fixAssign, ( " %s ^= %s " , (left, right)), left )}
599619
600620 | # (BOR_ASSIGN left=expr[block] right=expr[block])
601- { exp = (" %s |= %s " , (left, right))}
621+ { exp = block.fixAssignInExpr(fixAssign, (" %s |= %s " , (left, right)), left)}
622+
623+ | { left_if = right_if = block }
624+ # (lor:LOR
625+ {
626+ right_has = block.hasAssignInExpr(lor.getFirstChild().getNextSibling())
627+ if right_has:
628+ left_if = block.parent.newStatementBefore(" if" , block)
629+ right_if = left_if.newStatement(" if" )
630+ }
631+ left= expr[ left_if] right= expr[ right_if] )
632+ {
633+ if right_has:
634+ left_if.setExpression((" not %s " , left))
635+ if left != " _ret" :
636+ left_else = block.parent.newStatementBefore(" else" , block)
637+ left_else.addSource(" _ret = True" )
638+ right_if.setExpression(right)
639+ right_if.addSource(" _ret = True" )
640+ right_else = left_if.newStatement(" else" )
641+ right_else.addSource(" _ret = False" )
642+ if left_if.postIncDecInExprFixed:
643+ left_if.fixPostIncDecInExprAfter(left)
644+ if right_if.postIncDecInExprFixed:
645+ right_if.fixPostIncDecInExprAfter(right)
646+ exp = " _ret"
647+ else :
648+ exp = (" %s or %s " , (left, right))
602649
603- | # (LOR left=expr[block] right=expr[block])
604- { exp = (" %s or %s " , (left, right))}
650+ }
605651
606- | # (LAND left=expr[block] right=expr[block])
607- { exp = (" %s and %s " , (left, right))}
652+ | { left_if = right_if = block }
653+ # (land:LAND
654+ {
655+ right_has = block.hasAssignInExpr(land.getFirstChild().getNextSibling())
656+ if right_has:
657+ left_if = block.parent.newStatementBefore(" if" , block)
658+ right_if = left_if.newStatement(" if" )
659+ }
660+ left= expr[ left_if] right= expr[ right_if] )
661+ {
662+ if right_has:
663+ left_if.setExpression(left)
664+ if left != " _ret" :
665+ left_else = block.parent.newStatementBefore(" else" , block)
666+ left_else.addSource(" _ret = False" )
667+ right_if.setExpression(right)
668+ right_if.addSource(" _ret = True" )
669+ right_else = left_if.newStatement(" else" )
670+ right_else.addSource(" _ret = False" )
671+ if left_if.postIncDecInExprFixed:
672+ left_if.fixPostIncDecInExprAfter(left)
673+ if right_if.postIncDecInExprFixed:
674+ right_if.fixPostIncDecInExprAfter(right)
675+ exp = " _ret"
676+ else :
677+ exp = (" %s and %s " , (left, right))
678+ }
608679
609680 | # (BOR left=expr[block] right=expr[block])
610681 { exp = (" %s | %s " , (left, right))}
@@ -669,16 +740,16 @@ returns [exp = block.unknownExpression]
669740 { exp = (" %s * %s " , (left, right))}
670741
671742 | # (INC ex=expr[block])
672- { exp = ( " %s += 1" , ex)}
743+ { exp = block.fixAssignInExpr(fixAssign, ( " %s += 1" , ex) , ex)}
673744
674745 | # (DEC ex=expr[block])
675- { exp = ( " %s -= 1" , ex)}
746+ { exp = block.fixAssignInExpr(fixAssign, ( " %s -= 1" , ex) , ex)}
676747
677748 | # (POST_INC ex=expr[block])
678- { exp = ( " %s += 1" , ex)}
749+ { exp = block.fixPostIncDecInExpr(fixAssign, ( " %s += 1" , ex), ex, " + " )}
679750
680751 | # (POST_DEC ex=expr[block])
681- { exp = ( " %s -= 1" , ex)}
752+ { exp = block.fixPostIncDecInExpr(fixAssign, ( " %s -= 1" , ex), ex, " - " )}
682753
683754 | # (BNOT ex=expr[block])
684755 { exp = (" ~%s " , ex)}
0 commit comments