JEXL parses long expressions with lots of parenthesis slowly
------------------------------------------------------------

                 Key: JEXL-97
                 URL: https://issues.apache.org/jira/browse/JEXL-97
             Project: Commons JEXL
          Issue Type: Bug
    Affects Versions: 1.0, 1.1, 2.0
         Environment: Java
            Reporter: Jeff Ichnowski
            Priority: Minor


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);
    }
}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to