//1756 作成中途 //名前リストを元に何がやりたかったのかを推定してCodeEEを投げる //1822 DIMリストの解決中にIdentifierNotFoundCodeEEが飛んだ場合にはやり直しの可能性がある public void ThrowException(string str, bool isFunc) { string idStr = str; if (Config.ICFunction || Config.ICVariable) //片方だけなのは互換性用オプションなのでレアケースのはず。対応しない。 { idStr = idStr.ToUpper(); } if (disableList.Contains(idStr)) { throw new CodeEE("\"" + str + "\"は#DISABLEが宣言されています"); } if (!isFunc && privateDimList.Contains(idStr)) { throw new IdentifierNotFoundCodeEE("変数\"" + str + "\"はこの関数中では定義されていません"); } DefinedNameType type = DefinedNameType.None; if (nameDic.TryGetValue(idStr, out type)) { switch (type) { case DefinedNameType.Reserved: throw new CodeEE("Emueraの予約語\"" + str + "\"が不正な使われ方をしています"); case DefinedNameType.SystemVariable: case DefinedNameType.UserGlobalVariable: if (isFunc) { throw new CodeEE("変数名\"" + str + "\"が関数のように使われています"); } break; case DefinedNameType.SystemMethod: case DefinedNameType.UserRefMethod: if (!isFunc) { throw new CodeEE("関数名\"" + str + "\"が変数のように使われています"); } break; case DefinedNameType.UserMacro: throw new CodeEE("予期しないマクロ名\"" + str + "\"です"); case DefinedNameType.SystemInstrument: if (isFunc) { throw new CodeEE("命令名\"" + str + "\"が関数のように使われています"); } else { throw new CodeEE("命令名\"" + str + "\"が変数のように使われています"); } } } throw new IdentifierNotFoundCodeEE("\"" + idStr + "\"は解釈できない識別子です"); }
public void CheckUserMacroName(ref string errMes, ref int warnLevel, string macroName) { if (macroName.IndexOfAny(badSymbolAsIdentifier) >= 0) { errMes = "マクロ名" + macroName + "に\"_\"以外の記号が含まれています"; warnLevel = 2; return; } DefinedNameType nametype = DefinedNameType.None; if (nameDic.TryGetValue(macroName, out nametype)) { switch (nametype) { case DefinedNameType.Reserved: errMes = "マクロ名" + macroName + "はEmueraの予約語です"; warnLevel = 2; break; case DefinedNameType.SystemInstrument: case DefinedNameType.SystemMethod: //命令名を上書きした時が面倒なのでとりあえず許可しない errMes = "マクロ名" + macroName + "はEmueraの命令名として使われています"; warnLevel = 2; break; case DefinedNameType.SystemVariable: //別に上書きしてもいいがとりあえず許可しないでおく。いずれ解放するかもしれない errMes = "マクロ名" + macroName + "はEmueraの変数名として使われています"; warnLevel = 2; break; case DefinedNameType.UserMacro: errMes = "マクロ名" + macroName + "は既にマクロ名に使用されています"; warnLevel = 2; break; case DefinedNameType.UserGlobalVariable: errMes = "マクロ名" + macroName + "はユーザー定義の広域変数名に使用されています"; warnLevel = 2; break; case DefinedNameType.UserRefMethod: errMes = "マクロ名" + macroName + "は参照型関数の名称に使用されています"; warnLevel = 2; break; } } }
public void CheckUserPrivateVarName(ref string errMes, ref int warnLevel, string varName) { if (varName.Length == 0) { errMes = "変数名がありません"; warnLevel = 2; return; } //1.721 記号をサポートしない方向に変更 if (varName.IndexOfAny(badSymbolAsIdentifier) >= 0) { errMes = "変数名" + varName + "に\"_\"以外の記号が含まれています"; warnLevel = 2; return; } if (char.IsDigit(varName[0])) { errMes = "変数名" + varName + "が半角数字から始まっています"; warnLevel = 2; return; } DefinedNameType nametype = DefinedNameType.None; if (nameDic.TryGetValue(varName, out nametype)) { switch (nametype) { case DefinedNameType.Reserved: errMes = "変数名" + varName + "はEmueraの予約語です"; warnLevel = 2; return; case DefinedNameType.SystemInstrument: case DefinedNameType.SystemMethod: //代入文が使えなくなるために命令名との衝突は致命的。 errMes = "変数名" + varName + "はEmueraの命令名として使われています"; warnLevel = 2; return; case DefinedNameType.SystemVariable: //システム変数の上書きは不可 errMes = "変数名" + varName + "はEmueraの変数名として使われています"; warnLevel = 2; break; case DefinedNameType.UserMacro: //字句解析がうまくいっていれば本来あり得ないはず errMes = "変数名" + varName + "はマクロに使用されています"; warnLevel = 2; break; case DefinedNameType.UserGlobalVariable: //広域変数の上書きは禁止しておく errMes = "変数名" + varName + "はユーザー定義の広域変数名に使用されています"; warnLevel = 2; break; case DefinedNameType.UserRefMethod: errMes = "変数名" + varName + "は参照型関数の名称に使用されています"; warnLevel = 2; break; } } privateDimList.Add(varName); }
public void CheckUserVarName(ref string errMes, ref int warnLevel, string varName) { //if (varName.Length == 0) //{ // errMes = "変数名がありません"; // warnLevel = 2; // return; //} //1.721 記号をサポートしない方向に変更 if (varName.IndexOfAny(badSymbolAsIdentifier) >= 0) { errMes = "変数名" + varName + "に\"_\"以外の記号が含まれています"; warnLevel = 2; return; } //if (char.IsDigit(varName[0])) //{ // errMes = "変数名" + varName + "が半角数字から始まっています"; // warnLevel = 2; // return; //} DefinedNameType nametype = DefinedNameType.None; if (nameDic.TryGetValue(varName, out nametype)) { switch (nametype) { case DefinedNameType.Reserved: errMes = "変数名" + varName + "はEmueraの予約語です"; warnLevel = 2; break; case DefinedNameType.SystemInstrument: case DefinedNameType.SystemMethod: //代入文が使えなくなるために命令名との衝突は致命的。 errMes = "変数名" + varName + "はEmueraの命令名として使われています"; warnLevel = 2; break; case DefinedNameType.SystemVariable: errMes = "変数名" + varName + "はEmueraの変数名として使われています"; warnLevel = 2; break; case DefinedNameType.UserMacro: errMes = "変数名" + varName + "は既にマクロ名に使用されています"; warnLevel = 2; break; case DefinedNameType.UserGlobalVariable: errMes = "変数名" + varName + "はユーザー定義の広域変数名に使用されています"; warnLevel = 2; break; case DefinedNameType.UserRefMethod: errMes = "変数名" + varName + "は参照型関数の名称に使用されています"; warnLevel = 2; break; } } }
//public void SetSystemInstrumentName(List<string> names) //{ //} public void CheckUserLabelName(ref string errMes, ref int warnLevel, bool isFunction, string labelName) { if (labelName.Length == 0) { errMes = "ラベル名がありません"; warnLevel = 2; return; } //1.721 記号をサポートしない方向に変更 if (labelName.IndexOfAny(badSymbolAsIdentifier) >= 0) { errMes = "ラベル名" + labelName + "に\"_\"以外の記号が含まれています"; warnLevel = 1; return; } if (char.IsDigit(labelName[0]) && (labelName[0].ToString()).Length == LangManager.GetStrlenLang(labelName[0].ToString())) { errMes = "ラベル名" + labelName + "が半角数字から始まっています"; warnLevel = 0; return; } if (!isFunction || !Config.WarnFunctionOverloading) { return; } DefinedNameType nametype = DefinedNameType.None; if (!nameDic.TryGetValue(labelName, out nametype)) { return; } else { switch (nametype) { case DefinedNameType.Reserved: if (Config.AllowFunctionOverloading) { errMes = "関数名" + labelName + "はEmueraの予約語と衝突しています。Emuera専用構文の構文解析に支障をきたす恐れがあります"; warnLevel = 1; } else { errMes = "関数名" + labelName + "はEmueraの予約語です"; warnLevel = 2; } break; case DefinedNameType.SystemMethod: if (Config.AllowFunctionOverloading) { errMes = "関数名" + labelName + "はEmueraの式中関数を上書きします"; warnLevel = 1; } else { errMes = "関数名" + labelName + "はEmueraの式中関数名として使われています"; warnLevel = 2; } break; case DefinedNameType.SystemVariable: errMes = "関数名" + labelName + "はEmueraの変数で使われています"; warnLevel = 1; break; case DefinedNameType.SystemInstrument: errMes = "関数名" + labelName + "はEmueraの変数もしくは命令で使われています"; warnLevel = 1; break; case DefinedNameType.UserMacro: //字句解析がうまくいっていれば本来あり得ないはず errMes = "関数名" + labelName + "はマクロに使用されています"; warnLevel = 2; break; case DefinedNameType.UserRefMethod: errMes = "関数名" + labelName + "は参照型関数の名称に使用されています"; warnLevel = 2; break; } } }