Exemplo n.º 1
0
        private bool IsInfixBinary(StringToken token, Operator[] possibleOperators)
        {
            if (!possibleOperators.Any(x => x.Fixity == Fixity.Infix && x.Arity == Arity.Binary))
            {
                return(false);
            }

            var isPrecededByCloseBracket = grammarService.ClosePriorityBracket.Denotations.Contains(token.Previous);
            var isFollowedByOpenBracket  = grammarService.OpenPriorityBracket.Denotations.Contains(token.Next);

            // like 5 + 2
            //        ^
            var isInfixBinaryCase1 = grammarService.IsOperand(token.Previous) && grammarService.IsOperand(token.Next);

            // like 5 + (2 + 3)
            //        ^
            var isInfixBinaryCase2 = grammarService.IsOperand(token.Previous) &&
                                     isFollowedByOpenBracket;

            // like (2 + 3) + 5
            //              ^
            var isInfixBinaryCase3 = isPrecededByCloseBracket &&
                                     grammarService.IsOperand(token.Next);

            // like 5! + 3
            //         ^
            var isInfixBinaryCase4 = grammarService.IsOperator(token.Previous) &&
                                     grammarService.IsOperand(token.Next) &&
                                     grammarService.IsUniqueByFixity(token.Previous, Fixity.Postfix);

            // like (1 + 2) + (3 + 4)
            //              ^
            var isInfixBinaryCase5 = isPrecededByCloseBracket &&
                                     grammarService.IsOperator(token.Current) &&
                                     isFollowedByOpenBracket;

            return(isInfixBinaryCase1 ||
                   isInfixBinaryCase2 ||
                   isInfixBinaryCase3 ||
                   isInfixBinaryCase4 ||
                   isInfixBinaryCase5);
        }