@@ -118,7 +118,8 @@ class Parser {
118118 [" &&" ],
119119 [" ||" ],
120120 [" =" ," +=" ," -=" ," *=" ," /=" ," %=" ," <<=" ," >>=" ," >>>=" ," |=" ," &=" ," ^=" ," =>" ],
121- [" ->" ]
121+ [" ->" ],
122+ [" in" ," is" ]
122123 ];
123124 opPriority = new Map ();
124125 opRightAssoc = new Map ();
@@ -532,6 +533,8 @@ class Parser {
532533 var edef = switch ( expr (e ) ) {
533534 case EFor (v , it , e2 ):
534535 EFor (v , it , mapCompr (tmp , e2 ));
536+ case EForGen (it , e2 ):
537+ EForGen (it , mapCompr (tmp , e2 ));
535538 case EWhile (cond , e2 ):
536539 EWhile (cond , mapCompr (tmp , e2 ));
537540 case EDoWhile (cond , e2 ):
@@ -563,7 +566,8 @@ class Parser {
563566 return mk (EBinop (op ,e1 ,e ),pmin (e1 ),pmax (e1 ));
564567 return switch ( expr (e ) ) {
565568 case EBinop (op2 ,e2 ,e3 ):
566- if ( opPriority .get (op ) <= opPriority .get (op2 ) && ! opRightAssoc .exists (op ) )
569+ var delta = opPriority .get (op ) - opPriority .get (op2 );
570+ if ( delta < 0 || (delta == 0 && ! opRightAssoc .exists (op )) )
567571 mk (EBinop (op2 ,makeBinop (op ,e1 ,e2 ),e3 ),pmin (e1 ),pmax (e3 ));
568572 else
569573 mk (EBinop (op , e1 , e ), pmin (e1 ), pmax (e ));
@@ -638,12 +642,19 @@ class Parser {
638642 mk (EDoWhile (econd ,e ),p1 ,pmax (econd ));
639643 case " for" :
640644 ensure (TPOpen );
641- var vname = getIdent ();
642- ensureToken (TId (" in" ));
643- var eiter = parseExpr ();
645+ var eit = parseExpr ();
644646 ensure (TPClose );
645647 var e = parseExpr ();
646- mk (EFor (vname ,eiter ,e ),p1 ,pmax (e ));
648+ switch ( expr (eit ) ) {
649+ case EBinop (" in" ,ev ,eit ):
650+ switch ( expr (ev ) ) {
651+ case EIdent (v ):
652+ return mk (EFor (v ,eit ,e ),p1 ,pmax (e ));
653+ default :
654+ }
655+ default :
656+ }
657+ mk (EForGen (eit ,e ),p1 ,pmax (e ));
647658 case " break" : mk (EBreak );
648659 case " continue" : mk (EContinue );
649660 case " else" : unexpected (TId (id ));
@@ -803,8 +814,8 @@ class Parser {
803814 return parseExprNext (mk (EUnop (op ,false ,e1 ),pmin (e1 )));
804815 }
805816 return makeBinop (op ,e1 ,parseExpr ());
806- case TId (op ) if ( op == ' is ' ):
807- return makeBinop (op ,e1 ,parseExpr ());
817+ case TId (op ) if ( opPriority . exists ( op ) ):
818+ return parseExprNext ( makeBinop (op ,e1 ,parseExpr () ));
808819 case TDot :
809820 var field = getIdent ();
810821 return parseExprNext (mk (EField (e1 ,field ),pmin (e1 )));
0 commit comments