code: public Object evaluateExpression(String expression, EvaluationContext context, EvaluationStrategy strategy) throws EvaluationError {
          ExcellentLexer lexer = new ExcellentLexer(new ANTLRInputStream(expression));
          CommonTokenStream tokens = new CommonTokenStream(lexer);
  
          ExcellentParser parser = new ExcellentParser(tokens);
          parser.setErrorHandler(new BailErrorStrategy());
          ParseTree tree;
  
          try {
              tree = parser.parse();
  
              if (logger.isDebugEnabled()) {
                  logger.debug("Expression '{}' parsed as {}", expression, tree.toStringTree());
              }
          }
          catch (ParseCancellationException ex) {
              String message = null;
              if (ex.getCause() instanceof NoViableAltException) {
                  Token token = ((NoViableAltException) ex.getCause()).getOffendingToken();
                  if (token != null && token.getType() != ExcellentParser.EOF) {
                      message = "Expression error at: " + token.getText();
                  }
              }
  
              if (message == null) {
                  message = "Expression is invalid";
              }
  
              throw new EvaluationError(message, ex);
          }
  
          if (strategy == EvaluationStrategy.RESOLVE_AVAILABLE) {
              String resolved = resolveAvailable(tokens, context);
              if (resolved != null) {
                  return resolved;
              }
          }
  
          ExcellentVisitor visitor = new ExpressionVisitorImpl(m_functionManager, context);
          return visitor.visit(tree);
      }
docs: Evaluates a single expression, e.g. "contact.reports * 2"
  @param expression the expression string
  @param context the evaluation context
  @param strategy the evaluation strategy
  @return the evaluated expression value
  @throws EvaluationError if an error occurs during evaluation