private static List<String> naiveParse(String name) {
		// Only break on namespace delimiters that are found at templateLevel == 0.
		List<String> list = new ArrayList<>();
		int templateLevel = 0;
		int parenthesesLevel = 0;
		int startIndex = 0;
		for (int i = 0; i < name.length(); ++i) {
			if ((name.charAt(i) == ':') && (i != name.length() - 1) &&
				(name.charAt(i + 1) == ':')) {
				if ((templateLevel == 0) && (parenthesesLevel == 0)) {
					int endIndex = i; // could be 0 if i == 0.
					if (endIndex > startIndex) {
						list.add(name.substring(startIndex, endIndex));
						startIndex = i + 2;
						i++; // Only increment one, because the loop also has an increment.
					}
				}
			}
			else if (name.charAt(i) == '<') {
				++templateLevel;
			}
			else if (name.charAt(i) == '>') {
				--templateLevel;
			}
			else if (name.charAt(i) == '(') {
				++parenthesesLevel;
			}
			else if (name.charAt(i) == ')') {
				--parenthesesLevel;
			}
		}
		if ((templateLevel != 0) || (parenthesesLevel != 0)) {
			// Revert to no checking template level
			startIndex = 0;
			list = new ArrayList<>();
			for (int i = 0; i < name.length(); ++i) {
				if ((name.charAt(i) == ':') && (i != name.length() - 1) &&
					name.charAt(i + 1) == ':') {
					int endIndex = i; // could be 0 if i == 0.
					if (endIndex > startIndex) {
						list.add(name.substring(startIndex, endIndex));
						startIndex = i + 2;
						i++; // Only increment one, because the loop also has an increment.
					}
				}
			}
		}
		list.add(name.substring(startIndex, name.length()));

		return list;
	}
Naive parsing that assumes evenly matched angle brackets (templates) with no operator
overloading that contains these and no other rule breakers.
@param name The input String to be parsed.
@return List<String> containing the sequence of namespaces and trailing name.
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/SymbolPathParser.java