public static MDDataType determineAndParseDataType(MDMang dmang, boolean isHighest)
			throws MDException {

		MDDataType dt = null;
		if (dmang.peek() != '.') {
			throw new MDException("MDMang: Mangled string is not that of a type.");
		}

		dmang.setProcessingMode(ProcessingMode.DEFAULT_STANDARD);
		try {
			dmang.pushContext();
			dmang.increment(); // skip the '.'
			dt = parseDataType(dmang, isHighest);
			dt.parse();
			dmang.popContext();
		}
		catch (MDException e1) {
			dmang.resetState();
			dmang.setProcessingMode(ProcessingMode.LLVM);
			try {
				dmang.pushContext();
				dmang.increment(); // skip the '.'
				dt = parseDataType(dmang, isHighest);
				dt.parse();
				dmang.popContext();
			}
			catch (MDException e2) {
				throw new MDException(
					"Reason1: " + e1.getMessage().trim() + "; Reason2: " + e2.getMessage().trim());
			}
		}
		return dt;
	}
This method is only to be used by MDMang itself for the highest level type parsing where
there is not already a multi-retry. This method checks for the '.' starting character,
determines the type by calling the {@link #parseDataType(MDMang, boolean)}, parses the type,
and does the multi-mode retry if there is an exception on the first pass as
MDMangObjectParser does for generic mangled objects
@param dmang - the MDMang driver
@param isHighest - boolean indicating whether something else modifies or names the data
 type to be parsed, which impacts when certain overloaded CV modifiers can be applied.
@return - a type derived from MDDataType
@throws MDException on parsing error
Ghidra/Features/MicrosoftDmang/src/main/java/mdemangler/datatype/MDDataTypeParser.java