class Expression implements IStandardExpression, Serializable {

    private static final long serialVersionUID = 1608378943284014151L;

    
    public static final char PARSING_PLACEHOLDER_CHAR = '\u00A7';
    
    public static final char NESTING_START_CHAR = '(';
    public static final char NESTING_END_CHAR = ')';
    
    
    
    protected Expression() {
        super();
    }
    
    
    public abstract String getStringRepresentation();
    
    
    @Override
    public String toString() {
        return getStringRepresentation();
    }

    
    
    static Expression parse(final String input) {<FILL_FUNCTION_BODY>}
    

    
    

    
    
    
    
    static Object execute(
            final IExpressionContext context,
            final Expression expression, final IStandardVariableExpressionEvaluator expressionEvaluator,
            final StandardExpressionExecutionContext expContext) {
        
        if (expression instanceof SimpleExpression) {
            return SimpleExpression.executeSimple(context, (SimpleExpression)expression, expressionEvaluator, expContext);
        }
        if (expression instanceof ComplexExpression) {
            return ComplexExpression.executeComplex(context, (ComplexExpression)expression, expContext);
        }

        throw new TemplateProcessingException("Unrecognized expression: " + expression.getClass().getName());
        
    }





    public Object execute(
            final IExpressionContext context) {
        return execute(context, StandardExpressionExecutionContext.NORMAL);
    }


    public Object execute(
            final IExpressionContext context,
            final StandardExpressionExecutionContext expContext) {

        Validate.notNull(context, "Context cannot be null");

        final IStandardVariableExpressionEvaluator variableExpressionEvaluator =
                StandardExpressions.getVariableExpressionEvaluator(context.getConfiguration());

        final Object result = execute(context, this, variableExpressionEvaluator, expContext);
        return LiteralValue.unwrap(result);

    }


    
}


        Validate.notNull(input, "Input cannot be null");

        /*
         * PHASE 01: Decomposition (including unnesting parenthesis)
         */
        final ExpressionParsingState decomposition = ExpressionParsingUtil.decompose(input);
        if (decomposition == null) {
            return null;
        }

        /*
         * PHASE 02: Composition
         */
        final ExpressionParsingState result = ExpressionParsingUtil.compose(decomposition);
        if (result == null || !result.hasExpressionAt(0)) {
            return null;
        }

        return result.get(0).getExpression();

    
<no_super_class>