Exemplo n.º 1
0
        private CodePiece GenerateCode_Universal(CodeGenEnvironment env, bool reversed, LiteralArray value)
        {
            CodePiece p = new CodePiece();

            if (CodeDeclarationPos.IsSingleLine())
            {
                int varX = CodeDeclarationPos.X - 1;
                int varY = CodeDeclarationPos.Y;

                if (reversed)
                {
                    #region Reversed

                    // {...}{V5}{V4}{V3}{V2}{V1}0

                    p.AppendLeft(BCHelper.Digit0);

                    for (int i = 0; i < Size; i++)
                    {
                        p.AppendLeft(value.GenerateCode(env, i, reversed));
                        p.AppendLeft(NumberCodeHelper.GenerateCode(i + 1, reversed));
                    }

                    // ################################

                    //   >       v
                    // $_^#!:pY+X<
                    CodePiece op = new CodePiece();

                    op.AppendLeft(BCHelper.PCLeft);
                    op.AppendLeft(NumberCodeHelper.GenerateCode(varX, reversed));
                    op.AppendLeft(BCHelper.Add);
                    op.AppendLeft(NumberCodeHelper.GenerateCode(varY, reversed));
                    op.AppendLeft(BCHelper.ReflectSet);
                    op.AppendLeft(BCHelper.StackDup);
                    op.AppendLeft(BCHelper.Not);
                    op.AppendLeft(BCHelper.PCJump);
                    op.AppendLeft(BCHelper.PCUp);

                    op[-1, -1] = BCHelper.PCDown;
                    op.FillRowWw(-1, op.MinX + 1, -1);
                    op[op.MinX, -1] = BCHelper.PCRight;

                    op.AppendLeft(BCHelper.IfHorizontal);
                    op.AppendLeft(BCHelper.StackPop);

                    // ################################

                    p.AppendLeft(op);

                    #endregion
                }
                else
                {
                    #region Normal

                    p.AppendRight(BCHelper.Digit0);

                    for (int i = 0; i < Size; i++)
                    {
                        p.AppendRight(value.GenerateCode(env, i, reversed));
                        p.AppendRight(NumberCodeHelper.GenerateCode(i + 1, reversed));
                    }

                    // ################################

                    // >X+Yp:#v_$
                    // ^      <
                    CodePiece op = new CodePiece();

                    op.AppendRight(BCHelper.PCRight);
                    op.AppendRight(NumberCodeHelper.GenerateCode(varX, reversed));
                    op.AppendRight(BCHelper.Add);
                    op.AppendRight(NumberCodeHelper.GenerateCode(varY, reversed));
                    op.AppendRight(BCHelper.ReflectSet);
                    op.AppendRight(BCHelper.StackDup);
                    op.AppendRight(BCHelper.PCJump);
                    op.AppendRight(BCHelper.PCDown);

                    op[0, 1] = BCHelper.PCUp;
                    op.FillRowWw(1, 1, op.MaxX - 1);
                    op[op.MaxX - 1, 1] = BCHelper.PCLeft;

                    op.AppendRight(BCHelper.IfHorizontal);
                    op.AppendRight(BCHelper.StackPop);

                    // ################################

                    p.AppendRight(op);

                    #endregion
                }
            }
            else
            {
                #region Multiline

                for (int i = 0; i < Size; i++)
                {
                    p.Append(value.GenerateCode(env, i, reversed), reversed);
                    p.Append(NumberCodeHelper.GenerateCode(CodeDeclarationPos.X + (i % CodeDeclarationPos.Width), reversed), reversed);
                    p.Append(NumberCodeHelper.GenerateCode(CodeDeclarationPos.Y + (i / CodeDeclarationPos.Width), reversed), reversed);
                    p.Append(BCHelper.ReflectSet, reversed);
                }

                #endregion
            }

            p.NormalizeX();
            return(p);
        }
Exemplo n.º 2
0
        private CodePiece GenerateCode_Uniform(CodeGenEnvironment env, bool reversed, LiteralArray value)
        {
            CodePiece p = new CodePiece();

            if (CodeDeclarationPos.IsSingleLine())
            {
                int varXStart = CodeDeclarationPos.X;
                int varXEnd   = CodeDeclarationPos.X + Size - 1;
                int varY      = CodeDeclarationPos.Y;

                if (reversed)
                {
                    // $_v#!`\{X2}:p{Y}\{V}:<{X1}
                    //   >1+                ^

                    #region Reversed

                    p.AppendRight(BCHelper.StackPop);
                    p.AppendRight(BCHelper.IfHorizontal);

                    int botStart = p.MaxX;

                    p.AppendRight(BCHelper.PCDown);
                    p.AppendRight(BCHelper.PCJump);
                    p.AppendRight(BCHelper.Not);
                    p.AppendRight(BCHelper.GreaterThan);
                    p.AppendRight(BCHelper.StackSwap);
                    p.AppendRight(NumberCodeHelper.GenerateCode(varXEnd, reversed));
                    p.AppendRight(BCHelper.StackDup);
                    p.AppendRight(BCHelper.ReflectSet);
                    p.AppendRight(NumberCodeHelper.GenerateCode(varY, reversed));
                    p.AppendRight(BCHelper.StackSwap);
                    p.AppendRight(value.GenerateCode(env, 0, reversed));
                    p.AppendRight(BCHelper.StackDup);

                    int botEnd = p.MaxX;

                    p.AppendRight(BCHelper.PCLeft);
                    p.AppendRight(NumberCodeHelper.GenerateCode(varXStart, reversed));

                    p[botStart + 0, 1] = BCHelper.PCRight;
                    p[botStart + 1, 1] = BCHelper.Digit1;
                    p[botStart + 2, 1] = BCHelper.Add;

                    p.FillRowWw(1, botStart + 3, botEnd);

                    p[botEnd, 1] = BCHelper.PCUp;

                    #endregion
                }
                else
                {
                    // {X1}>:{V}\{Y}p:{X2}\`#v_$
                    //     ^+1               <

                    #region Normal

                    p.AppendRight(NumberCodeHelper.GenerateCode(varXStart, reversed));

                    int botStart = p.MaxX;

                    p.AppendRight(BCHelper.PCRight);
                    p.AppendRight(BCHelper.StackDup);
                    p.AppendRight(value.GenerateCode(env, 0, reversed));
                    p.AppendRight(BCHelper.StackSwap);
                    p.AppendRight(NumberCodeHelper.GenerateCode(varY, reversed));
                    p.AppendRight(BCHelper.ReflectSet);
                    p.AppendRight(BCHelper.StackDup);
                    p.AppendRight(NumberCodeHelper.GenerateCode(varXEnd, reversed));
                    p.AppendRight(BCHelper.StackSwap);
                    p.AppendRight(BCHelper.GreaterThan);
                    p.AppendRight(BCHelper.PCJump);

                    int botEnd = p.MaxX;

                    p.AppendRight(BCHelper.PCDown);
                    p.AppendRight(BCHelper.IfHorizontal);
                    p.AppendRight(BCHelper.StackPop);

                    p[botStart + 0, 1] = BCHelper.PCUp;
                    p[botStart + 1, 1] = BCHelper.Add;
                    p[botStart + 2, 1] = BCHelper.Digit1;

                    p.FillRowWw(1, botStart + 3, botEnd);

                    p[botEnd, 1] = BCHelper.PCLeft;

                    #endregion
                }
            }
            else
            {
                var pLast  = NumberCodeHelper.GenerateCode(CodeDeclarationPos.Size - 1, reversed);
                var pValue = value.GenerateCode(env, 0, reversed);
                var pX     = NumberCodeHelper.GenerateCode(CodeDeclarationPos.X, reversed);
                var pY     = NumberCodeHelper.GenerateCode(CodeDeclarationPos.Y, reversed);
                var pW     = NumberCodeHelper.GenerateCode(CodeDeclarationPos.Width, reversed);

                if (reversed)
                {
                    // $_v#!:p+/{W}\{Y}\+%{W}\{X}:\{V}:<{Last}
                    //   >                           1-^

                    #region Reversed

                    p[0, 0] = BCHelper.PCLeft;
                    p[0, 1] = BCHelper.PCUp;

                    p.AppendRight(pLast);

                    p.AppendLeft(BCHelper.StackDup);
                    p.AppendLeft(pValue);
                    p.AppendLeft(BCHelper.StackSwap);
                    p.AppendLeft(BCHelper.StackDup);
                    p.AppendLeft(pX);
                    p.AppendLeft(BCHelper.StackSwap);
                    p.AppendLeft(pW);
                    p.AppendLeft(BCHelper.Modulo);
                    p.AppendLeft(BCHelper.Add);
                    p.AppendLeft(BCHelper.StackSwap);
                    p.AppendLeft(pY);
                    p.AppendLeft(BCHelper.StackSwap);
                    p.AppendLeft(pW);
                    p.AppendLeft(BCHelper.Div);
                    p.AppendLeft(BCHelper.Add);
                    p.AppendLeft(BCHelper.ReflectSet);
                    p.AppendLeft(BCHelper.StackDup);
                    p.AppendLeft(BCHelper.Not);
                    p.AppendLeft(BCHelper.PCJump);
                    p.AppendLeft(BCHelper.PCDown);

                    p[-1, 1] = BCHelper.Sub;
                    p[-2, 1] = BCHelper.Digit1;

                    p.CreateRowWw(1, p.MinX + 1, -2);
                    p[p.MinX, 1] = BCHelper.PCRight;

                    p.AppendLeft(BCHelper.IfHorizontal);
                    p.AppendLeft(BCHelper.StackPop);

                    #endregion
                }
                else
                {
                    // {Last}>:{V}\:{X}\{W}%+\{Y}\{W}/+p:#v_$
                    //       ^-1                          <

                    #region Normal

                    p[0, 0] = BCHelper.PCRight;
                    p[0, 1] = BCHelper.PCUp;

                    p.AppendLeft(pLast);

                    p.AppendRight(BCHelper.StackDup);
                    p.AppendRight(pValue);
                    p.AppendRight(BCHelper.StackSwap);
                    p.AppendRight(BCHelper.StackDup);
                    p.AppendRight(pX);
                    p.AppendRight(BCHelper.StackSwap);
                    p.AppendRight(pW);
                    p.AppendRight(BCHelper.Modulo);
                    p.AppendRight(BCHelper.Add);
                    p.AppendRight(BCHelper.StackSwap);
                    p.AppendRight(pY);
                    p.AppendRight(BCHelper.StackSwap);
                    p.AppendRight(pW);
                    p.AppendRight(BCHelper.Div);
                    p.AppendRight(BCHelper.Add);
                    p.AppendRight(BCHelper.ReflectSet);
                    p.AppendRight(BCHelper.StackDup);
                    p.AppendRight(BCHelper.PCJump);
                    p.AppendRight(BCHelper.PCDown);

                    p[1, 1] = BCHelper.Sub;
                    p[2, 1] = BCHelper.Digit1;

                    p.CreateRowWw(1, 3, p.MaxX - 1);
                    p[p.MaxX - 1, 1] = BCHelper.PCLeft;

                    p.AppendRight(BCHelper.IfHorizontal);
                    p.AppendRight(BCHelper.StackPop);

                    #endregion
                }
            }

            p.NormalizeX();
            return(p);
        }