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); }
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)); }