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; }
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; }
public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm) { IOperandTerm[] terms = popTerms(line); if (!checkArgumentType(line, exm, terms)) return null; if (terms.Length == 0) { ExpressionArgument ret = new ExpressionArgument(null); ret.ConstStr = ""; ret.ConstInt = 0; ret.IsConst = true; return ret; } return new ExpressionArgument(terms[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; }
public override Argument CreateArgument(InstructionLine line, ExpressionMediator exm) { IOperandTerm[] terms = popTerms(line); if (!checkArgumentType(line, exm, terms)) return null; IOperandTerm term = null; ExpressionArgument ret; if (terms.Length == 0) { ret = new ExpressionArgument(term); return ret; } else { term = terms[0]; ret = new ExpressionArgument(term); } if (term is SingleTerm) { Int64 i = term.GetIntValue(null); if (line.FunctionCode == FunctionCode.ONEINPUT) { if (i < 0) { warn("ONEINPUTの引数にONEINPUTが受け取れない負の数数が指定されています(引数を無効とします)", line, 1, false); ret = new ExpressionArgument(null); return ret; } else if (i > 9) { warn("ONEINPUTの引数にONEINPUTが受け取れない2桁以上の数数が指定されています(最初の桁を引数と見なします)", line, 1, false); i = Int64.Parse(i.ToString().Remove(1)); } } ret.ConstInt = i; ret.IsConst = true; } return ret; }
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; }