public Rule compileExpression(final String expression) {
      RuleFactory factory = RuleFactory.getInstance();

      Stack<Object> stack = new Stack<>();
      InFixToPostFix.CustomTokenizer tokenizer = new InFixToPostFix.CustomTokenizer(expression);

      while (tokenizer.hasMoreTokens()) {
        // examine each token
        String token = tokenizer.nextToken();
        if (token.startsWith("'") || token.startsWith("\"")) {
          String quoteChar = token.substring(0, 1);
          token = token.substring(1);
          while (!token.endsWith(quoteChar) && tokenizer.hasMoreTokens()) {
            token = token + " " + tokenizer.nextToken();
          }
          if (token.length() > 0) {
            token = token.substring(0, token.length() - 1);
          }
        } else {
          // if a symbol is found, pop 2 off the stack,
          // evaluate and push the result
          if (factory.isRule(token)) {
            Rule r = factory.getRule(token, stack);
            stack.push(r);
            // null out the token so we don't try to push it below
            token = null;
          }
        }
        // variables or constants are pushed onto the stack
        if (token != null && token.length() > 0) {
          stack.push(token);
        }
      }

      if ((stack.size() == 1) && (!(stack.peek() instanceof Rule))) {
        // while this may be an attempt at creating an expression,
        // for ease of use, convert this single entry to a partial-text
        // match on the MSG field
        Object o = stack.pop();
        stack.push("MSG");
        stack.push(o);
        return factory.getRule("~=", stack);
      }

      // stack should contain a single rule if the expression is valid
      if ((stack.size() != 1) || (!(stack.peek() instanceof Rule))) {
        throw new IllegalArgumentException("invalid expression: " + expression);
      } else {
        return (Rule) stack.pop();
      }
    }
Compile expression.

@param expression expression.
@return rule.
olv-core/src/main/java/pl/otros/logview/accept/query/org/apache/log4j/rule/ExpressionRule.java