@Override
	protected void parseInternal() throws MDException {
		boolean argsDone = false;
		while (!argsDone) {
			char code = dmang.peek();
			MDDataType dt;
			switch (code) {
				case '@':
					dmang.increment();
					argsDone = true;
					break;
				case 'X':
					dmang.increment();
					dt = new MDVoidDataType(dmang);
					dt.parse();
					// If "void" is first argument of a function, terminate the arguments list
					//  without an '@' list terminator.  A "void" can be found in other
					//  argument locations, freely, and they will not terminate the list.
					if (args.size() == 0) {
						argsDone = true;
					}
					args.add(dt);
					if (dmang.peek() == '@') {
						throw new MDException("Void list has '@' terminator");
					}
					// Do not put into backreference parameter list.
					break;
				case 'Z':
					dmang.increment();
					dt = new MDVarArgsType(dmang);
					dt.parse();
					args.add(dt);
					// Do not put into Backref parameter list.  Found counter example with
					//  backreference for an embedded function where, having made it a
					//  backreference, would have resulted in a wrong result.  20140523.
					argsDone = true;
					break;
				case '0':
				case '1':
				case '2':
				case '3':
				case '4':
				case '5':
				case '6':
				case '7':
				case '8':
				case '9':
					dmang.increment();
					int index = code - '0';
					dt = dmang.getBackreferenceFunctionParameterMDDataType(index); // 20140610
					args.add(dt);
					break;
				case MDMang.DONE:
					throw new MDException("String Terminated");
				default:
					dt = MDDataTypeParser.parsePrimaryDataType(dmang, true);
					dt.parse();
					args.add(dt);
					if ((dt instanceof MDModifierType) || (dt instanceof MDExtendedType) ||
						(dt instanceof MDComplexType)) {
						dmang.addBackrefFunctionParameterMDDataType(dt);
					}
					break;
			}
		}
	}
This class represents an arguments list of a function within a Microsoft mangled symbol.
Ghidra/Features/MicrosoftDmang/src/main/java/mdemangler/functiontype/MDArgumentsList.java