Пример #1
0
 //以下添え字解析用の追加関数
 public bool checkSameTerm(VariableTerm term)
 {
     //添え字が全部定数があることがこの関数の前提(そもそもそうでないと使い道がない)
     if (!allArgIsConst)
     {
         return(false);
     }
     if (Identifier.Name != term.Identifier.Name)
     {
         return(false);
     }
     for (var i = 0; i < transporter.Length; i++)
     {
         if (transporter[i] != term.transporter[i])
         {
             return(false);
         }
     }
     return(true);
 }
Пример #2
0
 public SpVarSetArgument(VariableTerm var, IOperandTerm termSrc, IOperandTerm start, IOperandTerm end)
 {
     VariableDest = var;
     Term = termSrc;
     Start = start;
     End = end;
 }
Пример #3
0
 public SpTimesArgument(VariableTerm var, double d)
 {
     VariableDest = var;
     DoubleValue = d;
 }
Пример #4
0
 public SpSwapVarArgument(VariableTerm v1, VariableTerm v2)
 {
     var1 = v1;
     var2 = v2;
 }
Пример #5
0
 public PrintDataArgument(VariableTerm var)
 {
     Var = var;
 }
 public UserDefinedFunctionArgument(IOperandTerm[] srcArgs, VariableTerm[] destArgs)
 {
     Arguments = srcArgs;
     TransporterInt = new Int64[Arguments.Length];
     TransporterStr = new string[Arguments.Length];
     TransporterRef = new Array[Arguments.Length];
     isRef = new bool[Arguments.Length];
     for (int i = 0; i < Arguments.Length; i++)
     {
         isRef[i] = destArgs[i].Identifier.IsReference;
     }
 }
Пример #7
0
 public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
 {
     VariableTerm varTerm = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("NO"), new IOperandTerm[] { new SingleTerm(0) });
     SortOrder order = SortOrder.ASCENDING;
     WordCollection wc = popWords(line);
     IdentifierWord id = wc.Current as IdentifierWord;
     if (wc.EOL)
     {
         return new SpSortcharaArgument(varTerm, order);
     }
     if ((id != null) && (id.Code.Equals("FORWARD", Config.SCVariable)
         || (id.Code.Equals("BACK", Config.SCVariable))))
     {
         if (id.Code.Equals("BACK", Config.SCVariable))
             order = SortOrder.DESENDING;
         wc.ShiftNext();
         if (!wc.EOL)
             warn("引数が多すぎます", line, 1, false);
     }
     else
     {
         IOperandTerm term = ExpressionParser.ReduceExpressionTerm(wc, TermEndWith.Comma);
         if (term == null)
         { warn("書式が間違っています", line, 2, false); return null; }
         varTerm = term.Restructure(exm) as VariableTerm;
         if (varTerm == null)
         { warn("第1引数に変数以外を指定することはできません", line, 2, false); return null; }
         else if (!varTerm.Identifier.IsCharacterData)
         { warn("第1引数はキャラクタ変数でなければなりません", line, 2, false); return null; }
         wc.ShiftNext();
         if (!wc.EOL)
         {
             id = wc.Current as IdentifierWord;
             if ((id != null) && (id.Code.Equals("FORWARD", Config.SCVariable)
                 || (id.Code.Equals("BACK", Config.SCVariable))))
             {
                 if (id.Code.Equals("BACK", Config.SCVariable))
                     order = SortOrder.DESENDING;
                 wc.ShiftNext();
                 if (!wc.EOL)
                     warn("引数が多すぎます", line, 1, false);
             }
             else
             { warn("書式が間違っています", line, 2, false); return null; }
         }
     }
     return new SpSortcharaArgument(varTerm, order);
 }
Пример #8
0
 public SpGetIntArgument(VariableTerm var)
 {
     VarToken = var;
 }
Пример #9
0
 public SpPowerArgument(VariableTerm var, IOperandTerm x, IOperandTerm y)
 {
     VariableDest = var;
     X = x;
     Y = y;
 }
Пример #10
0
 public SpForNextArgment(VariableTerm var, IOperandTerm start, IOperandTerm end, IOperandTerm step)
 {
     this.Cnt = var;
     this.Start = start;
     this.End = end;
     this.Step = step;
 }
Пример #11
0
 public BitArgument(VariableTerm var, IOperandTerm[] termSrc)
 {
     VariableDest = var;
     Term = termSrc;
 }
Пример #12
0
 public SpArraySortArgument(VariableTerm var, SortOrder order, IOperandTerm num1, IOperandTerm num2)
 {
     VarToken = var;
     Order = order;
     Num1 = num1;
     Num2 = num2;
 }
Пример #13
0
 public SpArrayShiftArgument(VariableTerm var, IOperandTerm num1, IOperandTerm num2, IOperandTerm num3, IOperandTerm num4)
 {
     VarToken = var;
     Num1 = num1;
     Num2 = num2;
     Num3 = num3;
     Num4 = num4;
 }
Пример #14
0
 public SpArrayControlArgument(VariableTerm var, IOperandTerm num1, IOperandTerm num2)
 {
     VarToken = var;
     Num1 = num1;
     Num2 = num2;
 }
Пример #15
0
        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 });
        }
Пример #16
0
 public SpSetArgument(VariableTerm var, IOperandTerm termSrc)
 {
     VariableDest = var;
     Term = termSrc;
 }
Пример #17
0
        private void parseLabel(FunctionLabelLine label)
        {
            WordCollection wc = label.PopRowArgs();
            string errMes = null;
            SingleTerm[] subNames = new SingleTerm[0];
            VariableTerm[] args = new VariableTerm[0];
            SingleTerm[] defs = new SingleTerm[0];
            int maxArg = -1;
            int maxArgs = -1;
            //1807 非イベント関数のシステム関数については警告レベル低下&エラー解除&引数を設定するように。
            if (label.IsEvent)
            {
                if (!wc.EOL)
                    ParserMediator.Warn("イベント関数@" + label.LabelName + " に引数は設定できません", label, 2, true, false);
                //label.SubNames = subNames;
                label.Arg = args;
                label.Def = defs;
                label.ArgLength = -1;
                label.ArgsLength = -1;
                return;
            }

            if (!wc.EOL)
            {
                if (label.IsSystem)
                    ParserMediator.Warn("システム関数@" + label.LabelName + " に引数が設定されています", label, 1, false, false);
                SymbolWord symbol = wc.Current as SymbolWord;
                wc.ShiftNext();
                if (symbol == null)
                { errMes = "引数の書式が間違っています"; goto err; }
                if (symbol.Type == '[')
                {
                    IOperandTerm[] subNamesRow = ExpressionParser.ReduceArguments(wc, ArgsEndWith.RightBracket, false);
                    if (subNamesRow.Length == 0)
                    { errMes = "関数定義の[]内の引数は空にできません"; goto err; }
                    subNames = new SingleTerm[subNamesRow.Length];
                    for (int i = 0; i < subNamesRow.Length; i++)
                    {
                        if (subNamesRow[i] == null)
                        { errMes = "関数定義の引数は省略できません"; goto err; }
                        IOperandTerm term = subNamesRow[i].Restructure(exm);
                        subNames[i] = term as SingleTerm;
                        if (subNames[i] == null)
                        { errMes = "関数定義の[]内の引数は定数のみ指定できます"; goto err; }
                    }
                    symbol = wc.Current as SymbolWord;
                    if ((!wc.EOL) && (symbol == null))
                    { errMes = "引数の書式が間違っています"; goto err; }
                    wc.ShiftNext();
                }
                if (!wc.EOL)
                {
                    IOperandTerm[] argsRow = null;
                    if (symbol.Type == ',')
                        argsRow = ExpressionParser.ReduceArguments(wc, ArgsEndWith.EoL, true);
                    else if (symbol.Type == '(')
                        argsRow = ExpressionParser.ReduceArguments(wc, ArgsEndWith.RightParenthesis, true);
                    else
                    { errMes = "引数の書式が間違っています"; goto err; }
                    int length = argsRow.Length / 2;
                    args = new VariableTerm[length];
                    defs = new SingleTerm[length];
                    for (int i = 0; i < length; i++)
                    {
                        VariableTerm vTerm = null;
                        SingleTerm def = null;
                        IOperandTerm term = argsRow[i * 2];
                        //引数読み取り時点で判別されないといけない
                        //if (term == null)
                        //{ errMes = "関数定義の引数は省略できません"; goto err; }
                        vTerm = term.Restructure(exm) as VariableTerm;
                        if ((vTerm == null) || (vTerm.Identifier.Readonly))
                        { errMes = "関数定義の引数には代入可能な変数を指定してください"; goto err; }
                        else if (!vTerm.isAllConst)
                        { errMes = "関数定義の引数の添え字には定数を指定してください"; goto err; }
                        if (vTerm.Identifier.Code == VariableCode.ARG)
                        {
                            if (maxArg < vTerm.getEl1forArg + 1)
                                maxArg = vTerm.getEl1forArg + 1;
                        }
                        else if (vTerm.Identifier.Code == VariableCode.ARGS)
                        {
                            if (maxArgs < vTerm.getEl1forArg + 1)
                                maxArgs = vTerm.getEl1forArg + 1;
                        }
                        bool canDef = (vTerm.Identifier.Code == VariableCode.ARG || vTerm.Identifier.Code == VariableCode.ARGS || vTerm.Identifier.IsPrivate);
                        term = argsRow[i * 2 + 1];
                        if (term is NullTerm)
                        {
                            if (canDef)// && label.ArgOptional)
                            {
                                if (vTerm.GetOperandType() == typeof(Int64))
                                    def = new SingleTerm(0);
                                else
                                    def = new SingleTerm("");
                            }
                        }
                        else
                        {
                            def = term.Restructure(exm) as SingleTerm;
                            if (def == null)
                            { errMes = "引数の初期値には定数のみを指定できます"; goto err; }
                            if (!canDef)
                            { errMes = "引数の初期値を定義できるのは\"ARG\"、\"ARGS\"またはプライベート変数のみです"; goto err; }
                            else if (vTerm.Identifier.IsReference)
                            { errMes = "参照渡しの引数に初期値は定義できません"; goto err; }
                            if (vTerm.GetOperandType() != def.GetOperandType())
                            { errMes = "引数の型と初期値の型が一致していません"; goto err; }
                        }
                        args[i] = vTerm;
                        defs[i] = def;
                    }

                }
            }
            if (!wc.EOL)
            { errMes = "引数の書式が間違っています"; goto err; }

            //label.SubNames = subNames;
            label.Arg = args;
            label.Def = defs;
            label.ArgLength = maxArg;
            label.ArgsLength = maxArgs;
            return;
            err:
            ParserMediator.Warn("関数@" + label.LabelName + " の引数のエラー:" + errMes, label, 2, true, false);
            return;
        }
Пример #18
0
 public SpSetArrayArgument(VariableTerm var, IOperandTerm[] termList, Int64[] constList)
 {
     VariableDest = var;
     TermList = termList;
     ConstTermList = constList;
 }
Пример #19
0
 public static void Initialize()
 {
     ZeroTerm = new SingleTerm(0);
     IOperandTerm[] zeroArgs = { ZeroTerm };
     TARGET = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("TARGET"), zeroArgs);
 }
Пример #20
0
 public SpSortcharaArgument(VariableTerm var, SortOrder order)
 {
     SortKey = var;
     SortOrder = order;
 }
Пример #21
0
            public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
            {
                IOperandTerm[] terms = popTerms(line);
                if (!checkArgumentType(line, exm, terms))
                    return null;
                IOperandTerm term = null;
                if (terms.Length == 0)
                {
                    term = new SingleTerm(0);
                    if (!nullable)
                    {
                        if (line.Function.IsExtended())
                            warn("省略できない引数が省略されています。Emueraは0を補います", line, 1, false);
                        else
                            warn("省略できない引数が省略されています。Emueraは0を補いますがeramakerの動作は不定です", line, 1, false);
                    }
                }
                else
                {
                    term = terms[0];
                }

                if (line.FunctionCode == FunctionCode.REPEAT)
                {
                    if ((term is SingleTerm) && (term.GetIntValue(null) <= 0L))
                    {
                        warn("0回以下のREPEATです。(eramakerではエラーになります)", line, 0, true);
                    }
                    VariableToken count = GlobalStatic.VariableData.GetSystemVariableToken("COUNT");
                    VariableTerm repCount = new VariableTerm(count, new IOperandTerm[] { new SingleTerm(0) });
                    repCount.Restructure(exm);
                    return new SpForNextArgment(repCount, new SingleTerm(0), term, new SingleTerm(1));
                }
                ExpressionArgument ret = new ExpressionArgument(term);
                if (term is SingleTerm)
                {
                    Int64 i = term.GetIntValue(null);
                    ret.ConstInt = i;
                    ret.IsConst = true;
                    if (line.FunctionCode == FunctionCode.CLEARLINE)
                    {
                        if (i <= 0L)
                            warn("引数に0以下の値が渡されています(この行は何もしません)", line, 1, false);
                    }
                    else if (line.FunctionCode == FunctionCode.FONTSTYLE)
                    {
                        if (i < 0L)
                            warn("引数に負の値が渡されています(結果は不定です)", line, 1, false);
                    }
                }
                return ret;
            }
Пример #22
0
 public SpSplitArgument(IOperandTerm s1, IOperandTerm s2, VariableToken varId, VariableTerm num)
 {
     TargetStr = s1;
     Split = s2;
     Var = varId;
     Num = num;
 }
Пример #23
0
 public static void Initialize()
 {
     ZeroTerm = new SingleTerm(0);
     IOperandTerm[] zeroArgs = new IOperandTerm[] { ZeroTerm };
     TARGET = new VariableTerm(GlobalStatic.VariableData.GetSystemVariableToken("TARGET"), zeroArgs);
 }
Пример #24
0
 public PlayMusicArguments(VariableTerm var, IOperandTerm start, IOperandTerm end, IOperandTerm step)
 {
     this.Cnt = var;
     this.Start = start;
     this.End = end;
     this.Step = step;
 }