Author: cbrisson
Date: Mon Oct  8 11:05:21 2018
New Revision: 1843128

URL: http://svn.apache.org/viewvc?rev=1843128&view=rev
Log:
[VELOCITY-896] Fix parsing of a terminal hash or dollar sign in sing litteral 
and template (also fixes VELOCITY-897)

Added:
    
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity896TestCase.java
   (with props)
Modified:
    
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/VelocityCharStream.java
    velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt
    
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity667TestCase.java

Modified: 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/VelocityCharStream.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/VelocityCharStream.java?rev=1843128&r1=1843127&r2=1843128&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/VelocityCharStream.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/VelocityCharStream.java
 Mon Oct  8 11:05:21 2018
@@ -60,6 +60,11 @@ implements CharStream
     private int maxNextCharInd = 0;
     private int inBuf = 0;
 
+    /* CB - to properly handle EOF *inside* javacc lexer,
+     * we send a 'zero-width whitespace' *just before* EOF
+     */
+    private boolean beforeEOF = false;
+
     private void ExpandBuff(boolean wrapAround)
     {
         char[] newbuffer = new char[bufsize + nextBufExpand];
@@ -151,8 +156,13 @@ implements CharStream
             if ((i = inputStream.read(buffer, maxNextCharInd,
                     available - maxNextCharInd)) == -1)
             {
-                inputStream.close();
-                throw new java.io.IOException();
+                if (beforeEOF)
+                {
+                    inputStream.close();
+                    throw new java.io.IOException();
+                }
+                buffer[maxNextCharInd++] = '\u200B';
+                beforeEOF = true;
             }
             else
             {
@@ -349,6 +359,7 @@ implements CharStream
         prevCharIsLF = prevCharIsCR = false;
         tokenBegin = inBuf = maxNextCharInd = 0;
         bufpos = -1;
+        beforeEOF = false;
     }
 
     /**

Modified: velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt?rev=1843128&r1=1843127&r2=1843128&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt 
(original)
+++ velocity/engine/trunk/velocity-engine-core/src/main/parser/Parser.jjt Mon 
Oct  8 11:05:21 2018
@@ -564,6 +564,26 @@ TOKEN_MGR_DECLS:
  *
  * ------------------------------------------------------------------------- */
 
+/* The VelocityCharStream will send a zero-width whitespace
+   just before EOF to let us accept a terminal $ or #
+*/
+<PRE_DIRECTIVE,PRE_REFERENCE>
+TOKEN :
+{
+    <LONE_SYMBOL: "\u200B" >
+    {
+        inReference = false;
+        stateStackPop();
+    }
+}
+
+/* In all other states, drop the zero-width whitespace */
+<REFERENCE,REFMODIFIER,REFMOD3,REFINDEX,DIRECTIVE,REFMOD2,DEFAULT,REFMOD,IN_TEXTBLOCK,IN_MULTILINE_COMMENT,IN_FORMAL_COMMENT,IN_SINGLE_LINE_COMMENT>
+SKIP :
+{
+    <BEFORE_EOF: "\u200B">
+}
+
 <REFERENCE, REFMODIFIER, REFMOD3>
 TOKEN:
 {
@@ -811,7 +831,7 @@ MORE :
        }
     }
 
-|   <"#**" ~["#"]>
+|   <"#**" ~["#","\u200B"]>
     {
        if (!inComment)
        {
@@ -962,7 +982,7 @@ SKIP :
 <IN_TEXTBLOCK>
 MORE :
 {
-  < ~[] >
+  < ~["\u200B"] >
 }
 
 /* -----------------------------------------------------------------------
@@ -1006,7 +1026,7 @@ TOKEN :
 //   <STRING_LITERAL: ( "\"" ( ~["\"","\n","\r"] )* "\"" ) | ( "'" ( 
~["'","\n","\r"] )* "'" ) >
   < STRING_LITERAL:
       ("\""
-        (   (~["\""])
+        (   (~["\"","\u200B"])
           | ("\\"
               ( ["n","t","b","r","f"]
               | ["0"-"7"] ( ["0"-"7"] )?
@@ -1021,7 +1041,7 @@ TOKEN :
       )
     |
     ("\'"
-        (   (~["\'"])
+        (   (~["\'","\u200B"])
           | ("''")
           | ( "\\" (" ")* "\n")
         )*
@@ -1283,12 +1303,12 @@ TOKEN :
 {
     <DOUBLE_ESCAPE : "\\\\">
 |   <ESCAPE: "\\" >
-|   <TEXT: (~["$", "#", "\\", "\r", "\n"])* (~["$", "#", "\\", "\r", "\n", " 
", "\t"])+ (~["$", "#", "\\", "\r", "\n"])* <NEWLINE> ((~["$", "#", "\\", "\r", 
"\n"])* <NEWLINE>)* >
+|   <TEXT: (~["$", "#", "\\", "\r", "\n","\u200B"])* (~["$", "#", "\\", "\r", 
"\n", " ", "\t","\u200B"])+ (~["$", "#", "\\", "\r", "\n","\u200B"])* <NEWLINE> 
((~["$", "#", "\\", "\r", "\n","\u200B"])* <NEWLINE>)* >
 }
 
 TOKEN :
 {
-    <INLINE_TEXT: (~["$", "#", "\\", "\r", "\n"])+ >
+    <INLINE_TEXT: (~["$", "#", "\\", "\r", "\n","\u200B"])+ >
 }
 
 /**
@@ -1885,7 +1905,10 @@ TOKEN :
  * unscathed.
  * @return true if last read token was a newline
  */
-boolean Text() : {}
+boolean Text() :
+{
+    Token t = null;
+}
 {
     <TEXT> { return true; }
   |  <DOT> { return false; }
@@ -1898,6 +1921,11 @@ boolean Text() : {}
   |  <LCURLY> { return false; }
   |  <RCURLY> { return false; }
   |  <EMPTY_INDEX> { return false; }
+  |  t=<LONE_SYMBOL>
+     {
+         /* Drop the ending zero-width whitespace */
+         t.image = t.image.substring(0, t.image.length() - 1); return false;
+     }
 }
 
 /* -----------------------------------------------------------------------

Modified: 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity667TestCase.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity667TestCase.java?rev=1843128&r1=1843127&r2=1843128&view=diff
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity667TestCase.java
 (original)
+++ 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity667TestCase.java
 Mon Oct  8 11:05:21 2018
@@ -33,7 +33,7 @@ public class Velocity667TestCase extends
 
     public void test667()
     {
-          assertEvalExceptionAt("#macro", 1, 6);
+          assertEvalExceptionAt("#macro", 1, 7);
           assertEvalExceptionAt("#macro #macro", 1, 7);
     }
 }

Added: 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity896TestCase.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity896TestCase.java?rev=1843128&view=auto
==============================================================================
--- 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity896TestCase.java
 (added)
+++ 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity896TestCase.java
 Mon Oct  8 11:05:21 2018
@@ -0,0 +1,40 @@
+package org.apache.velocity.test.issues;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.velocity.test.BaseTestCase;
+
+/**
+ * This class tests VELOCITY-589.
+ */
+public class Velocity896TestCase extends BaseTestCase
+{
+    public Velocity896TestCase(String name)
+    {
+       super(name);
+    }
+
+    public void testTailingHash()
+    {
+        assertEvalEquals("#", "#");
+        assertEvalEquals("$", "$");
+    }
+
+}

Propchange: 
velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/issues/Velocity896TestCase.java
------------------------------------------------------------------------------
    svn:executable = *


Reply via email to