Ejemplo n.º 1
0
        private BindingParserNode ReadIdentifierExpression(bool onlyTypeName)
        {
            var startIndex = CurrentIndex;
            BindingParserNode expression = onlyTypeName ? ReadIdentifierNameExpression() : ReadAtomicExpression();


            var next          = Peek();
            int previousIndex = -1;

            while (next != null && previousIndex != CurrentIndex)
            {
                previousIndex = CurrentIndex;
                if (next.Type == BindingTokenType.Dot)
                {
                    // member access
                    Read();
                    var member = ReadIdentifierNameExpression();
                    expression = CreateNode(new MemberAccessBindingParserNode(expression, member), startIndex);
                }
                else if (!onlyTypeName && next.Type == BindingTokenType.OpenParenthesis)
                {
                    expression = ReadFunctionCall(startIndex, expression);
                }
                else if (!onlyTypeName && next.Type == BindingTokenType.OpenArrayBrace)
                {
                    expression = ReadArrayAccess(startIndex, expression);
                }
                else
                {
                    break;
                }
                next = Peek();
            }
            return(expression);
        }
Ejemplo n.º 2
0
        private BindingParserNode ReadFunctionCall(int startIndex, BindingParserNode expression)
        {
            // function call
            Read();
            var arguments          = new List <BindingParserNode>();
            int previousInnerIndex = -1;

            while (Peek() != null && Peek().Type != BindingTokenType.CloseParenthesis && previousInnerIndex != CurrentIndex)
            {
                previousInnerIndex = CurrentIndex;
                if (arguments.Count > 0)
                {
                    SkipWhiteSpace();
                    if (IsCurrentTokenIncorrect(BindingTokenType.Comma))
                    {
                        arguments.Add(CreateNode(new LiteralExpressionBindingParserNode(null), CurrentIndex, "The ',' was expected"));
                    }
                    else
                    {
                        Read();
                    }
                }
                arguments.Add(ReadExpression());
            }
            var error = IsCurrentTokenIncorrect(BindingTokenType.CloseParenthesis);

            Read();
            SkipWhiteSpace();
            expression = CreateNode(new FunctionCallBindingParserNode(expression, arguments), startIndex, error ? "The ')' was expected." : null);
            return(expression);
        }
Ejemplo n.º 3
0
        private BindingParserNode CreateVoidBlockIfBlankIdentifier(BindingParserNode originalNode, int startIndex)
        {
            if (IsBlankIdentifier(originalNode))
            {
                originalNode = CreateNode(new VoidBindingParserNode(), startIndex);
            }

            return(originalNode);
        }
Ejemplo n.º 4
0
 public virtual T Visit(BindingParserNode node)
 {
     if (node is ArrayAccessBindingParserNode)
     {
         return(VisitArrayAccess((ArrayAccessBindingParserNode)node));
     }
     else if (node is BinaryOperatorBindingParserNode)
     {
         return(VisitBinaryOperator((BinaryOperatorBindingParserNode)node));
     }
     else if (node is ConditionalExpressionBindingParserNode)
     {
         return(VisitConditionalExpression((ConditionalExpressionBindingParserNode)node));
     }
     else if (node is FunctionCallBindingParserNode)
     {
         return(VisitFunctionCall((FunctionCallBindingParserNode)node));
     }
     else if (node is GenericNameBindingParserNode)
     {
         return(VisitGenericName((GenericNameBindingParserNode)node));
     }
     else if (node is SimpleNameBindingParserNode)
     {
         return(VisitSimpleName((SimpleNameBindingParserNode)node));
     }
     else if (node is LiteralExpressionBindingParserNode)
     {
         return(VisitLiteralExpression((LiteralExpressionBindingParserNode)node));
     }
     else if (node is MemberAccessBindingParserNode)
     {
         return(VisitMemberAccess((MemberAccessBindingParserNode)node));
     }
     else if (node is ParenthesizedExpressionBindingParserNode)
     {
         return(VisitParenthesizedExpression((ParenthesizedExpressionBindingParserNode)node));
     }
     else if (node is UnaryOperatorBindingParserNode)
     {
         return(VisitUnaryOperator((UnaryOperatorBindingParserNode)node));
     }
     else if (node is MultiExpressionBindingParserNode)
     {
         return(VisitMultiExpression((MultiExpressionBindingParserNode)node));
     }
     else if (node is AssemblyQualifiedNameBindingParserNode)
     {
         return(VisitAssemblyQualifiedName((AssemblyQualifiedNameBindingParserNode)node));
     }
     else
     {
         throw new NotSupportedException($"The node of type {node.GetType()} is not supported!");
     }
 }
Ejemplo n.º 5
0
        private BindingParserNode ReadArrayAccess(int startIndex, BindingParserNode expression)
        {
            // array access
            Read();
            var innerExpression = ReadExpression();
            var error           = IsCurrentTokenIncorrect(BindingTokenType.CloseArrayBrace);

            Read();
            SkipWhiteSpace();
            expression = CreateNode(new ArrayAccessBindingParserNode(expression, innerExpression), startIndex, error ? "The ']' was expected." : null);
            return(expression);
        }
Ejemplo n.º 6
0
 protected virtual T DefaultVisit(BindingParserNode node)
 {
     throw new NotImplementedException("The visitor implementation should implement this method!");
 }
 public ParenthesizedExpressionBindingParserNode(BindingParserNode innerExpression)
 {
     InnerExpression = innerExpression;
 }
 public FunctionCallBindingParserNode(BindingParserNode targetExpression, List<BindingParserNode> argumentExpressions)
 {
     TargetExpression = targetExpression;
     ArgumentExpressions = argumentExpressions;
 }
Ejemplo n.º 9
0
 public ArrayAccessBindingParserNode(BindingParserNode targetExpression, BindingParserNode arrayIndexExpression)
 {
     TargetExpression     = targetExpression;
     ArrayIndexExpression = arrayIndexExpression;
 }
 public BinaryOperatorBindingParserNode(BindingParserNode firstExpression, BindingParserNode secondExpression, BindingTokenType @operator)
 {
     FirstExpression = firstExpression;
     SecondExpression = secondExpression;
     Operator = @operator;
 }
 public ConditionalExpressionBindingParserNode(BindingParserNode conditionExpression, BindingParserNode trueExpression, BindingParserNode falseExpression)
 {
     ConditionExpression = conditionExpression;
     TrueExpression      = trueExpression;
     FalseExpression     = falseExpression;
 }
 public ParenthesizedExpressionBindingParserNode(BindingParserNode innerExpression)
 {
     InnerExpression = innerExpression;
 }
 public UnaryOperatorBindingParserNode(BindingParserNode innerExpression, BindingTokenType @operator)
 {
     InnerExpression = innerExpression;
     Operator        = @operator;
 }
 public UnaryOperatorBindingParserNode(BindingParserNode innerExpression, BindingTokenType @operator)
 {
     InnerExpression = innerExpression;
     Operator = @operator;
 }
Ejemplo n.º 15
0
 public FunctionCallBindingParserNode(BindingParserNode targetExpression, List <BindingParserNode> argumentExpressions)
 {
     TargetExpression    = targetExpression;
     ArgumentExpressions = argumentExpressions;
 }
Ejemplo n.º 16
0
 public BindingCompilationException(string message, BindingParserNode node)
     : this(message, null, node)
 {
 }
Ejemplo n.º 17
0
 public BindingCompilationException(string message, Exception innerException, BindingParserNode node)
     : this(message, innerException, node.Tokens)
 {
 }
Ejemplo n.º 18
0
 public MemberAccessBindingParserNode(BindingParserNode targetExpression, IdentifierNameBindingParserNode memberNameExpression)
 {
     TargetExpression     = targetExpression;
     MemberNameExpression = memberNameExpression;
 }
Ejemplo n.º 19
0
 public BlockBindingParserNode(BindingParserNode firstExpression, BindingParserNode secondExpression)
 {
     this.FirstExpression  = firstExpression;
     this.SecondExpression = secondExpression;
 }
 public BinaryOperatorBindingParserNode(BindingParserNode firstExpression, BindingParserNode secondExpression, BindingTokenType @operator)
 {
     FirstExpression  = firstExpression;
     SecondExpression = secondExpression;
     Operator         = @operator;
 }
Ejemplo n.º 21
0
 public MemberAccessBindingParserNode(BindingParserNode targetExpression, IdentifierNameBindingParserNode memberNameExpression)
 {
     TargetExpression = targetExpression;
     MemberNameExpression = memberNameExpression;
 }
Ejemplo n.º 22
0
 public ArrayAccessBindingParserNode(BindingParserNode targetExpression, BindingParserNode arrayIndexExpression)
 {
     TargetExpression = targetExpression;
     ArrayIndexExpression = arrayIndexExpression;
 }
Ejemplo n.º 23
0
 private bool IsBlankIdentifier(BindingParserNode second) => second is IdentifierNameBindingParserNode identifier && identifier.Name.Length == 0;
 public AssemblyQualifiedNameBindingParserNode(BindingParserNode typeName, BindingParserNode assemblyName)
 {
     this.TypeName     = typeName;
     this.AssemblyName = assemblyName;
 }
 public ConditionalExpressionBindingParserNode(BindingParserNode conditionExpression, BindingParserNode trueExpression, BindingParserNode falseExpression)
 {
     ConditionExpression = conditionExpression;
     TrueExpression = trueExpression;
     FalseExpression = falseExpression;
 }