예제 #1
0
 public static VariableTerm ReduceVariable(VariableToken id, IOperandTerm p1, IOperandTerm p2, IOperandTerm p3)
 {
     IOperandTerm[] terms = null;
     IOperandTerm op1 = p1;
     IOperandTerm op2 = p2;
     IOperandTerm op3 = p3;
     //引数の推測
     if (id.IsCharacterData)
     {
         if (id.IsArray2D)
         {
             if ((op1 == null) || (op2 == null) || (op3 == null))
                 throw new CodeEE("キャラクタ二次元配列変数" + id.Name + "の引数は省略できません");
             terms = new IOperandTerm[3];
             terms[0] = op1;
             terms[1] = op2;
             terms[2] = op3;
         }
         else if (id.IsArray1D)
         {
             if (op3 != null)
                 throw new CodeEE("キャラクタ変数" + id.Name + "の引数が多すぎます");
             if (op2 == null)
             {
                 if (op1 == null)
                     op1 = ZeroTerm;
                 op2 = op1;
                 op1 = TARGET;
             }
             terms = new IOperandTerm[2];
             terms[0] = op1;
             terms[1] = op2;
         }
         else
         {
             if (op2 != null)
                 throw new CodeEE("一次元配列変数" + id.Name + "の引数が多すぎます");
             if (op1 == null)
                 op1 = TARGET;
             terms = new IOperandTerm[1];
             terms[0] = op1;
         }
     }
     else if (id.IsArray3D)
     {
         if ((op1 == null) || (op2 == null) || (op3 == null))
             throw new CodeEE("三次元配列変数" + id.Name + "の引数は省略できません");
         terms = new IOperandTerm[3];
         terms[0] = op1;
         terms[1] = op2;
         terms[2] = op3;
     }
     else if (id.IsArray2D)
     {
         if ((op1 == null) || (op2 == null))
             throw new CodeEE("二次元配列変数" + id.Name + "の引数は省略できません");
         if (op3 != null)
             throw new CodeEE("二次元配列" + id.Name + "の引数が多すぎます");
         terms = new IOperandTerm[2];
         terms[0] = op1;
         terms[1] = op2;
     }
     else if (id.IsArray1D)
     {
         if (op2 != null)
             throw new CodeEE("一次元配列変数" + id.Name + "の引数が多すぎます");
         if (op1 == null)
             op1 = ZeroTerm;
         terms = new IOperandTerm[1];
         terms[0] = op1;
     }
     else if (op1 != null)
     {
         throw new CodeEE("配列でない変数" + id.Name + "を引数付きで呼び出しています");
     }
     else
         terms = new IOperandTerm[0];
     for (int i = 0; i < terms.Length; i++)
         if (terms[i].IsString)
             terms[i] = new VariableStrArgTerm(id.Code, terms[i], i);
     return new VariableTerm(id, terms);
 }
예제 #2
0
        public static VariableTerm ReduceVariable(VariableToken id, IOperandTerm p1, IOperandTerm p2, IOperandTerm p3)
        {
            IOperandTerm[] terms = null;
            var            op1   = p1;
            var            op2   = p2;
            var            op3   = p3;

            //引数の推測
            if (id.IsCharacterData)
            {
                if (id.IsArray2D)
                {
                    if (op1 == null && op2 == null && op3 == null)
                    {
                        return(new VariableNoArgTerm(id));
                    }
                    if (op1 == null || op2 == null || op3 == null)
                    {
                        throw new CodeEE("キャラクタ二次元配列変数" + id.Name + "の引数は省略できません");
                    }
                    terms    = new IOperandTerm[3];
                    terms[0] = op1;
                    terms[1] = op2;
                    terms[2] = op3;
                }
                else if (id.IsArray1D)
                {
                    if (op3 != null)
                    {
                        throw new CodeEE("キャラクタ変数" + id.Name + "の引数が多すぎます");
                    }
                    if (op1 == null && op2 == null && op3 == null && Config.SystemNoTarget)
                    {
                        return(new VariableNoArgTerm(id));
                    }
                    if (op2 == null)
                    {
                        if (Config.SystemNoTarget)
                        {
                            throw new CodeEE("キャラクタ配列変数" + id.Name + "の引数は省略できません(コンフィグにより禁止が選択されています)");
                        }
                        if (op1 == null)
                        {
                            op2 = ZeroTerm;
                        }
                        else
                        {
                            op2 = op1;
                        }
                        op1 = TARGET;
                    }
                    terms    = new IOperandTerm[2];
                    terms[0] = op1;
                    terms[1] = op2;
                }
                else
                {
                    if (op2 != null)
                    {
                        throw new CodeEE("キャラクタ変数" + id.Name + "の引数が多すぎます");
                    }
                    if (op1 == null && op2 == null && op3 == null && Config.SystemNoTarget)
                    {
                        return(new VariableNoArgTerm(id));
                    }
                    if (op1 == null)
                    {
                        if (Config.SystemNoTarget)
                        {
                            throw new CodeEE("キャラクタ変数" + id.Name + "の引数は省略できません(コンフィグにより禁止が選択されています)");
                        }
                        op1 = TARGET;
                    }
                    terms    = new IOperandTerm[1];
                    terms[0] = op1;
                }
            }
            else if (id.IsArray3D)
            {
                if (op1 == null && op2 == null && op3 == null)
                {
                    return(new VariableNoArgTerm(id));
                }
                if (op1 == null || op2 == null || op3 == null)
                {
                    throw new CodeEE("三次元配列変数" + id.Name + "の引数は省略できません");
                }
                terms    = new IOperandTerm[3];
                terms[0] = op1;
                terms[1] = op2;
                terms[2] = op3;
            }
            else if (id.IsArray2D)
            {
                if (op1 == null && op2 == null && op3 == null)
                {
                    return(new VariableNoArgTerm(id));
                }
                if (op1 == null || op2 == null)
                {
                    throw new CodeEE("二次元配列変数" + id.Name + "の引数は省略できません");
                }
                if (op3 != null)
                {
                    throw new CodeEE("二次元配列" + id.Name + "の引数が多すぎます");
                }
                terms    = new IOperandTerm[2];
                terms[0] = op1;
                terms[1] = op2;
            }
            else if (id.IsArray1D)
            {
                if (op2 != null)
                {
                    throw new CodeEE("一次元配列変数" + id.Name + "の引数が多すぎます");
                }
                if (op1 == null)
                {
                    op1 = ZeroTerm;
                    if (!Config.CompatiRAND && id.Code == VariableCode.RAND)
                    {
                        throw new CodeEE("RANDの引数が省略されています");
                    }
                }
                if (!Config.CompatiRAND && op1 is SingleTerm && id.Code == VariableCode.RAND)
                {
                    if (((SingleTerm)op1).Int == 0)
                    {
                        throw new CodeEE("RANDの引数に0が与えられています");
                    }
                }
                terms    = new IOperandTerm[1];
                terms[0] = op1;
            }
            else if (op1 != null)
            {
                throw new CodeEE("配列でない変数" + id.Name + "を引数付きで呼び出しています");
            }
            else
            {
                terms = new IOperandTerm[0];
            }
            for (var i = 0; i < terms.Length; i++)
            {
                if (terms[i].IsString)
                {
                    terms[i] = new VariableStrArgTerm(id.Code, terms[i], i);
                }
            }
            return(new VariableTerm(id, terms));
        }