Пример #1
0
        private void PassOperator(Lexema lexema)
        {
            while (PeekIsOperator())
            {
                var peek = shuntingMachine.Peek();

                bool lexemaIsUnar = lexema.Token == Token.Unar;
                bool peekIsUnar   = peek.Token == Token.Unar;

                var lexemaPriority = DefaultOperator.GetPriority(lexema.Represents, lexemaIsUnar);
                var peekPriority   = DefaultOperator.GetPriority(peek.Represents, peekIsUnar);
                var lexemaOrder    = DefaultOperator.GetAssociativity(lexema.Represents, lexemaIsUnar);
                var peekOrder      = DefaultOperator.GetAssociativity(peek.Represents, peekIsUnar);

                bool allowPass = lexemaOrder == Associativity.Left && lexemaPriority <= peekPriority ||
                                 lexemaOrder == Associativity.Right && lexemaPriority < peekPriority;

                if (allowPass)
                {
                    outSequence.Enqueue(shuntingMachine.Pop());
                }
                else
                {
                    break;
                }
            }

            shuntingMachine.Push(lexema);
        }
Пример #2
0
        private void ProcessNextToken()
        {
            foreach (var rule in lexica.Rules)
            {
                var matched = rule.Matcher.Match(current.ExpressionString);

                if (matched > 0)
                {
                    position += matched;

                    var matchedString = current.ExpressionString.Substring(0, matched);
                    var lexema        = new Lexema(matchedString, rule.Token)
                    {
                        Position = position
                    };

                    current.ExpressionString = current.ExpressionString.Substring(matched);
                    current.LexicalQueue.AddLast(lexema);

                    SwitchStateForReceived(lexema.Token);

                    ProcessNextToken();
                }
            }
        }
Пример #3
0
        private void PassOperand(Lexema lexema)
        {
            outSequence.Enqueue(lexema);

            if (wereArguments.Count != 0 && !wereArguments.Peek())
            {
                wereArguments.Pop();
                wereArguments.Push(true);
            }
        }
Пример #4
0
        private void PassFunction(Lexema lexema)
        {
            shuntingMachine.Push(lexema);

            var argsCount = MathWrapper.GetFunctorFor(lexema.Represents).ParamsCount;

            argumentsCountMachine.Push(argsCount);
            argumentsRecievedMachine.Push(0);

            if (wereArguments.Count != 0)
            {
                wereArguments.Pop();
                wereArguments.Push(true);
            }
            wereArguments.Push(false);
        }
Пример #5
0
        public Expression CreateCalculationStack()
        {
            variableToken       = inner.DequeueHead();
            assignOperatorToken = inner.DequeueHead();

            if (type == typeof(Iterator))
            {
                PresetIterator();
            }
            else
            {
                PresetVariable();
            }

            CreateAssignment();
            ShuntExpression();
            BuildExpression();

            return(result);
        }
Пример #6
0
 public static void EnqueueTail(this LinkedList <Lexema> list, Lexema lexema) =>
 list.AddLast(lexema);
Пример #7
0
 public static void EnqueueHead(this LinkedList <Lexema> list, Lexema lexema) =>
 list.AddFirst(lexema);