private Expression ParseBitwiseORExpression (bool noIn) { Token start = current; Expression expr = ParseBitwiseXORExpression (noIn); while (current.Kind == Token.Type.Bar) { Token op = current; Next (); Expression right = ParseBitwiseXORExpression (noIn); expr = new BinaryOperatorExpression (expr, right, Expression.Operation.Bar, new TextSpan (start, current), new TextPoint (op.StartPosition)); } return expr; }
private Expression ParseEqualityExpression (bool noIn) { Token start = current; Expression expr = ParseRelationalExpression (noIn); while (current.Kind == Token.Type.EqualEqual || current.Kind == Token.Type.BangEqual || current.Kind == Token.Type.EqualEqualEqual || current.Kind == Token.Type.BangEqualEqual) { Expression.Operation op = Expression.Operation.SyntaxError; switch (current.Kind) { case Token.Type.EqualEqual: op = Expression.Operation.EqualEqual; break; case Token.Type.BangEqual: op = Expression.Operation.BangEqual; break; case Token.Type.EqualEqualEqual: op = Expression.Operation.EqualEqualEqual; break; case Token.Type.BangEqualEqual: op = Expression.Operation.BangEqualEqual; break; } Token ope = current; Next (); Expression right = ParseRelationalExpression (noIn); expr = new BinaryOperatorExpression (expr, right, op, new TextSpan (start, current), new TextPoint (ope.StartPosition)); } return expr; }
private Expression ParseRelationalExpression (bool noIn) { Token start = current; Expression.Operation op = Expression.Operation.SyntaxError; Expression expr = ParseShiftExpression (noIn); while (current.Kind == Token.Type.Less || current.Kind == Token.Type.Greater || current.Kind == Token.Type.GreaterEqual || current.Kind == Token.Type.LessEqual || current.Kind == Token.Type.instanceof || (current.Kind == Token.Type.@in && !noIn)) { switch (current.Kind) { case Token.Type.Less: op = Expression.Operation.Less; break; case Token.Type.Greater: op = Expression.Operation.Greater; break; case Token.Type.GreaterEqual: op = Expression.Operation.GreaterEqual; break; case Token.Type.LessEqual: op = Expression.Operation.LessEqual; break; case Token.Type.instanceof: op = Expression.Operation.instanceof; break; case Token.Type.@in: if (noIn) return ParseShiftExpression (noIn); else op = Expression.Operation.@in; break; } Next (); Expression right = ParseShiftExpression (noIn); expr = new BinaryOperatorExpression (expr, right, op, new TextSpan (start, current), new TextPoint (start.StartPosition)); } return expr; }
private Expression ParseShiftExpression (bool noIn) { Token start = current; Expression.Operation op = Expression.Operation.SyntaxError; Expression expr = ParseAdditiveExpression (noIn); while (current.Kind == Token.Type.LessLess || current.Kind == Token.Type.GreaterGreater || current.Kind == Token.Type.GreaterGreaterGreater) { switch (current.Kind) { case Token.Type.LessLess: op = Expression.Operation.LessLess; break; case Token.Type.GreaterGreater: op = Expression.Operation.GreaterGreater; break; case Token.Type.GreaterGreaterGreater: op = Expression.Operation.GreaterGreaterGreater; break; } Next (); Expression right = ParseAdditiveExpression (noIn); expr = new BinaryOperatorExpression (expr, right, op, new TextSpan (start, current), new TextPoint (start.StartPosition)); } return expr; }
private Expression ParseAdditiveExpression (bool noIn) { Token start = current; Expression expr = ParseMultiplicativeExpression (noIn); while (current.Kind == Token.Type.Plus || current.Kind == Token.Type.Minus) { Expression.Operation op = Expression.Operation.SyntaxError; switch (current.Kind) { case Token.Type.Plus: op = Expression.Operation.Plus; break; case Token.Type.Minus: op = Expression.Operation.Minus; break; } Next (); Expression right = ParseMultiplicativeExpression (noIn); expr = new BinaryOperatorExpression (expr, right, op, new TextSpan (start, current), new TextPoint (start.StartPosition)); } return expr; }
private Expression ParseExpression (bool noIn) { Token start = current; Expression expr = ParseAssignmentExpression (noIn); while (current.Kind == Token.Type.Comma) { Next (); Expression right = ParseAssignmentExpression (noIn); expr = new BinaryOperatorExpression (expr, right, Expression.Operation.Comma, new TextSpan (start, current), new TextPoint (start.StartPosition)); } return expr; }