@@ -32,6 +32,7 @@ enum Token {
32
32
TBrOpen ;
33
33
TBrClose ;
34
34
TDot ;
35
+ TQuestionDot ;
35
36
TComma ;
36
37
TSemicolon ;
37
38
TBkOpen ;
@@ -806,6 +807,18 @@ class Parser {
806
807
case TDot :
807
808
var field = getIdent ();
808
809
return parseExprNext (mk (EField (e1 ,field ),pmin (e1 )));
810
+ case TQuestionDot :
811
+ var field = getIdent ();
812
+ var tmp = " __a_" + (uid ++ );
813
+ var e = mk (EBlock ([
814
+ mk (EVar (tmp , null , e1 ), pmin (e1 ), pmax (e1 )),
815
+ mk (ETernary (
816
+ mk (EBinop (" ==" , mk (EIdent (tmp ),pmin (e1 ),pmax (e1 )), mk (EIdent (" null" ),pmin (e1 ),pmax (e1 )))),
817
+ mk (EIdent (" null" ),pmin (e1 ),pmax (e1 )),
818
+ mk (EField (mk (EIdent (tmp ),pmin (e1 ),pmax (e1 )),field ),pmin (e1 ))
819
+ ))
820
+ ]),pmin (e1 ));
821
+ return parseExprNext (e );
809
822
case TPOpen :
810
823
return parseExprNext (mk (ECall (e1 ,parseExprList (TPClose )),pmin (e1 )));
811
824
case TBkOpen :
@@ -1489,7 +1502,12 @@ class Parser {
1489
1502
case " [" .code : return TBkOpen ;
1490
1503
case " ]" .code : return TBkClose ;
1491
1504
case " '" .code , ' "' .code : return TConst ( CString (readString (char )) );
1492
- case " ?" .code : return TQuestion ;
1505
+ case " ?" .code :
1506
+ char = readChar ();
1507
+ if ( char == " ." .code )
1508
+ return TQuestionDot ;
1509
+ this .char = char ;
1510
+ return TQuestion ;
1493
1511
case " :" .code : return TDoubleDot ;
1494
1512
case ' =' .code :
1495
1513
char = readChar ();
@@ -1717,6 +1735,7 @@ class Parser {
1717
1735
case TBrOpen : " {" ;
1718
1736
case TBrClose : " }" ;
1719
1737
case TDot : " ." ;
1738
+ case TQuestionDot : " ?." ;
1720
1739
case TComma : " ," ;
1721
1740
case TSemicolon : " ;" ;
1722
1741
case TBkOpen : " [" ;
0 commit comments