public SpVarSetArgument(VariableTerm var, IOperandTerm termSrc, IOperandTerm start, IOperandTerm end) { VariableDest = var; Term = termSrc; Start = start; End = end; }
public SpSplitArgument(IOperandTerm s1, IOperandTerm s2, VariableToken varId, VariableTerm num) { TargetStr = s1; Split = s2; Var = varId; Num = num; }
public SpForNextArgment(VariableTerm var, IOperandTerm start, IOperandTerm end, IOperandTerm step) { this.Cnt = var; this.Start = start; this.End = end; this.Step = step; }
public VariableStrArgTerm(VariableCode code, IOperandTerm strTerm, int index) : base(typeof(long)) { this.strTerm = strTerm; parentCode = code; this.index = index; }
public SpForNextArgment(VariableTerm var, IOperandTerm start, IOperandTerm end, IOperandTerm step) { Cnt = var; Start = start; End = end; Step = step; }
public SpArraySortArgument(VariableTerm var, SortOrder order, IOperandTerm num1, IOperandTerm num2) { VarToken = var; Order = order; Num1 = num1; Num2 = num2; }
static FunctionMethodTerm CallnameTarget = null; // "$$$" 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 }); }
private string getValueString(string str) { if ((emuera == null) || (GlobalStatic.EMediator == null)) { return(""); } if (string.IsNullOrEmpty(str)) { return(""); } mainConsole.RunERBFromMemory = true; try { StringStream st = new StringStream(str); WordCollection wc = LexicalAnalyzer.Analyse(st, LexEndWith.EoL, LexAnalyzeFlag.None); IOperandTerm term = ExpressionParser.ReduceExpressionTerm(wc, TermEndWith.EoL); SingleTerm value = term.GetValue(GlobalStatic.EMediator); return(value.ToString()); } catch (CodeEE e) { return(e.Message); } catch (Exception e) { return(e.GetType().ToString() + ":" + e.Message); } finally { mainConsole.RunERBFromMemory = false; } }
public SpTInputsArgument(IOperandTerm time, IOperandTerm def, IOperandTerm disp, IOperandTerm timeout) { Time = time; Def = def; Disp = disp; Timeout = timeout; }
public SpArrayShiftArgument(VariableTerm var, IOperandTerm num1, IOperandTerm num2, IOperandTerm num3, IOperandTerm num4) { VarToken = var; Num1 = num1; Num2 = num2; Num3 = num3; Num4 = num4; }
public virtual void SetValue(IOperandTerm value, ExpressionMediator exm) { if (Identifier.VariableType == typeof(long)) { SetValue(value.GetIntValue(exm), exm); } else { SetValue(value.GetStrValue(exm), exm); } }
public override IOperandTerm Restructure(ExpressionMediator exm) { if (dic == null) { dic = exm.VEvaluator.Constant.GetKeywordDictionary(out errPos, parentCode, index); } strTerm = strTerm.Restructure(exm); if (!(strTerm is SingleTerm)) { return(this); } return(new SingleTerm(GetIntValue(exm))); }
///// <summary> ///// まだ最初の識別子を読んでいない状態から決め打ちで変数を解読する ///// </summary> ///// <param name="st"></param> ///// <returns></returns> //public static VariableTerm ReduceVariable(WordCollection wc) //{ // IdentifierWord id = wc.Current as IdentifierWord; // if (id == null) // return null; // wc.ShiftNext(); // VariableToken vid = ExpressionParser.ReduceVariableIdentifier(wc, id.Code); // if (vid == null) // throw new CodeEE("\"" + id.Code + "\"は解釈できない識別子です"); // return ReduceVariable(vid, wc); //} /// <summary> /// 識別子を読み終えた状態からの解析 /// </summary> /// <param name="st"></param> /// <returns></returns> public static VariableTerm ReduceVariable(VariableToken id, WordCollection wc) { IOperandTerm operand = null; IOperandTerm op1 = null; IOperandTerm op2 = null; IOperandTerm op3 = null; var i = 0; while (true) { if (wc.Current.Type != ':') { break; } if (i >= 3) { throw new CodeEE(id.Code + "の引数が多すぎます"); } wc.ShiftNext(); operand = ExpressionParser.ReduceVariableArgument(wc, id.Code); if (i == 0) { op1 = operand; } else if (i == 1) { op2 = operand; } else if (i == 2) { op3 = operand; } i++; } return(ReduceVariable(id, op1, op2, op3)); }
public SpSaveVarArgument(IOperandTerm term, IOperandTerm mes, VariableToken[] varTokens) { Term = term; SavMes = mes; VarTokens = varTokens; }
public IOperandTerm GetFunctionMethod(LabelDictionary labelDic, string codeStr, IOperandTerm[] arguments, bool userDefinedOnly) { if (Config.ICFunction) { codeStr = codeStr.ToUpper(); } if (arguments == null) //引数なし、名前のみの探索 { if (refmethodDic.ContainsKey(codeStr)) { return(new UserDefinedRefMethodNoArgTerm(refmethodDic[codeStr])); } return(null); } if ((labelDic != null) && (labelDic.Initialized)) { if (refmethodDic.ContainsKey(codeStr)) { return(new UserDefinedRefMethodTerm(refmethodDic[codeStr], arguments)); } FunctionLabelLine func = labelDic.GetNonEventLabel(codeStr); if (func != null) { if (userDefinedOnly && !func.IsMethod) { throw new CodeEE("#FUNCTIONが指定されていない関数\"@" + func.LabelName + "\"をCALLF系命令で呼び出そうとしました"); } if (func.IsMethod) { string errMes; IOperandTerm ret = UserDefinedMethodTerm.Create(func, arguments, out errMes); if (ret == null) { throw new CodeEE(errMes); } return(ret); } //1.721 #FUNCTIONが定義されていない関数は組み込み関数を上書きしない方向に。 PANCTION.ERBのRANDとか。 if (!methodDic.ContainsKey(codeStr)) { throw new CodeEE("#FUNCTIONが定義されていない関数(" + func.Position.Filename + ":" + func.Position.LineNo + "行目)を式中で呼び出そうとしました"); } } } if (userDefinedOnly) { return(null); } FunctionMethod method = null; if (!methodDic.TryGetValue(codeStr, out method)) { return(null); } string errmes = method.CheckArgumentType(codeStr, arguments); if (errmes != null) { throw new CodeEE(errmes); } return(new FunctionMethodTerm(method, arguments)); }
public static StrForm FromWordToken(StrFormWord wt) { StrForm ret = new StrForm(); ret.strs = wt.Strs; IOperandTerm[] termArray = new IOperandTerm[wt.SubWords.Length]; for (int i = 0; i < wt.SubWords.Length; i++) { SubWord SWT = wt.SubWords[i]; TripleSymbolSubWord tSymbol = SWT as TripleSymbolSubWord; if (tSymbol != null) { switch (tSymbol.Code) { case '*': termArray[i] = NameTarget; continue; case '+': termArray[i] = CallnameMaster; continue; case '=': termArray[i] = CallnamePlayer; continue; case '/': termArray[i] = NameAssi; continue; case '$': termArray[i] = CallnameTarget; continue; } throw new ExeEE("何かおかしい"); } WordCollection wc = null; IOperandTerm operand = null; YenAtSubWord yenat = SWT as YenAtSubWord; if (yenat != null) { wc = yenat.Words; if (wc != null) { operand = ExpressionParser.ReduceIntegerTerm(wc, TermEndWith.EoL); if (!wc.EOL) { throw new CodeEE("三項演算子\\@の第一オペランドが異常です"); } } else { operand = new SingleTerm(0); } IOperandTerm left = new StrFormTerm(StrForm.FromWordToken(yenat.Left)); IOperandTerm right = null; if (yenat.Right == null) { right = new SingleTerm(""); } else { right = new StrFormTerm(StrForm.FromWordToken(yenat.Right)); } termArray[i] = new FunctionMethodTerm(formatYenAt, new IOperandTerm[] { operand, left, right }); continue; } wc = SWT.Words; operand = ExpressionParser.ReduceExpressionTerm(wc, TermEndWith.Comma); if (operand == null) { if (SWT is CurlyBraceSubWord) { throw new CodeEE("{}の中に式が存在しません"); } else { throw new CodeEE("%%の中に式が存在しません"); } } IOperandTerm second = null; SingleTerm third = null; wc.ShiftNext(); if (!wc.EOL) { second = ExpressionParser.ReduceIntegerTerm(wc, TermEndWith.Comma); wc.ShiftNext(); if (!wc.EOL) { IdentifierWord id = wc.Current as IdentifierWord; if (id == null) { throw new CodeEE("','の後にRIGHT又はLEFTがありません"); } if (string.Equals(id.Code, "LEFT", Config.SCVariable))//標準RIGHT { third = new SingleTerm(1); } else if (!string.Equals(id.Code, "RIGHT", Config.SCVariable)) { throw new CodeEE("','の後にRIGHT又はLEFT以外の単語があります"); } wc.ShiftNext(); } if (!wc.EOL) { throw new CodeEE("RIGHT又はLEFTの後に余分な文字があります"); } } if (SWT is CurlyBraceSubWord) { if (operand.GetOperandType() != typeof(Int64)) { throw new CodeEE("{}の中の式が数式ではありません"); } termArray[i] = new FunctionMethodTerm(formatCurlyBrace, new IOperandTerm[] { operand, second, third }); continue; } if (operand.GetOperandType() != typeof(string)) { throw new CodeEE("%%の中の式が文字列式ではありません"); } termArray[i] = new FunctionMethodTerm(formatPercent, new IOperandTerm[] { operand, second, third }); } ret.terms = termArray; return(ret); }
/// <summary> /// 1803beta005 予め引数の数を合わせて規定値を代入しておく /// 1806+v6.99 式中関数の引数に無効な#DIM変数を与えている場合に例外になるのを修正 /// 1808beta009 REF型に対応 /// </summary> public UserDefinedFunctionArgument ConvertArg(IOperandTerm[] srcArgs, out string errMes) { errMes = null; if (TopLabel.IsError) { errMes = TopLabel.ErrMes; return(null); } var func = TopLabel; var convertedArg = new IOperandTerm[func.Arg.Length]; if (convertedArg.Length < srcArgs.Length) { errMes = "引数の数が関数\"@" + func.LabelName + "\"に設定された数を超えています"; return(null); } IOperandTerm term = null; VariableTerm destArg = null; var isString = false; for (var i = 0; i < func.Arg.Length; i++) { term = i < srcArgs.Length ? srcArgs[i] : null; destArg = func.Arg[i]; isString = destArg.IsString; if (destArg.Identifier.IsReference) //参照渡しの場合 { if (term == null) { errMes = "\"@" + func.LabelName + "\"の" + (i + 1) + "番目の引数は参照渡しのため省略できません"; return(null); } var vTerm = term as VariableTerm; if (vTerm == null || vTerm.Identifier.Dimension == 0) { errMes = "\"@" + func.LabelName + "\"の" + (i + 1) + "番目の引数は参照渡しのための配列変数でなければなりません"; return(null); } //TODO 1810alpha007 キャラ型を認めるかどうかはっきりしたい 今のところ認めない方向 //型チェック if (!((ReferenceToken)destArg.Identifier).MatchType(vTerm.Identifier, false, out errMes)) { errMes = "\"@" + func.LabelName + "\"の" + (i + 1) + "番目の引数:" + errMes; return(null); } } else if (term == null) //引数が省略されたとき { term = func.Def[i]; //デフォルト値を代入 //1808beta001 デフォルト値がない場合はエラーにする //一応逃がす if (term == null && !Config.CompatiFuncArgOptional) { errMes = "\"@" + func.LabelName + "\"の" + (i + 1) + "番目の引数は省略できません(この警告は互換性オプション「" + Config.GetConfigName(ConfigCode.CompatiFuncArgOptional) + "」により無視できます)"; return(null); } } else if (term.GetOperandType() != destArg.GetOperandType()) { if (term.GetOperandType() == typeof(string)) { errMes = "\"@" + func.LabelName + "\"の" + (i + 1) + "番目の引数を文字列型から整数型に変換できません"; return(null); } if (!Config.CompatiFuncArgAutoConvert) { errMes = "\"@" + func.LabelName + "\"の" + (i + 1) + "番目の引数を整数型から文字列型に変換できません(この警告は互換性オプション「" + Config.GetConfigName(ConfigCode.CompatiFuncArgAutoConvert) + "」により無視できます)"; return(null); } if (tostrMethod == null) { tostrMethod = FunctionMethodCreator.GetMethodList()["TOSTR"]; } term = new FunctionMethodTerm(tostrMethod, new[] { term }); } convertedArg[i] = term; } return(new UserDefinedFunctionArgument(convertedArg, func.Arg)); }
public static UserDefinedVariableData Create(WordCollection wc, bool dims, bool isPrivate, ScriptPosition sc) { string dimtype = dims ? "#DIM" : "#DIMS"; UserDefinedVariableData ret = new UserDefinedVariableData(); ret.TypeIsStr = dims; IdentifierWord idw = null; bool staticDefined = false; ret.Const = false; string keyword = dimtype; List <string> keywords = new List <string>(); while (!wc.EOL && (idw = wc.Current as IdentifierWord) != null) { wc.ShiftNext(); keyword = idw.Code; if (Config.ICVariable) { keyword = keyword.ToUpper(); } //TODO ifの数があたまわるい なんとかしたい switch (keyword) { case "CONST": if (ret.CharaData) { throw new CodeEE(keyword + "とCHARADATAキーワードは同時に指定できません", sc); } if (ret.Global) { throw new CodeEE(keyword + "とGLOBALキーワードは同時に指定できません", sc); } if (ret.Save) { throw new CodeEE(keyword + "とSAVEDATAキーワードは同時に指定できません", sc); } if (ret.Reference) { throw new CodeEE(keyword + "とREFキーワードは同時に指定できません", sc); } if (!ret.Static) { throw new CodeEE(keyword + "とDYNAMICキーワードは同時に指定できません", sc); } if (ret.Const) { throw new CodeEE(keyword + "キーワードが二重に指定されています", sc); } ret.Const = true; break; case "REF": //throw new CodeEE("未実装の機能です", sc); //if (!isPrivate) // throw new CodeEE("広域変数の宣言に" + keyword + "キーワードは指定できません", sc); if (staticDefined && ret.Static) { throw new CodeEE(keyword + "とSTATICキーワードは同時に指定できません", sc); } if (ret.CharaData) { throw new CodeEE(keyword + "とCHARADATAキーワードは同時に指定できません", sc); } if (ret.Global) { throw new CodeEE(keyword + "とGLOBALキーワードは同時に指定できません", sc); } if (ret.Save) { throw new CodeEE(keyword + "とSAVEDATAキーワードは同時に指定できません", sc); } if (ret.Const) { throw new CodeEE(keyword + "とCONSTキーワードは同時に指定できません", sc); } if (ret.Reference) { throw new CodeEE(keyword + "キーワードが二重に指定されています", sc); } ret.Reference = true; ret.Static = true; break; case "DYNAMIC": if (!isPrivate) { throw new CodeEE("広域変数の宣言に" + keyword + "キーワードは指定できません", sc); } if (ret.CharaData) { throw new CodeEE(keyword + "とCHARADATAキーワードは同時に指定できません", sc); } if (ret.Const) { throw new CodeEE(keyword + "とCONSTキーワードは同時に指定できません", sc); } if (staticDefined) { if (ret.Static) { throw new CodeEE("STATICとDYNAMICキーワードは同時に指定できません", sc); } else { throw new CodeEE(keyword + "キーワードが二重に指定されています", sc); } } staticDefined = true; ret.Static = false; break; case "STATIC": if (!isPrivate) { throw new CodeEE("広域変数の宣言に" + keyword + "キーワードは指定できません", sc); } if (ret.CharaData) { throw new CodeEE(keyword + "とCHARADATAキーワードは同時に指定できません", sc); } if (staticDefined) { if (!ret.Static) { throw new CodeEE("STATICとDYNAMICキーワードは同時に指定できません", sc); } else { throw new CodeEE(keyword + "キーワードが二重に指定されています", sc); } } if (ret.Reference) { throw new CodeEE(keyword + "とREFキーワードは同時に指定できません", sc); } staticDefined = true; ret.Static = true; break; case "GLOBAL": if (isPrivate) { throw new CodeEE("ローカル変数の宣言に" + keyword + "キーワードは指定できません", sc); } if (ret.CharaData) { throw new CodeEE(keyword + "とCHARADATAキーワードは同時に指定できません", sc); } if (ret.Reference) { throw new CodeEE(keyword + "とREFキーワードは同時に指定できません", sc); } if (ret.Const) { throw new CodeEE(keyword + "とCONSTキーワードは同時に指定できません", sc); } if (staticDefined) { if (ret.Static) { throw new CodeEE("STATICとGLOBALキーワードは同時に指定できません", sc); } else { throw new CodeEE("DYNAMICとGLOBALキーワードは同時に指定できません", sc); } } ret.Global = true; break; case "SAVEDATA": if (isPrivate) { throw new CodeEE("ローカル変数の宣言に" + keyword + "キーワードは指定できません", sc); } if (staticDefined) { if (ret.Static) { throw new CodeEE("STATICとSAVEDATAキーワードは同時に指定できません", sc); } else { throw new CodeEE("DYNAMICとSAVEDATAキーワードは同時に指定できません", sc); } } if (ret.Reference) { throw new CodeEE(keyword + "とREFキーワードは同時に指定できません", sc); } if (ret.Const) { throw new CodeEE(keyword + "とCONSTキーワードは同時に指定できません", sc); } if (ret.Save) { throw new CodeEE(keyword + "キーワードが二重に指定されています", sc); } ret.Save = true; break; case "CHARADATA": if (isPrivate) { throw new CodeEE("ローカル変数の宣言に" + keyword + "キーワードは指定できません", sc); } if (ret.Reference) { throw new CodeEE(keyword + "とREFキーワードは同時に指定できません", sc); } if (ret.Const) { throw new CodeEE(keyword + "とCONSTキーワードは同時に指定できません", sc); } if (staticDefined) { if (ret.Static) { throw new CodeEE(keyword + "とSTATICキーワードは同時に指定できません", sc); } else { throw new CodeEE(keyword + "とDYNAMICキーワードは同時に指定できません", sc); } } if (ret.Global) { throw new CodeEE(keyword + "とGLOBALキーワードは同時に指定できません", sc); } if (ret.CharaData) { throw new CodeEE(keyword + "キーワードが二重に指定されています", sc); } ret.CharaData = true; break; default: ret.Name = keyword; goto whilebreak; } } whilebreak: if (ret.Name == null) { throw new CodeEE(keyword + "の後に有効な変数名が指定されていません", sc); } string errMes = ""; int errLevel = -1; if (isPrivate) { GlobalStatic.IdentifierDictionary.CheckUserPrivateVarName(ref errMes, ref errLevel, ret.Name); } else { GlobalStatic.IdentifierDictionary.CheckUserVarName(ref errMes, ref errLevel, ret.Name); } if (errLevel >= 0) { if (errLevel >= 2) { throw new CodeEE(errMes, sc); } ParserMediator.Warn(errMes, sc, errLevel); } List <int> sizeNum = new List <int>(); if (wc.EOL) //サイズ省略 { if (ret.Const) { throw new CodeEE("CONSTキーワードが指定されていますが初期値が設定されていません"); } sizeNum.Add(1); } else if (wc.Current.Type == ',') //サイズ指定 { while (!wc.EOL) { if (wc.Current.Type == '=') //サイズ指定解読完了&初期値指定 { break; } if (wc.Current.Type != ',') { throw new CodeEE("書式が間違っています", sc); } wc.ShiftNext(); if (ret.Reference) //参照型の場合は要素数不要 { sizeNum.Add(0); if (wc.EOL) { break; } if (wc.Current.Type == ',') { continue; } } if (wc.EOL) { throw new CodeEE("カンマの後に有効な定数式が指定されていません", sc); } IOperandTerm arg = ExpressionParser.ReduceIntegerTerm(wc, TermEndWith.Comma_Assignment); SingleTerm sizeTerm = arg.Restructure(null) as SingleTerm; if ((sizeTerm == null) || (sizeTerm.GetOperandType() != typeof(Int64))) { throw new CodeEE("カンマの後に有効な定数式が指定されていません", sc); } if (ret.Reference) //参照型には要素数指定不可(0にするか書かないかどっちか { if (sizeTerm.Int != 0) { throw new CodeEE("参照型変数にはサイズを指定できません(サイズを省略するか0を指定してください)", sc); } continue; } else if ((sizeTerm.Int <= 0) || (sizeTerm.Int > 1000000)) { throw new CodeEE("ユーザー定義変数のサイズは1以上1000000以下でなければなりません", sc); } sizeNum.Add((int)sizeTerm.Int); } } if (wc.Current.Type != '=') //初期値指定なし { if (ret.Const) { throw new CodeEE("CONSTキーワードが指定されていますが初期値が設定されていません"); } } else //初期値指定あり { if (((OperatorWord)wc.Current).Code != OperatorCode.Assignment) { throw new CodeEE("予期しない演算子を発見しました"); } if (ret.Reference) { throw new CodeEE("参照型変数には初期値を設定できません"); } if (sizeNum.Count >= 2) { throw new CodeEE("多次元変数には初期値を設定できません"); } if (ret.CharaData) { throw new CodeEE("キャラ型変数には初期値を設定できません"); } int size = 0; if (sizeNum.Count == 1) { size = sizeNum[0]; } wc.ShiftNext(); IOperandTerm[] terms = ExpressionParser.ReduceArguments(wc, ArgsEndWith.EoL, false); if (terms.Length == 0) { throw new CodeEE("配列の初期値は省略できません"); } if (size > 0) { if (terms.Length > size) { throw new CodeEE("初期値の数が配列のサイズを超えています"); } if (ret.Const && terms.Length != size) { throw new CodeEE("定数の初期値の数が配列のサイズと一致しません"); } } if (dims) { ret.DefaultStr = new string[terms.Length]; } else { ret.DefaultInt = new Int64[terms.Length]; } for (int i = 0; i < terms.Length; i++) { if (terms[i] == null) { throw new CodeEE("配列の初期値は省略できません"); } terms[i] = terms[i].Restructure(GlobalStatic.EMediator); SingleTerm sTerm = terms[i] as SingleTerm; if (sTerm == null) { throw new CodeEE("配列の初期値には定数のみ指定できます"); } if (dims != sTerm.IsString) { throw new CodeEE("変数の型と初期値の型が一致していません"); } if (dims) { ret.DefaultStr[i] = sTerm.Str; } else { ret.DefaultInt[i] = sTerm.Int; } } if (sizeNum.Count == 0) { sizeNum.Add(terms.Length); } } if (!wc.EOL) { throw new CodeEE("書式が間違っています", sc); } if (sizeNum.Count == 0) { sizeNum.Add(1); } ret.Private = isPrivate; ret.Dimension = sizeNum.Count; if (ret.Const && ret.Dimension > 1) { throw new CodeEE("CONSTキーワードが指定された変数を多次元配列にはできません"); } if (ret.CharaData && ret.Dimension > 2) { throw new CodeEE("3次元以上のキャラ型変数を宣言することはできません", sc); } if (ret.Dimension > 3) { throw new CodeEE("4次元以上の配列変数を宣言することはできません", sc); } ret.Lengths = new int[sizeNum.Count]; if (ret.Reference) { return(ret); } Int64 totalBytes = 1; for (int i = 0; i < sizeNum.Count; i++) { ret.Lengths[i] = sizeNum[i]; totalBytes *= ret.Lengths[i]; } if ((totalBytes <= 0) || (totalBytes > 1000000)) { throw new CodeEE("ユーザー定義変数のサイズは1以上1000000以下でなければなりません", sc); } if (!isPrivate && ret.Save && !Config.SystemSaveInBinary) { if (dims && ret.Dimension > 1) { throw new CodeEE("文字列型の多次元配列変数にSAVEDATAフラグを付ける場合には「バイナリ型セーブ」オプションが必須です", sc); } else if (ret.CharaData) { throw new CodeEE("キャラ型変数にSAVEDATAフラグを付ける場合には「バイナリ型セーブ」オプションが必須です", sc); } } return(ret); }
public RefArgument(UserDefinedRefMethod udrm, IOperandTerm src) { RefMethodToken = udrm; SrcTerm = src; }
public RefArgument(ReferenceToken vt, IOperandTerm src) { RefVarToken = vt; SrcTerm = src; }
public TermWord(IOperandTerm term) { this.term = term; }
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)); }
public static bool ParseSharpLine(FunctionLabelLine label, StringStream st, ScriptPosition position, List <string> OnlyLabel) { st.ShiftNext(); //'#'を飛ばす string token = LexicalAnalyzer.ReadSingleIdentifier(st); //#~自体にはマクロ非適用 if (Config.ICFunction) { token = token.ToUpper(); } //#行として不正な行でもAnalyzeに行って引っかかることがあるので、先に存在しない#~は弾いてしまう if (token == null || (token != "SINGLE" && token != "LATER" && token != "PRI" && token != "ONLY" && token != "FUNCTION" && token != "FUNCTIONS" && token != "LOCALSIZE" && token != "LOCALSSIZE" && token != "DIM" && token != "DIMS")) { ParserMediator.Warn("解釈できない#行です", position, 1); return(false); } try { WordCollection wc = LexicalAnalyzer.Analyse(st, LexEndWith.EoL, LexAnalyzeFlag.AllowAssignment); switch (token) { case "SINGLE": if (label.IsMethod) { ParserMediator.Warn("式中関数では#SINGLEは機能しません", position, 1); break; } else if (!label.IsEvent) { ParserMediator.Warn("イベント関数以外では#SINGLEは機能しません", position, 1); break; } else if (label.IsSingle) { ParserMediator.Warn("#SINGLEが重複して使われています", position, 1); break; } else if (label.IsOnly) { ParserMediator.Warn("#ONLYが指定されたイベント関数では#SINGLEは機能しません", position, 1); break; } label.IsSingle = true; break; case "LATER": if (label.IsMethod) { ParserMediator.Warn("式中関数では#LATERは機能しません", position, 1); break; } else if (!label.IsEvent) { ParserMediator.Warn("イベント関数以外では#LATERは機能しません", position, 1); break; } else if (label.IsLater) { ParserMediator.Warn("#LATERが重複して使われています", position, 1); break; } else if (label.IsOnly) { ParserMediator.Warn("#ONLYが指定されたイベント関数では#LATERは機能しません", position, 1); break; } else if (label.IsPri) { ParserMediator.Warn("#PRIと#LATERが重複して使われています(この関数は2度呼ばれます)", position, 1); } label.IsLater = true; break; case "PRI": if (label.IsMethod) { ParserMediator.Warn("式中関数では#PRIは機能しません", position, 1); break; } else if (!label.IsEvent) { ParserMediator.Warn("イベント関数以外では#PRIは機能しません", position, 1); break; } else if (label.IsPri) { ParserMediator.Warn("#PRIが重複して使われています", position, 1); break; } else if (label.IsOnly) { ParserMediator.Warn("#ONLYが指定されたイベント関数では#PRIは機能しません", position, 1); break; } else if (label.IsLater) { ParserMediator.Warn("#PRIと#LATERが重複して使われています(この関数は2度呼ばれます)", position, 1); } label.IsPri = true; break; case "ONLY": if (label.IsMethod) { ParserMediator.Warn("式中関数では#ONLYは機能しません", position, 1); break; } else if (!label.IsEvent) { ParserMediator.Warn("イベント関数以外では#ONLYは機能しません", position, 1); break; } else if (label.IsOnly) { ParserMediator.Warn("#ONLYが重複して使われています", position, 1); break; } else if (OnlyLabel.Contains(label.LabelName)) { ParserMediator.Warn("このイベント関数\"@" + label.LabelName + "\"にはすでに#ONLYが宣言されています(この関数は実行されません)", position, 1); } OnlyLabel.Add(label.LabelName); label.IsOnly = true; if (label.IsPri) { ParserMediator.Warn("このイベント関数には#PRIが宣言されていますが無視されます", position, 1); label.IsPri = false; } if (label.IsLater) { ParserMediator.Warn("このイベント関数には#LATERが宣言されていますが無視されます", position, 1); label.IsLater = false; } if (label.IsSingle) { ParserMediator.Warn("このイベント関数には#SINGLEが宣言されていますが無視されます", position, 1); label.IsSingle = false; } break; case "FUNCTION": case "FUNCTIONS": if (!string.IsNullOrEmpty(label.LabelName) && char.IsDigit(label.LabelName[0])) { ParserMediator.Warn("#" + token + "属性は関数名が数字で始まる関数には指定できません", position, 1); label.IsError = true; label.ErrMes = "関数名が数字で始まっています"; break; } if (label.IsMethod) { if ((label.MethodType == typeof(Int64) && token == "FUNCTION") || (label.MethodType == typeof(string) && token == "FUNCTIONS")) { ParserMediator.Warn("関数" + label.LabelName + "にはすでに#" + token + "が宣言されています(この行は無視されます)", position, 1); return(false); } if (label.MethodType == typeof(Int64) && token == "FUNCTIONS") { ParserMediator.Warn("関数" + label.LabelName + "にはすでに#FUNCTIONが宣言されています", position, 2); } else if (label.MethodType == typeof(string) && token == "FUNCTION") { ParserMediator.Warn("関数" + label.LabelName + "にはすでに#FUNCTIONSが宣言されています", position, 2); } return(false); } if (label.Depth == 0) { ParserMediator.Warn("システム関数に#" + token + "が指定されています", position, 2); return(false); } label.IsMethod = true; label.Depth = 0; if (token == "FUNCTIONS") { label.MethodType = typeof(string); } else { label.MethodType = typeof(Int64); } if (label.IsPri) { ParserMediator.Warn("式中関数では#PRIは機能しません", position, 1); label.IsPri = false; } if (label.IsLater) { ParserMediator.Warn("式中関数では#LATERは機能しません", position, 1); label.IsLater = false; } if (label.IsSingle) { ParserMediator.Warn("式中関数では#SINGLEは機能しません", position, 1); label.IsSingle = false; } if (label.IsOnly) { ParserMediator.Warn("式中関数では#ONLYは機能しません", position, 1); label.IsOnly = false; } break; case "LOCALSIZE": case "LOCALSSIZE": { if (wc.EOL) { ParserMediator.Warn("#" + token + "の後に有効な数値が指定されていません", position, 2); break; } //イベント関数では指定しても無視される if (label.IsEvent) { ParserMediator.Warn("イベント関数では#" + token + "による" + token.Substring(0, token.Length - 4) + "のサイズ指定は無視されます", position, 1); break; } IOperandTerm arg = ExpressionParser.ReduceIntegerTerm(wc, TermEndWith.EoL); SingleTerm sizeTerm = arg.Restructure(null) as SingleTerm; if ((sizeTerm == null) || (sizeTerm.GetOperandType() != typeof(Int64))) { ParserMediator.Warn("#" + token + "の後に有効な定数式が指定されていません", position, 2); break; } if (sizeTerm.Int <= 0) { ParserMediator.Warn("#" + token + "に0以下の値(" + sizeTerm.Int.ToString() + ")が与えられました。設定は無視されます", position, 1); break; } if (sizeTerm.Int >= Int32.MaxValue) { ParserMediator.Warn("#" + token + "に大きすぎる値(" + sizeTerm.Int.ToString() + ")が与えられました。設定は無視されます", position, 1); break; } int size = (int)sizeTerm.Int; if (token == "LOCALSIZE") { if (GlobalStatic.IdentifierDictionary.getLocalIsForbid("LOCAL")) { ParserMediator.Warn("#" + token + "が指定されていますが変数LOCALは使用禁止されています", position, 2); break; } if (label.LocalLength > 0) { ParserMediator.Warn("この関数にはすでに#LOCALSIZEが定義されています。(以前の定義は無視されます)", position, 1); } label.LocalLength = size; } else { if (GlobalStatic.IdentifierDictionary.getLocalIsForbid("LOCALS")) { ParserMediator.Warn("#" + token + "が指定されていますが変数LOCALSは使用禁止されています", position, 2); break; } if (label.LocalsLength > 0) { ParserMediator.Warn("この関数にはすでに#LOCALSSIZEが定義されています。(以前の定義は無視されます)", position, 1); } label.LocalsLength = size; } } break; case "DIM": case "DIMS": { UserDefinedVariableData data = UserDefinedVariableData.Create(wc, token == "DIMS", true, position); if (!label.AddPrivateVariable(data)) { ParserMediator.Warn("変数名" + data.Name + "は既に使用されています", position, 2); return(false); } break; } default: ParserMediator.Warn("解釈できない#行です", position, 1); break; } if (!wc.EOL) { ParserMediator.Warn("#の識別子の後に余分な文字があります", position, 1); } } catch (Exception e) { ParserMediator.Warn(e.Message, position, 2); goto err; } return(true); err: return(false); }
public OneInputsArgument(IOperandTerm term, IOperandTerm flag) { Term = term; Flag = flag; }
public SpSetArgument(VariableTerm var, IOperandTerm termSrc) { VariableDest = var; Term = termSrc; }
public SpBarArgument(IOperandTerm value, IOperandTerm max, IOperandTerm length) { Terms[0] = value; Terms[1] = max; Terms[2] = length; }
public TermWord(IOperandTerm term) { Term = term; }
public override void SetValue(IOperandTerm value, ExpressionMediator exm) { throw new CodeEE("変数" + Identifier.Name + "に必要な引数が不足しています"); }
void doNormalFunction(InstructionLine func) { Int64 iValue = 0; string str = null; IOperandTerm term = null; switch (func.FunctionCode) { case FunctionCode.PRINTBUTTON: //変数の内容 { if (skipPrint) { break; } exm.Console.UseUserStyle = true; exm.Console.UseSetColorStyle = true; SpButtonArgument bArg = (SpButtonArgument)func.Argument; str = bArg.PrintStrTerm.GetStrValue(exm); //ボタン処理に絡んで表示がおかしくなるため、PRINTBUTTONでの改行コードはオミット str = str.Replace("\n", ""); if (bArg.ButtonWord.GetOperandType() == typeof(long)) { exm.Console.PrintButton(str, bArg.ButtonWord.GetIntValue(exm)); } else { exm.Console.PrintButton(str, bArg.ButtonWord.GetStrValue(exm)); } } break; case FunctionCode.PRINTBUTTONC: //変数の内容 case FunctionCode.PRINTBUTTONLC: { if (skipPrint) { break; } exm.Console.UseUserStyle = true; exm.Console.UseSetColorStyle = true; SpButtonArgument bArg = (SpButtonArgument)func.Argument; str = bArg.PrintStrTerm.GetStrValue(exm); //ボタン処理に絡んで表示がおかしくなるため、PRINTBUTTONでの改行コードはオミット str = str.Replace("\n", ""); bool isRight = (func.FunctionCode == FunctionCode.PRINTBUTTONC) ? true : false; if (bArg.ButtonWord.GetOperandType() == typeof(long)) { exm.Console.PrintButtonC(str, bArg.ButtonWord.GetIntValue(exm), isRight); } else { exm.Console.PrintButtonC(str, bArg.ButtonWord.GetStrValue(exm), isRight); } } break; case FunctionCode.PRINTPLAIN: case FunctionCode.PRINTPLAINFORM: { if (skipPrint) { break; } exm.Console.UseUserStyle = true; exm.Console.UseSetColorStyle = true; term = ((ExpressionArgument)func.Argument).Term; exm.Console.PrintPlain(term.GetStrValue(exm)); } break; case FunctionCode.DRAWLINE: //画面の左端から右端まで----と線を引く。 if (skipPrint) { break; } exm.Console.PrintBar(); exm.Console.NewLine(); break; case FunctionCode.CUSTOMDRAWLINE: case FunctionCode.DRAWLINEFORM: { if (skipPrint) { break; } term = ((ExpressionArgument)func.Argument).Term; str = term.GetStrValue(exm); exm.Console.printCustomBar(str); //exm.Console.setStBar(str); //exm.Console.PrintBar(); exm.Console.NewLine(); //exm.Console.setStBar(Config.DrawLineString); } break; case FunctionCode.PRINT_ABL: //能力。引数は登録番号 case FunctionCode.PRINT_TALENT: //素質 case FunctionCode.PRINT_MARK: //刻印 case FunctionCode.PRINT_EXP: //経験 { if (skipPrint) { break; } ExpressionArgument intExpArg = (ExpressionArgument)func.Argument; Int64 target = intExpArg.Term.GetIntValue(exm); exm.Console.Print(vEvaluator.GetCharacterDataString(target, func.FunctionCode)); exm.Console.NewLine(); } break; case FunctionCode.PRINT_PALAM: //パラメータ { if (skipPrint) { break; } ExpressionArgument intExpArg = (ExpressionArgument)func.Argument; Int64 target = intExpArg.Term.GetIntValue(exm); int count = 0; ///100以降は否定の珠とかなので表示しない for (int i = 0; i < 100; i++) { string printStr = vEvaluator.GetCharacterParamString(target, i); if (printStr != null) { exm.Console.PrintC(printStr, true); count++; if ((Config.PrintCPerLine > 0) && (count % Config.PrintCPerLine == 0)) { exm.Console.PrintFlush(false); } } } exm.Console.PrintFlush(false); exm.Console.RefreshStrings(false); } break; case FunctionCode.PRINT_ITEM: //所持アイテム if (skipPrint) { break; } exm.Console.Print(vEvaluator.GetHavingItemsString()); exm.Console.NewLine(); break; case FunctionCode.PRINT_SHOPITEM: //ショップで売っているアイテム { if (skipPrint) { break; } int length = Math.Min(vEvaluator.ITEMSALES.Length, vEvaluator.ITEMNAME.Length); if (length > vEvaluator.ITEMPRICE.Length) { length = vEvaluator.ITEMPRICE.Length; } int count = 0; for (int i = 0; i < length; i++) { if (vEvaluator.ItemSales(i)) { string printStr = vEvaluator.ITEMNAME[i]; if (printStr == null) { printStr = ""; } Int64 price = vEvaluator.ITEMPRICE[i]; // 1.52a改変部分 (単位の差し替えおよび前置、後置に対応) if (Config.MoneyFirst) { exm.Console.PrintC(string.Format("[{2}] {0}({3}{1})", printStr, price, i, Config.MoneyLabel), false); } else { exm.Console.PrintC(string.Format("[{2}] {0}({1}{3})", printStr, price, i, Config.MoneyLabel), false); } count++; if ((Config.PrintCPerLine > 0) && (count % Config.PrintCPerLine == 0)) { exm.Console.PrintFlush(false); } } } exm.Console.PrintFlush(false); exm.Console.RefreshStrings(false); } break; case FunctionCode.UPCHECK: //パラメータの変動 vEvaluator.UpdateInUpcheck(exm.Console, skipPrint); break; case FunctionCode.CUPCHECK: //パラメータの変動(任意キャラ版) { ExpressionArgument intExpArg = (ExpressionArgument)func.Argument; Int64 target = intExpArg.Term.GetIntValue(exm); vEvaluator.CUpdateInUpcheck(exm.Console, target, skipPrint); } break; case FunctionCode.DELALLCHARA: { vEvaluator.DelAllCharacter(); break; } case FunctionCode.PICKUPCHARA: { ExpressionArrayArgument intExpArg = (ExpressionArrayArgument)func.Argument; Int64[] NoList = new Int64[intExpArg.TermList.Length]; Int64 charaNum = vEvaluator.CHARANUM; for (int i = 0; i < intExpArg.TermList.Length; i++) { IOperandTerm term_i = intExpArg.TermList[i]; NoList[i] = term_i.GetIntValue(exm); if (!(term_i is VariableTerm) || ((((VariableTerm)term_i).Identifier.Code != VariableCode.MASTER) && (((VariableTerm)term_i).Identifier.Code != VariableCode.ASSI) && (((VariableTerm)term_i).Identifier.Code != VariableCode.TARGET))) { if (NoList[i] < 0 || NoList[i] >= charaNum) { throw new CodeEE("命令PICKUPCHARAの第" + (i + 1).ToString() + "引数にキャラリストの範囲外の値(" + NoList[i].ToString() + ")が与えられました"); } } } vEvaluator.PickUpChara(NoList); } break; case FunctionCode.ADDDEFCHARA: { //デバッグコマンドなら通す if ((func.ParentLabelLine != null) && (func.ParentLabelLine.LabelName != "SYSTEM_TITLE")) { throw new CodeEE("@SYSTEM_TITLE以外でこの命令を使うことはできません"); } vEvaluator.AddCharacterFromCsvNo(0); if (GlobalStatic.GameBaseData.DefaultCharacter > 0) { vEvaluator.AddCharacterFromCsvNo(GlobalStatic.GameBaseData.DefaultCharacter); } break; } case FunctionCode.PUTFORM: //@SAVEINFO関数でのみ使用可能。PRINTFORMと同様の書式でセーブデータに概要をつける。 { term = ((ExpressionArgument)func.Argument).Term; str = term.GetStrValue(exm); if (vEvaluator.SAVEDATA_TEXT != null) { vEvaluator.SAVEDATA_TEXT += str; } else { vEvaluator.SAVEDATA_TEXT = str; } break; } case FunctionCode.QUIT: //ゲームを終了 exm.Console.Quit(); break; case FunctionCode.VARSIZE: { SpVarsizeArgument versizeArg = (SpVarsizeArgument)func.Argument; VariableToken varID = versizeArg.VariableID; vEvaluator.VarSize(varID); } break; case FunctionCode.SAVEDATA: { SpSaveDataArgument spSavedataArg = (SpSaveDataArgument)func.Argument; Int64 target = spSavedataArg.Target.GetIntValue(exm); if (target < 0) { throw new CodeEE("SAVEDATAの引数に負の値(" + target.ToString() + ")が指定されました"); } else if (target > int.MaxValue) { throw new CodeEE("SAVEDATAの引数(" + target.ToString() + ")が大きすぎます"); } string savemes = spSavedataArg.StrExpression.GetStrValue(exm); if (savemes.Contains("\n")) { throw new CodeEE("SAVEDATAのセーブテキストに改行文字が与えられました(セーブデータが破損するため改行文字は使えません)"); } if (!vEvaluator.SaveTo((int)target, savemes)) { console.PrintError("SAVEDATA命令によるセーブ中に予期しないエラーが発生しました"); } } break; case FunctionCode.POWER: { SpPowerArgument powerArg = (SpPowerArgument)func.Argument; double x = powerArg.X.GetIntValue(exm); double y = powerArg.Y.GetIntValue(exm); double pow = Math.Pow(x, y); if (double.IsNaN(pow)) { throw new CodeEE("累乗結果が非数値です"); } else if (double.IsInfinity(pow)) { throw new CodeEE("累乗結果が無限大です"); } else if ((pow >= Int64.MaxValue) || (pow <= Int64.MinValue)) { throw new CodeEE("累乗結果(" + pow.ToString() + ")が64ビット符号付き整数の範囲外です"); } powerArg.VariableDest.SetValue((long)pow, exm); break; } case FunctionCode.SWAP: { SpSwapVarArgument arg = (SpSwapVarArgument)func.Argument; //1756beta2+v11 //値を読み出す前に添え字を確定させておかないと、RANDが添え字にある場合正しく処理できない FixedVariableTerm vTerm1 = arg.var1.GetFixedVariableTerm(exm); FixedVariableTerm vTerm2 = arg.var2.GetFixedVariableTerm(exm); if (vTerm1.GetOperandType() != vTerm2.GetOperandType()) { throw new CodeEE("入れ替える変数の型が異なります"); } if (vTerm1.GetOperandType() == typeof(Int64)) { Int64 temp = vTerm1.GetIntValue(exm); vTerm1.SetValue(vTerm2.GetIntValue(exm), exm); vTerm2.SetValue(temp, exm); } else if (arg.var1.GetOperandType() == typeof(string)) { string temps = vTerm1.GetStrValue(exm); vTerm1.SetValue(vTerm2.GetStrValue(exm), exm); vTerm2.SetValue(temps, exm); } else { throw new CodeEE("不明な変数型です"); } break; } case FunctionCode.GETTIME: { long date = DateTime.Now.Year; date = date * 100 + DateTime.Now.Month; date = date * 100 + DateTime.Now.Day; date = date * 100 + DateTime.Now.Hour; date = date * 100 + DateTime.Now.Minute; date = date * 100 + DateTime.Now.Second; date = date * 1000 + DateTime.Now.Millisecond; vEvaluator.RESULT = date; //17桁。2京くらい。 vEvaluator.RESULTS = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); } break; case FunctionCode.SETCOLOR: { SpColorArgument colorArg = (SpColorArgument)func.Argument; Int64 colorR; Int64 colorG; Int64 colorB; if (colorArg.RGB != null) { Int64 colorRGB = colorArg.RGB.GetIntValue(exm); colorR = (colorRGB & 0xFF0000) >> 16; colorG = (colorRGB & 0x00FF00) >> 8; colorB = (colorRGB & 0x0000FF); } else { colorR = colorArg.R.GetIntValue(exm); colorG = colorArg.G.GetIntValue(exm); colorB = colorArg.B.GetIntValue(exm); if ((colorR < 0) || (colorG < 0) || (colorB < 0)) { throw new CodeEE("SETCOLORの引数に0未満の値が指定されました"); } if ((colorR > 255) || (colorG > 255) || (colorB > 255)) { throw new CodeEE("SETCOLORの引数に255を超える値が指定されました"); } } Color c = Color.FromArgb((Int32)colorR, (Int32)colorG, (Int32)colorB); exm.Console.SetStringStyle(c); } break; case FunctionCode.SETCOLORBYNAME: { string colorName = func.Argument.ConstStr; Color c = Color.FromName(colorName); if (c.A == 0) { if (str.Equals("transparent", StringComparison.OrdinalIgnoreCase)) { throw new CodeEE("無色透明(Transparent)は色として指定できません"); } throw new CodeEE("指定された色名\"" + colorName + "\"は無効な色名です"); } exm.Console.SetStringStyle(c); } break; case FunctionCode.SETBGCOLOR: { SpColorArgument colorArg = (SpColorArgument)func.Argument; Int64 colorR; Int64 colorG; Int64 colorB; if (colorArg.IsConst) { Int64 colorRGB = colorArg.ConstInt; colorR = (colorRGB & 0xFF0000) >> 16; colorG = (colorRGB & 0x00FF00) >> 8; colorB = (colorRGB & 0x0000FF); } else if (colorArg.RGB != null) { Int64 colorRGB = colorArg.RGB.GetIntValue(exm); colorR = (colorRGB & 0xFF0000) >> 16; colorG = (colorRGB & 0x00FF00) >> 8; colorB = (colorRGB & 0x0000FF); } else { colorR = colorArg.R.GetIntValue(exm); colorG = colorArg.G.GetIntValue(exm); colorB = colorArg.B.GetIntValue(exm); if ((colorR < 0) || (colorG < 0) || (colorB < 0)) { throw new CodeEE("SETCOLORの引数に0未満の値が指定されました"); } if ((colorR > 255) || (colorG > 255) || (colorB > 255)) { throw new CodeEE("SETCOLORの引数に255を超える値が指定されました"); } } Color c = Color.FromArgb((Int32)colorR, (Int32)colorG, (Int32)colorB); exm.Console.SetBgColor(c); } break; case FunctionCode.SETBGCOLORBYNAME: { string colorName = func.Argument.ConstStr; Color c = Color.FromName(colorName); if (c.A == 0) { if (str.Equals("transparent", StringComparison.OrdinalIgnoreCase)) { throw new CodeEE("無色透明(Transparent)は色として指定できません"); } throw new CodeEE("指定された色名\"" + colorName + "\"は無効な色名です"); } exm.Console.SetBgColor(c); } break; case FunctionCode.FONTSTYLE: { FontStyle fs = FontStyle.Regular; if (func.Argument.IsConst) { iValue = func.Argument.ConstInt; } else { iValue = ((ExpressionArgument)func.Argument).Term.GetIntValue(exm); } if ((iValue & 1) != 0) { fs |= FontStyle.Bold; } if ((iValue & 2) != 0) { fs |= FontStyle.Italic; } if ((iValue & 4) != 0) { fs |= FontStyle.Strikeout; } if ((iValue & 8) != 0) { fs |= FontStyle.Underline; } exm.Console.SetStringStyle(fs); } break; case FunctionCode.SETFONT: if (func.Argument.IsConst) { str = func.Argument.ConstStr; } else { str = ((ExpressionArgument)func.Argument).Term.GetStrValue(exm); } exm.Console.SetFont(str); break; case FunctionCode.ALIGNMENT: str = func.Argument.ConstStr; if (str.Equals("LEFT", Config.SCVariable)) { exm.Console.Alignment = DisplayLineAlignment.LEFT; } else if (str.Equals("CENTER", Config.SCVariable)) { exm.Console.Alignment = DisplayLineAlignment.CENTER; } else if (str.Equals("RIGHT", Config.SCVariable)) { exm.Console.Alignment = DisplayLineAlignment.RIGHT; } else { throw new CodeEE("ALIGNMENTのキーワード\"" + str + "\"は未定義です"); } break; case FunctionCode.REDRAW: if (func.Argument.IsConst) { iValue = func.Argument.ConstInt; } else { iValue = ((ExpressionArgument)func.Argument).Term.GetIntValue(exm); } exm.Console.SetRedraw(iValue); break; case FunctionCode.RESET_STAIN: { if (func.Argument.IsConst) { iValue = func.Argument.ConstInt; } else { iValue = ((ExpressionArgument)func.Argument).Term.GetIntValue(exm); } vEvaluator.SetDefaultStain(iValue); } break; case FunctionCode.SPLIT: { SpSplitArgument spSplitArg = (SpSplitArgument)func.Argument; string target = spSplitArg.TargetStr.GetStrValue(exm); string[] split = new string[] { spSplitArg.Split.GetStrValue(exm) }; string[] retStr = target.Split(split, StringSplitOptions.None); spSplitArg.Num.SetValue(retStr.Length, exm); if (retStr.Length > spSplitArg.Var.GetLength(0)) { string[] temp = retStr; retStr = new string[spSplitArg.Var.GetLength(0)]; Array.Copy(temp, retStr, retStr.Length); //throw new CodeEE("SPLITによる分割後の文字列の数が配列変数の要素数を超えています"); } spSplitArg.Var.SetValue(retStr, new long[] { 0, 0, 0 }); } break; case FunctionCode.PRINTCPERLINE: { SpGetIntArgument spGetintArg = (SpGetIntArgument)func.Argument; spGetintArg.VarToken.SetValue((Int64)Config.PrintCPerLine, exm); } break; case FunctionCode.SAVENOS: { SpGetIntArgument spGetintArg = (SpGetIntArgument)func.Argument; spGetintArg.VarToken.SetValue((Int64)Config.SaveDataNos, exm); } break; case FunctionCode.FORCEKANA: if (func.Argument.IsConst) { iValue = func.Argument.ConstInt; } else { iValue = ((ExpressionArgument)func.Argument).Term.GetIntValue(exm); } exm.ForceKana(iValue); break; case FunctionCode.SKIPDISP: { iValue = (func.Argument.IsConst) ? func.Argument.ConstInt : ((ExpressionArgument)func.Argument).Term.GetIntValue(exm); skipPrint = (iValue != 0); userDefinedSkip = (iValue != 0); vEvaluator.RESULT = (skipPrint) ? 1L : 0L; } break; case FunctionCode.NOSKIP: { if (func.JumpTo == null) { throw new CodeEE("対応するENDNOSKIPのないNOSKIPです"); } saveSkip = skipPrint; if (skipPrint) { skipPrint = false; } } break; case FunctionCode.ENDNOSKIP: { if (func.JumpTo == null) { throw new CodeEE("対応するNOSKIPのないENDNOSKIPです"); } if (saveSkip) { skipPrint = true; } } break; case FunctionCode.OUTPUTLOG: exm.Console.OutputLog(null); break; case FunctionCode.ARRAYSHIFT: //配列要素をずらす { SpArrayShiftArgument arrayArg = (SpArrayShiftArgument)func.Argument; if (!arrayArg.VarToken.Identifier.IsArray1D) { throw new CodeEE("ARRAYSHIFTは1次元配列および配列型キャラクタ変数のみに対応しています"); } FixedVariableTerm dest = arrayArg.VarToken.GetFixedVariableTerm(exm); int shift = (int)arrayArg.Num1.GetIntValue(exm); if (shift == 0) { break; } int start = (int)arrayArg.Num3.GetIntValue(exm); if (start < 0) { throw new CodeEE("ARRAYSHIFTの第4引数が負の値(" + start.ToString() + ")です"); } int num; if (arrayArg.Num4 != null) { num = (int)arrayArg.Num4.GetIntValue(exm); if (num < 0) { throw new CodeEE("ARRAYSHIFTの第5引数が負の値(" + num.ToString() + ")です"); } if (num == 0) { break; } } else { num = -1; } if (dest.Identifier.IsInteger) { Int64 def = arrayArg.Num2.GetIntValue(exm); vEvaluator.ShiftArray(dest, shift, def, start, num); } else { string defs = arrayArg.Num2.GetStrValue(exm); vEvaluator.ShiftArray(dest, shift, defs, start, num); } break; } case FunctionCode.ARRAYREMOVE: { SpArrayControlArgument arrayArg = (SpArrayControlArgument)func.Argument; if (!arrayArg.VarToken.Identifier.IsArray1D) { throw new CodeEE("ARRAYREMOVEは1次元配列および配列型キャラクタ変数のみに対応しています"); } FixedVariableTerm p = arrayArg.VarToken.GetFixedVariableTerm(exm); int start = (int)arrayArg.Num1.GetIntValue(exm); int num = (int)arrayArg.Num2.GetIntValue(exm); if (start < 0) { throw new CodeEE("ARRAYREMOVEの第2引数が負の値(" + start.ToString() + ")です"); } if (num < 0) { throw new CodeEE("ARRAYREMOVEの第3引数が負の値(" + start.ToString() + ")です"); } if (num == 0) { break; } vEvaluator.RemoveArray(p, start, num); break; } case FunctionCode.ARRAYSORT: { SpArraySortArgument arrayArg = (SpArraySortArgument)func.Argument; if (!arrayArg.VarToken.Identifier.IsArray1D) { throw new CodeEE("ARRAYRESORTは1次元配列および配列型キャラクタ変数のみに対応しています"); } FixedVariableTerm p = arrayArg.VarToken.GetFixedVariableTerm(exm); int start = (int)arrayArg.Num1.GetIntValue(exm); if (start < 0) { throw new CodeEE("ARRAYSORTの第3引数が負の値(" + start.ToString() + ")です"); } int num = 0; if (arrayArg.Num2 != null) { num = (int)arrayArg.Num2.GetIntValue(exm); if (num < 0) { throw new CodeEE("ARRAYSORTの第4引数が負の値(" + start.ToString() + ")です"); } if (num == 0) { break; } } else { num = -1; } vEvaluator.SortArray(p, arrayArg.Order, start, num); break; } case FunctionCode.ARRAYCOPY: { SpCopyArrayArgument arrayArg = (SpCopyArrayArgument)func.Argument; IOperandTerm varName1 = arrayArg.VarName1; IOperandTerm varName2 = arrayArg.VarName2; VariableToken[] vars = new VariableToken[2] { null, null }; if (!(varName1 is SingleTerm) || !(varName2 is SingleTerm)) { string[] names = new string[2] { null, null }; names[0] = varName1.GetStrValue(exm); names[1] = varName2.GetStrValue(exm); if ((vars[0] = GlobalStatic.IdentifierDictionary.GetVariableToken(names[0], null, true)) == null) { throw new CodeEE("ARRAYCOPY命令の第1引数(" + names[0] + ")が有効な変数名ではありません"); } if (!vars[0].IsArray1D && !vars[0].IsArray2D && !vars[0].IsArray3D) { throw new CodeEE("ARRAYCOPY命令の第1引数\"" + names[0] + "\"は配列変数ではありません"); } if (vars[0].IsCharacterData) { throw new CodeEE("ARRAYCOPY命令の第1引数\"" + names[0] + "\"はキャラクタ変数です(対応していません)"); } if ((vars[1] = GlobalStatic.IdentifierDictionary.GetVariableToken(names[1], null, true)) == null) { throw new CodeEE("ARRAYCOPY命令の第2引数(" + names[0] + ")が有効な変数名ではありません"); } if (!vars[1].IsArray1D && !vars[1].IsArray2D && !vars[1].IsArray3D) { throw new CodeEE("ARRAYCOPY命令の第2引数\"" + names[1] + "\"は配列変数ではありません"); } if (vars[1].IsCharacterData) { throw new CodeEE("ARRAYCOPY命令の第2引数\"" + names[1] + "\"はキャラクタ変数です(対応していません)"); } if (vars[1].IsConst) { throw new CodeEE("ARRAYCOPY命令の第2引数\"" + names[1] + "\"は値を変更できない変数です"); } if ((vars[0].IsArray1D && !vars[1].IsArray1D) || (vars[0].IsArray2D && !vars[1].IsArray2D) || (vars[0].IsArray3D && !vars[1].IsArray3D)) { throw new CodeEE("ARRAYCOPY命令の2つの配列変数の次元数が一致していません"); } if ((vars[0].IsInteger && vars[1].IsString) || (vars[0].IsString && vars[1].IsInteger)) { throw new CodeEE("ARRAYCOPY命令の2つの配列変数の型が一致していません"); } } else { vars[0] = GlobalStatic.IdentifierDictionary.GetVariableToken(((SingleTerm)varName1).Str, null, true); vars[1] = GlobalStatic.IdentifierDictionary.GetVariableToken(((SingleTerm)varName2).Str, null, true); if ((vars[0].IsInteger && vars[1].IsString) || (vars[0].IsString && vars[1].IsInteger)) { throw new CodeEE("ARRAYCOPY命令の2つの配列変数の型が一致していません"); } } vEvaluator.CopyArray(vars[0], vars[1]); } break; case FunctionCode.ENCODETOUNI: { //int length = Encoding.UTF32.GetEncoder().GetByteCount(target.ToCharArray(), 0, target.Length, false); //byte[] bytes = new byte[length]; //Encoding.UTF32.GetEncoder().GetBytes(target.ToCharArray(), 0, target.Length, bytes, 0, false); //vEvaluator.setEncodingResult(bytes); term = ((ExpressionArgument)func.Argument).Term; string target = term.GetStrValue(exm); int length = vEvaluator.RESULT_ARRAY.Length; // result:0には長さが入るのでその分-1 if (target.Length > length - 1) { throw new CodeEE(String.Format("ENCODETOUNIの引数が長すぎます(現在{0}文字。最大{1}文字まで)", target.Length, length - 1)); } int[] ary = new int[target.Length]; for (int i = 0; i < target.Length; i++) { ary[i] = char.ConvertToUtf32(target, i); } vEvaluator.SetEncodingResult(ary); } break; case FunctionCode.ASSERT: if (((ExpressionArgument)func.Argument).Term.GetIntValue(exm) == 0) { throw new CodeEE("ASSERT文の引数が0です"); } break; case FunctionCode.THROW: throw new CodeEE(((ExpressionArgument)func.Argument).Term.GetStrValue(exm)); case FunctionCode.CLEARTEXTBOX: GlobalStatic.MainWindow.clear_richText(); break; case FunctionCode.STRDATA: { //表示データが空なら何もしないで飛ぶ if (func.dataList.Count == 0) { state.JumpTo(func.JumpTo); return; } int count = func.dataList.Count; int choice = (int)exm.VEvaluator.GetNextRand(count); List <InstructionLine> iList = func.dataList[choice]; int i = 0; foreach (InstructionLine selectedLine in iList) { state.CurrentLine = selectedLine; if (selectedLine.Argument == null) { ArgumentParser.SetArgumentTo(selectedLine); } term = ((ExpressionArgument)selectedLine.Argument).Term; str += term.GetStrValue(exm); if (++i < (int)iList.Count) { str += "\n"; } } ((StrDataArgument)func.Argument).Var.SetValue(str, exm); //ジャンプするが、流れが連続であることを保証。 state.JumpTo(func.JumpTo); break; } #if DEBUG default: throw new ExeEE("未定義の関数"); #endif } return; }
public SpSwapCharaArgument(IOperandTerm x, IOperandTerm y) { X = x; Y = y; }