/// <summary> /// adr[,x] のオペランドを解釈します。 /// </summary> /// <param name="lexer">オペランドの字句を解析する <see cref="OperandLexer"/> のオブジェクトです。</param> /// <param name="opcode">このオペラントの命令の第 1 語のオペコードの値です。</param> /// <returns> /// 解釈した結果として生成した <see cref="AdrXOperand"/> オブジェクトを返します。 /// </returns> internal static AdrXOperand Parse(OperandLexer lexer, UInt16 opcode) { IAdrCodeGenerator adr = ParseAdr(lexer); RegisterOperand x = ParseX(lexer); return(new AdrXOperand(opcode, adr, x)); }
private static Boolean TryParseAdr(OperandLexer lexer, out IAdrCodeGenerator adr) { Token token = lexer.CurrentToken; if (token.Type == TokenType.DecimalConstant) { lexer.MoveNext(); adr = new DecimalConstant(token.I32Value); return(true); } else if (token.Type == TokenType.HexaDecimalConstant) { lexer.MoveNext(); adr = new HexaDecimalConstant(token.I32Value); return(true); } else if (token.Type == TokenType.Label) { lexer.MoveNext(); adr = new AddressConstant(token.StrValue); return(true); } else if (token.Type == TokenType.EqualSign) { // リテラルは、一つの 10 進定数、16 進定数又は文字定数の前に等号 (=) を付けて記述する。 lexer.MoveNext(); adr = Literal.Parse(lexer); return(true); } else { adr = null; return(false); } }
internal static void CheckIAdrCodeGenerator( IAdrCodeGenerator expected, IAdrCodeGenerator actual, String message) { TestUtils.CheckType(expected, actual, message); Type expectedType = expected.GetType(); if (expectedType == typeof(DecimalConstant)) { DecimalConstantTest.Check( (DecimalConstant)expected, (DecimalConstant)actual, message); } else if (expectedType == typeof(HexaDecimalConstant)) { HexaDecimalConstantTest.Check( (HexaDecimalConstant)expected, (HexaDecimalConstant)actual, message); } else if (expectedType == typeof(AddressConstant)) { AddressConstantTest.Check( (AddressConstant)expected, (AddressConstant)actual, message); } else if (expectedType == typeof(Literal)) { LiteralTest.Check( (Literal)expected, (Literal)actual, message); } else { Assert.Fail("未知の IAddrCodeGenerator の実装クラスです。"); } }
internal static void CheckGenerateLiteralDc(IAdrCodeGenerator target, String expected, String message) { LabelTable lblTable = new LabelTable(); String actual = target.GenerateLiteralDc(lblTable); Assert.AreEqual(expected, actual, message); }
internal static AdrXOperand MakeForUnitTest(UInt16 opcode, IAdrCodeGenerator adr, RegisterOperand x) { return(new AdrXOperand(opcode, adr, x)); }
internal static AdrXOperand MakeForUnitTest(IAdrCodeGenerator adr, RegisterOperand x) { return(MakeForUnitTest(OpcodeDef.Dummy, adr, x)); }
private AdrXOperand(UInt16 opcode, IAdrCodeGenerator adr, RegisterOperand x) : base(opcode) { m_adr = adr; m_x = x; }
private void CheckGenerateLiteralDc(IAdrCodeGenerator literal, String expected, String message) { ICodeGeneratorTest.CheckGenerateLiteralDc(literal, expected, message); }
private static void CheckAdr(IAdrCodeGenerator expected, IAdrCodeGenerator actual, String message) { ICodeGeneratorTest.CheckIAdrCodeGenerator(expected, actual, message); }