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); }
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); }
private BindingParserNode CreateVoidBlockIfBlankIdentifier(BindingParserNode originalNode, int startIndex) { if (IsBlankIdentifier(originalNode)) { originalNode = CreateNode(new VoidBindingParserNode(), startIndex); } return(originalNode); }
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!"); } }
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); }
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; }
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; }
public FunctionCallBindingParserNode(BindingParserNode targetExpression, List <BindingParserNode> argumentExpressions) { TargetExpression = targetExpression; ArgumentExpressions = argumentExpressions; }
public BindingCompilationException(string message, BindingParserNode node) : this(message, null, node) { }
public BindingCompilationException(string message, Exception innerException, BindingParserNode node) : this(message, innerException, node.Tokens) { }
public MemberAccessBindingParserNode(BindingParserNode targetExpression, IdentifierNameBindingParserNode memberNameExpression) { TargetExpression = targetExpression; MemberNameExpression = memberNameExpression; }
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; }
public MemberAccessBindingParserNode(BindingParserNode targetExpression, IdentifierNameBindingParserNode memberNameExpression) { TargetExpression = targetExpression; MemberNameExpression = memberNameExpression; }
public ArrayAccessBindingParserNode(BindingParserNode targetExpression, BindingParserNode arrayIndexExpression) { TargetExpression = targetExpression; ArrayIndexExpression = arrayIndexExpression; }
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; }