Ejemplo n.º 1
0
        public override void EnterArray(FlyParser.ArrayContext context)
        {
            if (context.var != null)
            {
                var hasEnd = context.spliceEnd != null;
                Code.Instructions.Add(OpCode.GET_VAR);
                var varName = context.var.Text;
                Code.Instructions.AddInt(Code.Instructions.AddString(varName));
                EnterExpression(context.spliceStart);
                if (hasEnd)
                {
                    EnterExpression(context.spliceEnd);
                }
                else
                {
                    Code.Instructions.Add(OpCode.GET_VAR);
                    Code.Instructions.AddInt(Code.Instructions.AddString(varName));
                    Code.Instructions.Add(OpCode.SUB_I1);
                }

                Code.Instructions.Add(OpCode.ARRAY_SPLICE);
            }
            else
            {
                var big         = context.size != null;
                var expressions = context._items;
                if (big)
                {
                    EnterExpression(context.addSize);
                    EnterExpression(context.size);
                    Code.Instructions.Add(OpCode.ARRAY_ADD_BIG);
                }
                else if (expressions.Count > 0)
                {
                    Code.Instructions.Add(OpCode.ARRAY_ADD_W_SIZE);
                    Code.Instructions.AddInt(expressions.Count);
                }
                else
                {
                    Code.Instructions.Add(OpCode.ARRAY_ADD);
                }

                for (int i = 0; i < expressions.Count; i++)
                {
                    Code.Instructions.Add(OpCode.CLONE);
                    EnterExpression(context.expression(i));
                    Code.Instructions.Add(OpCode.ARRAY_PUSH);
                }
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="FlyParser.array"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitArray([NotNull] FlyParser.ArrayContext context)
 {
 }