This is an automated email from the ASF dual-hosted git repository. henrib pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-jexl.git
The following commit(s) were added to refs/heads/master by this push: new a0ac2f4 JEXL-30{3,4}: modified syntax (jjt) to better handle blocks and keywords in identifiers; modified tests a0ac2f4 is described below commit a0ac2f42d8038e1572490d616a5f2fb94422476e Author: henrib <hen...@apache.org> AuthorDate: Thu May 23 16:28:28 2019 +0200 JEXL-30{3,4}: modified syntax (jjt) to better handle blocks and keywords in identifiers; modified tests --- .../org/apache/commons/jexl3/parser/Parser.jjt | 119 +++++++++++---------- .../org/apache/commons/jexl3/Issues300Test.java | 16 ++- .../java/org/apache/commons/jexl3/ScriptTest.java | 14 +-- 3 files changed, 77 insertions(+), 72 deletions(-) diff --git a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt index e5c6f2b..edede88 100644 --- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt +++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt @@ -113,28 +113,28 @@ TOKEN_MGR_DECLS : { <*> TOKEN : /* KEYWORDS */ { - < IF : "if" > - | < ELSE : "else" > - | < FOR : "for" > - | < WHILE : "while" > - | < DO : "do" > - | < NEW : "new" > - | < VAR : "var" > + < IF : "if" > { popDot(); } + | < ELSE : "else" > { popDot(); } + | < FOR : "for" > { popDot(); } + | < WHILE : "while" > { popDot(); } + | < DO : "do" > { popDot(); } + | < NEW : "new" > { popDot(); } + | < VAR : "var" > { popDot(); } | < EMPTY : "empty" > { popDot(); } /* Revert state to default if was DOT_ID. */ | < SIZE : "size" > { popDot(); } /* Revert state to default if was DOT_ID. */ - | < NULL : "null" > - | < TRUE : "true" > - | < FALSE : "false" > - | < RETURN : "return" > - | < FUNCTION : "function" > + | < NULL : "null" > { popDot(); } + | < TRUE : "true" > { popDot(); } + | < FALSE : "false" > { popDot(); } + | < RETURN : "return" > { popDot(); } + | < FUNCTION : "function" > { popDot(); } | < LAMBDA : "->" > - | < BREAK : "break" > - | < CONTINUE : "continue" > - | < PRAGMA : "#pragma" > + | < BREAK : "break" > { popDot(); } + | < CONTINUE : "continue" > { popDot(); } + | < PRAGMA : "#pragma" > { popDot(); } } <*> TOKEN : { /* SEPARATORS */ - < LPAREN : "("> + < LPAREN : "("> | < RPAREN : ")"> | < LCURLY : "{" > | < RCURLY : "}" > @@ -152,23 +152,31 @@ TOKEN_MGR_DECLS : { < QMARK : "?" > | < ELVIS : "?:" > | < NULLP : "??" > - | < AND : "&&" | "and" > - | < OR : "||" | "or" > + | < AND : "&&" > + | < _AND : "and" > { popDot(); } + | < OR : "||" > + | < _OR: "or" > { popDot(); } } <*> TOKEN : { /* COMPARISONS */ - < eq : "==" | "eq" > - | < ne : "!=" | "ne" > + < eq : "==" > + | < EQ : "eq" > { popDot(); } + | < ne : "!=" > + | < NE : "ne" > { popDot(); } + | < gt : ">" > + | < GT : "gt" > { popDot(); } + | < ge : ">=" > + | < GE : "ge" > { popDot(); } + | < lt : "<" > + | < LT : "lt" > { popDot(); } + | < le : "<=" > + | < LE : "le" > { popDot(); } | < req : "=~" > // regexp equal | < rne : "!~" > // regexp not equal | < seq : "=^" > // starts equal | < eeq : "=$" > // ends equal | < sne : "!^" > // start not equal | < ene : "!$" > // ends not equal - | < gt : ">" | "gt" > - | < ge : ">=" | "ge" > - | < lt : "<" | "lt" > - | < le : "<=" | "le" > } <*> TOKEN : { /* OPERATORS */ @@ -185,9 +193,12 @@ TOKEN_MGR_DECLS : { | < plus : "+" > | < minus : "-" > | < mult : "*" > - | < div : "/" | "div" > - | < mod : "%" | "mod" > - | < not : "!" | "not" > + | < div : "/" > + | < DIV : "div" > { popDot(); } + | < mod : "%" > + | < MOD : "mod" > { popDot(); } + | < not : "!" > + | < NOT : "not" > { popDot(); } | < and : "&" > | < or : "|" > | < xor : "^" > @@ -211,7 +222,7 @@ TOKEN_MGR_DECLS : { <DOT_ID> TOKEN : /* IDENTIFIERS */ { - < DOT_IDENTIFIER: ( [ "0"-"9", "a"-"z", "A"-"Z", "_", "$", "@" ])+ | "var" > { popDot(); } /* Revert state to default. */ + < DOT_IDENTIFIER: ( [ "0"-"9", "a"-"z", "A"-"Z", "_", "$", "@" ])+ > { popDot(); } /* Revert state to default. */ } <DEFAULT, REGISTERS> TOKEN : /* IDENTIFIERS */ @@ -313,22 +324,16 @@ void AnnotatedStatement() #AnnotatedStatement() : {} (LOOKAHEAD(<ANNOTATION>) Annotation())+ (LOOKAHEAD(1) Block() | Statement()) } -void StatementLookahead() #void : {} -{ - <SEMICOL> | <IF> | <FOR> | <DO> | <WHILE> | <RETURN> | <BREAK> | <CONTINUE> | <VAR> | <PRAGMA> -} - void Statement() #void : {} { <SEMICOL> | LOOKAHEAD(<ANNOTATION>) AnnotatedStatement() - | LOOKAHEAD(<LCURLY> StatementLookahead()) Block() // to disambiguate the set literals - | LOOKAHEAD(<LCURLY> Expression() <SEMICOL>) Block() // to disambiguate the set literals + | LOOKAHEAD(Expression()) ExpressionStatement() + | Block() | IfStatement() | ForeachStatement() | WhileStatement() | DoWhileStatement() - | ExpressionStatement() | ReturnStatement() | Continue() | Break() @@ -497,13 +502,13 @@ void ConditionalExpression() #void : {} void ConditionalOrExpression() #void : {} { ConditionalAndExpression() - ( <OR> ConditionalAndExpression() #OrNode(2) )* + ( (<OR>|<_OR>) ConditionalAndExpression() #OrNode(2) )* } void ConditionalAndExpression() #void : {} { InclusiveOrExpression() - ( <AND> InclusiveOrExpression() #AndNode(2) )* + ( (<AND>|<_AND>) InclusiveOrExpression() #AndNode(2) )* } void InclusiveOrExpression() #void : {} @@ -528,9 +533,9 @@ void EqualityExpression() #void : {} { RelationalExpression() ( - <eq> RelationalExpression() #EQNode(2) + (<eq> | <EQ>) RelationalExpression() #EQNode(2) | - <ne> RelationalExpression() #NENode(2) + (<ne> | <NE>) RelationalExpression() #NENode(2) | <range> RelationalExpression() #RangeNode(2) // range )? @@ -540,13 +545,13 @@ void RelationalExpression() #void : {} { AdditiveExpression() ( - <lt> AdditiveExpression() #LTNode(2) + (<lt> |<LT>) AdditiveExpression() #LTNode(2) | - <gt> AdditiveExpression() #GTNode(2) + (<gt> | <GT>) AdditiveExpression() #GTNode(2) | - <le> AdditiveExpression() #LENode(2) + (<le> | <LE>) AdditiveExpression() #LENode(2) | - <ge> AdditiveExpression() #GENode(2) + (<ge> | <GE>) AdditiveExpression() #GENode(2) | <req> AdditiveExpression() #ERNode(2) // equals regexp | @@ -582,9 +587,9 @@ void MultiplicativeExpression() #void : {} ( <mult> UnaryExpression() #MulNode(2) | - <div> UnaryExpression() #DivNode(2) + (<div>|<DIV>) UnaryExpression() #DivNode(2) | - <mod> UnaryExpression() #ModNode(2) + (<mod>|<MOD>) UnaryExpression() #ModNode(2) )* } @@ -596,7 +601,7 @@ void UnaryExpression() #void : {} | <tilda> UnaryExpression() #BitwiseComplNode(1) | - <not> UnaryExpression() #NotNode(1) + (<not>|<NOT>) UnaryExpression() #NotNode(1) | <EMPTY> UnaryExpression() #EmptyFunction(1) | @@ -844,15 +849,23 @@ void Lambda() #JexlLambda() : * References ***************************************/ +Token dotName() #void : +{ + Token t ; +} +{ + ( t = <DOT_IDENTIFIER> | t=<IF> | t=<ELSE> | t=<FOR> | t=<WHILE> | t=<DO> | t=<NEW>| t=<EMPTY> | t=<SIZE> | t=<TRUE> | t=<FALSE> | t=<NULL> + | t=<_OR> | t=<_AND>| t=<NOT> | t=<NE> | t=<EQ> | t=<GT> | t=<GE> | t=<LT> | t=<LE> + | t=<VAR> | t=<FUNCTION> ) { return t ;} +} + void IdentifierAccess() #void : { Token t; } { <DOT> ( - t=<DOT_IDENTIFIER> { jjtThis.setIdentifier(t.image); } #IdentifierAccess - | - <VAR> { jjtThis.setIdentifier("var"); } #IdentifierAccess + t=dotName() { jjtThis.setIdentifier(t.image); } #IdentifierAccess | t=<STRING_LITERAL> { jjtThis.setIdentifier(Parser.buildString(t.image, true)); } #IdentifierAccess | @@ -860,9 +873,7 @@ void IdentifierAccess() #void : ) | <QDOT> ( - t=<DOT_IDENTIFIER> { jjtThis.setIdentifier(t.image); } #IdentifierAccessSafe - | - <VAR> { jjtThis.setIdentifier("var"); } #IdentifierAccessSafe + t=dotName() { jjtThis.setIdentifier(t.image); } #IdentifierAccessSafe | t=<STRING_LITERAL> { jjtThis.setIdentifier(Parser.buildString(t.image, true)); } #IdentifierAccessSafe | @@ -899,7 +910,7 @@ void PrimaryExpression() #void : {} | LOOKAHEAD( <LCURLY> <COLON>) MapLiteral() | - LOOKAHEAD( <LCURLY> Expression() ) SetLiteral() + LOOKAHEAD( <LCURLY> Expression() (<COMMA> | <RCURLY>)) SetLiteral() | LOOKAHEAD( <LCURLY> <RCURLY> ) SetLiteral() | diff --git a/src/test/java/org/apache/commons/jexl3/Issues300Test.java b/src/test/java/org/apache/commons/jexl3/Issues300Test.java index 4d19c4c..65a3b13 100644 --- a/src/test/java/org/apache/commons/jexl3/Issues300Test.java +++ b/src/test/java/org/apache/commons/jexl3/Issues300Test.java @@ -72,7 +72,8 @@ public class Issues300Test { String[] strs = new String[]{ "{if (0) 1 else 2; var x = 4;}", "if (0) 1; else 2; ", - "{ if (0) 1; else 2; }" + "{ if (0) 1; else 2; }", + "{ if (0) { if (false) 1 else -3 } else 2; }" }; JexlEngine jexl = new JexlBuilder().create(); for(String str : strs) { @@ -86,7 +87,7 @@ public class Issues300Test { @Test public void testIssue304() { JexlEngine jexlEngine = new JexlBuilder().strict(false).create(); - JexlExpression jexlExpresssion = jexlEngine.createExpression("overview.limit.var"); + JexlExpression e304 = jexlEngine.createExpression("overview.limit.var"); HashMap<String,Object> map3 = new HashMap<String,Object>(); map3.put("var", "4711"); @@ -96,14 +97,19 @@ public class Issues300Test { map.put("overview", map2); JexlContext context = new MapContext(map); - Object value = jexlExpresssion.evaluate(context); + Object value = e304.evaluate(context); assertEquals("4711", value); // fails map.clear(); map.put("overview.limit.var", 42); - value = jexlExpresssion.evaluate(context); - assertEquals(42, value); // fails + value = e304.evaluate(context); + assertEquals(42, value); + String allkw = "e304.if.else.do.while.new.true.false.null.var.function.empty.size.not.and.or.ne.eq.le.lt.gt.ge"; + map.put(allkw, 42); + e304 = jexlEngine.createExpression(allkw); + value = e304.evaluate(context); + assertEquals(42, value); } @Test diff --git a/src/test/java/org/apache/commons/jexl3/ScriptTest.java b/src/test/java/org/apache/commons/jexl3/ScriptTest.java index b643ca1..4ee9233 100644 --- a/src/test/java/org/apache/commons/jexl3/ScriptTest.java +++ b/src/test/java/org/apache/commons/jexl3/ScriptTest.java @@ -77,19 +77,7 @@ public class ScriptTest extends JexlTestCase { Assert.assertNotNull("No result", result); Assert.assertEquals("Wrong result", new Integer(7), result); } - - @Ignore - public void testScriptFromFile2() throws Exception { - File testScript = new File("/Users/henri.biestro/Downloads/sts8689.jexl"); -// String testScript = "cube(()->{ while (true) { if (true) { if (true) {" -// + "montantTTL_7_tempo += montantTVANonDeductibleParMois) * exchangeRate_entite / exchangeRate_contrat;\n" -// + "}}}})"; - - JexlScript s = JEXL.createScript(testScript); - Assert.assertNotNull("No result", s); - } - - + @Test public void testArgScriptFromFile() throws Exception { File testScript = new File(TEST_ADD);