Exemple #1
0
        /// <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);
        }
Exemple #6
0
        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() で取り扱う。
        }
Exemple #7
0
        /// <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));
        }
Exemple #8
0
 /// <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);
 }
Exemple #10
0
 /// <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);
 }
Exemple #12
0
 /// <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));
 }
Exemple #13
0
 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);
Exemple #15
0
        /// <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));
        }
Exemple #16
0
 /// <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);
 }