Пример #1
0
        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));
        }