public AssemblyResolution solve(AbstractAssemblyResolutionFactory<?, ?> factory,
			PatternExpression exp, MaskedLong goal, Map<String, Long> vals,
			AssemblyResolvedPatterns cur, String description) throws NeedsBackfillException {
		return solve(factory, exp, goal, vals, cur, Set.of(), description);
	}
Solve a given expression, given a masked-value goal

<p>
From a simplified perspective, we need only the expression and the desired value to solve it.
Generally speaking, the expression may only contain a single field, and the encoded result
specifies the bits of the solved field. It must be absorbed into the overall assembly
pattern.

<p>
More realistically, these expressions may depend on quite a bit of extra information. For
example, PC-relative encodings (i.e., those involving {@code inst_start} or
{@code inst_next}, need to know the starting address of the resulting instruction. {@code
inst_start} must be provided to the solver by the assembler. {@code inst_next} cannot be
known until the instruction length is known. Thus, expressions using it always result in a
{@link NeedsBackfillException}. The symbols, when known, are provided to the solver via the
{@code vals} parameter.

@param exp the expression to solve
@param goal the desired output (modulo a mask) of the expression
@param vals any defined symbols (usually {@code inst_start}, and {@code inst_next})
@param description a description to attached to the encoded solution
@return the encoded solution
@throws NeedsBackfillException a solution may exist, but a required symbol is missing
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/expr/RecursiveDescentSolver.java