// FORMAT TO MATH MODEL PARSER
        public IExpressionType UnitImportFromFormatToModel(IFormat input, int listPosition)
        {
            Context ctx = Context.getInstance();

            ctx.getIn(input.getType().ToString() + listPosition); //спускаемся в контекст блока

            List <IExpressionType> unitExpressions = new List <IExpressionType>();

            for (int o = 0; o < input.getOperands().Count; o++) // преобразуем все выражения внутри блока
            {
                switch (input.getOperands()[o].getType())
                {
                case Types.FuncDefinition:
                case Types.WhileU:
                case Types.ConditionU:
                    unitExpressions.Add(UnitImportFromFormatToModel(input.getOperands()[o], o));
                    break;

                default:
                    unitExpressions.Add(ExpressionImportFromFormatToModel(input.getOperands()[o]));
                    break;
                }
            }

            // преобразуем выражение - условие
            IExpressionType options = null;

            if (input.getType() != Types.FuncDefinition)
            {
                options = input.getOptions() == null ? null : ExpressionImportFromFormatToModel(input.getOptions());
            }

            ctx.getOut();

            // построение самого блока
            switch (input.getType())
            {
            case Types.GlobalU:
                return(new GlobalUnit(unitExpressions, listPosition));

            case Types.WhileU:
                return(new WhileUnit(unitExpressions, options, listPosition));

            case Types.FuncDefinition:
                string name = input.getOptions().getOptions().getValue();

                List <Variable> lst = new List <Variable>();
                foreach (var v in input.getOptions().getOperands())
                {
                    lst.Add(new Variable(v.getValue()));
                }

                FunctionDefenition fd = new FunctionDefenition(unitExpressions, name, lst, listPosition);
                ctx.addFunction(name, ctx.getCurrPath(), fd);
                return(fd);

            default:
                throw new Exception("Error in importing" + input.getType());
            }
        }
        public IExpressionType ExpressionImportFromFormatToModel(IFormat expression)
        {
            List <IExpressionType> operands = new List <IExpressionType>();

            Context ctx = Context.getInstance();

            if (expression.getOperands() != null)
            {
                foreach (var operand in expression.getOperands())
                {
                    operands.Add(ExpressionImportFromFormatToModel(operand));
                }
            }

            switch (expression.getType())
            {
            case Types.Variable:
                Variable newVar = new Variable(expression.getValue());
                ctx.addVariable(newVar.getValue(), ctx.getCurrPath(), null);
                return(newVar);

            case Types.Number:
                return(new Number(Convert.ToDouble(expression.getValue())));

            case Types.VarDefinition:
                Equation ne = new Equation(operands, false);
                ctx.changeVariable(((Variable)operands[0]).getValue(), ctx.getCurrPath(), ne);
                return(ne);

            case Types.SuspendedVarDefinition:
                Equation nde = new Equation(operands, true);
                ctx.changeVariable(((Variable)operands[0]).getValue(), ctx.getCurrPath(), nde);
                return(nde);

            case Types.List:
                return(new MathList(operands));

            case Types.Interval:
                return(new Interval(operands));

            case Types.FuncExpression:
                return(new Function(expression.getType(), operands, expression.getOptions().getValue()));

            default:
                return(new Function(expression.getType(), operands, ""));
            }
        }
Пример #3
0
        private void toXml(XmlElement root, XmlDocument doc, IFormat el)
        {
            switch (el.getType())
            {
            case Types.VarDefinition:
            {
                XmlElement elem = doc.CreateElement("Equation");

                for (int i = 0; i < el.getOperands().Count; i++)
                {
                    toXml(elem, doc, el.getOperands()[i]);
                }

                root.AppendChild(elem);
                break;
            }

            case Types.Addition:
            {
                XmlElement elem = doc.CreateElement("Sum");

                for (int i = 0; i < el.getOperands().Count; i++)
                {
                    toXml(elem, doc, el.getOperands()[i]);
                }

                root.AppendChild(elem);
                break;
            }

            case Types.Multiplication:
            {
                XmlElement elem = doc.CreateElement("Mul");

                for (int i = 0; i < el.getOperands().Count; i++)
                {
                    toXml(elem, doc, el.getOperands()[i]);
                }

                root.AppendChild(elem);
                break;
            }

            case Types.Fraction:
            {
                XmlElement elem      = doc.CreateElement("Fraction");
                XmlElement numerator = doc.CreateElement("Numerator");
                toXml(numerator, doc, el.getOperands()[0]);
                XmlElement denumerator = doc.CreateElement("Denumerator");
                toXml(denumerator, doc, el.getOperands()[1]);

                elem.AppendChild(numerator);
                elem.AppendChild(denumerator);
                root.AppendChild(elem);
                break;
            }

            case Types.Power:
            {
                XmlElement elem      = doc.CreateElement("Power");
                XmlElement numerator = doc.CreateElement("Base");
                toXml(numerator, doc, el.getOperands()[0]);
                XmlElement denumerator = doc.CreateElement("Value");
                toXml(denumerator, doc, el.getOperands()[1]);

                elem.AppendChild(numerator);
                elem.AppendChild(denumerator);
                root.AppendChild(elem);
                break;
            }

            case Types.Root:
            {
                XmlElement elem      = doc.CreateElement("Sqrt");
                XmlElement numerator = doc.CreateElement("Base");
                toXml(numerator, doc, el.getOperands()[0]);
                XmlElement denumerator = doc.CreateElement("Value");
                toXml(denumerator, doc, el.getOperands()[1]);

                elem.AppendChild(numerator);
                elem.AppendChild(denumerator);
                root.AppendChild(elem);
                break;
            }

            case Types.Number:
            case Types.Variable:
            {
                XmlElement elem = doc.CreateElement("Operand");
                elem.InnerText = el.getValue();
                root.AppendChild(elem);
                break;
            }

            case Types.FuncDefinition:
                /*XmlElement elem1 = doc.CreateElement(el.getOperands()[0].getValue());
                 * for( int i=1; i< el.getOperands().Count; i++)
                 * {
                 *  toXml(elem1,doc,el.getOperands()[i]);
                 * }
                 * root.AppendChild(elem1);*/
                break;

            case Types.FuncExpression:
                XmlElement elem2 = doc.CreateElement(el.getOperands()[0].getValue());
                for (int i = 1; i < el.getOperands().Count; i++)
                {
                    toXml(elem2, doc, el.getOperands()[i]);
                }
                root.AppendChild(elem2);
                break;

            default: throw new Exception();
            }
        }