Uploaded image for project: 'Commons JEXL'
  1. Commons JEXL
  2. JEXL-97

JEXL parses long expressions with lots of parenthesis slowly

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 1.1
    • 2.0
    • None
    • Java

    Description

      JEXL's parser uses an unbounded JavaCC LOOKAHEAD to distinguish assignment expressions from other expressions. The result is certain expressions take exponential time to parse. The example snippet below demonstrates the problem. On my machine parsing the expression below takes ~120 seconds. Changing the parser to remove the LOOKAHEAD can get this to parse in milliseconds. The lookahead appears to be in all versions of the parser source.

      import org.apache.commons.jexl.Expression;
      import org.apache.commons.jexl.ExpressionFactory;

      public class SlowParse {

      public static void main(String[] args) throws Exception

      { String input = "(((((((((((((((((((((((((z+y)/x)*w)-v)*u)/t)-s)*r)/q)+p)-o)*n)-m)+l)*k)+j)/i)+h)*g)+f)/e)+d)-c)/b)+a)"; // Make sure everything is loaded... Expression expr = ExpressionFactory.createExpression(input); long start = System.nanoTime(); expr = ExpressionFactory.createExpression(input); long end = System.nanoTime(); System.out.printf("Parse took %.1f seconds\n", (end-start)/1e+9); }

      }

      Attachments

        1. proposed.patch
          0.4 kB
          Jeff Ichnowski

        Activity

          People

            Unassigned Unassigned
            jeffi Jeff Ichnowski
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: