public String printSeparator(int separatorIndex) {

		// Separator is all chars to the left of the corresponding operand
		// The mnemonic (first sequence of contiguous non-space print-pieces)
		// is ignored when identifying the first separator (index 0) and the 
		// operand which immediately follows.
		// NOTE: sleigh "operands" may appear as part of mnemonic so the 
		// separator cache may be slightly over-allocated.  
		if (separatorIndex < 0 || separatorIndex > operands.length) {
			return null;
		}

		String cachedSeparator = separators[separatorIndex];
		if (cachedSeparator != null) {
			if (cachedSeparator.length() == 0) {
				return null;
			}
			return cachedSeparator;
		}

		// skip mnemonic and set curPos to first print-piece associated with operand 0
		int curPos = 0;
		while (curPos < printpiece.length &&
			(printpiece[curPos].length() == 0 || printpiece[curPos].charAt(0) != ' ')) {
			curPos++;
		}
		curPos++;

		int opIndex = 0;
		StringBuilder buf = new StringBuilder();
		for (int i = curPos; i < printpiece.length && opIndex <= separatorIndex; i++) {
			if (printpiece[i].length() != 0) {
				if (printpiece[i].charAt(0) == '\n') {
					if (opIndex == separatorIndex) {
						break;
					}
					opIndex++;
				}
				else if (opIndex == separatorIndex) {
					buf.append(printpiece[i]);
				}
			}
		}
		String separator = buf.toString();
		separator = separator.replaceAll(",\\s+", ",");
		separators[separatorIndex] = separator;
		if (separator.length() == 0) {
			return null;
		}
		return separator;
	}
The primary sleigh concept representing a semantic action
taking operands (semantic values) as input
producing a semantic value as output
matching a particular pattern
printing in a certain way
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/Constructor.java