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)); }
private int parseNumberLiteral(ZealCpuParser.NumberLiteralContext context) { return(parseNumberArgument(context).Number); }