If a hex literal has an 'd' of 'f' in it, such as '0xf' or '0xd', the compiler fails with illegal tree structure.

The other hex literals work.  The issue is probably related to using `f` and `d` in float and double literals.

```
    public void testHexCollisionDouble() {
        assertEquals(13, exec("return 0xd"));
    }

    public void testHexCollisionFloat() {
        assertEquals(15, exec("return 0xf"));
    }

    public void testHex() throws Exception {
        for (int i = 0; i <= 15; i++) {
            String hex = Integer.toHexString(i);
            if ("d".equals(hex) || "f".equals(hex)) {
                continue;
            }
            assertEquals(i, exec("return 0x" + hex));
            assertEquals(i, exec("return 0x" + hex.toUpperCase(Locale.ROOT)));
            assertEquals(i, exec("return 0X" + hex));
            assertEquals(i, exec("return 0X" + hex.toUpperCase(Locale.ROOT)));
        }
    }
```
modules/lang-painless/src/main/java/org/elasticsearch/painless/phase/DefaultSemanticAnalysisPhase.java
checkedVisit(userRightNode, semanticScope);
            decorateWithCast(userRightNode, semanticScope);
        }
        semanticScope.putDecoration(
            userAssignmentNode,
            new ValueType(semanticScope.getCondition(userAssignmentNode, Read.class) ? leftValueType : void.class)
        );
    }
    /**
     * Visits a unary expression which special-cases a negative operator when the child
     * is a constant expression to handle the maximum negative values appropriately.
     * Checks: type validation
     */
    @Override
    public void visitUnary(EUnary userUnaryNode, SemanticScope semanticScope) {
        Operation operation = userUnaryNode.getOperation();
        if (semanticScope.getCondition(userUnaryNode, Write.class)) {
            throw userUnaryNode.createError(
                new IllegalArgumentException(
                    "invalid assignment: cannot assign a value to " + operation.name + " operation " + "[" + operation.symbol + "]"
                )
            );
        }
        if (semanticScope.getCondition(userUnaryNode, Read.class) == false) {
            throw userUnaryNode.createError(
                new IllegalArgumentException(
                    "not a statement: result not used from " + operation.name + " operation " + "[" + operation.symbol + "]"
                )
            );
        }