//以下添え字解析用の追加関数 public bool checkSameTerm(VariableTerm term) { //添え字が全部定数があることがこの関数の前提(そもそもそうでないと使い道がない) if (!allArgIsConst) { return(false); } if (Identifier.Name != term.Identifier.Name) { return(false); } for (var i = 0; i < transporter.Length; i++) { if (transporter[i] != term.transporter[i]) { return(false); } } return(true); }
public SpVarSetArgument(VariableTerm var, IOperandTerm termSrc, IOperandTerm start, IOperandTerm end) { VariableDest = var; Term = termSrc; Start = start; End = end; }
public SpTimesArgument(VariableTerm var, double d) { VariableDest = var; DoubleValue = d; }
public SpSwapVarArgument(VariableTerm v1, VariableTerm v2) { var1 = v1; var2 = v2; }
public PrintDataArgument(VariableTerm var) { Var = var; }
public UserDefinedFunctionArgument(IOperandTerm[] srcArgs, VariableTerm[] destArgs) { Arguments = srcArgs; TransporterInt = new Int64[Arguments.Length]; TransporterStr = new string[Arguments.Length]; TransporterRef = new Array[Arguments.Length]; isRef = new bool[Arguments.Length]; for (int i = 0; i < Arguments.Length; i++) { isRef[i] = destArgs[i].Identifier.IsReference; } }
public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm) { VariableTerm varTerm = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("NO"), new IOperandTerm[] { new SingleTerm(0) }); SortOrder order = SortOrder.ASCENDING; WordCollection wc = popWords(line); IdentifierWord id = wc.Current as IdentifierWord; if (wc.EOL) { return new SpSortcharaArgument(varTerm, order); } if ((id != null) && (id.Code.Equals("FORWARD", Config.SCVariable) || (id.Code.Equals("BACK", Config.SCVariable)))) { if (id.Code.Equals("BACK", Config.SCVariable)) order = SortOrder.DESENDING; wc.ShiftNext(); if (!wc.EOL) warn("引数が多すぎます", line, 1, false); } else { IOperandTerm term = ExpressionParser.ReduceExpressionTerm(wc, TermEndWith.Comma); if (term == null) { warn("書式が間違っています", line, 2, false); return null; } varTerm = term.Restructure(exm) as VariableTerm; if (varTerm == null) { warn("第1引数に変数以外を指定することはできません", line, 2, false); return null; } else if (!varTerm.Identifier.IsCharacterData) { warn("第1引数はキャラクタ変数でなければなりません", line, 2, false); return null; } wc.ShiftNext(); if (!wc.EOL) { id = wc.Current as IdentifierWord; if ((id != null) && (id.Code.Equals("FORWARD", Config.SCVariable) || (id.Code.Equals("BACK", Config.SCVariable)))) { if (id.Code.Equals("BACK", Config.SCVariable)) order = SortOrder.DESENDING; wc.ShiftNext(); if (!wc.EOL) warn("引数が多すぎます", line, 1, false); } else { warn("書式が間違っています", line, 2, false); return null; } } } return new SpSortcharaArgument(varTerm, order); }
public SpGetIntArgument(VariableTerm var) { VarToken = var; }
public SpPowerArgument(VariableTerm var, IOperandTerm x, IOperandTerm y) { VariableDest = var; X = x; Y = y; }
public SpForNextArgment(VariableTerm var, IOperandTerm start, IOperandTerm end, IOperandTerm step) { this.Cnt = var; this.Start = start; this.End = end; this.Step = step; }
public BitArgument(VariableTerm var, IOperandTerm[] termSrc) { VariableDest = var; Term = termSrc; }
public SpArraySortArgument(VariableTerm var, SortOrder order, IOperandTerm num1, IOperandTerm num2) { VarToken = var; Order = order; Num1 = num1; Num2 = num2; }
public SpArrayShiftArgument(VariableTerm var, IOperandTerm num1, IOperandTerm num2, IOperandTerm num3, IOperandTerm num4) { VarToken = var; Num1 = num1; Num2 = num2; Num3 = num3; Num4 = num4; }
public SpArrayControlArgument(VariableTerm var, IOperandTerm num1, IOperandTerm num2) { VarToken = var; Num1 = num1; Num2 = num2; }
public static void Initialize() { formatCurlyBrace = new FormatCurlyBrace(); formatPercent = new FormatPercent(); formatYenAt = new FormatYenAt(); VariableToken nameID = GlobalStatic.VariableData.GetSystemVariableToken("NAME"); VariableToken callnameID = GlobalStatic.VariableData.GetSystemVariableToken("CALLNAME"); IOperandTerm[] zeroArg = new IOperandTerm[] { new SingleTerm(0) }; VariableTerm target = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("TARGET"), zeroArg); VariableTerm master = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("MASTER"), zeroArg); VariableTerm player = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("PLAYER"), zeroArg); VariableTerm assi = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("ASSI"), zeroArg); VariableTerm nametarget = new VariableTerm(nameID, new IOperandTerm[] { target }); VariableTerm callnamemaster = new VariableTerm(callnameID, new IOperandTerm[] { master }); VariableTerm callnameplayer = new VariableTerm(callnameID, new IOperandTerm[] { player }); VariableTerm nameassi = new VariableTerm(nameID, new IOperandTerm[] { assi }); VariableTerm callnametarget = new VariableTerm(callnameID, new IOperandTerm[] { target }); NameTarget = new FunctionMethodTerm(formatPercent, new IOperandTerm[] { nametarget, null, null }); CallnameMaster = new FunctionMethodTerm(formatPercent, new IOperandTerm[] { callnamemaster, null, null }); CallnamePlayer = new FunctionMethodTerm(formatPercent, new IOperandTerm[] { callnameplayer, null, null }); NameAssi = new FunctionMethodTerm(formatPercent, new IOperandTerm[] { nameassi, null, null }); CallnameTarget = new FunctionMethodTerm(formatPercent, new IOperandTerm[] { callnametarget, null, null }); }
public SpSetArgument(VariableTerm var, IOperandTerm termSrc) { VariableDest = var; Term = termSrc; }
private void parseLabel(FunctionLabelLine label) { WordCollection wc = label.PopRowArgs(); string errMes = null; SingleTerm[] subNames = new SingleTerm[0]; VariableTerm[] args = new VariableTerm[0]; SingleTerm[] defs = new SingleTerm[0]; int maxArg = -1; int maxArgs = -1; //1807 非イベント関数のシステム関数については警告レベル低下&エラー解除&引数を設定するように。 if (label.IsEvent) { if (!wc.EOL) ParserMediator.Warn("イベント関数@" + label.LabelName + " に引数は設定できません", label, 2, true, false); //label.SubNames = subNames; label.Arg = args; label.Def = defs; label.ArgLength = -1; label.ArgsLength = -1; return; } if (!wc.EOL) { if (label.IsSystem) ParserMediator.Warn("システム関数@" + label.LabelName + " に引数が設定されています", label, 1, false, false); SymbolWord symbol = wc.Current as SymbolWord; wc.ShiftNext(); if (symbol == null) { errMes = "引数の書式が間違っています"; goto err; } if (symbol.Type == '[') { IOperandTerm[] subNamesRow = ExpressionParser.ReduceArguments(wc, ArgsEndWith.RightBracket, false); if (subNamesRow.Length == 0) { errMes = "関数定義の[]内の引数は空にできません"; goto err; } subNames = new SingleTerm[subNamesRow.Length]; for (int i = 0; i < subNamesRow.Length; i++) { if (subNamesRow[i] == null) { errMes = "関数定義の引数は省略できません"; goto err; } IOperandTerm term = subNamesRow[i].Restructure(exm); subNames[i] = term as SingleTerm; if (subNames[i] == null) { errMes = "関数定義の[]内の引数は定数のみ指定できます"; goto err; } } symbol = wc.Current as SymbolWord; if ((!wc.EOL) && (symbol == null)) { errMes = "引数の書式が間違っています"; goto err; } wc.ShiftNext(); } if (!wc.EOL) { IOperandTerm[] argsRow = null; if (symbol.Type == ',') argsRow = ExpressionParser.ReduceArguments(wc, ArgsEndWith.EoL, true); else if (symbol.Type == '(') argsRow = ExpressionParser.ReduceArguments(wc, ArgsEndWith.RightParenthesis, true); else { errMes = "引数の書式が間違っています"; goto err; } int length = argsRow.Length / 2; args = new VariableTerm[length]; defs = new SingleTerm[length]; for (int i = 0; i < length; i++) { VariableTerm vTerm = null; SingleTerm def = null; IOperandTerm term = argsRow[i * 2]; //引数読み取り時点で判別されないといけない //if (term == null) //{ errMes = "関数定義の引数は省略できません"; goto err; } vTerm = term.Restructure(exm) as VariableTerm; if ((vTerm == null) || (vTerm.Identifier.Readonly)) { errMes = "関数定義の引数には代入可能な変数を指定してください"; goto err; } else if (!vTerm.isAllConst) { errMes = "関数定義の引数の添え字には定数を指定してください"; goto err; } if (vTerm.Identifier.Code == VariableCode.ARG) { if (maxArg < vTerm.getEl1forArg + 1) maxArg = vTerm.getEl1forArg + 1; } else if (vTerm.Identifier.Code == VariableCode.ARGS) { if (maxArgs < vTerm.getEl1forArg + 1) maxArgs = vTerm.getEl1forArg + 1; } bool canDef = (vTerm.Identifier.Code == VariableCode.ARG || vTerm.Identifier.Code == VariableCode.ARGS || vTerm.Identifier.IsPrivate); term = argsRow[i * 2 + 1]; if (term is NullTerm) { if (canDef)// && label.ArgOptional) { if (vTerm.GetOperandType() == typeof(Int64)) def = new SingleTerm(0); else def = new SingleTerm(""); } } else { def = term.Restructure(exm) as SingleTerm; if (def == null) { errMes = "引数の初期値には定数のみを指定できます"; goto err; } if (!canDef) { errMes = "引数の初期値を定義できるのは\"ARG\"、\"ARGS\"またはプライベート変数のみです"; goto err; } else if (vTerm.Identifier.IsReference) { errMes = "参照渡しの引数に初期値は定義できません"; goto err; } if (vTerm.GetOperandType() != def.GetOperandType()) { errMes = "引数の型と初期値の型が一致していません"; goto err; } } args[i] = vTerm; defs[i] = def; } } } if (!wc.EOL) { errMes = "引数の書式が間違っています"; goto err; } //label.SubNames = subNames; label.Arg = args; label.Def = defs; label.ArgLength = maxArg; label.ArgsLength = maxArgs; return; err: ParserMediator.Warn("関数@" + label.LabelName + " の引数のエラー:" + errMes, label, 2, true, false); return; }
public SpSetArrayArgument(VariableTerm var, IOperandTerm[] termList, Int64[] constList) { VariableDest = var; TermList = termList; ConstTermList = constList; }
public static void Initialize() { ZeroTerm = new SingleTerm(0); IOperandTerm[] zeroArgs = { ZeroTerm }; TARGET = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("TARGET"), zeroArgs); }
public SpSortcharaArgument(VariableTerm var, SortOrder order) { SortKey = var; SortOrder = order; }
public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm) { IOperandTerm[] terms = popTerms(line); if (!checkArgumentType(line, exm, terms)) return null; IOperandTerm term = null; if (terms.Length == 0) { term = new SingleTerm(0); if (!nullable) { if (line.Function.IsExtended()) warn("省略できない引数が省略されています。Emueraは0を補います", line, 1, false); else warn("省略できない引数が省略されています。Emueraは0を補いますがeramakerの動作は不定です", line, 1, false); } } else { term = terms[0]; } if (line.FunctionCode == FunctionCode.REPEAT) { if ((term is SingleTerm) && (term.GetIntValue(null) <= 0L)) { warn("0回以下のREPEATです。(eramakerではエラーになります)", line, 0, true); } VariableToken count = GlobalStatic.VariableData.GetSystemVariableToken("COUNT"); VariableTerm repCount = new VariableTerm(count, new IOperandTerm[] { new SingleTerm(0) }); repCount.Restructure(exm); return new SpForNextArgment(repCount, new SingleTerm(0), term, new SingleTerm(1)); } ExpressionArgument ret = new ExpressionArgument(term); if (term is SingleTerm) { Int64 i = term.GetIntValue(null); ret.ConstInt = i; ret.IsConst = true; if (line.FunctionCode == FunctionCode.CLEARLINE) { if (i <= 0L) warn("引数に0以下の値が渡されています(この行は何もしません)", line, 1, false); } else if (line.FunctionCode == FunctionCode.FONTSTYLE) { if (i < 0L) warn("引数に負の値が渡されています(結果は不定です)", line, 1, false); } } return ret; }
public SpSplitArgument(IOperandTerm s1, IOperandTerm s2, VariableToken varId, VariableTerm num) { TargetStr = s1; Split = s2; Var = varId; Num = num; }
public static void Initialize() { ZeroTerm = new SingleTerm(0); IOperandTerm[] zeroArgs = new IOperandTerm[] { ZeroTerm }; TARGET = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("TARGET"), zeroArgs); }
public PlayMusicArguments(VariableTerm var, IOperandTerm start, IOperandTerm end, IOperandTerm step) { this.Cnt = var; this.Start = start; this.End = end; this.Step = step; }