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 = *