public void ShouldParseArgumentSizeCorrectly(string instruction, int value, ArgumentSize size) { string input = String.Format(ProcedureTemplate, instruction); ZealCpuDriver driver = new ZealCpuDriver(input.ToMemoryStream()); driver.Parse(); CpuInstructionStatement instructionStatement = driver.GlobalScope.Children[0].Statements[0] as CpuInstructionStatement; var argument = instructionStatement.Arguments[0] as NumberInstructionArgument; Assert.Equal(value, argument.Number); Assert.Equal(size, argument.Size); }
private NumberInstructionArgument parseNumberArgument(ZealCpuParser.NumberLiteralContext context) { int result = 0; ArgumentSize size = ArgumentSize.Byte; switch (context.Start.Type) { case ZealCpuParser.HEX_LITERAL: { string hexText = context.HEX_LITERAL().GetText().Substring(1); if (Int32.TryParse(hexText, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out result)) { if (hexText.Length > 4 && hexText.Length <= 6) { size = ArgumentSize.LongWord; } else if (hexText.Length > 2 && hexText.Length <= 4) { size = ArgumentSize.Word; } } break; } case ZealCpuParser.INTEGER_LITERAL: if (Int32.TryParse(context.INTEGER_LITERAL().GetText(), out result)) { if (result > ushort.MaxValue) { size = ArgumentSize.LongWord; } else if (result > byte.MaxValue) { size = ArgumentSize.Word; } } break; case ZealCpuParser.BINARY_LITERAL: { string binaryLiteral = context.BINARY_LITERAL().GetText().Substring(1); int stringLength = binaryLiteral.Length - 1; for (int i = 0; i <= stringLength; ++i) { if (binaryLiteral[stringLength - i] == '1') { result |= (1 << i); } } if (binaryLiteral.Length > 16 && binaryLiteral.Length <= 24) { size = ArgumentSize.LongWord; } else if (binaryLiteral.Length > 8 && binaryLiteral.Length <= 16) { size = ArgumentSize.Word; } break; } } return(new NumberInstructionArgument(result, size)); }
public NumberInstructionArgument(int value, ArgumentSize size) { Number = value; Size = size; }