Ejemplo n.º 1
0
 internal static Operator CreateBinary(OperatorDefinition definition, Token token, AssignmentOperatorBehavior assignmentOperatorBehavior)
 {
     return(definition switch
     {
         StandardOperatorDefinition standardOperator => new StandardOperator(token, standardOperator.OperatorType, assignmentOperatorBehavior),
         SpecialOperatorDefinition specialOperator => new SpecialOperator(token, specialOperator.OperatorType),
         _ => throw new NotImplementedException(),
     });
Ejemplo n.º 2
0
 internal StandardOperator(Token token, OperatorType operatorType, AssignmentOperatorBehavior assignmentOperatorBehavior) : base(token)
 {
     OperatorType = operatorType;
     AssignmentOperatorBehavior = assignmentOperatorBehavior;
 }
Ejemplo n.º 3
0
        internal bool TryParse(ILookaroundEnumerator <Token> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode, AssignmentOperatorBehavior assignmentOperatorBehavior, int currentPrecedence = 0)
        {
            if (currentPrecedence == 0 && CustomParseDelegates != default)
            {
                var customResult = CustomParseDelegates.Select(del =>
                {
                    var Success = del(enumerator, out var Result, assignmentOperatorBehavior);
                    return(new { Success, Result });
                }).FirstOrDefault(res => res.Success)?.Result;
                if (customResult != default)
                {
                    enumerator.MoveNext(); // TODO: Is this right?
                    parsedNode = customResult;
                    return(true);
                }
            }

            if (currentPrecedence >= _PrecedenceGroups.Length)
            {
                return(TryParseBraces(enumerator, out parsedNode, assignmentOperatorBehavior));
            }

            return(_PrecedenceGroups[currentPrecedence].First().OperandCount switch
            {
                OperandCount.Binary => TryParseBinary(enumerator, currentPrecedence, out parsedNode, assignmentOperatorBehavior),
                OperandCount.Unary => TryParseUnary(enumerator, currentPrecedence, out parsedNode),
                _ => throw new NotImplementedException(),
            });
Ejemplo n.º 4
0
        internal bool TryParseDictionary(ILookaroundEnumerator <Token> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode, AssignmentOperatorBehavior assignmentOperatorBehavior)
        {
            parsedNode = default;
            if (enumerator.Current.TokenType != TokenType.CurlyBraceOpen)
            {
                return(false);
            }

            var dictionaryItems = new Queue <DictionaryItemNode>();

            while (enumerator.MoveNext() && TryParseDictionaryItem(enumerator, out var dictionaryItem, assignmentOperatorBehavior))
            {
                dictionaryItems.Enqueue(dictionaryItem);
                if (enumerator.MoveNext() == false)
                {
                    throw new NotImplementedException();
                }
                if (enumerator.Current.TokenType != TokenType.Comma)
                {
                    break;
                }
            }

            if (enumerator.State == EnumeratorState.Complete || enumerator.Current.TokenType != TokenType.CurlyBraceClose)
            {
                throw new NotImplementedException();
            }
            parsedNode = new DictionaryNode(dictionaryItems);
            return(true);
        }
Ejemplo n.º 5
0
 internal bool TryParseTuple(ILookaroundEnumerator <Token> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode, AssignmentOperatorBehavior assignmentOperatorBehavior)
 {
     if (TryParseCommaSeperatedSet(enumerator, TokenType.Operator, _OPERATOR_PAREN_OPEN, ParenClose, out var parsedListItems, minimumItems: 2, assignmentOperatorBehavior))
     {
         parsedNode = new TupleNode(parsedListItems);
         return(true);
     }
     parsedNode = default;
     return(false);
 }
Ejemplo n.º 6
0
 internal bool TryParseList(ILookaroundEnumerator <Token> enumerator, [NotNullWhen(true)] out ASTNode?parsedNode, AssignmentOperatorBehavior assignmentOperatorBehavior)
 {
     if (TryParseCommaSeperatedSet(enumerator, TokenType.Operator, _OPERATOR_SQUARE_BRACE_OPEN, SquareBraceClose, out var parsedListItems, minimumItems: 0, assignmentOperatorBehavior))
     {
         parsedNode = new ListNode(parsedListItems);
         return(true);
     }
     parsedNode = default;
     return(false);
 }
Ejemplo n.º 7
0
        private bool TryParseCommaSeperatedSet(ILookaroundEnumerator <Token> enumerator, TokenType startTokenType, string?startTokenText, TokenType endTokenType, [NotNullWhen(true)] out IEnumerable <ASTNode>?parsedNodes, int minimumItems, AssignmentOperatorBehavior assignmentOperatorBehavior)
        {
            parsedNodes = default;
            if (enumerator.Current.TokenType != startTokenType)
            {
                return(false);
            }
            if (startTokenText != null && enumerator.Current.TextValue != startTokenText)
            {
                return(false);
            }

            if (enumerator.TryGetPrevious(out var prevToken) == true)
            {
                if (prevToken.TokenType.IsTerminal())
                {
                    return(false);
                }
            }
            enumerator.MoveNext();
            var queue = new Queue <ASTNode>();

            while (TryParse(enumerator, out var listItem, assignmentOperatorBehavior))
            {
                queue.Enqueue(listItem);
                if (enumerator.Current.TokenType != TokenType.Comma)
                {
                    break;
                }
                if (enumerator.MoveNext() == false)
                {
                    throw new ParseException(ExpressionParserStrings.ResourceManager.GetString("ParsingError_UnterminatedCollectionLiteral", CultureInfo.InvariantCulture));
                }
            }
            if (queue.Count < minimumItems)
            {
                throw new NotImplementedException();
            }

            if (enumerator.Current.TokenType != endTokenType)
            {
                throw new NotImplementedException();
            }
            parsedNodes = queue;
            return(true);
        }
Ejemplo n.º 8
0
 private bool TryParseDictionaryItem(ILookaroundEnumerator <Token> enumerator, [NotNullWhen(true)] out DictionaryItemNode?dictionaryItem, AssignmentOperatorBehavior assignmentOperatorBehavior)
 {
     dictionaryItem = default;
     if (TryParse(enumerator, out var key, assignmentOperatorBehavior) == false || key == default)
     {
         return(false);
     }
     if (enumerator.MoveNext() == false)
     {
         throw new NotImplementedException();
     }
     if (enumerator.Current.TokenType != TokenType.Colon)
     {
         throw new NotImplementedException();
     }
     if (enumerator.MoveNext() == false)
     {
         throw new NotImplementedException();
     }
     if (TryParse(enumerator, out var value, assignmentOperatorBehavior) == false || value == default)
     {
         throw new NotImplementedException();
     }
     dictionaryItem = new DictionaryItemNode(key, value);
     return(true);
 }