This is an automated email from the ASF dual-hosted git repository. henrib pushed a commit to branch JEXL-390 in repository https://gitbox.apache.org/repos/asf/commons-jexl.git
commit fe97d7c4e58a538544f43a1259d22647df093055 Author: henrib <hen...@apache.org> AuthorDate: Mon Dec 19 16:28:11 2022 +0100 JEXL-390: modified grammar to remove pragma declarations from statements and allow them in scripts/blocks; --- .../org/apache/commons/jexl3/parser/Parser.jjt | 7 +++---- .../org/apache/commons/jexl3/Issues300Test.java | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 4 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 05a17285..cd6cc868 100644 --- a/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt +++ b/src/main/java/org/apache/commons/jexl3/parser/Parser.jjt @@ -324,7 +324,7 @@ ASTJexlScript JexlScript(Scope frame) : { { pushUnit(jjtThis); } - (Statement())* <EOF> + ( LOOKAHEAD(<PRAGMA>) Pragma() | Statement() )* <EOF> { popUnit(jjtThis); return jjtThis.script(); @@ -338,7 +338,7 @@ ASTJexlScript JexlExpression(Scope frame) #JexlScript : { { pushUnit(jjtThis); } - ( Expression() )? <EOF> + ( Pragma() )* ( Expression() )? <EOF> { popUnit(jjtThis); return jjtThis.script(); @@ -370,7 +370,6 @@ void Statement() #void : {} void StatementNoVar() #void : {} { <SEMICOL> - | LOOKAHEAD(<PRAGMA>) Pragma() | LOOKAHEAD(<ANNOTATION>) AnnotatedStatement() | LOOKAHEAD(<IF>) IfStatement() | LOOKAHEAD(<FOR>) ForeachStatement() @@ -386,7 +385,7 @@ void StatementNoVar() #void : {} void Block() #Block : {} { - <LCURLY> { pushUnit(jjtThis); } ( Statement() )* { popUnit(jjtThis); } <RCURLY> + <LCURLY> { pushUnit(jjtThis); } ( LOOKAHEAD(<PRAGMA>) Pragma() | Statement() )* { popUnit(jjtThis); } <RCURLY> } void FunctionStatement() #JexlLambda : {} diff --git a/src/test/java/org/apache/commons/jexl3/Issues300Test.java b/src/test/java/org/apache/commons/jexl3/Issues300Test.java index 720bafaf..e742d4e4 100644 --- a/src/test/java/org/apache/commons/jexl3/Issues300Test.java +++ b/src/test/java/org/apache/commons/jexl3/Issues300Test.java @@ -34,6 +34,7 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.apache.commons.jexl3.internal.Util.debuggerCheck; import static org.junit.Assert.assertEquals; /** @@ -1150,4 +1151,25 @@ public class Issues300Test { Assert.assertEquals("ABC", s1.execute(ctxt, null)); } } + @Test + public void test390() throws Exception { + final JexlEngine jexl = new JexlBuilder() + .safe(false) + .strict(true) + .debug(true) + .create(); + JexlScript script = null; + String src; + src = "if (true) #pragma one 42"; + try { + script = jexl.createScript(src); + Assert.fail("should have failed parsing"); + } catch(JexlException.Parsing xparse) { + Assert.assertTrue(xparse.getDetail().contains("pragma")); + } + src = "if (true) { #pragma one 42 }"; + script = jexl.createScript(src); + Object result = script.execute(null); + debuggerCheck(jexl); + } }