Пример #1
0
        private IokeObject ParseMessageChain()
        {
            top = new ChainContext(top);
            while (ParseMessage())
            {
                ;
            }
            top.PopOperatorsTo(999999);
            IokeObject ret = top.Pop();

            top = top.parent;
            return(ret);
        }
Пример #2
0
        private void PossibleOperator(IokeObject mx)
        {
            string name = Message.GetName(mx);

            if (IsUnary(name) || onlyUnaryOperators.Contains(name))
            {
                top.Add(mx);
                top.Push(-1, mx, Level.Type.UNARY);
                return;
            }

            if (operatorTable.ContainsKey(name))
            {
                var op = operatorTable[name];
                top.PopOperatorsTo(op.precedence);
                top.Add(mx);
                top.Push(op.precedence, mx, Level.Type.REGULAR);
            }
            else
            {
                if (trinaryOperatorTable.ContainsKey(name))
                {
                    var opa = trinaryOperatorTable[name];
                    if (opa.arity == 2)
                    {
                        IokeObject last = top.PrepareAssignmentMessage();
                        mx.Arguments.Add(last);
                        top.Add(mx);
                        top.Push(13, mx, Level.Type.ASSIGNMENT);
                    }
                    else
                    {
                        IokeObject last = top.PrepareAssignmentMessage();
                        mx.Arguments.Add(last);
                        top.Add(mx);
                    }
                }
                else
                {
                    if (invertedOperatorTable.ContainsKey(name))
                    {
                        var op = invertedOperatorTable[name];
                        top.PopOperatorsTo(op.precedence);
                        top.Add(mx);
                        top.Push(op.precedence, mx, Level.Type.INVERTED);
                    }
                    else
                    {
                        int possible = PossibleOperatorPrecedence(name);
                        if (possible != -1)
                        {
                            top.PopOperatorsTo(possible);
                            top.Add(mx);
                            top.Push(possible, mx, Level.Type.REGULAR);
                        }
                        else
                        {
                            top.Add(mx);
                        }
                    }
                }
            }
        }