Return-Path: Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: (qmail 73289 invoked from network); 8 Feb 2011 16:06:39 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 8 Feb 2011 16:06:39 -0000 Received: (qmail 18439 invoked by uid 500); 8 Feb 2011 16:06:39 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 18094 invoked by uid 500); 8 Feb 2011 16:06:35 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 18084 invoked by uid 99); 8 Feb 2011 16:06:34 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 Feb 2011 16:06:34 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 08 Feb 2011 16:06:32 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 68C8623889DA; Tue, 8 Feb 2011 16:06:11 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1068459 - in /commons/proper/jexl/trunk/src: main/java/org/apache/commons/jexl2/ main/java/org/apache/commons/jexl2/parser/ test/java/org/apache/commons/jexl2/ Date: Tue, 08 Feb 2011 16:06:11 -0000 To: commits@commons.apache.org From: henrib@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110208160611.68C8623889DA@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: henrib Date: Tue Feb 8 16:06:10 2011 New Revision: 1068459 URL: http://svn.apache.org/viewvc?rev=1068459&view=rev Log: JEXL-107; modified grammar and added debugger/interpreter support Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java?rev=1068459&r1=1068458&r2=1068459&view=diff ============================================================================== --- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java (original) +++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Debugger.java Tue Feb 8 16:06:10 2011 @@ -56,6 +56,7 @@ import org.apache.commons.jexl2.parser.A import org.apache.commons.jexl2.parser.ASTNullLiteral; import org.apache.commons.jexl2.parser.ASTOrNode; import org.apache.commons.jexl2.parser.ASTReference; +import org.apache.commons.jexl2.parser.ASTReferenceExpression; import org.apache.commons.jexl2.parser.ASTSizeFunction; import org.apache.commons.jexl2.parser.ASTSizeMethod; import org.apache.commons.jexl2.parser.ASTStringLiteral; @@ -638,4 +639,11 @@ final class Debugger implements ParserVi public Object visit(ASTAmbiguous node, Object data) { throw new UnsupportedOperationException("unexpected type of node"); } + + public Object visit(ASTReferenceExpression node, Object data) { + builder.append("("); + accept(node.jjtGetChild(0), data); + builder.append(")"); + return data; + } } \ No newline at end of file Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java?rev=1068459&r1=1068458&r2=1068459&view=diff ============================================================================== --- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java (original) +++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/Interpreter.java Tue Feb 8 16:06:10 2011 @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import org.apache.commons.jexl2.parser.ASTReferenceExpression; import org.apache.commons.jexl2.parser.SimpleNode; import org.apache.commons.logging.Log; @@ -1066,6 +1067,10 @@ public class Interpreter implements Pars return result; } + public Object visit(ASTReferenceExpression node, Object data) { + return node.jjtGetChild(0).jjtAccept(this, data); + } + /** * Check if a null evaluated expression is protected by a ternary expression. * The rationale is that the ternary / elvis expressions are meant for the user to explictly take @@ -1364,4 +1369,5 @@ public class Interpreter implements Pars public Object visit(ASTAmbiguous node, Object data) { throw new UnsupportedOperationException("unexpected type of node"); } + } Modified: commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt?rev=1068459&r1=1068458&r2=1068459&view=diff ============================================================================== --- commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt (original) +++ commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/parser/Parser.jjt Tue Feb 8 16:06:10 2011 @@ -130,7 +130,7 @@ PARSER_END(Parser) | < SEMICOL : ";" > | < COLON : ":" > | < COMMA : "," > - | + | < DOT : "." > } <*> TOKEN : { /* CONDITIONALS */ @@ -257,15 +257,12 @@ void ForeachStatement() : {} void Expression() #void : {} { - LOOKAHEAD( Reference() ) Assignment() -| - ConditionalExpression() + ConditionalExpression() ( Expression() #Assignment(2) )? } - void Assignment() #Assignment(2) : {} { - Reference() Expression() + ConditionalExpression() Expression() } /*************************************** @@ -528,12 +525,8 @@ void Constructor() #ConstructorNode() : void PrimaryExpression() #void : {} { - Literal() -| LOOKAHEAD(3) Reference() | - LOOKAHEAD( ) Expression() -| LOOKAHEAD( ) EmptyFunction() | LOOKAHEAD( ) SizeFunction() @@ -543,9 +536,10 @@ void PrimaryExpression() #void : {} LOOKAHEAD( MapEntry() ) MapLiteral() | LOOKAHEAD( Expression() ) ArrayLiteral() +| + Literal() } - void ArrayAccess() : {} { Identifier() (LOOKAHEAD(2) Expression() )+ @@ -570,7 +564,8 @@ void DotReference() #void : {} void Reference() : {} { - ( LOOKAHEAD() Constructor() + ( + LOOKAHEAD() Constructor() | LOOKAHEAD(Identifier() ) ArrayAccess() | @@ -578,10 +573,20 @@ void Reference() : {} | LOOKAHEAD(Identifier() ) Method() | - Identifier() -| LOOKAHEAD() MapLiteral() | - LOOKAHEAD() ArrayLiteral() ) DotReference() + LOOKAHEAD() ArrayLiteral() +| + LOOKAHEAD( Expression() ) ReferenceExpression() +| + StringLiteral() +| + Identifier() + ) DotReference() +} + +void ReferenceExpression() : {} +{ + Expression() } Modified: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java?rev=1068459&r1=1068458&r2=1068459&view=diff ============================================================================== --- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java (original) +++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl2/IssuesTest.java Tue Feb 8 16:06:10 2011 @@ -452,4 +452,33 @@ public class IssuesTest extends JexlTest //ok to fail } } + + public void test107() throws Exception { + JexlContext context = new MapContext(); + context.set("Q4", "Q4"); + JexlEngine jexl = new JexlEngine(); + Expression expr; + Object value; + expr = jexl.createExpression("'Q4'.toLowerCase()"); + value = expr.evaluate(context); + assertEquals("q4", value); + expr = jexl.createExpression("(Q4).toLowerCase()"); + value = expr.evaluate(context); + assertEquals("q4", value); + expr = jexl.createExpression("(4).toString()"); + value = expr.evaluate(context); + assertEquals("4", value); + value = jexl.createExpression("(1 + 3).toString()"); + value = expr.evaluate(context); + assertEquals("4", value); + expr = jexl.createExpression("({ 'Q4' : 'Q4'}).get('Q4').toLowerCase()"); + value = expr.evaluate(context); + assertEquals("q4", value); + expr = jexl.createExpression("{ 'Q4' : 'Q4'}.get('Q4').toLowerCase()"); + value = expr.evaluate(context); + assertEquals("q4", value); + expr = jexl.createExpression("({ 'Q4' : 'Q4'}).get('Q4').toLowerCase()"); + value = expr.evaluate(context); + assertEquals("q4", value); + } }