void collectComponents(PatternExpression exp, long shift,
			Map<Long, PatternExpression> components, Map<String, Long> vals,
			AssemblyResolvedPatterns cur) throws SolverException {
		if (exp instanceof OrExpression) {
			collectComponentsOr((OrExpression) exp, shift, components, vals, cur);
		}
		else if (exp instanceof LeftShiftExpression) {
			collectComponentsLeft((LeftShiftExpression) exp, shift, components, vals, cur);
		}
		else if (exp instanceof RightShiftExpression) {
			collectComponentsRight((RightShiftExpression) exp, shift, components, vals, cur);
		}
		else {
			assert shift < 64;
			PatternExpression conflict = components.put(shift, exp);
			if (conflict != null) {
				throw new SolverException("Two 'fields' at the same shift indicates conflict");
			}
		}
	}
Solves expressions of the form {@code A | B}
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/OrExpressionSolver.java