コード例 #1
0
        //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 + "\"は解釈できない識別子です");
        }
コード例 #2
0
        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;
                }
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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;
                }
            }
        }
コード例 #5
0
        //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;
                }
            }
        }