@@ -105,7 +105,7 @@ private StatementListItem StatementListItem(SymbolTable table)
105
105
private Statement Statement ( SymbolTable table )
106
106
{
107
107
if ( CurrentIs ( "Ident" ) || CurrentIsLiteral ( ) || CurrentIs ( "LeftParen" ) || CurrentIsOperator ( "-" ) ||
108
- CurrentIsOperator ( "!" ) )
108
+ CurrentIsOperator ( "!" ) || CurrentIsOperator ( "~" ) )
109
109
{
110
110
return ExpressionStatement ( table ) ;
111
111
}
@@ -177,8 +177,9 @@ private ExpressionStatement ExpressionStatement(SymbolTable table)
177
177
private ReturnStatement ReturnStatement ( SymbolTable table )
178
178
{
179
179
var ret = Expect ( "Keyword" , "return" ) ;
180
- if ( CurrentIs ( "Ident" ) || CurrentIsLiteral ( ) || CurrentIs ( "LeftParen" ) || CurrentIsOperator ( "-" ) ||
181
- CurrentIsOperator ( "!" ) || CurrentIs ( "LeftCurl" ) || CurrentIs ( "LeftBracket" ) )
180
+ if ( CurrentIs ( "Ident" ) || CurrentIsLiteral ( ) || CurrentIs ( "LeftParen" ) ||
181
+ CurrentIsOperator ( "-" ) || CurrentIsOperator ( "!" ) || CurrentIsOperator ( "~" ) ||
182
+ CurrentIs ( "LeftCurl" ) || CurrentIs ( "LeftBracket" ) )
182
183
{
183
184
return new ReturnStatement ( Expression ( table ) )
184
185
{
@@ -452,42 +453,19 @@ private void AddToDeclaration(LexicalDeclaration declaration, SymbolTable table)
452
453
453
454
private Expression Expression ( SymbolTable table )
454
455
{
455
- return AssignmentExpression ( table ) ;
456
- }
457
-
458
- private Expression AssignmentExpression ( SymbolTable table )
459
- {
460
- var lhs = LeftHandSideExpression ( table ) ;
461
- if ( CurrentIs ( "Assign" ) && ! ( lhs is CallExpression ) )
456
+ var expr = CastExpression ( table ) ;
457
+ if ( expr is LeftHandSideExpression lhs )
462
458
{
463
459
var assign = Expect ( "Assign" ) ;
464
- var member = lhs is IdentifierReference reference
465
- ? ( MemberExpression ) reference
466
- : ( MemberExpression ) lhs ;
467
- return new AssignmentExpression ( member , AssignmentExpression ( table ) )
460
+ return new AssignmentExpression ( lhs , Expression ( table ) )
468
461
{ SymbolTable = table , Segment = assign . Segment } ;
469
462
}
470
-
471
- return lhs ;
472
- }
473
-
474
- private Expression LeftHandSideExpression ( SymbolTable table )
475
- {
476
- var expr = CastExpression ( table ) ;
477
- if ( expr is IdentifierReference identRef )
478
- {
479
- if ( CurrentIs ( "LeftParen" ) || CurrentIs ( "LeftBracket" ) || CurrentIs ( "Dot" ) )
480
- {
481
- return CallExpression ( identRef , table ) ;
482
- }
483
- }
484
-
485
463
return expr ;
486
464
}
487
465
488
- private Expression CallExpression ( IdentifierReference identRef , SymbolTable table )
466
+ private Expression CallExpression ( SymbolTable table )
489
467
{
490
- var member = MemberExpression ( identRef , table ) ;
468
+ var member = MemberExpression ( table ) ;
491
469
if ( CurrentIs ( "LeftParen" ) )
492
470
{
493
471
var lp = Expect ( "LeftParen" ) ;
@@ -504,7 +482,7 @@ private Expression CallExpression(IdentifierReference identRef, SymbolTable tabl
504
482
}
505
483
506
484
Expect ( "RightParen" ) ;
507
- return new CallExpression ( member , expressions )
485
+ return new CallExpression ( member as MemberExpression , expressions )
508
486
{
509
487
SymbolTable = table ,
510
488
Segment = lp . Segment
@@ -514,8 +492,13 @@ private Expression CallExpression(IdentifierReference identRef, SymbolTable tabl
514
492
return member ;
515
493
}
516
494
517
- private MemberExpression MemberExpression ( IdentifierReference identRef , SymbolTable table )
495
+ private Expression MemberExpression ( SymbolTable table )
518
496
{
497
+ var primary = PrimaryExpression ( table ) ;
498
+ if ( ! CurrentIs ( "LeftBracket" ) && ! CurrentIs ( "Dot" ) )
499
+ return primary ;
500
+
501
+ var identRef = primary as IdentifierReference ;
519
502
var accessChain = new List < AccessExpression > ( ) ;
520
503
while ( CurrentIs ( "LeftBracket" ) || CurrentIs ( "Dot" ) )
521
504
{
@@ -570,9 +553,9 @@ private Expression ConditionalExpression(SymbolTable table)
570
553
if ( CurrentIs ( "QuestionMark" ) )
571
554
{
572
555
Expect ( "QuestionMark" ) ;
573
- var consequent = AssignmentExpression ( table ) ;
556
+ var consequent = Expression ( table ) ;
574
557
Expect ( "Colon" ) ;
575
- var alternate = AssignmentExpression ( table ) ;
558
+ var alternate = Expression ( table ) ;
576
559
return new ConditionalExpression ( test , consequent , alternate ) ;
577
560
}
578
561
@@ -688,7 +671,12 @@ private Expression UnaryExpression(SymbolTable table)
688
671
} ;
689
672
}
690
673
691
- return PrimaryExpression ( table ) ;
674
+ return LeftHandSideExpression ( table ) ;
675
+ }
676
+
677
+ private Expression LeftHandSideExpression ( SymbolTable table )
678
+ {
679
+ return CallExpression ( table ) ;
692
680
}
693
681
694
682
private Expression PrimaryExpression ( SymbolTable table )
0 commit comments