LNode SubExpr(Precedence context)
{
TokenType la0, la1;
Debug.Assert(context.CanParse(EP.Prefix));
Precedence prec;
var e = PrefixExpr();
// Line 671: greedy( &{context.CanParse(prec = InfixPrecedenceOf($LA))} (TT.Add|TT.And|TT.AndBits|TT.BQString|TT.CompoundSet|TT.DivMod|TT.DotDot|TT.EqNeq|TT.GT|TT.In|TT.LambdaArrow|TT.LEGE|TT.LT|TT.Mul|TT.NotBits|TT.NullCoalesce|TT.OrBits|TT.OrXor|TT.Power|TT.Set|TT.Sub|TT.XorBits) SubExpr | &{context.CanParse(prec = InfixPrecedenceOf($LA))} (TT.As|TT.Is|TT.Using) DataType FinishPrimaryExpr | &{context.CanParse(EP.Shift)} &{LT($LI).EndIndex == LT($LI + 1).StartIndex} (TT.LT TT.LT SubExpr | TT.GT TT.GT SubExpr) | &{context.CanParse(EP.IfElse)} TT.QuestionMark SubExpr TT.Colon SubExpr )*
for (;;) {
switch (LA0) {
case TT.GT: case TT.LT:
{
la0 = LA0;
if (context.CanParse(prec = InfixPrecedenceOf(la0))) {
if (LT(0).EndIndex == LT(0 + 1).StartIndex) {
if (context.CanParse(EP.Shift)) {
la1 = LA(1);
if (PrefixExpr_set0.Contains((int) la1))
goto match1;
else if (la1 == TT.GT || la1 == TT.LT)
goto match3;
else
goto stop;
} else {
la1 = LA(1);
if (PrefixExpr_set0.Contains((int) la1))
goto match1;
else
goto stop;
}
} else {
la1 = LA(1);
if (PrefixExpr_set0.Contains((int) la1))
goto match1;
else
goto stop;
}
} else if (LT(0).EndIndex == LT(0 + 1).StartIndex) {
if (context.CanParse(EP.Shift)) {
la1 = LA(1);
if (la1 == TT.GT || la1 == TT.LT)
goto match3;
else
goto stop;
} else
goto stop;
} else
goto stop;
}
case TT.Add: case TT.And: case TT.AndBits: case TT.BQString:
case TT.CompoundSet: case TT.DivMod: case TT.DotDot: case TT.EqNeq:
case TT.In: case TT.LambdaArrow: case TT.LEGE: case TT.Mul:
case TT.NotBits: case TT.NullCoalesce: case TT.OrBits: case TT.OrXor:
case TT.Power: case TT.Set: case TT.Sub: case TT.XorBits:
{
la0 = LA0;
if (context.CanParse(prec = InfixPrecedenceOf(la0))) {
la1 = LA(1);
if (PrefixExpr_set0.Contains((int) la1))
goto match1;
else
goto stop;
} else
goto stop;
}
case TT.As: case TT.Is: case TT.Using:
{
la0 = LA0;
if (context.CanParse(prec = InfixPrecedenceOf(la0))) {
switch (LA(1)) {
case TT.ContextualKeyword: case TT.Id: case TT.Operator: case TT.Substitute:
case TT.TypeKeyword:
{
var op = MatchAny();
var rhs = DataType(true);
var opSym = op.Type() == TT.Using ? S.UsingCast : ((Symbol) op.Value);
e = F.Call(opSym, e, rhs, e.Range.StartIndex, rhs.Range.EndIndex, op.StartIndex, op.EndIndex, NodeStyle.Operator);
FinishPrimaryExpr(ref e);
}
break;
default:
goto stop;
}
} else
goto stop;
}
break;
case TT.QuestionMark:
{
if (context.CanParse(EP.IfElse)) {
la1 = LA(1);
if (PrefixExpr_set0.Contains((int) la1)) {
var op = MatchAny();
var then = SubExpr(StartExpr);
Match((int) TT.Colon);
var @else = SubExpr(EP.IfElse);
// line 694
e = F.Call(S.QuestionMark, LNode.List(e, then, @else), e.Range.StartIndex, @else.Range.EndIndex, op.StartIndex, op.EndIndex, NodeStyle.Operator);
} else
goto stop;
} else
goto stop;
}
break;
default:
goto stop;
}
continue;
match1:
{
var op = MatchAny();
var rhs = SubExpr(prec);
// line 675
e = F.Call((Symbol) op.Value, e, rhs, e.Range.StartIndex, rhs.Range.EndIndex, op.StartIndex, op.EndIndex, NodeStyle.Operator);
}
continue;
match3:
{
// Line 686: (TT.LT TT.LT SubExpr | TT.GT TT.GT SubExpr)
la0 = LA0;
if (la0 == TT.LT) {
var op = MatchAny();
Match((int) TT.LT);
var rhs = SubExpr(EP.Shift);
// line 687
e = F.Call(S.Shl, e, rhs, e.Range.StartIndex, rhs.Range.EndIndex, op.StartIndex, op.EndIndex + 1, NodeStyle.Operator);
} else {
var op = Match((int) TT.GT);
Match((int) TT.GT);
var rhs = SubExpr(EP.Shift);
// line 689
e = F.Call(S.Shr, e, rhs, e.Range.StartIndex, rhs.Range.EndIndex, op.StartIndex, op.EndIndex + 1, NodeStyle.Operator);
}
}
}
stop:;
// line 697
return e;
}