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
boolean bool = userBooleanConstantNode.getBool();
        if (semanticScope.getCondition(userBooleanConstantNode, Write.class)) {
            throw userBooleanConstantNode.createError(
                new IllegalArgumentException("invalid assignment: cannot assign a value to boolean constant [" + bool + "]")
            );
        }
        if (semanticScope.getCondition(userBooleanConstantNode, Read.class) == false) {
            throw userBooleanConstantNode.createError(
                new IllegalArgumentException("not a statement: boolean constant [" + bool + "] not used")
            );
        }
        semanticScope.putDecoration(userBooleanConstantNode, new ValueType(boolean.class));
        semanticScope.putDecoration(userBooleanConstantNode, new StandardConstant(bool));
    }
    /**
     * Visits a numeric constant expression which includes int and long.
     * Checks: type validation
     */
    @Override
    public void visitNumeric(ENumeric userNumericNode, SemanticScope semanticScope) {
        String numeric = userNumericNode.getNumeric();
        if (semanticScope.getCondition(userNumericNode, Negate.class)) {
            numeric = "-" + numeric;
        }
        if (semanticScope.getCondition(userNumericNode, Write.class)) {
            throw userNumericNode.createError(
                new IllegalArgumentException("invalid assignment: cannot assign a value to numeric constant [" + numeric + "]")
            );
        }
        if (semanticScope.getCondition(userNumericNode, Read.class) == false) {