Example #1
0
 public static IPyValue FindIncrement(PyVariableExpression controlVariable, IPyStatement statement)
 {
     if (statement is PyExpressionStatement expressionStatement)
     {
         return(FindIncrement(controlVariable, expressionStatement.Expression));
     }
     return(null);
 }
Example #2
0
 /// <summary>
 ///     Tworzy instancję obiektu
 ///     <param name="initVariables"></param>
 ///     <param name="condition"></param>
 ///     <param name="statement"></param>
 ///     <param name="incrementors"></param>
 /// </summary>
 public PyForStatement(PyAssignExpression[] initVariables, IPyValue condition, IPyStatement statement,
                       IPyStatement[]                          incrementors)
 {
     InitVariables = initVariables;
     Condition     = condition;
     Statement     = statement;
     Incrementors  = incrementors;
 }
Example #3
0
 /// <summary>
 ///     Tworzy instancję obiektu
 ///     <param name="keyVarname"></param>
 ///     <param name="valueVarname"></param>
 ///     <param name="collection"></param>
 ///     <param name="statement"></param>
 /// </summary>
 public PyForEachStatement(string keyVarname, string valueVarname, IPyValue collection,
                           IPyStatement statement)
 {
     KeyVarname   = keyVarname;
     ValueVarname = valueVarname;
     Collection   = collection;
     Statement    = statement;
 }
Example #4
0
        public static PyCodeBlock Bound(IPyStatement s)
        {
            if (s is PyCodeBlock)
            {
                return(s as PyCodeBlock);
            }
            var g = new PyCodeBlock();

            g.Statements.Add(s);
            return(g);
        }
Example #5
0
        public static IPyStatement Reduce(IPyStatement x)
        {
            if (x == null)
            {
                return(x);
            }
            if (x is PyCodeBlock)
            {
                var src = x as PyCodeBlock;
                if (src.Statements.Count == 0)
                {
                    return(null);
                }
                if (src.Statements.Count > 1)
                {
                    return(x);
                }
                return(Reduce(src.Statements[0]));
            }

            return(x);
        }
Example #6
0
        // Public Methods 

        public static bool HasAny(IPyStatement x)
        {
            if (x == null)
            {
                return(false);
            }
            if (x is PyCodeBlock)
            {
                var src = x as PyCodeBlock;
                if (src.Statements.Count == 0)
                {
                    return(false);
                }
                if (src.Statements.Count > 1)
                {
                    return(true);
                }
                return(HasAny(src.Statements[0]));
            }

            return(true);
        }
Example #7
0
 public PyCodeBlock(IPyStatement other)
 {
     Statements.Add(other);
 }
Example #8
0
        /// <summary>
        ///     try to resolve simple case like for(int i=0; i<10; i++)
        /// </summary>
        private static IPyStatement[] TrySimpleForLoop(
            PyAssignExpression[] pyDeclarations,
            IPyStatement[]       incrementors,
            IPyValue condition,
            IPyStatement statement)
        {
            if (pyDeclarations.Length != 1 || incrementors.Length != 1)
            {
                return(null);
            }
            var dec = pyDeclarations[0];

            if (!(dec.Left is PyVariableExpression controlVariable))
            {
                return(null);
            }
            if (!(condition is PyBinaryOperatorExpression binCondition))
            {
                return(null);
            }
            binCondition = VariableOnLeft(binCondition, controlVariable.VariableName);

            var loopIncrement = FindIncrement(controlVariable, incrementors[0]);

            if (loopIncrement == null)
            {
                return(null);
            }

            var loopStart = pyDeclarations[0].Right;

            IPyStatement[] Q(object incrementValue)
            {
                var range          = new PyMethodCallExpression("range");
                var isOneIncrement = ValueHelper.EqualsNumericOne(incrementValue) ?? false;

                if (!IsConstZero(loopStart) || !isOneIncrement)
                {
                    range.Arguments.Add(new PyMethodInvokeValue(loopStart));
                }
                range.Arguments.Add(new PyMethodInvokeValue(binCondition.Right));
                if (!isOneIncrement)
                {
                    range.Arguments.Add(
                        new PyMethodInvokeValue(new PyConstValue(incrementValue)));
                }
                var foreachStatement =
                    new PyForEachStatement(controlVariable.VariableName, range, statement);

                return(new IPyStatement[] { foreachStatement });
            }

            if (loopIncrement is PyConstValue constLoopIncrement)
            {
                switch (binCondition.Operator)
                {
                case "<":
                {
                    if (ValueHelper.IsGreaterThanZero(constLoopIncrement.Value) ?? false)
                    {
                        return(Q(constLoopIncrement.Value));
                    }
                }
                break;

                case ">":
                {
                    if (ValueHelper.IsLowerThanZero(constLoopIncrement.Value) ?? false)
                    {
                        return(Q(constLoopIncrement.Value));
                    }
                }
                break;
                }
            }
            var result = new PyForStatement(pyDeclarations.ToArray(), condition, statement, incrementors);

            return(new IPyStatement[] { result });
        }
Example #9
0
 /// <summary>
 ///     Tworzy instancję obiektu
 ///     <param name="condition"></param>
 ///     <param name="statement"></param>
 /// </summary>
 public PyWhileStatement(IPyValue condition, IPyStatement statement)
 {
     Condition = condition;
     Statement = statement;
 }
Example #10
0
        // Protected Methods 

        protected void EmitHeaderStatement(PySourceCodeEmiter emiter, PySourceCodeWriter writer, PyEmitStyle style, string header, IPyStatement statement)
        {
            style = style ?? new PyEmitStyle();
            var iStyle = PyEmitStyle.xClone(style, ShowBracketsEnum.IfManyItems);

            if (style.UseBracketsEvenIfNotNecessary)
            {
                iStyle.Brackets = ShowBracketsEnum.Always;
            }

            var statementToEmit = PyCodeBlock.Reduce(statement);
            var emptyStatement  = !PyCodeBlock.HasAny(statementToEmit);


            if (emptyStatement)
            {
                header += "{}";
            }
            if (style.Compression == EmitStyleCompression.NearCrypto)
            {
                writer.Write(header);
            }
            else
            {
                writer.WriteLn(header);
            }
            if (emptyStatement)
            {
                return;
            }


            var myBracket = style.UseBracketsEvenIfNotNecessary;

            if (!myBracket)
            {
                var gf = statementToEmit.GetStatementEmitInfo(iStyle);
                if (gf != StatementEmitInfo.NormalSingleStatement)
                {
                    myBracket = true;
                }
            }
            writer.IncIndent();
            if (myBracket)
            {
                iStyle.Brackets = ShowBracketsEnum.Never;
                writer.OpenLn("{");
            }


            statementToEmit.Emit(emiter, writer, iStyle);
            if (myBracket)
            {
                writer.CloseLn("}");
            }

            writer.DecIndent();
        }
Example #11
0
 private static IPyStatement[] MkArray(IPyStatement x)
 {
     return(new[] { x });
 }
Example #12
0
 /// <summary>
 ///     Tworzy instancję obiektu
 ///     <param name="condition"></param>
 ///     <param name="ifTrue"></param>
 ///     <param name="ifFalse"></param>
 /// </summary>
 public PyIfStatement(IPyValue condition, IPyStatement ifTrue, IPyStatement ifFalse)
 {
     Condition = condition;
     IfTrue    = ifTrue;
     IfFalse   = ifFalse;
 }