Пример #1
0
            public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
            {
                StringStream st = line.PopArgumentPrimitive();
                IOperandTerm funcname = null;
                if (form)
                {
                    StrFormWord sfw = LexicalAnalyzer.AnalyseFormattedString(st, FormStrEndWith.LeftParenthesis_Bracket_Comma_Semicolon, true);
                    funcname = ExpressionParser.ToStrFormTerm(sfw);
                    funcname = funcname.Restructure(exm);
                }
                else
                {
                    string str = LexicalAnalyzer.ReadString(st, StrEndWith.LeftParenthesis_Bracket_Comma_Semicolon);
                    str = str.Trim(new char[] { ' ', '\t' });
                    funcname = new SingleTerm(str);
                }
                char cur = st.Current;
                WordCollection wc = LexicalAnalyzer.Analyse(st, LexEndWith.EoL, false, false);
                wc.ShiftNext();

                IOperandTerm[] subNames = null;
                IOperandTerm[] args = null;
                if (cur == '[')
                {
                    subNames = ExpressionParser.ReduceArguments(wc, ArgsEndWith.RightBracket, false);
                    if (!wc.EOL)
                    {
                        if (wc.Current.Type != '(')
                        wc.ShiftNext();
                        args = ExpressionParser.ReduceArguments(wc, ArgsEndWith.RightParenthesis, false);
                    }
                }
                if ((cur == '(') || (cur == ','))
                {
                    if (cur == '(')
                        args = ExpressionParser.ReduceArguments(wc, ArgsEndWith.RightParenthesis, false);
                    else
                        args = ExpressionParser.ReduceArguments(wc, ArgsEndWith.EoL, false);
                    if (!wc.EOL)
                    { warn("書式が間違っています", line, 2, false); return null; }
                }
                if (subNames == null)
                    subNames = new IOperandTerm[0];
                if (args == null)
                    args = new IOperandTerm[0];
                for(int i = 0; i < subNames.Length; i++)
                    if (subNames != null)
                        subNames[i] = subNames[i].Restructure(exm);
                for(int i = 0; i < args.Length; i++)
                    if (args[i] != null)
                        args[i] = args[i].Restructure(exm);
                Argument ret = null;
                if(callf)
                    ret = new SpCallFArgment(funcname, subNames, args);
                else
                    ret = new SpCallArgment(funcname, subNames, args);
                if (funcname is SingleTerm)
                {
                    ret.IsConst = true;
                    ret.ConstStr = funcname.GetStrValue(null);
                    if (ret.ConstStr == "")
                    {
                        warn("関数名が指定されていません", line, 2, false);
                        return null;
                    }
                }
                return ret;
            }
Пример #2
0
 public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
 {
     Argument ret = null;
     StringStream st = line.PopArgumentPrimitive();
     List<IOperandTerm> termList = new List<IOperandTerm>();
     LexicalAnalyzer.SkipHalfSpace(st);
     if (st.EOS)
     {
         if (line.FunctionCode == FunctionCode.RETURNFORM)
         {
             termList.Add(new SingleTerm("0"));
             ret = new ExpressionArrayArgument(termList);
             ret.IsConst = true;
             ret.ConstInt = 0;
             return ret;
         }
         warn("引数が設定されていません", line, 2, false);
         return null;
     }
     while (true)
     {
         StrFormWord sfwt = LexicalAnalyzer.AnalyseFormattedString(st, FormStrEndWith.Comma, false);
         IOperandTerm term = ExpressionParser.ToStrFormTerm(sfwt);
         term = term.Restructure(exm);
         termList.Add(term);
         st.ShiftNext();
         if (st.EOS)
             break;
         LexicalAnalyzer.SkipHalfSpace(st);
         if (st.EOS)
         {
             warn("\',\'の後ろに引数がありません。", line, 1, false);
             break;
         }
     }
     return new ExpressionArrayArgument(termList);
 }
Пример #3
0
            public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
            {
                StringStream st = line.PopArgumentPrimitive();
                Argument ret = null;
                if (st.EOS)
                {
                    if(!nullable)
                    {
                        warn("引数が設定されていません", line, 2, false);
                        return null;
                    }
                    //if (line.FunctionCode == FunctionCode.PRINTFORML)
                    //	warn("PRINTFORMLの後ろに空白がありません(eramaker:\'PRINTFORML\'を表示)", line, 0, true);
                    ret = new ExpressionArgument(new SingleTerm(""));

                    ret.ConstStr = "";
                    ret.IsConst = true;
                    return ret;
                }
                StrFormWord sfwt = LexicalAnalyzer.AnalyseFormattedString(st, FormStrEndWith.EoL, false);
                IOperandTerm term = ExpressionParser.ToStrFormTerm(sfwt);
                term = term.Restructure(exm);
                ret = new ExpressionArgument(term);
                if(term is SingleTerm)
                {
                    ret.ConstStr = term.GetStrValue(exm);
                    ret.IsConst = true;
                }
                return ret;
            }
Пример #4
0
 public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
 {
     StringStream st = line.PopArgumentPrimitive();
         string rowStr = null;
     if (st.EOS)
     {
         if (!nullable)
         {
             warn("引数が設定されていません", line, 2, false);
             return null;
         }
         rowStr = "";
         //1756 処理変更のために完全に見分けが付かなくなってしまった
         //if (line.FunctionCode == FunctionCode.PRINTL)
         //	warn("PRINTLの後ろに空白がありません(eramaker:\'PRINTL\'を表示)", line, 0, true);
     }
     else
         rowStr = st.Substring();
     if (line.FunctionCode == FunctionCode.SETCOLORBYNAME || line.FunctionCode == FunctionCode.SETBGCOLORBYNAME)
     {
         Color c = Color.FromName(rowStr);
         if (rowStr != "BLACK" && (c.R == 0 && c.G == 0 && c.B == 0))
             warn(line.Function.Name + "関数で指定された色名\"" +  rowStr + "\"は無効な色名です", line, 2, false);
     }
     Argument ret = new ExpressionArgument(new SingleTerm(rowStr));
     ret.ConstStr = rowStr;
     ret.IsConst = true;
     return ret;
 }
Пример #5
0
 public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
 {
     StringStream st = line.PopArgumentPrimitive();
     LexicalAnalyzer.SkipWhiteSpace(st);
     if (!st.EOS)
         warn("引数は不要です", line, 1, false);
     return new VoidArgument();
 }
Пример #6
0
 public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
 {
     StringStream st = line.PopArgumentPrimitive();
     WordCollection wc = LexicalAnalyzer.Analyse(st, LexEndWith.Comma, false, false);
     st.ShiftNext();
     if (st.EOS)
         {warn("引数が足りません", line, 2, false); return null;}
     double d = 0.0;
     try
     {
         LexicalAnalyzer.SkipWhiteSpace(st);
         d = LexicalAnalyzer.ReadDouble(st);
         LexicalAnalyzer.SkipWhiteSpace(st);
         if (!st.EOS)
             warn("引数が多すぎます", line, 1, false);
     }
     catch
     {
         warn("第2引数が実数値ではありません(常に0と解釈されます)", line, 1, false);
         d = 0.0;
     }
     IOperandTerm term = ExpressionParser.ReduceExpressionTerm(wc, TermEndWith.EoL);
     if (term == null)
     { warn("書式が間違っています", line, 2, false); return null; }
     VariableTerm varTerm = term.Restructure(exm) as VariableTerm;
     if (varTerm == null)
     { warn("第1引数に変数以外を指定することはできません", line, 2, false); return null; }
     else if (varTerm.IsString)
     { warn("第1引数を文字列変数にすることはできません", line, 2, false); return null; }
     else if (varTerm.Identifier.Readonly)
     { warn("第1引数に変更できない変数を指定することはできません", line, 2, false); return null; }
     return new SpTimesArgument(varTerm, d);
 }
Пример #7
0
 public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
 {
     StringStream st = line.PopArgumentPrimitive();
     IdentifierWord iw = LexicalAnalyzer.ReadSingleIdentifierWord(st);
     if (iw == null)
     { warn("第1引数を読み取ることができません", line, 2, false); return null; }
     string idStr = iw.Code;
     VariableToken id = GlobalStatic.IdentifierDictionary.GetVariableToken(idStr, null, true);
     if (id == null)
     { warn("第1引数に変数以外を指定することはできません", line, 2, false); return null; }
     else if ((!id.IsArray1D && !id.IsArray2D && !id.IsArray3D) || (id.Code == VariableCode.RAND))
     { warn("第1引数に配列でない変数を指定することはできません", line, 2, false); return null; }
     LexicalAnalyzer.SkipWhiteSpace(st);
     if (!st.EOS)
     {
         warn("引数の後に余分な文字があります", line, 1, false);
     }
     return new SpVarsizeArgument(id);
 }
Пример #8
0
            public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
            {
                WordCollection destWc = line.PopAssignmentDestStr();
                IOperandTerm[] destTerms = ExpressionParser.ReduceArguments(destWc, ArgsEndWith.EoL, false);
                SpSetArgument ret = null;
                if ((destTerms.Length == 0) || (destTerms[0] == null))
                    {assignwarn("代入文の代入先変数の読み取りに失敗しました", line, 2, false); return null;}
                if (destTerms.Length != 1)
                    {assignwarn("代入文の左辺に余分な','があります", line, 2, false); return null;}
                VariableTerm varTerm = destTerms[0] as VariableTerm;
                if (varTerm == null)
                {//
                    assignwarn("代入文の左辺に変数以外を指定することはできません", line, 2, false);
                    return null;
                }
                else if (varTerm.Identifier.Readonly)
                {
                    assignwarn("代入文に変更できない変数を指定することはできません", line, 2, false);
                    return null;
                }
                varTerm.Restructure(exm);
                StringStream st = line.PopArgumentPrimitive();
                if (st == null)
                    st = new StringStream("");
                OperatorCode op = line.AssignOperator;
                IOperandTerm src = null;
                if(varTerm.IsInteger)
                {
                    if((op == OperatorCode.Increment)||(op == OperatorCode.Decrement))
                    {
                        LexicalAnalyzer.SkipWhiteSpace(st);
                        if (!st.EOS)
                        {
                            if (op == OperatorCode.Increment)
                                {assignwarn("インクリメント行でインクリメント以外の処理が定義されています", line, 2, false);return null;}
                            else
                                {assignwarn("デクリメント行でデクリメント以外の処理が定義されています", line, 2, false);return null;}
                        }
                        ret = new SpSetArgument(varTerm, null);
                        ret.IsConst = true;
                        if (op == OperatorCode.Increment)
                            ret.ConstInt = 1;
                        else
                            ret.ConstInt = -1;
                        ret.AddConst = true;
                        return ret;
                    }
                    WordCollection srcWc = LexicalAnalyzer.Analyse(st, LexEndWith.EoL, false, false);
                    IOperandTerm[] srcTerms = ExpressionParser.ReduceArguments(srcWc, ArgsEndWith.EoL, false);

                    if ((srcTerms.Length == 0) || (srcTerms[0] == null))
                        {assignwarn("代入文の右辺の読み取りに失敗しました", line, 2, false); return null;}
                    if (srcTerms.Length != 1)
                    {
                        if(op != OperatorCode.Assignment)
                        {assignwarn("複合代入演算では右辺に複数の値を含めることはできません", line, 2, false); return null;}
                        bool allConst = true;
                        Int64[] constValues = new Int64[srcTerms.Length];
                        for (int i = 0; i < srcTerms.Length; i++)
                        {
                            if (srcTerms[i] == null)
                            { assignwarn("代入式の右辺の値は省略できません", line, 2, false); return null; }
                            if (!srcTerms[i].IsInteger)
                            { assignwarn("数値型変数に文字列は代入できません", line, 2, false); return null; }
                            srcTerms[i] = srcTerms[i].Restructure(exm);
                            if (allConst && (srcTerms[i] is SingleTerm))
                                constValues[i] = srcTerms[i].GetIntValue(null);
                            else
                                allConst = false;
                        }
                        SpSetArrayArgument arrayarg = new SpSetArrayArgument(varTerm, srcTerms, constValues);
                        arrayarg.IsConst = allConst;
                        return arrayarg;
                    }
                    if(!srcTerms[0].IsInteger)
                        {assignwarn("数値型変数に文字列は代入できません", line, 2, false); return null;}
                    src = srcTerms[0].Restructure(exm);
                    if(op == OperatorCode.Assignment)
                    {
                        ret = new SpSetArgument(varTerm, src);
                        if(src is SingleTerm)
                        {
                            ret.IsConst = true;
                            ret.AddConst = false;
                            ret.ConstInt = src.GetIntValue(null);
                        }
                        return ret;
                    }
                    if((op == OperatorCode.Plus)||(op == OperatorCode.Minus))
                    {
                        if(src is SingleTerm)
                        {
                            ret = new SpSetArgument(varTerm, null);
                            ret.IsConst = true;
                            ret.AddConst = true;
                            if (op == OperatorCode.Plus)
                                ret.ConstInt = src.GetIntValue(null);
                            else
                                ret.ConstInt = -src.GetIntValue(null);
                            return ret;
                        }
                    }
                    src = OperatorMethodManager.ReduceBinaryTerm(op,varTerm, src);
                    return new SpSetArgument(varTerm, src);

                }
                else
                {
                    if (op == OperatorCode.Assignment)
                    {
                        LexicalAnalyzer.SkipHalfSpace(st);//文字列の代入なら半角スペースだけを読み飛ばす
                        //eramakerは代入文では妙なTrim()をする。半端にしか再現できないがとりあえずtrim = true
                        StrFormWord sfwt = LexicalAnalyzer.AnalyseFormattedString(st, FormStrEndWith.EoL, true);
                        IOperandTerm term = ExpressionParser.ToStrFormTerm(sfwt);
                        src = term.Restructure(exm);
                        ret = new SpSetArgument(varTerm, src);
                        if (src is SingleTerm)
                        {
                            ret.IsConst = true;
                            ret.AddConst = false;
                            ret.ConstStr = src.GetStrValue(null);
                            return ret;
                        }
                        return new SpSetArgument(varTerm, src);
                    }
                    else if ((op == OperatorCode.Mult)||(op == OperatorCode.Plus))
                    {
                        WordCollection srcWc = LexicalAnalyzer.Analyse(st, LexEndWith.EoL, false, false);
                        IOperandTerm[] srcTerms = ExpressionParser.ReduceArguments(srcWc, ArgsEndWith.EoL, false);

                        if ((srcTerms.Length == 0) || (srcTerms[0] == null))
                            {assignwarn("代入文の右辺の読み取りに失敗しました", line, 2, false); return null;}
                        if (srcTerms.Length != 1)
                            {assignwarn("代入文の右辺に余分な','があります", line, 2, false); return null;}
                        src = srcTerms[0].Restructure(exm);
                        src = OperatorMethodManager.ReduceBinaryTerm(op, varTerm, src);
                        return new SpSetArgument(varTerm, src);
                    }
                    assignwarn("代入式に使用できない演算子が使われました", line, 2, false);
                    return null;
                }
            }
Пример #9
0
 protected WordCollection popWords(InstructionLine line)
 {
     StringStream st = line.PopArgumentPrimitive();
     return LexicalAnalyzer.Analyse(st, LexEndWith.EoL, false, false);
 }
Пример #10
0
 protected IOperandTerm[] popTerms(InstructionLine line)
 {
     StringStream st = line.PopArgumentPrimitive();
     WordCollection wc = LexicalAnalyzer.Analyse(st, LexEndWith.EoL, false, false);
     return ExpressionParser.ReduceArguments(wc, ArgsEndWith.EoL, false);
 }
Пример #11
0
 public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
 {
     StringStream st = line.PopArgumentPrimitive();
     WordCollection wc = LexicalAnalyzer.Analyse(st, LexEndWith.EoL, true, false);
     IOperandTerm[] args = ExpressionParser.ReduceArguments(wc, ArgsEndWith.EoL, false);
     for(int i = 0; i< args.Length;i++)
     {
         if(args[i] == null)
             {warn("引数を省略することはできません", line, 2, false); return null;}
         else
             args[i] = args[i].Restructure(exm);
     }
     return new SpPrintVArgument(args);
 }
Пример #12
0
 public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm)
 {
     StringStream st = line.PopArgumentPrimitive();
     Argument ret = null;
     if (st.EOS)
     {
         ret = new ExpressionArgument(null);
         return ret;
     }
     StrFormWord sfwt = LexicalAnalyzer.AnalyseFormattedString(st, FormStrEndWith.EoL, false);
     IOperandTerm term = ExpressionParser.ToStrFormTerm(sfwt);
     term = term.Restructure(exm);
     ret = new ExpressionArgument(term);
     if (term is SingleTerm)
     {
         ret.ConstStr = term.GetStrValue(exm);
         if (line.FunctionCode == FunctionCode.ONEINPUTS)
         {
             if (string.IsNullOrEmpty(ret.ConstStr))
             {
                 warn("引数が空文字列なため、引数は無視されます", line, 1, false);
                 ret = new ExpressionArgument(null);
                 return ret;
             }
             else if (ret.ConstStr.Length > 1)
             {
                 warn("ONEINPUTSの引数に2文字以上の文字列が渡されています(2文字目以降は無視されます)", line, 1, false);
                 ret.ConstStr = ret.ConstStr.Remove(1);
             }
         }
         ret.IsConst = true;
     }
     return ret;
 }