public VariableStrArgTerm(VariableCode code, IOperandTerm strTerm, int index) : base(typeof(Int64)) { this.strTerm = strTerm; parentCode = code; this.index = index; }
public VariableStrArgTerm(VariableCode code, IOperandTerm strTerm, int index) : base(typeof(long)) { this.strTerm = strTerm; parentCode = code; this.index = index; }
public static VariableIdentifier GetVariableId(string key, string subStr) { VariableCode ret = VariableCode.__NULL__; if (string.IsNullOrEmpty(key)) { return(null); } if (Config.ICVariable) { key = key.ToUpper(); } if (subStr != null) { if (Config.ICFunction) { subStr = subStr.ToUpper(); } if (localvarNameDic.TryGetValue(key, out ret)) { return(new VariableIdentifier(ret, subStr)); } if (nameDic.ContainsKey(key)) { throw new CodeEE("ローカル変数でない変数" + key + "に対して@が使われました"); } throw new CodeEE("@の使い方が不正です"); } nameDic.TryGetValue(key, out ret); return(new VariableIdentifier(ret)); }
public LocalVariableToken(VariableCode varCode, VariableData varData, string subId, int size) : base(varCode, varData) { CanRestructure = false; this.subID = subId; this.size = size; }
public static IOperandTerm ReduceVariableArgument(WordCollection wc, VariableCode varCode) { IOperandTerm ret = reduceTerm(wc, false, TermEndWith.EoL, varCode); if (ret == null) { throw new CodeEE("変数の:の後に引数がありません"); } return(ret); }
public static List <VariableCode> GetExtSaveList(VariableCode flag) { VariableCode gFlag = flag & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__INTEGER__); if (!extSaveListDic.ContainsKey(gFlag)) { return(new List <VariableCode>()); } return(extSaveListDic[gFlag]); }
public static List <VariableCode> GetExtSaveList(VariableCode flag) { VariableCode gFlag = flag & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__INTEGER__); if (!extSaveListDic.TryGetValue(gFlag, out var var_code_list)) { return(new List <VariableCode>()); } return(var_code_list); }
private List <VariableCode> ExtractVariables(string line) { VariableCode variable = GetVariable(line); if (variable != null) { return(new List <VariableCode> { variable }); } return(allVariables.Where(x => Regex.IsMatch(" " + line + " ", @"[ ,=><)(]" + x.Name + @"[ ,\.\?=><)(]")).ToList()); }
public static int[] CharacterVarLength(VariableCode code, ConstantData constant) { int[] ret = null; VariableCode type = code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__INTEGER__ | VariableCode.__STRING__); int i = (int)(code & VariableCode.__LOWERCASE__); if (i >= 0xF0) { return(null); } Int64 length64 = 0; switch (type) { case VariableCode.__STRING__: case VariableCode.__INTEGER__: ret = new int[0]; break; case VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__: ret = new int[1]; ret[0] = constant.CharacterIntArrayLength[i]; break; case VariableCode.__STRING__ | VariableCode.__ARRAY_1D__: ret = new int[1]; ret[0] = constant.CharacterStrArrayLength[i]; break; case VariableCode.__INTEGER__ | VariableCode.__ARRAY_2D__: ret = new int[2]; length64 = constant.CharacterIntArray2DLength[i]; ret[0] = (int)(length64 >> 32); ret[1] = (int)(length64 & 0x7FFFFFFF); break; case VariableCode.__STRING__ | VariableCode.__ARRAY_2D__: ret = new int[2]; length64 = constant.CharacterStrArray2DLength[i]; ret[0] = (int)(length64 >> 32); ret[1] = (int)(length64 & 0x7FFFFFFF); break; case VariableCode.__INTEGER__ | VariableCode.__ARRAY_3D__: throw new NotImplCodeEE(); case VariableCode.__STRING__ | VariableCode.__ARRAY_3D__: throw new NotImplCodeEE(); } return(ret); }
private void WriteAssign(StringWriter writer, AssignCode assign, int tabs) { VariableCode variable = fieldManager.GetVariable(assign.To); string text = $"{assign.To} = {assign.Value};"; if (variable != null) { if (!variable.WasInitialized) { text = $"{variable.Type} {assign.To} = {assign.Value};"; variable.WasInitialized = true; } } writer.WriteLineTabs(text, tabs); }
private VariableIdentifier(VariableCode code) { this.code = code; }
public int KeywordToInteger(VariableCode code, string key, int index) { if (string.IsNullOrEmpty(key)) throw new CodeEE("キーワードを空には出来ません"); int ret = -1; string errPos; Dictionary<string, int> dic = GetKeywordDictionary(out errPos, code, index); if (dic.TryGetValue(key, out ret)) return ret; if (errPos == null) throw new CodeEE("配列変数" + code.ToString() + "の要素を文字列で指定することはできません"); else throw new CodeEE(errPos + "の中に\"" + key + "\"の定義がありません"); }
public Dictionary<string, int> GetKeywordDictionary(out string errPos, VariableCode code, int index) { errPos = null; int allowIndex = -1; Dictionary<string, int> ret = null; switch (code) { case VariableCode.ABL: ret = nameToIntDics[ablIndex];//AblName; errPos = "abl.csv"; allowIndex = 1; break; case VariableCode.EXP: ret = nameToIntDics[expIndex];//ExpName; errPos = "exp.csv"; allowIndex = 1; break; case VariableCode.TALENT: ret = nameToIntDics[talentIndex];//TalentName; errPos = "talent.csv"; allowIndex = 1; break; case VariableCode.UP: case VariableCode.DOWN: ret = nameToIntDics[paramIndex];//ParamName 1; errPos = "palam.csv"; allowIndex = 0; break; case VariableCode.PALAM: case VariableCode.JUEL: case VariableCode.GOTJUEL: case VariableCode.CUP: case VariableCode.CDOWN: ret = nameToIntDics[paramIndex];//ParamName 2; errPos = "palam.csv"; allowIndex = 1; break; case VariableCode.TRAINNAME: ret = nameToIntDics[trainIndex];//TrainName; errPos = "train.csv"; allowIndex = 0; break; case VariableCode.MARK: ret = nameToIntDics[markIndex];//MarkName; errPos = "mark.csv"; allowIndex = 1; break; case VariableCode.ITEM: case VariableCode.ITEMSALES: case VariableCode.ITEMPRICE: ret = nameToIntDics[itemIndex];//ItemName; errPos = "Item.csv"; allowIndex = 0; break; case VariableCode.LOSEBASE: ret = nameToIntDics[baseIndex];//BaseName; errPos = "base.csv"; allowIndex = 0; break; case VariableCode.BASE: case VariableCode.MAXBASE: case VariableCode.DOWNBASE: ret = nameToIntDics[baseIndex];//BaseName; errPos = "base.csv"; allowIndex = 1; break; case VariableCode.SOURCE: ret = nameToIntDics[sourceIndex];//SourceName; errPos = "source.csv"; allowIndex = 1; break; case VariableCode.EX: case VariableCode.NOWEX: ret = nameToIntDics[exIndex];//ExName; errPos = "ex.csv"; allowIndex = 1; break; case VariableCode.EQUIP: ret = nameToIntDics[equipIndex];//EquipName; errPos = "equip.csv"; allowIndex = 1; break; case VariableCode.TEQUIP: ret = nameToIntDics[tequipIndex];//TequipName; errPos = "tequip.csv"; allowIndex = 1; break; case VariableCode.FLAG: ret = nameToIntDics[flagIndex];//FlagName; errPos = "flag.csv"; allowIndex = 0; break; case VariableCode.TFLAG: ret = nameToIntDics[tflagIndex];//TFlagName; errPos = "tflag.csv"; allowIndex = 0; break; case VariableCode.CFLAG: ret = nameToIntDics[cflagIndex];//CFlagName; errPos = "cflag.csv"; allowIndex = 1; break; case VariableCode.TCVAR: ret = nameToIntDics[tcvarIndex];//TCVarName; errPos = "tcvar.csv"; allowIndex = 1; break; case VariableCode.CSTR: ret = nameToIntDics[cstrIndex];//CStrName; errPos = "cstr.csv"; allowIndex = 1; break; case VariableCode.STAIN: ret = nameToIntDics[stainIndex];//StainName; errPos = "stain.csv"; allowIndex = 1; break; case VariableCode.CDFLAGNAME1: ret = nameToIntDics[cdflag1Index]; errPos = "cdflag1.csv"; allowIndex = 0; break; case VariableCode.CDFLAGNAME2: ret = nameToIntDics[cdflag2Index]; errPos = "cdflag2.csv"; allowIndex = 0; break; case VariableCode.CDFLAG: { if (index == 1) { ret = nameToIntDics[cdflag1Index];//CDFlagName1 errPos = "cdflag1.csv"; } else if (index == 2) { ret = nameToIntDics[cdflag2Index];//CDFlagName2 errPos = "cdflag2.csv"; } else if (index >= 0) throw new CodeEE("配列変数" + code.ToString() + "の" + (index + 1).ToString() + "番目の要素を文字列で指定することはできません"); else throw new CodeEE("CDFLAGの要素の取得にはCDFLAGNAME1又はCDFLAGNAME2を使用します"); return ret; } case VariableCode.STR: ret = nameToIntDics[strnameIndex]; errPos = "strname.csv"; allowIndex = 0; break; case VariableCode.TSTR: ret = nameToIntDics[tstrnameIndex]; errPos = "tstr.csv"; allowIndex = 0; break; case VariableCode.SAVESTR: ret = nameToIntDics[savestrnameIndex]; errPos = "savestr.csv"; allowIndex = 0; break; case VariableCode.GLOBAL: ret = nameToIntDics[globalIndex]; errPos = "global.csv"; allowIndex = 0; break; case VariableCode.GLOBALS: ret = nameToIntDics[globalsIndex]; errPos = "globals.csv"; allowIndex = 0; break; case VariableCode.RELATION: ret = relationDic; errPos = "chara*.csv"; allowIndex = 1; break; } if (index < 0) return ret; if (ret == null) throw new CodeEE("配列変数" + code.ToString() + "の要素を文字列で指定することはできません"); if ((index != allowIndex)) throw new CodeEE("配列変数" + code.ToString() + "の" + (index + 1).ToString() + "番目の要素を文字列で指定することはできません"); return ret; }
private void _decideActualArraySize_sub(VariableCode mainCode, VariableCode nameCode, int[] arraylength, ScriptPosition position) { int nameIndex = (int)(nameCode & VariableCode.__LOWERCASE__); int mainLengthIndex = (int)(mainCode & VariableCode.__LOWERCASE__); if (changedCode.Contains(nameCode) && changedCode.Contains(mainCode)) { if (MaxDataList[nameIndex] != arraylength[mainLengthIndex]) { int i = Math.Max(MaxDataList[nameIndex], arraylength[mainLengthIndex]); arraylength[mainLengthIndex] = i; MaxDataList[nameIndex] = i; //1803beta004 不適切な指定として警告Lv1の対象にする ParserMediator.Warn(mainCode.ToString() + "と" + nameCode.ToString() + "の要素数が異なります(大きい方に合わせます)", position, 1); } } else if (changedCode.Contains(nameCode) && !changedCode.Contains(mainCode)) arraylength[mainLengthIndex] = MaxDataList[nameIndex]; else if (!changedCode.Contains(nameCode) && changedCode.Contains(mainCode)) MaxDataList[nameIndex] = arraylength[mainLengthIndex]; }
private VariableIdentifier(VariableCode code, string scope) { Code = code; Scope = scope; }
public void SaveToStreamBinary(EraBinaryDataWriter writer, VariableData varData) { //eramaker変数の保存 foreach (KeyValuePair <string, VariableToken> pair in varData.GetVarTokenDic()) { VariableToken var = pair.Value; if (!var.IsSavedata || !var.IsCharacterData || var.IsGlobal) { continue; } VariableCode code = var.Code; VariableCode flag = code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__STRING__ | VariableCode.__INTEGER__); int CodeInt = var.CodeInt; switch (flag) { case VariableCode.__INTEGER__: writer.WriteWithKey(code.ToString(), dataInteger[CodeInt]); break; case VariableCode.__STRING__: writer.WriteWithKey(code.ToString(), dataString[CodeInt]); break; case VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__: writer.WriteWithKey(code.ToString(), dataIntegerArray[CodeInt]); break; case VariableCode.__STRING__ | VariableCode.__ARRAY_1D__: writer.WriteWithKey(code.ToString(), dataStringArray[CodeInt]); break; case VariableCode.__INTEGER__ | VariableCode.__ARRAY_2D__: writer.WriteWithKey(code.ToString(), dataIntegerArray2D[CodeInt]); break; case VariableCode.__STRING__ | VariableCode.__ARRAY_2D__: writer.WriteWithKey(code.ToString(), dataStringArray2D[CodeInt]); break; //case VariableCode.__INTEGER__ | VariableCode.__ARRAY_3D__: // writer.Write(code.ToString(), dataIntegerArray3D[CodeInt]); // break; //case VariableCode.__STRING__ | VariableCode.__ARRAY_3D__: // writer.Write(code.ToString(), dataStringArray3D[CodeInt]); // break; } } //1813追加 if (UserDefCVarDataList.Count != 0) { writer.WriteSeparator(); //#DIM宣言変数の保存 foreach (UserDefinedCharaVariableToken var in varData.UserDefinedCharaVarList) { if (!var.IsSavedata || !var.IsCharacterData || var.IsGlobal) { continue; } writer.WriteWithKey(var.Name, UserDefCVarDataList[var.ArrayIndex]); } } writer.WriteEOC(); }
protected VariableToken(VariableCode varCode, VariableData varData) { Code = varCode; VariableType = ((varCode & VariableCode.__INTEGER__) == VariableCode.__INTEGER__) ? typeof(Int64) : typeof(string); VarCodeInt = (int)(varCode & VariableCode.__LOWERCASE__); varName = varCode.ToString(); this.varData = varData; IsPrivate = false; IsReference = false; Dimension = 0; IsGlobal = (Code == VariableCode.GLOBAL) || (Code == VariableCode.GLOBALS); if ((Code & VariableCode.__ARRAY_1D__) == VariableCode.__ARRAY_1D__) Dimension = 1; if ((Code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__) Dimension = 2; if ((Code & VariableCode.__ARRAY_3D__) == VariableCode.__ARRAY_3D__) Dimension = 3; IsSavedata = false; if ((Code == VariableCode.GLOBAL) || (Code == VariableCode.GLOBALS)) IsSavedata = true; else if ((Code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__) { IsSavedata = true; } else if (((Code & VariableCode.__EXTENDED__) != VariableCode.__EXTENDED__) && ((Code & VariableCode.__CALC__) != VariableCode.__CALC__) && ((Code & VariableCode.__UNCHANGEABLE__) != VariableCode.__UNCHANGEABLE__) && ((Code & VariableCode.__LOCAL__) != VariableCode.__LOCAL__) && (!varName.StartsWith("NOTUSE_"))) { VariableCode flag = Code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__STRING__ | VariableCode.__INTEGER__ | VariableCode.__CHARACTER_DATA__); switch (flag) { case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__: if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER__) IsSavedata = true; break; case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__: if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING__) IsSavedata = true; break; case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__: if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER_ARRAY__) IsSavedata = true; break; case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__ARRAY_1D__: if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING_ARRAY__) IsSavedata = true; break; case VariableCode.__INTEGER__: if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_INTEGER__) IsSavedata = true; break; case VariableCode.__STRING__: if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_STRING__) IsSavedata = true; break; case VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__: if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_INTEGER_ARRAY__) IsSavedata = true; break; case VariableCode.__STRING__ | VariableCode.__ARRAY_1D__: if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_STRING_ARRAY__) IsSavedata = true; break; } } }
public __INT_MIN__Token(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = true; }
public WINDOW_TITLE_Token(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = false; }
public StrVariableToken(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = false; array = varData.DataString; }
public StrConstantToken(VariableCode varCode, VariableData varData, string s) : base(varCode, varData) { this.s = s; }
public Str1DConstantToken(VariableCode varCode, VariableData varData) : base(varCode, varData) { this.array = varData.constant.GetCsvNameList(varCode); }
private VariableIdentifier(VariableCode code, string scope) { this.code = code; this.scope = scope; }
public static VariableIdentifier GetVariableId(VariableCode code) { return(new VariableIdentifier(code)); }
public CHARANUM_Token(VariableCode varCode, VariableData varData) : base(varCode, varData) { }
public Str1DConstantToken(VariableCode varCode, VariableData varData, string[] array) : base(varCode, varData) { this.array = array; }
public CharaStrVariableToken(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = false; }
protected UserDefinedVariableToken(VariableCode varCode, UserDefinedVariableData data) : base(varCode, null) { varName = data.Name; IsPrivate = data.Private; this.sizes = data.Lengths; this.IsGlobal = data.Global; this.IsSavedata = data.Save; //Dimension = sizes.Length; totalSize = 1; for (int i = 0; i < sizes.Length; i++) totalSize *= sizes[i]; }
public CompatiRandToken(VariableCode varCode, VariableData varData) : base(varCode, varData) { }
public MONEYLABEL_Token(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = true; }
public ConstantToken(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = true; }
public string[] GetCsvNameList(VariableCode code) { return names[(int)(code & VariableCode.__LOWERCASE__)]; }
public Debug__LINE__Token(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = true; }
public bool isDefined(VariableCode varCode, string str) { if (string.IsNullOrEmpty(str)) return false; string errPos = null; Dictionary<string, int> dic = null; if (varCode == VariableCode.CDFLAG) { dic = GetKeywordDictionary(out errPos, VariableCode.CDFLAGNAME1, -1); if ((dic == null) || (!dic.ContainsKey(str))) dic = GetKeywordDictionary(out errPos, VariableCode.CDFLAGNAME2, -1); if (dic == null) return false; return dic.ContainsKey(str); } dic = GetKeywordDictionary(out errPos, varCode, -1); if (dic == null) return false; return dic.ContainsKey(str); }
public DRAWLINESTR_Token(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = true; }
public LocalStr1DVariableToken(VariableCode varCode, VariableData varData, string subId, int size) : base(varCode, varData, subId, size) { }
/// <summary> /// 識別子一つを解決 /// </summary> /// <param name="wc"></param> /// <param name="idStr">識別子文字列</param> /// <param name="varCode">変数の引数の場合はその変数のCode。連想配列的につかう</param> /// <returns></returns> private static IOperandTerm reduceIdentifier(WordCollection wc, string idStr, VariableCode varCode) { wc.ShiftNext(); SymbolWord symbol = wc.Current as SymbolWord; if (symbol != null && symbol.Type == '.') { //名前空間 throw new NotImplCodeEE(); } else if (symbol != null && (symbol.Type == '(' || symbol.Type == '[')) { //関数 wc.ShiftNext(); if (symbol.Type == '[') //1810 多分永久に実装されない { throw new CodeEE("[]を使った機能はまだ実装されていません"); } //引数を処理 IOperandTerm[] args = ReduceArguments(wc, ArgsEndWith.RightParenthesis, false); IOperandTerm mToken = GlobalStatic.IdentifierDictionary.GetFunctionMethod(GlobalStatic.LabelDictionary, idStr, args, false); if (mToken == null) { if (!Program.AnalysisMode) { GlobalStatic.IdentifierDictionary.ThrowException(idStr, true); } else { if (GlobalStatic.tempDic.ContainsKey(idStr)) { GlobalStatic.tempDic[idStr]++; } else { GlobalStatic.tempDic.Add(idStr, 1); } return(new NullTerm(0)); } } return(mToken); } else { //変数 or キーワード VariableToken id = ReduceVariableIdentifier(wc, idStr); if (id != null) //idStrが変数名の場合、 { if (varCode != VariableCode.__NULL__) //変数の引数が引数を持つことはない { return(VariableParser.ReduceVariable(id, null, null, null)); } else { return(VariableParser.ReduceVariable(id, wc)); } } //idStrが変数名でない場合、 IOperandTerm refToken = GlobalStatic.IdentifierDictionary.GetFunctionMethod(GlobalStatic.LabelDictionary, idStr, null, false); if (refToken != null) //関数参照と名前が一致したらそれを返す。実際に使うとエラー { return(refToken); } if (varCode != VariableCode.__NULL__ && GlobalStatic.ConstantData.isDefined(varCode, idStr)) //連想配列的な可能性アリ { return(new SingleTerm(idStr)); } GlobalStatic.IdentifierDictionary.ThrowException(idStr, false); } throw new ExeEE("エラー投げ損ねた"); //ここまででthrowかreturnのどちらかをするはず。 }
static VariableIdentifier() { Array array = Enum.GetValues(typeof(VariableCode)); nameDic.Add(VariableCode.__FILE__.ToString(), VariableCode.__FILE__); nameDic.Add(VariableCode.__LINE__.ToString(), VariableCode.__LINE__); nameDic.Add(VariableCode.__FUNCTION__.ToString(), VariableCode.__FUNCTION__); foreach (object name in array) { VariableCode code = (VariableCode)name; string key = code.ToString(); if ((key == null) || (key.StartsWith("__") && key.EndsWith("__"))) { continue; } if (Config.ICVariable) { key = key.ToUpper(); } if (nameDic.ContainsKey(key)) { continue; } #if UEMUERA_DEBUG if ((code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__) { if ((code & VariableCode.__ARRAY_1D__) == VariableCode.__ARRAY_1D__) { throw new ExeEE("ARRAY2DとARRAY1Dは排他"); } } if (((code & VariableCode.__INTEGER__) != VariableCode.__INTEGER__) && ((code & VariableCode.__STRING__) != VariableCode.__STRING__)) { throw new ExeEE("INTEGERとSTRINGのどちらかは必須"); } if (((code & VariableCode.__INTEGER__) == VariableCode.__INTEGER__) && ((code & VariableCode.__STRING__) == VariableCode.__STRING__)) { throw new ExeEE("INTEGERとSTRINGは排他"); } if ((code & VariableCode.__EXTENDED__) != VariableCode.__EXTENDED__) { if ((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__) { throw new ExeEE("SAVE_EXTENDEDにはEXTENDEDフラグ必須"); } if ((code & VariableCode.__LOCAL__) == VariableCode.__LOCAL__) { throw new ExeEE("LOCALにはEXTENDEDフラグ必須"); } if ((code & VariableCode.__GLOBAL__) == VariableCode.__GLOBAL__) { throw new ExeEE("GLOBALにはEXTENDEDフラグ必須"); } if ((code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__) { throw new ExeEE("ARRAY2DにはEXTENDEDフラグ必須"); } } if (((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__) && ((code & VariableCode.__UNCHANGEABLE__) == VariableCode.__UNCHANGEABLE__)) { throw new ExeEE("CALCとSAVE_EXTENDEDは排他"); } if (((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__) && ((code & VariableCode.__CALC__) == VariableCode.__CALC__)) { throw new ExeEE("UNCHANGEABLEとSAVE_EXTENDEDは排他"); } if (((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__) && ((code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__) && ((code & VariableCode.__STRING__) == VariableCode.__STRING__)) { throw new ExeEE("STRINGかつARRAY2DのSAVE_EXTENDEDは未実装"); } #endif nameDic.Add(key, code); ////セーブが必要な変数リストの作成 ////__SAVE_EXTENDED__フラグ持ち //if ((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__) //{ // if ((code & VariableCode.__CHARACTER_DATA__) == VariableCode.__CHARACTER_DATA__) // charaSaveDataList.Add(code); // else // saveDataList.Add(code); //} //else if ( ((code & VariableCode.__EXTENDED__) != VariableCode.__EXTENDED__) // && ((code & VariableCode.__CALC__) != VariableCode.__CALC__) // && ((code & VariableCode.__UNCHANGEABLE__) != VariableCode.__UNCHANGEABLE__) // && ((code & VariableCode.__LOCAL__) != VariableCode.__LOCAL__) // && (!key.StartsWith("NOTUSE_")) ) //{//eramaker由来の変数でセーブするもの // VariableCode flag = code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__STRING__ | VariableCode.__INTEGER__ | VariableCode.__CHARACTER_DATA__); // int codeInt = (int)VariableCode.__LOWERCASE__ & (int)code; // switch (flag) // { // case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__: // if (codeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER__) // charaSaveDataList.Add(code); // break; // case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__: // if (codeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING__) // charaSaveDataList.Add(code); // break; // case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__: // if (codeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER_ARRAY__) // charaSaveDataList.Add(code); // break; // case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__ARRAY_1D__: // if (codeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING_ARRAY__) // charaSaveDataList.Add(code); // break; // case VariableCode.__INTEGER__: // if (codeInt < (int)VariableCode.__COUNT_SAVE_INTEGER__) // saveDataList.Add(code); // break; // case VariableCode.__STRING__: // if (codeInt < (int)VariableCode.__COUNT_SAVE_STRING__) // saveDataList.Add(code); // break; // case VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__: // if (codeInt < (int)VariableCode.__COUNT_SAVE_INTEGER_ARRAY__) // saveDataList.Add(code); // break; // case VariableCode.__STRING__ | VariableCode.__ARRAY_1D__: // if (codeInt < (int)VariableCode.__COUNT_SAVE_STRING_ARRAY__) // saveDataList.Add(code); // break; // } //} if ((code & VariableCode.__LOCAL__) == VariableCode.__LOCAL__) { localvarNameDic.Add(key, code); } if ((code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__) { VariableCode flag = code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__INTEGER__); if (!extSaveListDic.TryGetValue(flag, out var var_code_list)) { var_code_list = new List <VariableCode>(); extSaveListDic.Add(flag, var_code_list); } var_code_list.Add(code); } } }
public LASTLOAD_TEXT_Token(VariableCode varCode, VariableData varData) : base(varCode, varData) { }
public LINECOUNT_Token(VariableCode varCode, VariableData varData) : base(varCode, varData) { }
public Int1DConstantToken(VariableCode varCode, VariableData varData, Int64[] array) : base(varCode, varData) { this.array = array; }
public LASTLOAD_VERSION_Token(VariableCode varCode, VariableData varData) : base(varCode, varData) { }
public VariableLocal(VariableCode varCode, int size, CreateLocalVariableToken creater) { this.size = size; this.varCode = varCode; this.creater = creater; }
protected ReferenceToken(VariableCode varCode, UserDefinedVariableData data) : base(varCode, data) { CanRestructure = false; IsStatic = !data.Private; IsReference = true; arrayList = new List<Array>(); }
protected PseudoVariableToken(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = false; }
/// <summary> /// 解析器の本体 /// </summary> /// <param name="wc"></param> /// <param name="allowKeywordTo">TOキーワードが見つかっても良いか</param> /// <param name="endWith">終端記号</param> /// <returns></returns> private static IOperandTerm reduceTerm(WordCollection wc, bool allowKeywordTo, TermEndWith endWith, VariableCode varCode) { TermStack stack = new TermStack(); //int termCount = 0; int ternaryCount = 0; OperatorCode formerOp = OperatorCode.NULL; bool varArg = varCode != VariableCode.__NULL__; do { Word token = wc.Current; switch (token.Type) { case '\0': goto end; case '"': //LiteralStringWT stack.Add(((LiteralStringWord)token).Str); break; case '0': //LiteralIntegerWT stack.Add(((LiteralIntegerWord)token).Int); break; case 'F': //FormattedStringWT stack.Add(ToStrFormTerm((StrFormWord)token)); break; case 'A': //IdentifierWT { string idStr = (((IdentifierWord)token).Code); if (idStr.Equals("TO", Config.SCVariable)) { if (allowKeywordTo) { goto end; } else { throw new CodeEE("TOキーワードはここでは使用できません"); } } else if (idStr.Equals("IS", Config.SCVariable)) { throw new CodeEE("ISキーワードはここでは使用できません"); } stack.Add(reduceIdentifier(wc, idStr, varCode)); continue; } case '=': //OperatorWT { if (varArg) { throw new CodeEE("変数の引数の読み取り中に予期しない演算子を発見しました"); } OperatorCode op = ((OperatorWord)token).Code; if (op == OperatorCode.Assignment) { if ((endWith & TermEndWith.Assignment) == TermEndWith.Assignment) { goto end; } throw new CodeEE("式中で代入演算子'='が使われています(等価比較には'=='を使用してください)"); } if (formerOp == OperatorCode.Equal || formerOp == OperatorCode.Greater || formerOp == OperatorCode.Less || formerOp == OperatorCode.GreaterEqual || formerOp == OperatorCode.LessEqual || formerOp == OperatorCode.NotEqual) { if (op == OperatorCode.Equal || op == OperatorCode.Greater || op == OperatorCode.Less || op == OperatorCode.GreaterEqual || op == OperatorCode.LessEqual || op == OperatorCode.NotEqual) { ParserMediator.Warn("(構文上の注意)比較演算子が連続しています。", GlobalStatic.Process.GetScaningLine(), 0, false, false); } } stack.Add(op); formerOp = op; if (op == OperatorCode.Ternary_a) { ternaryCount++; } else if (op == OperatorCode.Ternary_b) { if (ternaryCount > 0) { ternaryCount--; } else { throw new CodeEE("対応する'?'のない'#'です"); } } break; } case '(': wc.ShiftNext(); IOperandTerm inTerm = reduceTerm(wc, false, TermEndWith.RightParenthesis, VariableCode.__NULL__); if (inTerm == null) { throw new CodeEE("かっこ\"(\"~\")\"の中に式が含まれていません"); } stack.Add(inTerm); if (wc.Current.Type != ')') { throw new CodeEE("対応する')'のない'('です"); } //termCount++; wc.ShiftNext(); continue; case ')': if ((endWith & TermEndWith.RightParenthesis) == TermEndWith.RightParenthesis) { goto end; } throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました"); case ']': if ((endWith & TermEndWith.RightBracket) == TermEndWith.RightBracket) { goto end; } throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました"); case ',': if ((endWith & TermEndWith.Comma) == TermEndWith.Comma) { goto end; } throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました"); case 'M': throw new ExeEE("マクロ解決失敗"); default: throw new CodeEE("構文解釈中に予期しない記号'" + token.Type + "'を発見しました"); } //termCount++; wc.ShiftNext(); } while (!varArg); end: if (ternaryCount > 0) { throw new CodeEE("'?'と'#'の数が正しく対応していません"); } return(stack.ReduceAll()); }
public EmptyStrToken(VariableCode varCode, VariableData varData) : base(varCode, varData) { CanRestructure = true; }