/// <summary> /// adr[,x] のオペランドを解釈します。戻り値は、解釈が成功したかどうかを示します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <param name="adrX"> /// 解釈が成功したとき、結果として生成した <see cref="AdrXOperand"/> のオブジェクトを格納します。 /// 失敗した場合は <see langword="null"/> を格納します。 /// </param> /// <returns> /// 解釈に成功した場合は <see langword="true"/> を、失敗した場合は <see langword="false"/> を返します。 /// </returns> internal static Boolean TryParse(OperandLexer lexer, out AdrXOperand adrX) { IAdrCodeGenerator adr; if (!TryParseAdr(lexer, out adr)) { adrX = null; return(false); } else { RegisterOperand x = ParseX(lexer); adrX = new AdrXOperand(OpcodeDef.Dummy, adr, x); return(true); } }
/// <summary> /// r,adr[,x] のオペランドの adr[,x] の部分を解釈します。戻り値は、解釈が成功したかどうかを示します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <param name="opcode">このオペラントの命令の第 1 語のオペコードの値です。</param> /// <param name="r"> /// r,adr[,x] のオペランドの最初の r の内容を保持する <see cref="RegisterOperand"/> のオブジェクトです。 /// </param> /// <param name="rAdrX"> /// 解釈が成功したとき、結果として生成した <see cref="RAdrXOperand"/> のオブジェクトを格納します。 /// 失敗した場合は <see langword="null"/> を格納します。 /// </param> /// <returns> /// 解釈に成功した場合は <see langword="true"/> を、失敗した場合は <see langword="false"/> を返します。 /// </returns> internal static Boolean TryParseAdrX( OperandLexer lexer, UInt16 opcode, RegisterOperand r, out RAdrXOperand rAdrX) { AdrXOperand adrX; if (!AdrXOperand.TryParse(lexer, out adrX)) { rAdrX = null; return(false); } else { rAdrX = new RAdrXOperand(opcode, r, adrX); return(true); } }
/// <summary> /// r1,r2 のオペランドの r2 の部分を解釈します。戻り値は、解釈が成功したかどうかを示します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <param name="opcode">このオペラントの命令の第 1 語のオペコードの値です。</param> /// <param name="r1"> /// r1,r2 のオペランドの最初の r1 の内容を保持する <see cref="RegisterOperand"/> のオブジェクトです。 /// </param> /// <param name="r1R2"> /// 解釈が成功したとき、結果として生成した <see cref="R1R2Operand"/> のオブジェクトを格納します。 /// 失敗した場合は <see langword="null"/> を格納します。 /// </param> /// <returns> /// 解釈に成功した場合は <see langword="true"/> を、失敗した場合は <see langword="false"/> を返します。 /// </returns> internal static Boolean TryParseR2( OperandLexer lexer, UInt16 opcode, RegisterOperand r1, out R1R2Operand r1R2) { RegisterOperand r2; if (!RegisterOperand.TryParse(lexer, out r2)) { r1R2 = null; return(false); } else { r1R2 = new R1R2Operand(opcode, r1, r2); return(true); } }
/// <summary> /// 定数の並びを解釈します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <returns> /// 解釈した結果として生成した <see cref="ConstantCollection"/> オブジェクトを返します。 /// </returns> internal static ConstantCollection Parse(OperandLexer lexer) { List <Constant> constantList = new List <Constant>(); for ( ; ;) { Constant constant = Constant.Parse(lexer); constantList.Add(constant); if (!lexer.SkipIf(TokenType.Comma)) { break; } } // 解釈しなかった残りの字句要素は、Instruction.ReadOperand() で取り扱う。 return(new ConstantCollection(constantList.ToArray())); }
private Operand ParseOperand(ReadBuffer buffer) { OperandLexer lexer = new OperandLexer(buffer); String strToParse = lexer.Remaining; lexer.MoveNext(); Operand operand = ParseSpecificOperand(lexer); // 解釈していない残りの字句要素があるかチェックする。 Token token = lexer.CurrentToken; if (token.Type != TokenType.EndOfToken) { String message = String.Format( Resources.MSG_NotParsedStringRemainsInOperand, Mnemonic, strToParse, lexer.Remaining); throw new Casl2SimulatorException(message); } return(operand); }
internal static ExecStartAddress Parse(OperandLexer lexer) { Token token = lexer.CurrentToken; if (token.Type == TokenType.EndOfToken) { return(new ExecStartAddress(null)); } else if (token.Type == TokenType.Label) { lexer.MoveNext(); Label label = new Label(token.StrValue); return(new ExecStartAddress(label)); } else { String message = String.Format(Resources.MSG_OptionLabelParseError, token); throw new Casl2SimulatorException(message); } // 解釈しなかった残りの字句要素は、Instruction.ParseOperand() で取り扱う。 }
/// <summary> /// リテラルを解釈します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <returns> /// 解釈した結果として生成した <see cref="Literal"/> オブジェクトを返します。 /// </returns> internal static Literal Parse(OperandLexer lexer) { Constant constant = ParseLiteralConstant(lexer); return(new Literal(constant)); }
/// <summary> /// オペランドがない命令のオペランドを解釈します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <param name="opcode">このオペラントの命令の第 1 語のオペコードの値です。</param> /// <returns> /// 解釈した結果として生成した <see cref="NoOperand"/> オブジェクトを返します。 /// </returns> internal static NoOperand Parse(OperandLexer lexer, UInt16 opcode) { return(new NoOperand(opcode)); }
/// <summary> /// DC 命令のオペランドを解釈します。記述の形式は "定数[,定数]..." です。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <returns> /// 解釈した結果として生成した <see cref="Operand"/> クラスのオブジェクトを返します。 /// </returns> protected override Operand ParseSpecificOperand(OperandLexer lexer) { m_constants = ConstantCollection.Parse(lexer); return(m_constants); }
/// <summary> /// IN/OUT 命令のオペランドを解釈します。記述の形式は "入出力領域,入出力文字長領域" です。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <returns> /// 解釈した結果として生成した <see cref="Operand"/> クラスのオブジェクトを返します。 /// </returns> protected override Operand ParseSpecificOperand(OperandLexer lexer) { m_areaSpec = AreaSpec.Parse(lexer); return(m_areaSpec); }
/// <summary> /// START 命令のオペランドを解釈します。記述の形式は "[実行開始番地]" です。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <returns> /// 解釈した結果として生成した <see cref="Operand"/> クラスのオブジェクトを返します。 /// </returns> protected override Operand ParseSpecificOperand(OperandLexer lexer) { m_execStartAddress = ExecStartAddress.Parse(lexer); return(m_execStartAddress); }
/// <summary> /// adr[,x] のオペランドを解釈します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <returns> /// 解釈した結果として生成した <see cref="AdrXOperand"/> オブジェクトを返します。 /// </returns> internal static AdrXOperand Parse(OperandLexer lexer) { return(Parse(lexer, OpcodeDef.Dummy)); }
protected override Operand ParseSpecificOperand(OperandLexer lexer) { m_operand = m_operandParseFunc(lexer); return(m_operand); }
/// <summary> /// それぞれの命令に応じてオペランドの内容を解釈します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <returns> /// 解釈した結果として生成した <see cref="Operand"/> クラスのオブジェクトを返します。 /// </returns> protected abstract Operand ParseSpecificOperand(OperandLexer lexer);
/// <summary> /// オペランドのラベルを解釈します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <returns> /// 解釈した結果として生成した <see cref="Label"/> オブジェクトを返します。 /// </returns> internal static Label Parse(OperandLexer lexer) { Token token = lexer.ReadCurrentAs(TokenType.Label); return(new Label(token.StrValue)); }
/// <summary> /// DS 命令のオペランドを解釈します。記述の形式は "語数" です。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <returns> /// 解釈した結果として生成した <see cref="Operand"/> クラスのオブジェクトを返します。 /// </returns> protected override Operand ParseSpecificOperand(OperandLexer lexer) { m_wordCount = WordCount.Parse(lexer); return(m_wordCount); }
/// <summary> /// r のオペランドを解釈します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <param name="opcode">このオペラントの命令の第 1 語のオペコードの値です。</param> /// <returns> /// 解釈した結果として生成した <see cref="RegisterOperand"/> オブジェクトを返します。 /// </returns> internal static RegisterOperand Parse(OperandLexer lexer, UInt16 opcode) { Token token = lexer.ReadCurrentAs(TokenType.RegisterName); return(new RegisterOperand(opcode, token.StrValue)); }
protected override Operand ParseSpecificOperand(OperandLexer lexer) { return(null); }