TILESSB-21
Added code that uses QDox to create the model.
Removed Antlr stuff and dependency on Java compiler tools.

git-svn-id: https://svn.apache.org/repos/asf/tiles/sandbox/trunk/tiles-autotag@905568 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index 1ffb81d..378a39f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,17 +1,32 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>tiles-master</artifactId>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>tiles-master</artifactId>
+        <groupId>org.apache.tiles</groupId>
+        <version>1</version>
+    </parent>
     <groupId>org.apache.tiles</groupId>
-    <version>1</version>
-  </parent>
-  <groupId>org.apache.tiles</groupId>
-  <artifactId>tiles-autotag</artifactId>
-  <version>1.0-SNAPSHOT</version>
-  <packaging>pom</packaging>
-  <name>Autotags</name>
-  <description>Automatic generation of tags.</description>
-  <modules>
-  	<module>tiles-autotag-core</module>
-  </modules>
-</project>
\ No newline at end of file
+    <artifactId>tiles-autotag</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <name>Autotags</name>
+    <description>Automatic generation of tags.</description>
+    <modules>
+        <module>tiles-autotag-core</module>
+    </modules>
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <configuration>
+                        <source>1.6</source>
+                        <target>1.6</target>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+</project>
diff --git a/tiles-autotag-core/pom.xml b/tiles-autotag-core/pom.xml
index f5ab2d2..e822e03 100644
--- a/tiles-autotag-core/pom.xml
+++ b/tiles-autotag-core/pom.xml
@@ -12,33 +12,33 @@
     <name>Autotag - Core</name>
     <description>Core classes for Autotag.</description>
     <build>
-        <plugins>
-            <plugin>
-                <groupId>org.antlr</groupId>
-                <artifactId>antlr3-maven-plugin</artifactId>
-                <version>3.2</version>
-                <configuration>
-                    <includes>
-                        <include>Java.g</include>
-                    </includes>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>antlr</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
+        <resources>
+        </resources>
+        <testResources>
+            <testResource>
+                <directory>src/test/java</directory>
+                <includes>
+                    <include>org/apache/tiles/autotag/core/internal/*.java</include>
+                </includes>
+            </testResource>
+        </testResources>
     </build>
     <dependencies>
         <dependency>
-            <groupId>org.antlr</groupId>
-            <artifactId>antlr-runtime</artifactId>
-            <version>3.2</version>
-            <type>jar</type>
-            <scope>compile</scope>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.7</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.thoughtworks.qdox</groupId>
+            <artifactId>qdox</artifactId>
+            <version>1.10.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tiles</groupId>
+            <artifactId>tiles-request-api</artifactId>
+            <version>1.0-SNAPSHOT</version>
         </dependency>
     </dependencies>
 </project>
diff --git a/tiles-autotag-core/src/main/antlr3/Java.g b/tiles-autotag-core/src/main/antlr3/Java.g
deleted file mode 100644
index b15b943..0000000
--- a/tiles-autotag-core/src/main/antlr3/Java.g
+++ /dev/null
@@ -1,2507 +0,0 @@
-/*
- [The "BSD licence"]
- Copyright (c) 2007-2008 Terence Parr
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
- 3. The name of the author may not be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-/*
- * This file is modified by Yang Jiang (yang.jiang.z@gmail.com), taken from the original
- * java grammar in www.antlr.org, with the goal to provide a standard ANTLR grammar 
- * for java, as well as an implementation to construct the same AST trees as javac does.  
- * 
- * The major changes of this version as compared to the original version include:
- * 1) Top level rules are changed to include all of their sub-components. 
- *    For example, the rule
- * 
- *      classOrInterfaceDeclaration
- *          :   classOrInterfaceModifiers (classDeclaration | interfaceDeclaration)
- *      ;
- *
- *    is changed to
- * 
- *      classOrInterfaceDeclaration
- *          :   classDeclaration | interfaceDeclaration
- *      ;
- *    
- *    with classOrInterfaceModifiers been moved inside classDeclaration and 
- *    interfaceDeclaration.
- * 
- * 2) The original version is not quite clear on certain rules like memberDecl, 
- *    where it mixed the styles of listing of top level rules and listing of sub rules.
- *
- *    memberDecl
- *      :   genericMethodOrConstructorDecl
- *      |   memberDeclaration
- *      |   'void' Identifier voidMethodDeclaratorRest   
- *      |   Identifier constructorDeclaratorRest
- *      |   interfaceDeclaration
- *      |   classDeclaration
- *      ;
- *
- *    This is changed to a 
- *
- *    memberDecl
- *      :   fieldDeclaration        
- *      |   methodDeclaration
- *      |   classDeclaration
- *      |   interfaceDeclaration
- *      ;
- *    by folding similar rules into single rule.
- *
- * 3) Some syntactical predicates are added for efficiency, although this is not necessary 
- *    for correctness.
- *
- * 4) Lexer part is rewritten completely to construct tokens needed for the parser.
- * 
- * 5) This grammar adds more source level support
- *
- *
- * This grammar also adds bug fixes.
- *
- * 1) Adding typeArguments to superSuffix to alHexSignificandlow input like 
- *      super.<TYPE>method()
- * 
- * 2) Adding typeArguments to innerCreator to allow input like 
- *      new Type1<String, Integer>().new Type2<String>()
- * 
- * 3) conditionalExpression is changed to 
- *    conditionalExpression
- *      :   conditionalOrExpression ( '?' expression ':' conditionalExpression )?
- *      ;
- *    to accept input like 
- *      true?1:2=3
- *    
- *    Note: note this is by no means a valid input, by the grammar should be able to parse 
- *    this as 
- *            (true?1:2)=3  
- *    rather than    
- *            true?1:(2=3)
- *
- *  
- *  Know problems:
- *    Won't pass input containing unicode sequence like this 
- *      char c = '\uffff'
- *      String s = "\uffff";
- *    Because Antlr does not treat '\uffff' as an valid char. This will be fixed in the next Antlr 
- *    release. [Fixed in Antlr-3.1.1]
- * 
- *  Things to do:
- *    More effort to make this grammar faster.
- *    Error reporting/recovering.
- *  
- *  
- *  NOTE: If you try to compile this file from command line and Antlr gives an exception 
- *    like error message while compiling, add option 
- *    -Xconversiontimeout 100000
- *    to the command line.  
- *    If it still doesn't work or the compilation process
- *    takes too long, try to comment out the following two lines:
- *    |    {isValidSurrogateIdentifierStart((char)input.LT(1), (char)input.LT(2))}?=>('\ud800'..'\udbff') ('\udc00'..'\udfff')
- *    |    {isValidSurrogateIdentifierPart((char)input.LT(1), (char)input.LT(2))}?=>('\ud800'..'\udbff') ('\udc00'..'\udfff')
- *   
- *
- *  Below are comments found in the original version. 
- */
-
-
-/** A Java 1.5 grammar for ANTLR v3 derived from the spec
- *
- *  This is a very close representation of the spec; the changes
- *  are comestic (remove left recursion) and also fixes (the spec
- *  isn't exactly perfect).  I have run this on the 1.4.2 source
- *  and some nasty looking enums from 1.5, but have not really
- *  tested for 1.5 compatibility.
- *
- *  I built this with: java -Xmx100M org.antlr.Tool java.g
- *  and got two errors that are ok (for now):
- *  java.g:691:9: Decision can match input such as
- *    "'0'..'9'{'E', 'e'}{'+', '-'}'0'..'9'{'D', 'F', 'd', 'f'}"
- *    using multiple alternatives: 3, 4
- *  As a result, alternative(s) 4 were disabled for that input
- *  java.g:734:35: Decision can match input such as "{'$', 'A'..'Z',
- *    '_', 'a'..'z', '\u00C0'..'\u00D6', '\u00D8'..'\u00F6',
- *    '\u00F8'..'\u1FFF', '\u3040'..'\u318F', '\u3300'..'\u337F',
- *    '\u3400'..'\u3D2D', '\u4E00'..'\u9FFF', '\uF900'..'\uFAFF'}"
- *    using multiple alternatives: 1, 2
- *  As a result, alternative(s) 2 were disabled for that input
- *
- *  You can turn enum on/off as a keyword :)
- *
- *  Version 1.0 -- initial release July 5, 2006 (requires 3.0b2 or higher)
- *
- *  Primary author: Terence Parr, July 2006
- *
- *  Version 1.0.1 -- corrections by Koen Vanderkimpen & Marko van Dooren,
- *      October 25, 2006;
- *      fixed normalInterfaceDeclaration: now uses typeParameters instead
- *          of typeParameter (according to JLS, 3rd edition)
- *      fixed castExpression: no longer allows expression next to type
- *          (according to semantics in JLS, in contrast with syntax in JLS)
- *
- *  Version 1.0.2 -- Terence Parr, Nov 27, 2006
- *      java spec I built this from had some bizarre for-loop control.
- *          Looked weird and so I looked elsewhere...Yep, it's messed up.
- *          simplified.
- *
- *  Version 1.0.3 -- Chris Hogue, Feb 26, 2007
- *      Factored out an annotationName rule and used it in the annotation rule.
- *          Not sure why, but typeName wasn't recognizing references to inner
- *          annotations (e.g. @InterfaceName.InnerAnnotation())
- *      Factored out the elementValue section of an annotation reference.  Created
- *          elementValuePair and elementValuePairs rules, then used them in the
- *          annotation rule.  Allows it to recognize annotation references with
- *          multiple, comma separated attributes.
- *      Updated elementValueArrayInitializer so that it allows multiple elements.
- *          (It was only allowing 0 or 1 element).
- *      Updated localVariableDeclaration to allow annotations.  Interestingly the JLS
- *          doesn't appear to indicate this is legal, but it does work as of at least
- *          JDK 1.5.0_06.
- *      Moved the Identifier portion of annotationTypeElementRest to annotationMethodRest.
- *          Because annotationConstantRest already references variableDeclarator which
- *          has the Identifier portion in it, the parser would fail on constants in
- *          annotation definitions because it expected two identifiers.
- *      Added optional trailing ';' to the alternatives in annotationTypeElementRest.
- *          Wouldn't handle an inner interface that has a trailing ';'.
- *      Swapped the expression and type rule reference order in castExpression to
- *          make it check for genericized casts first.  It was failing to recognize a
- *          statement like  "Class<Byte> TYPE = (Class<Byte>)...;" because it was seeing
- *          'Class<Byte' in the cast expression as a less than expression, then failing
- *          on the '>'.
- *      Changed createdName to use typeArguments instead of nonWildcardTypeArguments.
- *         
- *      Changed the 'this' alternative in primary to allow 'identifierSuffix' rather than
- *          just 'arguments'.  The case it couldn't handle was a call to an explicit
- *          generic method invocation (e.g. this.<E>doSomething()).  Using identifierSuffix
- *          may be overly aggressive--perhaps should create a more constrained thisSuffix rule?
- *
- *  Version 1.0.4 -- Hiroaki Nakamura, May 3, 2007
- *
- *  Fixed formalParameterDecls, localVariableDeclaration, forInit,
- *  and forVarControl to use variableModifier* not 'final'? (annotation)?
- *
- *  Version 1.0.5 -- Terence, June 21, 2007
- *  --a[i].foo didn't work. Fixed unaryExpression
- *
- *  Version 1.0.6 -- John Ridgway, March 17, 2008
- *      Made "assert" a switchable keyword like "enum".
- *      Fixed compilationUnit to disallow "annotation importDeclaration ...".
- *      Changed "Identifier ('.' Identifier)*" to "qualifiedName" in more
- *          places.
- *      Changed modifier* and/or variableModifier* to classOrInterfaceModifiers,
- *          modifiers or variableModifiers, as appropriate.
- *      Renamed "bound" to "typeBound" to better match language in the JLS.
- *      Added "memberDeclaration" which rewrites to methodDeclaration or
- *      fieldDeclaration and pulled type into memberDeclaration.  So we parse
- *          type and then move on to decide whether we're dealing with a field
- *          or a method.
- *      Modified "constructorDeclaration" to use "constructorBody" instead of
- *          "methodBody".  constructorBody starts with explicitConstructorInvocation,
- *          then goes on to blockStatement*.  Pulling explicitConstructorInvocation
- *          out of expressions allowed me to simplify "primary".
- *      Changed variableDeclarator to simplify it.
- *      Changed type to use classOrInterfaceType, thus simplifying it; of course
- *          I then had to add classOrInterfaceType, but it is used in several
- *          places.
- *      Fixed annotations, old version allowed "@X(y,z)", which is illegal.
- *      Added optional comma to end of "elementValueArrayInitializer"; as per JLS.
- *      Changed annotationTypeElementRest to use normalClassDeclaration and
- *          normalInterfaceDeclaration rather than classDeclaration and
- *          interfaceDeclaration, thus getting rid of a couple of grammar ambiguities.
- *      Split localVariableDeclaration into localVariableDeclarationStatement
- *          (includes the terminating semi-colon) and localVariableDeclaration.
- *          This allowed me to use localVariableDeclaration in "forInit" clauses,
- *           simplifying them.
- *      Changed switchBlockStatementGroup to use multiple labels.  This adds an
- *          ambiguity, but if one uses appropriately greedy parsing it yields the
- *           parse that is closest to the meaning of the switch statement.
- *      Renamed "forVarControl" to "enhancedForControl" -- JLS language.
- *      Added semantic predicates to test for shift operations rather than other
- *          things.  Thus, for instance, the string "< <" will never be treated
- *          as a left-shift operator.
- *      In "creator" we rule out "nonWildcardTypeArguments" on arrayCreation,
- *          which are illegal.
- *      Moved "nonWildcardTypeArguments into innerCreator.
- *      Removed 'super' superSuffix from explicitGenericInvocation, since that
- *          is only used in explicitConstructorInvocation at the beginning of a
- *           constructorBody.  (This is part of the simplification of expressions
- *           mentioned earlier.)
- *      Simplified primary (got rid of those things that are only used in
- *          explicitConstructorInvocation).
- *      Lexer -- removed "Exponent?" from FloatingPointLiteral choice 4, since it
- *          led to an ambiguity.
- *
- *      This grammar successfully parses every .java file in the JDK 1.5 source
- *          tree (excluding those whose file names include '-', which are not
- *          valid Java compilation units).
- *
- *  Known remaining problems:
- *      "Letter" and "JavaIDDigit" are wrong.  The actual specification of
- *      "Letter" should be "a character for which the method
- *      Character.isJavaIdentifierStart(int) returns true."  A "Java
- *      letter-or-digit is a character for which the method
- *      Character.isJavaIdentifierPart(int) returns true."
- */   
- 
- 
- /* 
-    This is a merged file, containing two versions of the Java.g grammar.
-    To extract a version from the file, run the ver.jar with the command provided below.
-    
-    Version 1 - tree building version, with all source level support, error recovery etc.
-                This is the version for compiler grammar workspace.
-                This version can be extracted by invoking:
-                java -cp ver.jar Main 1 true true true true true Java.g
-                             
-    Version 2 - clean version, with no source leve support, no error recovery, no predicts, 
-                assumes 1.6 level, works in Antlrworks.
-                This is the version for Alex.
-                This version can be extracted by invoking:
-                java -cp ver.jar Main 2 false false false false false Java.g 
-*/
-  
-grammar Java;
-
-
-options {
-    backtrack=true;
-    memoize=true;
-}
-
-/********************************************************************************************
-                          Parser section
-*********************************************************************************************/
-           
-compilationUnit 
-    :   (   (annotations
-            )?
-            packageDeclaration
-        )?
-        (importDeclaration
-        )*
-        (typeDeclaration
-        )*
-    ;
-
-packageDeclaration 
-    :   'package' qualifiedName
-        ';'
-    ;
-
-importDeclaration  
-    :   'import' 
-        ('static'
-        )?
-        IDENTIFIER '.' '*'
-        ';'       
-    |   'import' 
-        ('static'
-        )?
-        IDENTIFIER
-        ('.' IDENTIFIER
-        )+
-        ('.' '*'
-        )?
-        ';'
-    ;
-
-qualifiedImportName 
-    :   IDENTIFIER
-        ('.' IDENTIFIER
-        )*
-    ;
-
-typeDeclaration 
-    :   classOrInterfaceDeclaration
-    |   ';'
-    ;
-
-classOrInterfaceDeclaration 
-    :    classDeclaration
-    |   interfaceDeclaration
-    ;
-    
-  
-modifiers  
-    :
-    (    annotation
-    |   'public'
-    |   'protected'
-    |   'private'
-    |   'static'
-    |   'abstract'
-    |   'final'
-    |   'native'
-    |   'synchronized'
-    |   'transient'
-    |   'volatile'
-    |   'strictfp'
-    )*
-    ;
-
-
-variableModifiers 
-    :   (   'final'
-        |   annotation
-        )*
-    ;
-    
-
-classDeclaration 
-    :   normalClassDeclaration
-    |   enumDeclaration
-    ;
-
-normalClassDeclaration 
-    :   modifiers  'class' IDENTIFIER
-        (typeParameters
-        )?
-        ('extends' type
-        )?
-        ('implements' typeList
-        )?            
-        classBody
-    ;
-
-
-typeParameters 
-    :   '<'
-            typeParameter
-            (',' typeParameter
-            )*
-        '>'
-    ;
-
-typeParameter 
-    :   IDENTIFIER
-        ('extends' typeBound
-        )?
-    ;
-
-
-typeBound 
-    :   type
-        ('&' type
-        )*
-    ;
-
-
-enumDeclaration 
-    :   modifiers 
-        ('enum'
-        ) 
-        IDENTIFIER
-        ('implements' typeList
-        )?
-        enumBody
-    ;
-    
-
-enumBody 
-    :   '{'
-        (enumConstants
-        )? 
-        ','? 
-        (enumBodyDeclarations
-        )? 
-        '}'
-    ;
-
-enumConstants 
-    :   enumConstant
-        (',' enumConstant
-        )*
-    ;
-
-/**
- * NOTE: here differs from the javac grammar, missing TypeArguments.
- * EnumeratorDeclaration = AnnotationsOpt [TypeArguments] IDENTIFIER [ Arguments ] [ "{" ClassBody "}" ]
- */
-enumConstant 
-    :   (annotations
-        )?
-        IDENTIFIER
-        (arguments
-        )?
-        (classBody
-        )?
-        /* TODO: $GScope::name = names.empty. enum constant body is actually
-        an anonymous class, where constructor isn't allowed, have to add this check*/
-    ;
-
-enumBodyDeclarations 
-    :   ';' 
-        (classBodyDeclaration
-        )*
-    ;
-
-interfaceDeclaration 
-    :   normalInterfaceDeclaration
-    |   annotationTypeDeclaration
-    ;
-    
-normalInterfaceDeclaration 
-    :   modifiers 'interface' IDENTIFIER
-        (typeParameters
-        )?
-        ('extends' typeList
-        )?
-        interfaceBody
-    ;
-
-typeList 
-    :   type
-        (',' type
-        )*
-    ;
-
-classBody 
-    :   '{' 
-        (classBodyDeclaration
-        )* 
-        '}'
-    ;
-
-interfaceBody 
-    :   '{' 
-        (interfaceBodyDeclaration
-        )* 
-        '}'
-    ;
-
-classBodyDeclaration 
-    :   ';'
-    |   ('static'
-        )? 
-        block
-    |   memberDecl
-    ;
-
-memberDecl 
-    :    fieldDeclaration
-    |    methodDeclaration
-    |    classDeclaration
-    |    interfaceDeclaration
-    ;
-
-
-methodDeclaration 
-    :
-        /* For constructor, return type is null, name is 'init' */
-         modifiers
-        (typeParameters
-        )?
-        IDENTIFIER
-        formalParameters
-        ('throws' qualifiedNameList
-        )?
-        '{' 
-        (explicitConstructorInvocation
-        )?
-        (blockStatement
-        )*
-        '}'
-    |   modifiers
-        (typeParameters
-        )?
-        (type
-        |   'void'
-        )
-        IDENTIFIER
-        formalParameters
-        ('[' ']'
-        )*
-        ('throws' qualifiedNameList
-        )?            
-        (        
-            block
-        |   ';' 
-        )
-    ;
-
-
-fieldDeclaration 
-    :   modifiers
-        type
-        variableDeclarator
-        (',' variableDeclarator
-        )*
-        ';'
-    ;
-
-variableDeclarator 
-    :   IDENTIFIER
-        ('[' ']'
-        )*
-        ('=' variableInitializer
-        )?
-    ;
-
-/**
- *TODO: add predicates
- */
-interfaceBodyDeclaration 
-    :
-        interfaceFieldDeclaration
-    |   interfaceMethodDeclaration
-    |   interfaceDeclaration
-    |   classDeclaration
-    |   ';'
-    ;
-
-interfaceMethodDeclaration 
-    :   modifiers
-        (typeParameters
-        )?
-        (type
-        |'void'
-        )
-        IDENTIFIER
-        formalParameters
-        ('[' ']'
-        )*
-        ('throws' qualifiedNameList
-        )? ';'
-    ;
-
-/**
- * NOTE, should not use variableDeclarator here, as it doesn't necessary require
- * an initializer, while an interface field does, or judge by the returned value.
- * But this gives better diagnostic message, or antlr won't predict this rule.
- */
-interfaceFieldDeclaration 
-    :   modifiers type variableDeclarator
-        (',' variableDeclarator
-        )*
-        ';'
-    ;
-
-
-type 
-    :   classOrInterfaceType
-        ('[' ']'
-        )*
-    |   primitiveType
-        ('[' ']'
-        )*
-    ;
-
-
-classOrInterfaceType 
-    :   IDENTIFIER
-        (typeArguments
-        )?
-        ('.' IDENTIFIER
-            (typeArguments
-            )?
-        )*
-    ;
-
-primitiveType  
-    :   'boolean'
-    |   'char'
-    |   'byte'
-    |   'short'
-    |   'int'
-    |   'long'
-    |   'float'
-    |   'double'
-    ;
-
-typeArguments 
-    :   '<' typeArgument
-        (',' typeArgument
-        )* 
-        '>'
-    ;
-
-typeArgument 
-    :   type
-    |   '?'
-        (
-            ('extends'
-            |'super'
-            )
-            type
-        )?
-    ;
-
-qualifiedNameList 
-    :   qualifiedName
-        (',' qualifiedName
-        )*
-    ;
-
-formalParameters 
-    :   '('
-        (formalParameterDecls
-        )? 
-        ')'
-    ;
-
-formalParameterDecls 
-    :   ellipsisParameterDecl
-    |   normalParameterDecl
-        (',' normalParameterDecl
-        )*
-    |   (normalParameterDecl
-        ','
-        )+ 
-        ellipsisParameterDecl
-    ;
-
-normalParameterDecl 
-    :   variableModifiers type IDENTIFIER
-        ('[' ']'
-        )*
-    ;
-
-ellipsisParameterDecl 
-    :   variableModifiers
-        type  '...'
-        IDENTIFIER
-    ;
-
-
-explicitConstructorInvocation 
-    :   (nonWildcardTypeArguments
-        )?     //NOTE: the position of Identifier 'super' is set to the type args position here
-        ('this'
-        |'super'
-        )
-        arguments ';'
-
-    |   primary
-        '.'
-        (nonWildcardTypeArguments
-        )?
-        'super'
-        arguments ';'
-    ;
-
-qualifiedName 
-    :   IDENTIFIER
-        ('.' IDENTIFIER
-        )*
-    ;
-
-annotations 
-    :   (annotation
-        )+
-    ;
-
-/**
- *  Using an annotation. 
- * '@' is flaged in modifier
- */
-annotation 
-    :   '@' qualifiedName
-        (   '('   
-                  (   elementValuePairs
-                  |   elementValue
-                  )? 
-            ')' 
-        )?
-    ;
-
-elementValuePairs 
-    :   elementValuePair
-        (',' elementValuePair
-        )*
-    ;
-
-elementValuePair 
-    :   IDENTIFIER '=' elementValue
-    ;
-
-elementValue 
-    :   conditionalExpression
-    |   annotation
-    |   elementValueArrayInitializer
-    ;
-
-elementValueArrayInitializer 
-    :   '{'
-        (elementValue
-            (',' elementValue
-            )*
-        )? (',')? '}'
-    ;
-
-
-/**
- * Annotation declaration.
- */
-annotationTypeDeclaration 
-    :   modifiers '@'
-        'interface'
-        IDENTIFIER
-        annotationTypeBody
-    ;
-
-
-annotationTypeBody 
-    :   '{' 
-        (annotationTypeElementDeclaration
-        )* 
-        '}'
-    ;
-
-/**
- * NOTE: here use interfaceFieldDeclaration for field declared inside annotation. they are sytactically the same.
- */
-annotationTypeElementDeclaration 
-    :   annotationMethodDeclaration
-    |   interfaceFieldDeclaration
-    |   normalClassDeclaration
-    |   normalInterfaceDeclaration
-    |   enumDeclaration
-    |   annotationTypeDeclaration
-    |   ';'
-    ;
-
-annotationMethodDeclaration 
-    :   modifiers type IDENTIFIER
-        '(' ')' ('default' elementValue
-                )?
-        ';'
-        ;
-
-block 
-    :   '{'
-        (blockStatement
-        )*
-        '}'
-    ;
-
-/*
-staticBlock returns [JCBlock tree]
-        @init {
-            ListBuffer<JCStatement> stats = new ListBuffer<JCStatement>();
-            int pos = ((AntlrJavacToken) $start).getStartIndex();
-        }
-        @after {
-            $tree = T.at(pos).Block(Flags.STATIC, stats.toList());
-            pu.storeEnd($tree, $stop);
-            // construct a dummy static modifiers for end position
-            pu.storeEnd(T.at(pos).Modifiers(Flags.STATIC,  com.sun.tools.javac.util.List.<JCAnnotation>nil()),$st);
-        }
-    :   st_1='static' '{' 
-        (blockStatement
-            {
-                if ($blockStatement.tree == null) {
-                    stats.appendList($blockStatement.list);
-                } else {
-                    stats.append($blockStatement.tree);
-                }
-            }
-        )* '}'
-    ;
-*/
-blockStatement 
-    :   localVariableDeclarationStatement
-    |   classOrInterfaceDeclaration
-    |   statement
-    ;
-
-
-localVariableDeclarationStatement 
-    :   localVariableDeclaration
-        ';'
-    ;
-
-localVariableDeclaration 
-    :   variableModifiers type
-        variableDeclarator
-        (',' variableDeclarator
-        )*
-    ;
-
-statement 
-    :   block
-            
-    |   ('assert'
-        )
-        expression (':' expression)? ';'
-    |   'assert'  expression (':' expression)? ';'            
-    |   'if' parExpression statement ('else' statement)?          
-    |   forstatement
-    |   'while' parExpression statement
-    |   'do' statement 'while' parExpression ';'
-    |   trystatement
-    |   'switch' parExpression '{' switchBlockStatementGroups '}'
-    |   'synchronized' parExpression block
-    |   'return' (expression )? ';'
-    |   'throw' expression ';'
-    |   'break'
-            (IDENTIFIER
-            )? ';'
-    |   'continue'
-            (IDENTIFIER
-            )? ';'
-    |   expression  ';'     
-    |   IDENTIFIER ':' statement
-    |   ';'
-
-    ;
-
-switchBlockStatementGroups 
-    :   (switchBlockStatementGroup )*
-    ;
-
-switchBlockStatementGroup 
-    :
-        switchLabel
-        (blockStatement
-        )*
-    ;
-
-switchLabel 
-    :   'case' expression ':'
-    |   'default' ':'
-    ;
-
-
-trystatement 
-    :   'try' block
-        (   catches 'finally' block
-        |   catches
-        |   'finally' block
-        )
-     ;
-
-catches 
-    :   catchClause
-        (catchClause
-        )*
-    ;
-
-catchClause 
-    :   'catch' '(' formalParameter
-        ')' block 
-    ;
-
-formalParameter 
-    :   variableModifiers type IDENTIFIER
-        ('[' ']'
-        )*
-    ;
-
-forstatement 
-    :   
-        // enhanced for loop
-        'for' '(' variableModifiers type IDENTIFIER ':' 
-        expression ')' statement
-            
-        // normal for loop
-    |   'for' '(' 
-                (forInit
-                )? ';' 
-                (expression
-                )? ';' 
-                (expressionList
-                )? ')' statement
-    ;
-
-forInit 
-    :   localVariableDeclaration
-    |   expressionList
-    ;
-
-parExpression 
-    :   '(' expression ')'
-    ;
-
-expressionList 
-    :   expression
-        (',' expression
-        )*
-    ;
-
-
-expression 
-    :   conditionalExpression
-        (assignmentOperator expression
-        )?
-    ;
-
-
-assignmentOperator 
-    :   '='
-    |   '+='
-    |   '-='
-    |   '*='
-    |   '/='
-    |   '&='
-    |   '|='
-    |   '^='
-    |   '%='
-    |    '<' '<' '='
-    |    '>' '>' '>' '='
-    |    '>' '>' '='
-    ;
-
-
-conditionalExpression 
-    :   conditionalOrExpression
-        ('?' expression ':' conditionalExpression
-        )?
-    ;
-
-conditionalOrExpression 
-    :   conditionalAndExpression
-        ('||' conditionalAndExpression
-        )*
-    ;
-
-conditionalAndExpression 
-    :   inclusiveOrExpression
-        ('&&' inclusiveOrExpression
-        )*
-    ;
-
-inclusiveOrExpression 
-    :   exclusiveOrExpression
-        ('|' exclusiveOrExpression
-        )*
-    ;
-
-exclusiveOrExpression 
-    :   andExpression
-        ('^' andExpression
-        )*
-    ;
-
-andExpression 
-    :   equalityExpression
-        ('&' equalityExpression
-        )*
-    ;
-
-equalityExpression 
-    :   instanceOfExpression
-        (   
-            (   '=='
-            |   '!='
-            )
-            instanceOfExpression
-        )*
-    ;
-
-instanceOfExpression 
-    :   relationalExpression
-        ('instanceof' type
-        )?
-    ;
-
-relationalExpression 
-    :   shiftExpression
-        (relationalOp shiftExpression
-        )*
-    ;
-
-relationalOp 
-    :    '<' '='
-    |    '>' '='
-    |   '<'
-    |   '>'
-    ;
-
-shiftExpression 
-    :   additiveExpression
-        (shiftOp additiveExpression
-        )*
-    ;
-
-
-shiftOp 
-    :    '<' '<'
-    |    '>' '>' '>'
-    |    '>' '>'
-    ;
-
-
-additiveExpression 
-    :   multiplicativeExpression
-        (   
-            (   '+'
-            |   '-'
-            )
-            multiplicativeExpression
-         )*
-    ;
-
-multiplicativeExpression 
-    :
-        unaryExpression
-        (   
-            (   '*'
-            |   '/'
-            |   '%'
-            )
-            unaryExpression
-        )*
-    ;
-
-/**
- * NOTE: for '+' and '-', if the next token is int or long interal, then it's not a unary expression.
- *       it's a literal with signed value. INTLTERAL AND LONG LITERAL are added here for this.
- */
-unaryExpression 
-    :   '+'  unaryExpression
-    |   '-' unaryExpression
-    |   '++' unaryExpression
-    |   '--' unaryExpression
-    |   unaryExpressionNotPlusMinus
-    ;
-
-unaryExpressionNotPlusMinus 
-    :   '~' unaryExpression
-    |   '!' unaryExpression
-    |   castExpression
-    |   primary
-        (selector
-        )*
-        (   '++'
-        |   '--'
-        )?
-    ;
-
-castExpression 
-    :   '(' primitiveType ')' unaryExpression
-    |   '(' type ')' unaryExpressionNotPlusMinus
-    ;
-
-/**
- * have to use scope here, parameter passing isn't well supported in antlr.
- */
-primary 
-    :   parExpression            
-    |   'this'
-        ('.' IDENTIFIER
-        )*
-        (identifierSuffix
-        )?
-    |   IDENTIFIER
-        ('.' IDENTIFIER
-        )*
-        (identifierSuffix
-        )?
-    |   'super'
-        superSuffix
-    |   literal
-    |   creator
-    |   primitiveType
-        ('[' ']'
-        )*
-        '.' 'class'
-    |   'void' '.' 'class'
-    ;
-    
-
-superSuffix  
-    :   arguments
-    |   '.' (typeArguments
-        )?
-        IDENTIFIER
-        (arguments
-        )?
-    ;
-
-
-identifierSuffix 
-    :   ('[' ']'
-        )+
-        '.' 'class'
-    |   ('[' expression ']'
-        )+
-    |   arguments
-    |   '.' 'class'
-    |   '.' nonWildcardTypeArguments IDENTIFIER arguments
-    |   '.' 'this'
-    |   '.' 'super' arguments
-    |   innerCreator
-    ;
-
-
-selector  
-    :   '.' IDENTIFIER
-        (arguments
-        )?
-    |   '.' 'this'
-    |   '.' 'super'
-        superSuffix
-    |   innerCreator
-    |   '[' expression ']'
-    ;
-
-creator 
-    :   'new' nonWildcardTypeArguments classOrInterfaceType classCreatorRest
-    |   'new' classOrInterfaceType classCreatorRest
-    |   arrayCreator
-    ;
-
-arrayCreator 
-    :   'new' createdName
-        '[' ']'
-        ('[' ']'
-        )*
-        arrayInitializer
-
-    |   'new' createdName
-        '[' expression
-        ']'
-        (   '[' expression
-            ']'
-        )*
-        ('[' ']'
-        )*
-    ;
-
-variableInitializer 
-    :   arrayInitializer
-    |   expression
-    ;
-
-arrayInitializer 
-    :   '{' 
-            (variableInitializer
-                (',' variableInitializer
-                )*
-            )? 
-            (',')? 
-        '}'             //Yang's fix, position change.
-    ;
-
-
-createdName 
-    :   classOrInterfaceType
-    |   primitiveType
-    ;
-
-innerCreator  
-    :   '.' 'new'
-        (nonWildcardTypeArguments
-        )?
-        IDENTIFIER
-        (typeArguments
-        )?
-        classCreatorRest
-    ;
-
-
-classCreatorRest 
-    :   arguments
-        (classBody
-        )?
-    ;
-
-
-nonWildcardTypeArguments 
-    :   '<' typeList
-        '>'
-    ;
-
-arguments 
-    :   '(' (expressionList
-        )? ')'
-    ;
-
-literal 
-    :   INTLITERAL
-    |   LONGLITERAL
-    |   FLOATLITERAL
-    |   DOUBLELITERAL
-    |   CHARLITERAL
-    |   STRINGLITERAL
-    |   TRUE
-    |   FALSE
-    |   NULL
-    ;
-
-/**
- * These are headers help to make syntatical predicates, not necessary but helps to make grammar faster.
- */
- 
-classHeader 
-    :   modifiers 'class' IDENTIFIER
-    ;
-
-enumHeader 
-    :   modifiers ('enum'|IDENTIFIER) IDENTIFIER
-    ;
-
-interfaceHeader 
-    :   modifiers 'interface' IDENTIFIER
-    ;
-
-annotationHeader 
-    :   modifiers '@' 'interface' IDENTIFIER
-    ;
-
-typeHeader 
-    :   modifiers ('class'|'enum'|('@' ? 'interface')) IDENTIFIER
-    ;
-
-methodHeader 
-    :   modifiers typeParameters? (type|'void')? IDENTIFIER '('
-    ;
-
-fieldHeader 
-    :   modifiers type IDENTIFIER ('['']')* ('='|','|';')
-    ;
-
-localVariableHeader 
-    :   variableModifiers type IDENTIFIER ('['']')* ('='|','|';')
-    ;
-
-
-
-
-/********************************************************************************************
-                  Lexer section
-*********************************************************************************************/
-
-LONGLITERAL
-    :   IntegerNumber LongSuffix
-    ;
-
-    
-INTLITERAL
-    :   IntegerNumber 
-    ;
-    
-fragment
-IntegerNumber
-    :   '0' 
-    |   '1'..'9' ('0'..'9')*    
-    |   '0' ('0'..'7')+         
-    |   HexPrefix HexDigit+        
-    ;
-
-fragment
-HexPrefix
-    :   '0x' | '0X'
-    ;
-        
-fragment
-HexDigit
-    :   ('0'..'9'|'a'..'f'|'A'..'F')
-    ;
-
-fragment
-LongSuffix
-    :   'l' | 'L'
-    ;
-
-
-fragment
-NonIntegerNumber
-    :   ('0' .. '9')+ '.' ('0' .. '9')* Exponent?  
-    |   '.' ( '0' .. '9' )+ Exponent?  
-    |   ('0' .. '9')+ Exponent  
-    |   ('0' .. '9')+ 
-    |   
-        HexPrefix (HexDigit )* 
-        (    () 
-        |    ('.' (HexDigit )* ) 
-        ) 
-        ( 'p' | 'P' ) 
-        ( '+' | '-' )? 
-        ( '0' .. '9' )+
-        ;
-        
-fragment 
-Exponent    
-    :   ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ 
-    ;
-    
-fragment 
-FloatSuffix
-    :   'f' | 'F' 
-    ;     
-
-fragment
-DoubleSuffix
-    :   'd' | 'D'
-    ;
-        
-FLOATLITERAL
-    :   NonIntegerNumber FloatSuffix
-    ;
-    
-DOUBLELITERAL
-    :   NonIntegerNumber DoubleSuffix?
-    ;
-
-CHARLITERAL
-    :   '\'' 
-        (   EscapeSequence 
-        |   ~( '\'' | '\\' | '\r' | '\n' )
-        ) 
-        '\''
-    ; 
-
-STRINGLITERAL
-    :   '"' 
-        (   EscapeSequence
-        |   ~( '\\' | '"' | '\r' | '\n' )        
-        )* 
-        '"' 
-    ;
-
-fragment
-EscapeSequence 
-    :   '\\' (
-                 'b' 
-             |   't' 
-             |   'n' 
-             |   'f' 
-             |   'r' 
-             |   '\"' 
-             |   '\'' 
-             |   '\\' 
-             |       
-                 ('0'..'3') ('0'..'7') ('0'..'7')
-             |       
-                 ('0'..'7') ('0'..'7') 
-             |       
-                 ('0'..'7')
-             )          
-;     
-
-WS  
-    :   (
-             ' '
-        |    '\r'
-        |    '\t'
-        |    '\u000C'
-        |    '\n'
-        ) 
-            {
-                skip();
-            }          
-    ;
-    
-COMMENT
-         @init{
-            boolean isJavaDoc = false;
-        }
-    :   '/*'
-            {
-                if((char)input.LA(1) == '*'){
-                    isJavaDoc = true;
-                }
-            }
-        (options {greedy=false;} : . )* 
-        '*/'
-            {
-                if(isJavaDoc==true){
-                    $channel=HIDDEN;
-                }else{
-                    skip();
-                }
-            }
-    ;
-
-LINE_COMMENT
-    :   '//' ~('\n'|'\r')*  ('\r\n' | '\r' | '\n') 
-            {
-                skip();
-            }
-    |   '//' ~('\n'|'\r')*     // a line comment could appear at the end of the file without CR/LF
-            {
-                skip();
-            }
-    ;   
-        
-ABSTRACT
-    :   'abstract'
-    ;
-    
-ASSERT
-    :   'assert'
-    ;
-    
-BOOLEAN
-    :   'boolean'
-    ;
-    
-BREAK
-    :   'break'
-    ;
-    
-BYTE
-    :   'byte'
-    ;
-    
-CASE
-    :   'case'
-    ;
-    
-CATCH
-    :   'catch'
-    ;
-    
-CHAR
-    :   'char'
-    ;
-    
-CLASS
-    :   'class'
-    ;
-    
-CONST
-    :   'const'
-    ;
-
-CONTINUE
-    :   'continue'
-    ;
-
-DEFAULT
-    :   'default'
-    ;
-
-DO
-    :   'do'
-    ;
-
-DOUBLE
-    :   'double'
-    ;
-
-ELSE
-    :   'else'
-    ;
-
-ENUM
-    :   'enum'
-    ;             
-
-EXTENDS
-    :   'extends'
-    ;
-
-FINAL
-    :   'final'
-    ;
-
-FINALLY
-    :   'finally'
-    ;
-
-FLOAT
-    :   'float'
-    ;
-
-FOR
-    :   'for'
-    ;
-
-GOTO
-    :   'goto'
-    ;
-
-IF
-    :   'if'
-    ;
-
-IMPLEMENTS
-    :   'implements'
-    ;
-
-IMPORT
-    :   'import'
-    ;
-
-INSTANCEOF
-    :   'instanceof'
-    ;
-
-INT
-    :   'int'
-    ;
-
-INTERFACE
-    :   'interface'
-    ;
-
-LONG
-    :   'long'
-    ;
-
-NATIVE
-    :   'native'
-    ;
-
-NEW
-    :   'new'
-    ;
-
-PACKAGE
-    :   'package'
-    ;
-
-PRIVATE
-    :   'private'
-    ;
-
-PROTECTED
-    :   'protected'
-    ;
-
-PUBLIC
-    :   'public'
-    ;
-
-RETURN
-    :   'return'
-    ;
-
-SHORT
-    :   'short'
-    ;
-
-STATIC
-    :   'static'
-    ;
-
-STRICTFP
-    :   'strictfp'
-    ;
-
-SUPER
-    :   'super'
-    ;
-
-SWITCH
-    :   'switch'
-    ;
-
-SYNCHRONIZED
-    :   'synchronized'
-    ;
-
-THIS
-    :   'this'
-    ;
-
-THROW
-    :   'throw'
-    ;
-
-THROWS
-    :   'throws'
-    ;
-
-TRANSIENT
-    :   'transient'
-    ;
-
-TRY
-    :   'try'
-    ;
-
-VOID
-    :   'void'
-    ;
-
-VOLATILE
-    :   'volatile'
-    ;
-
-WHILE
-    :   'while'
-    ;
-
-TRUE
-    :   'true'
-    ;
-
-FALSE
-    :   'false'
-    ;
-
-NULL
-    :   'null'
-    ;
-
-LPAREN
-    :   '('
-    ;
-
-RPAREN
-    :   ')'
-    ;
-
-LBRACE
-    :   '{'
-    ;
-
-RBRACE
-    :   '}'
-    ;
-
-LBRACKET
-    :   '['
-    ;
-
-RBRACKET
-    :   ']'
-    ;
-
-SEMI
-    :   ';'
-    ;
-
-COMMA
-    :   ','
-    ;
-
-DOT
-    :   '.'
-    ;
-
-ELLIPSIS
-    :   '...'
-    ;
-
-EQ
-    :   '='
-    ;
-
-BANG
-    :   '!'
-    ;
-
-TILDE
-    :   '~'
-    ;
-
-QUES
-    :   '?'
-    ;
-
-COLON
-    :   ':'
-    ;
-
-EQEQ
-    :   '=='
-    ;
-
-AMPAMP
-    :   '&&'
-    ;
-
-BARBAR
-    :   '||'
-    ;
-
-PLUSPLUS
-    :   '++'
-    ;
-
-SUBSUB
-    :   '--'
-    ;
-
-PLUS
-    :   '+'
-    ;
-
-SUB
-    :   '-'
-    ;
-
-STAR
-    :   '*'
-    ;
-
-SLASH
-    :   '/'
-    ;
-
-AMP
-    :   '&'
-    ;
-
-BAR
-    :   '|'
-    ;
-
-CARET
-    :   '^'
-    ;
-
-PERCENT
-    :   '%'
-    ;
-
-PLUSEQ
-    :   '+='
-    ; 
-    
-SUBEQ
-    :   '-='
-    ;
-
-STAREQ
-    :   '*='
-    ;
-
-SLASHEQ
-    :   '/='
-    ;
-
-AMPEQ
-    :   '&='
-    ;
-
-BAREQ
-    :   '|='
-    ;
-
-CARETEQ
-    :   '^='
-    ;
-
-PERCENTEQ
-    :   '%='
-    ;
-
-MONKEYS_AT
-    :   '@'
-    ;
-
-BANGEQ
-    :   '!='
-    ;
-
-GT
-    :   '>'
-    ;
-
-LT
-    :   '<'
-    ;        
-              
-IDENTIFIER
-    :   IdentifierStart IdentifierPart*
-    ;
-
-fragment
-SurrogateIdentifer 
-    :   ('\ud800'..'\udbff') ('\udc00'..'\udfff') 
-    ;                 
-
-fragment
-IdentifierStart
-    :   '\u0024'
-    |   '\u0041'..'\u005a'
-    |   '\u005f'
-    |   '\u0061'..'\u007a'
-    |   '\u00a2'..'\u00a5'
-    |   '\u00aa'
-    |   '\u00b5'
-    |   '\u00ba'
-    |   '\u00c0'..'\u00d6'
-    |   '\u00d8'..'\u00f6'
-    |   '\u00f8'..'\u0236'
-    |   '\u0250'..'\u02c1'
-    |   '\u02c6'..'\u02d1'
-    |   '\u02e0'..'\u02e4'
-    |   '\u02ee'
-    |   '\u037a'
-    |   '\u0386'
-    |   '\u0388'..'\u038a'
-    |   '\u038c'
-    |   '\u038e'..'\u03a1'
-    |   '\u03a3'..'\u03ce'
-    |   '\u03d0'..'\u03f5'
-    |   '\u03f7'..'\u03fb'
-    |   '\u0400'..'\u0481'
-    |   '\u048a'..'\u04ce'
-    |   '\u04d0'..'\u04f5'
-    |   '\u04f8'..'\u04f9'
-    |   '\u0500'..'\u050f'
-    |   '\u0531'..'\u0556'
-    |   '\u0559'
-    |   '\u0561'..'\u0587'
-    |   '\u05d0'..'\u05ea'
-    |   '\u05f0'..'\u05f2'
-    |   '\u0621'..'\u063a'
-    |   '\u0640'..'\u064a'
-    |   '\u066e'..'\u066f'
-    |   '\u0671'..'\u06d3'
-    |   '\u06d5'
-    |   '\u06e5'..'\u06e6'
-    |   '\u06ee'..'\u06ef'
-    |   '\u06fa'..'\u06fc'
-    |   '\u06ff'
-    |   '\u0710'
-    |   '\u0712'..'\u072f'
-    |   '\u074d'..'\u074f'
-    |   '\u0780'..'\u07a5'
-    |   '\u07b1'
-    |   '\u0904'..'\u0939'
-    |   '\u093d'
-    |   '\u0950'
-    |   '\u0958'..'\u0961'
-    |   '\u0985'..'\u098c'
-    |   '\u098f'..'\u0990'
-    |   '\u0993'..'\u09a8'
-    |   '\u09aa'..'\u09b0'
-    |   '\u09b2'
-    |   '\u09b6'..'\u09b9'
-    |   '\u09bd'
-    |   '\u09dc'..'\u09dd'
-    |   '\u09df'..'\u09e1'
-    |   '\u09f0'..'\u09f3'
-    |   '\u0a05'..'\u0a0a'
-    |   '\u0a0f'..'\u0a10'
-    |   '\u0a13'..'\u0a28'
-    |   '\u0a2a'..'\u0a30'
-    |   '\u0a32'..'\u0a33'
-    |   '\u0a35'..'\u0a36'
-    |   '\u0a38'..'\u0a39'
-    |   '\u0a59'..'\u0a5c'
-    |   '\u0a5e'
-    |   '\u0a72'..'\u0a74'
-    |   '\u0a85'..'\u0a8d'
-    |   '\u0a8f'..'\u0a91'
-    |   '\u0a93'..'\u0aa8'
-    |   '\u0aaa'..'\u0ab0'
-    |   '\u0ab2'..'\u0ab3'
-    |   '\u0ab5'..'\u0ab9'
-    |   '\u0abd'
-    |   '\u0ad0'
-    |   '\u0ae0'..'\u0ae1'
-    |   '\u0af1'
-    |   '\u0b05'..'\u0b0c'
-    |   '\u0b0f'..'\u0b10'
-    |   '\u0b13'..'\u0b28'
-    |   '\u0b2a'..'\u0b30'
-    |   '\u0b32'..'\u0b33'
-    |   '\u0b35'..'\u0b39'
-    |   '\u0b3d'
-    |   '\u0b5c'..'\u0b5d'
-    |   '\u0b5f'..'\u0b61'
-    |   '\u0b71'
-    |   '\u0b83'
-    |   '\u0b85'..'\u0b8a'
-    |   '\u0b8e'..'\u0b90'
-    |   '\u0b92'..'\u0b95'
-    |   '\u0b99'..'\u0b9a'
-    |   '\u0b9c'
-    |   '\u0b9e'..'\u0b9f'
-    |   '\u0ba3'..'\u0ba4'
-    |   '\u0ba8'..'\u0baa'
-    |   '\u0bae'..'\u0bb5'
-    |   '\u0bb7'..'\u0bb9'
-    |   '\u0bf9'
-    |   '\u0c05'..'\u0c0c'
-    |   '\u0c0e'..'\u0c10'
-    |   '\u0c12'..'\u0c28'
-    |   '\u0c2a'..'\u0c33'
-    |   '\u0c35'..'\u0c39'
-    |   '\u0c60'..'\u0c61'
-    |   '\u0c85'..'\u0c8c'
-    |   '\u0c8e'..'\u0c90'
-    |   '\u0c92'..'\u0ca8'
-    |   '\u0caa'..'\u0cb3'
-    |   '\u0cb5'..'\u0cb9'
-    |   '\u0cbd'
-    |   '\u0cde'
-    |   '\u0ce0'..'\u0ce1'
-    |   '\u0d05'..'\u0d0c'
-    |   '\u0d0e'..'\u0d10'
-    |   '\u0d12'..'\u0d28'
-    |   '\u0d2a'..'\u0d39'
-    |   '\u0d60'..'\u0d61'
-    |   '\u0d85'..'\u0d96'
-    |   '\u0d9a'..'\u0db1'
-    |   '\u0db3'..'\u0dbb'
-    |   '\u0dbd'
-    |   '\u0dc0'..'\u0dc6'
-    |   '\u0e01'..'\u0e30'
-    |   '\u0e32'..'\u0e33'
-    |   '\u0e3f'..'\u0e46'
-    |   '\u0e81'..'\u0e82'
-    |   '\u0e84'
-    |   '\u0e87'..'\u0e88'
-    |   '\u0e8a'
-    |   '\u0e8d'
-    |   '\u0e94'..'\u0e97'
-    |   '\u0e99'..'\u0e9f'
-    |   '\u0ea1'..'\u0ea3'
-    |   '\u0ea5'
-    |   '\u0ea7'
-    |   '\u0eaa'..'\u0eab'
-    |   '\u0ead'..'\u0eb0'
-    |   '\u0eb2'..'\u0eb3'
-    |   '\u0ebd'
-    |   '\u0ec0'..'\u0ec4'
-    |   '\u0ec6'
-    |   '\u0edc'..'\u0edd'
-    |   '\u0f00'
-    |   '\u0f40'..'\u0f47'
-    |   '\u0f49'..'\u0f6a'
-    |   '\u0f88'..'\u0f8b'
-    |   '\u1000'..'\u1021'
-    |   '\u1023'..'\u1027'
-    |   '\u1029'..'\u102a'
-    |   '\u1050'..'\u1055'
-    |   '\u10a0'..'\u10c5'
-    |   '\u10d0'..'\u10f8'
-    |   '\u1100'..'\u1159'
-    |   '\u115f'..'\u11a2'
-    |   '\u11a8'..'\u11f9'
-    |   '\u1200'..'\u1206'
-    |   '\u1208'..'\u1246'
-    |   '\u1248'
-    |   '\u124a'..'\u124d'
-    |   '\u1250'..'\u1256'
-    |   '\u1258'
-    |   '\u125a'..'\u125d'
-    |   '\u1260'..'\u1286'
-    |   '\u1288'
-    |   '\u128a'..'\u128d'
-    |   '\u1290'..'\u12ae'
-    |   '\u12b0'
-    |   '\u12b2'..'\u12b5'
-    |   '\u12b8'..'\u12be'
-    |   '\u12c0'
-    |   '\u12c2'..'\u12c5'
-    |   '\u12c8'..'\u12ce'
-    |   '\u12d0'..'\u12d6'
-    |   '\u12d8'..'\u12ee'
-    |   '\u12f0'..'\u130e'
-    |   '\u1310'
-    |   '\u1312'..'\u1315'
-    |   '\u1318'..'\u131e'
-    |   '\u1320'..'\u1346'
-    |   '\u1348'..'\u135a'
-    |   '\u13a0'..'\u13f4'
-    |   '\u1401'..'\u166c'
-    |   '\u166f'..'\u1676'
-    |   '\u1681'..'\u169a'
-    |   '\u16a0'..'\u16ea'
-    |   '\u16ee'..'\u16f0'
-    |   '\u1700'..'\u170c'
-    |   '\u170e'..'\u1711'
-    |   '\u1720'..'\u1731'
-    |   '\u1740'..'\u1751'
-    |   '\u1760'..'\u176c'
-    |   '\u176e'..'\u1770'
-    |   '\u1780'..'\u17b3'
-    |   '\u17d7' 
-    |   '\u17db'..'\u17dc'
-    |   '\u1820'..'\u1877'
-    |   '\u1880'..'\u18a8'
-    |   '\u1900'..'\u191c'
-    |   '\u1950'..'\u196d'
-    |   '\u1970'..'\u1974'
-    |   '\u1d00'..'\u1d6b'
-    |   '\u1e00'..'\u1e9b'
-    |   '\u1ea0'..'\u1ef9'
-    |   '\u1f00'..'\u1f15'
-    |   '\u1f18'..'\u1f1d'
-    |   '\u1f20'..'\u1f45'
-    |   '\u1f48'..'\u1f4d'
-    |   '\u1f50'..'\u1f57'
-    |   '\u1f59'
-    |   '\u1f5b'
-    |   '\u1f5d'
-    |   '\u1f5f'..'\u1f7d'
-    |   '\u1f80'..'\u1fb4'
-    |   '\u1fb6'..'\u1fbc'
-    |   '\u1fbe'
-    |   '\u1fc2'..'\u1fc4'
-    |   '\u1fc6'..'\u1fcc'
-    |   '\u1fd0'..'\u1fd3'
-    |   '\u1fd6'..'\u1fdb'
-    |   '\u1fe0'..'\u1fec'
-    |   '\u1ff2'..'\u1ff4'
-    |   '\u1ff6'..'\u1ffc'
-    |   '\u203f'..'\u2040'
-    |   '\u2054'
-    |   '\u2071'
-    |   '\u207f'
-    |   '\u20a0'..'\u20b1'
-    |   '\u2102'
-    |   '\u2107'
-    |   '\u210a'..'\u2113'
-    |   '\u2115'
-    |   '\u2119'..'\u211d'
-    |   '\u2124'
-    |   '\u2126'
-    |   '\u2128'
-    |   '\u212a'..'\u212d'
-    |   '\u212f'..'\u2131'
-    |   '\u2133'..'\u2139'
-    |   '\u213d'..'\u213f'
-    |   '\u2145'..'\u2149'
-    |   '\u2160'..'\u2183'
-    |   '\u3005'..'\u3007'
-    |   '\u3021'..'\u3029'
-    |   '\u3031'..'\u3035'
-    |   '\u3038'..'\u303c'
-    |   '\u3041'..'\u3096'
-    |   '\u309d'..'\u309f'
-    |   '\u30a1'..'\u30ff'
-    |   '\u3105'..'\u312c'
-    |   '\u3131'..'\u318e'
-    |   '\u31a0'..'\u31b7'
-    |   '\u31f0'..'\u31ff'
-    |   '\u3400'..'\u4db5'
-    |   '\u4e00'..'\u9fa5'
-    |   '\ua000'..'\ua48c'
-    |   '\uac00'..'\ud7a3'
-    |   '\uf900'..'\ufa2d'
-    |   '\ufa30'..'\ufa6a'
-    |   '\ufb00'..'\ufb06'
-    |   '\ufb13'..'\ufb17'
-    |   '\ufb1d'
-    |   '\ufb1f'..'\ufb28'
-    |   '\ufb2a'..'\ufb36'
-    |   '\ufb38'..'\ufb3c'
-    |   '\ufb3e'
-    |   '\ufb40'..'\ufb41'
-    |   '\ufb43'..'\ufb44'
-    |   '\ufb46'..'\ufbb1'
-    |   '\ufbd3'..'\ufd3d'
-    |   '\ufd50'..'\ufd8f'
-    |   '\ufd92'..'\ufdc7'
-    |   '\ufdf0'..'\ufdfc'
-    |   '\ufe33'..'\ufe34'
-    |   '\ufe4d'..'\ufe4f'
-    |   '\ufe69'
-    |   '\ufe70'..'\ufe74'
-    |   '\ufe76'..'\ufefc'
-    |   '\uff04'
-    |   '\uff21'..'\uff3a'
-    |   '\uff3f'
-    |   '\uff41'..'\uff5a'
-    |   '\uff65'..'\uffbe'
-    |   '\uffc2'..'\uffc7'
-    |   '\uffca'..'\uffcf'
-    |   '\uffd2'..'\uffd7'
-    |   '\uffda'..'\uffdc'
-    |   '\uffe0'..'\uffe1'
-    |   '\uffe5'..'\uffe6'
-    |   ('\ud800'..'\udbff') ('\udc00'..'\udfff') 
-    ;                
-                       
-fragment 
-IdentifierPart
-    :   '\u0000'..'\u0008'
-    |   '\u000e'..'\u001b'
-    |   '\u0024'
-    |   '\u0030'..'\u0039'
-    |   '\u0041'..'\u005a'
-    |   '\u005f'
-    |   '\u0061'..'\u007a'
-    |   '\u007f'..'\u009f'
-    |   '\u00a2'..'\u00a5'
-    |   '\u00aa'
-    |   '\u00ad'
-    |   '\u00b5'
-    |   '\u00ba'
-    |   '\u00c0'..'\u00d6'
-    |   '\u00d8'..'\u00f6'
-    |   '\u00f8'..'\u0236'
-    |   '\u0250'..'\u02c1'
-    |   '\u02c6'..'\u02d1'
-    |   '\u02e0'..'\u02e4'
-    |   '\u02ee'
-    |   '\u0300'..'\u0357'
-    |   '\u035d'..'\u036f'
-    |   '\u037a'
-    |   '\u0386'
-    |   '\u0388'..'\u038a'
-    |   '\u038c'
-    |   '\u038e'..'\u03a1'
-    |   '\u03a3'..'\u03ce'
-    |   '\u03d0'..'\u03f5'
-    |   '\u03f7'..'\u03fb'
-    |   '\u0400'..'\u0481'
-    |   '\u0483'..'\u0486'
-    |   '\u048a'..'\u04ce'
-    |   '\u04d0'..'\u04f5'
-    |   '\u04f8'..'\u04f9'
-    |   '\u0500'..'\u050f'
-    |   '\u0531'..'\u0556'
-    |   '\u0559'
-    |   '\u0561'..'\u0587'
-    |   '\u0591'..'\u05a1'
-    |   '\u05a3'..'\u05b9'
-    |   '\u05bb'..'\u05bd'
-    |   '\u05bf'
-    |   '\u05c1'..'\u05c2'
-    |   '\u05c4'
-    |   '\u05d0'..'\u05ea'
-    |   '\u05f0'..'\u05f2'
-    |   '\u0600'..'\u0603'
-    |   '\u0610'..'\u0615'
-    |   '\u0621'..'\u063a'
-    |   '\u0640'..'\u0658'
-    |   '\u0660'..'\u0669'
-    |   '\u066e'..'\u06d3'
-    |   '\u06d5'..'\u06dd'
-    |   '\u06df'..'\u06e8'
-    |   '\u06ea'..'\u06fc'
-    |   '\u06ff'
-    |   '\u070f'..'\u074a'
-    |   '\u074d'..'\u074f'
-    |   '\u0780'..'\u07b1'
-    |   '\u0901'..'\u0939'
-    |   '\u093c'..'\u094d'
-    |   '\u0950'..'\u0954'
-    |   '\u0958'..'\u0963'
-    |   '\u0966'..'\u096f'
-    |   '\u0981'..'\u0983'
-    |   '\u0985'..'\u098c'
-    |   '\u098f'..'\u0990'
-    |   '\u0993'..'\u09a8'
-    |   '\u09aa'..'\u09b0'
-    |   '\u09b2'
-    |   '\u09b6'..'\u09b9'
-    |   '\u09bc'..'\u09c4'
-    |   '\u09c7'..'\u09c8'
-    |   '\u09cb'..'\u09cd'
-    |   '\u09d7'
-    |   '\u09dc'..'\u09dd'
-    |   '\u09df'..'\u09e3'
-    |   '\u09e6'..'\u09f3'
-    |   '\u0a01'..'\u0a03'
-    |   '\u0a05'..'\u0a0a'
-    |   '\u0a0f'..'\u0a10'
-    |   '\u0a13'..'\u0a28'
-    |   '\u0a2a'..'\u0a30'
-    |   '\u0a32'..'\u0a33'
-    |   '\u0a35'..'\u0a36'
-    |   '\u0a38'..'\u0a39'
-    |   '\u0a3c'
-    |   '\u0a3e'..'\u0a42'
-    |   '\u0a47'..'\u0a48'
-    |   '\u0a4b'..'\u0a4d'
-    |   '\u0a59'..'\u0a5c'
-    |   '\u0a5e'
-    |   '\u0a66'..'\u0a74'
-    |   '\u0a81'..'\u0a83'
-    |   '\u0a85'..'\u0a8d'
-    |   '\u0a8f'..'\u0a91'
-    |   '\u0a93'..'\u0aa8'
-    |   '\u0aaa'..'\u0ab0'
-    |   '\u0ab2'..'\u0ab3'
-    |   '\u0ab5'..'\u0ab9'
-    |   '\u0abc'..'\u0ac5'
-    |   '\u0ac7'..'\u0ac9'
-    |   '\u0acb'..'\u0acd'
-    |   '\u0ad0'
-    |   '\u0ae0'..'\u0ae3'
-    |   '\u0ae6'..'\u0aef'
-    |   '\u0af1'
-    |   '\u0b01'..'\u0b03'
-    |   '\u0b05'..'\u0b0c'        
-    |   '\u0b0f'..'\u0b10'
-    |   '\u0b13'..'\u0b28'
-    |   '\u0b2a'..'\u0b30'
-    |   '\u0b32'..'\u0b33'
-    |   '\u0b35'..'\u0b39'
-    |   '\u0b3c'..'\u0b43'
-    |   '\u0b47'..'\u0b48'
-    |   '\u0b4b'..'\u0b4d'
-    |   '\u0b56'..'\u0b57'
-    |   '\u0b5c'..'\u0b5d'
-    |   '\u0b5f'..'\u0b61'
-    |   '\u0b66'..'\u0b6f'
-    |   '\u0b71'
-    |   '\u0b82'..'\u0b83'
-    |   '\u0b85'..'\u0b8a'
-    |   '\u0b8e'..'\u0b90'
-    |   '\u0b92'..'\u0b95'
-    |   '\u0b99'..'\u0b9a'
-    |   '\u0b9c'
-    |   '\u0b9e'..'\u0b9f'
-    |   '\u0ba3'..'\u0ba4'
-    |   '\u0ba8'..'\u0baa'
-    |   '\u0bae'..'\u0bb5'
-    |   '\u0bb7'..'\u0bb9'
-    |   '\u0bbe'..'\u0bc2'
-    |   '\u0bc6'..'\u0bc8'
-    |   '\u0bca'..'\u0bcd'
-    |   '\u0bd7'
-    |   '\u0be7'..'\u0bef'
-    |   '\u0bf9'
-    |   '\u0c01'..'\u0c03'
-    |   '\u0c05'..'\u0c0c'
-    |   '\u0c0e'..'\u0c10'
-    |   '\u0c12'..'\u0c28'
-    |   '\u0c2a'..'\u0c33'
-    |   '\u0c35'..'\u0c39'
-    |   '\u0c3e'..'\u0c44'
-    |   '\u0c46'..'\u0c48'
-    |   '\u0c4a'..'\u0c4d'
-    |   '\u0c55'..'\u0c56'
-    |   '\u0c60'..'\u0c61'
-    |   '\u0c66'..'\u0c6f'        
-    |   '\u0c82'..'\u0c83'
-    |   '\u0c85'..'\u0c8c'
-    |   '\u0c8e'..'\u0c90'
-    |   '\u0c92'..'\u0ca8'
-    |   '\u0caa'..'\u0cb3'
-    |   '\u0cb5'..'\u0cb9'
-    |   '\u0cbc'..'\u0cc4'
-    |   '\u0cc6'..'\u0cc8'
-    |   '\u0cca'..'\u0ccd'
-    |   '\u0cd5'..'\u0cd6'
-    |   '\u0cde'
-    |   '\u0ce0'..'\u0ce1'
-    |   '\u0ce6'..'\u0cef'
-    |   '\u0d02'..'\u0d03'
-    |   '\u0d05'..'\u0d0c'
-    |   '\u0d0e'..'\u0d10'
-    |   '\u0d12'..'\u0d28'
-    |   '\u0d2a'..'\u0d39'
-    |   '\u0d3e'..'\u0d43'
-    |   '\u0d46'..'\u0d48'
-    |   '\u0d4a'..'\u0d4d'
-    |   '\u0d57'
-    |   '\u0d60'..'\u0d61'
-    |   '\u0d66'..'\u0d6f'
-    |   '\u0d82'..'\u0d83'
-    |   '\u0d85'..'\u0d96'
-    |   '\u0d9a'..'\u0db1'
-    |   '\u0db3'..'\u0dbb'
-    |   '\u0dbd'
-    |   '\u0dc0'..'\u0dc6'
-    |   '\u0dca'
-    |   '\u0dcf'..'\u0dd4'
-    |   '\u0dd6'
-    |   '\u0dd8'..'\u0ddf'
-    |   '\u0df2'..'\u0df3'
-    |   '\u0e01'..'\u0e3a'
-    |   '\u0e3f'..'\u0e4e'
-    |   '\u0e50'..'\u0e59'
-    |   '\u0e81'..'\u0e82'
-    |   '\u0e84'
-    |   '\u0e87'..'\u0e88'        
-    |   '\u0e8a'
-    |   '\u0e8d'
-    |   '\u0e94'..'\u0e97'
-    |   '\u0e99'..'\u0e9f'
-    |   '\u0ea1'..'\u0ea3'
-    |   '\u0ea5'
-    |   '\u0ea7'
-    |   '\u0eaa'..'\u0eab'
-    |   '\u0ead'..'\u0eb9'
-    |   '\u0ebb'..'\u0ebd'
-    |   '\u0ec0'..'\u0ec4'
-    |   '\u0ec6'
-    |   '\u0ec8'..'\u0ecd'
-    |   '\u0ed0'..'\u0ed9'
-    |   '\u0edc'..'\u0edd'
-    |   '\u0f00'
-    |   '\u0f18'..'\u0f19'
-    |   '\u0f20'..'\u0f29'
-    |   '\u0f35'
-    |   '\u0f37'
-    |   '\u0f39'
-    |   '\u0f3e'..'\u0f47'
-    |   '\u0f49'..'\u0f6a'
-    |   '\u0f71'..'\u0f84'
-    |   '\u0f86'..'\u0f8b'
-    |   '\u0f90'..'\u0f97'
-    |   '\u0f99'..'\u0fbc'
-    |   '\u0fc6'
-    |   '\u1000'..'\u1021'
-    |   '\u1023'..'\u1027'
-    |   '\u1029'..'\u102a'
-    |   '\u102c'..'\u1032'
-    |   '\u1036'..'\u1039'
-    |   '\u1040'..'\u1049'
-    |   '\u1050'..'\u1059'
-    |   '\u10a0'..'\u10c5'
-    |   '\u10d0'..'\u10f8'
-    |   '\u1100'..'\u1159'
-    |   '\u115f'..'\u11a2'
-    |   '\u11a8'..'\u11f9'
-    |   '\u1200'..'\u1206'        
-    |   '\u1208'..'\u1246'
-    |   '\u1248'
-    |   '\u124a'..'\u124d'
-    |   '\u1250'..'\u1256'
-    |   '\u1258'
-    |   '\u125a'..'\u125d'
-    |   '\u1260'..'\u1286'
-    |   '\u1288'        
-    |   '\u128a'..'\u128d'
-    |   '\u1290'..'\u12ae'
-    |   '\u12b0'
-    |   '\u12b2'..'\u12b5'
-    |   '\u12b8'..'\u12be'
-    |   '\u12c0'
-    |   '\u12c2'..'\u12c5'
-    |   '\u12c8'..'\u12ce'
-    |   '\u12d0'..'\u12d6'
-    |   '\u12d8'..'\u12ee'
-    |   '\u12f0'..'\u130e'
-    |   '\u1310'
-    |   '\u1312'..'\u1315'
-    |   '\u1318'..'\u131e'
-    |   '\u1320'..'\u1346'
-    |   '\u1348'..'\u135a'
-    |   '\u1369'..'\u1371'
-    |   '\u13a0'..'\u13f4'
-    |   '\u1401'..'\u166c'
-    |   '\u166f'..'\u1676'
-    |   '\u1681'..'\u169a'
-    |   '\u16a0'..'\u16ea'
-    |   '\u16ee'..'\u16f0'
-    |   '\u1700'..'\u170c'
-    |   '\u170e'..'\u1714'
-    |   '\u1720'..'\u1734'
-    |   '\u1740'..'\u1753'
-    |   '\u1760'..'\u176c'
-    |   '\u176e'..'\u1770'
-    |   '\u1772'..'\u1773'
-    |   '\u1780'..'\u17d3'
-    |   '\u17d7'
-    |   '\u17db'..'\u17dd'
-    |   '\u17e0'..'\u17e9'
-    |   '\u180b'..'\u180d'
-    |   '\u1810'..'\u1819'
-    |   '\u1820'..'\u1877'
-    |   '\u1880'..'\u18a9'
-    |   '\u1900'..'\u191c'
-    |   '\u1920'..'\u192b'
-    |   '\u1930'..'\u193b'
-    |   '\u1946'..'\u196d'
-    |   '\u1970'..'\u1974'
-    |   '\u1d00'..'\u1d6b'
-    |   '\u1e00'..'\u1e9b'
-    |   '\u1ea0'..'\u1ef9'
-    |   '\u1f00'..'\u1f15'
-    |   '\u1f18'..'\u1f1d'
-    |   '\u1f20'..'\u1f45'
-    |   '\u1f48'..'\u1f4d'
-    |   '\u1f50'..'\u1f57'
-    |   '\u1f59'
-    |   '\u1f5b'
-    |   '\u1f5d'
-    |   '\u1f5f'..'\u1f7d'
-    |   '\u1f80'..'\u1fb4'
-    |   '\u1fb6'..'\u1fbc'        
-    |   '\u1fbe'
-    |   '\u1fc2'..'\u1fc4'
-    |   '\u1fc6'..'\u1fcc'
-    |   '\u1fd0'..'\u1fd3'
-    |   '\u1fd6'..'\u1fdb'
-    |   '\u1fe0'..'\u1fec'
-    |   '\u1ff2'..'\u1ff4'
-    |   '\u1ff6'..'\u1ffc'
-    |   '\u200c'..'\u200f'
-    |   '\u202a'..'\u202e'
-    |   '\u203f'..'\u2040'
-    |   '\u2054'
-    |   '\u2060'..'\u2063'
-    |   '\u206a'..'\u206f'
-    |   '\u2071'
-    |   '\u207f'
-    |   '\u20a0'..'\u20b1'
-    |   '\u20d0'..'\u20dc'
-    |   '\u20e1'
-    |   '\u20e5'..'\u20ea'
-    |   '\u2102'
-    |   '\u2107'
-    |   '\u210a'..'\u2113'
-    |   '\u2115'
-    |   '\u2119'..'\u211d'
-    |   '\u2124'
-    |   '\u2126'
-    |   '\u2128'
-    |   '\u212a'..'\u212d'
-    |   '\u212f'..'\u2131'
-    |   '\u2133'..'\u2139'
-    |   '\u213d'..'\u213f'
-    |   '\u2145'..'\u2149'
-    |   '\u2160'..'\u2183'
-    |   '\u3005'..'\u3007'
-    |   '\u3021'..'\u302f'        
-    |   '\u3031'..'\u3035'
-    |   '\u3038'..'\u303c'
-    |   '\u3041'..'\u3096'
-    |   '\u3099'..'\u309a'
-    |   '\u309d'..'\u309f'
-    |   '\u30a1'..'\u30ff'
-    |   '\u3105'..'\u312c'
-    |   '\u3131'..'\u318e'
-    |   '\u31a0'..'\u31b7'
-    |   '\u31f0'..'\u31ff'
-    |   '\u3400'..'\u4db5'
-    |   '\u4e00'..'\u9fa5'
-    |   '\ua000'..'\ua48c'
-    |   '\uac00'..'\ud7a3'
-    |   '\uf900'..'\ufa2d'
-    |   '\ufa30'..'\ufa6a'
-    |   '\ufb00'..'\ufb06'
-    |   '\ufb13'..'\ufb17'
-    |   '\ufb1d'..'\ufb28'
-    |   '\ufb2a'..'\ufb36'
-    |   '\ufb38'..'\ufb3c'
-    |   '\ufb3e'
-    |   '\ufb40'..'\ufb41'
-    |   '\ufb43'..'\ufb44'
-    |   '\ufb46'..'\ufbb1'
-    |   '\ufbd3'..'\ufd3d'
-    |   '\ufd50'..'\ufd8f'
-    |   '\ufd92'..'\ufdc7'
-    |   '\ufdf0'..'\ufdfc'
-    |   '\ufe00'..'\ufe0f'
-    |   '\ufe20'..'\ufe23'
-    |   '\ufe33'..'\ufe34'
-    |   '\ufe4d'..'\ufe4f'
-    |   '\ufe69'
-    |   '\ufe70'..'\ufe74'
-    |   '\ufe76'..'\ufefc'
-    |   '\ufeff'
-    |   '\uff04'
-    |   '\uff10'..'\uff19'
-    |   '\uff21'..'\uff3a'
-    |   '\uff3f'
-    |   '\uff41'..'\uff5a'
-    |   '\uff65'..'\uffbe'
-    |   '\uffc2'..'\uffc7'
-    |   '\uffca'..'\uffcf'
-    |   '\uffd2'..'\uffd7'
-    |   '\uffda'..'\uffdc'
-    |   '\uffe0'..'\uffe1'
-    |   '\uffe5'..'\uffe6'
-    |   '\ufff9'..'\ufffb' 
-    |   ('\ud800'..'\udbff') ('\udc00'..'\udfff')
-    ;
-
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java
new file mode 100644
index 0000000..dbe5450
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java
@@ -0,0 +1,20 @@
+package org.apache.tiles.autotag.core;
+
+public class AutotagRuntimeException extends RuntimeException {
+
+    public AutotagRuntimeException() {
+    }
+
+    public AutotagRuntimeException(String message) {
+        super(message);
+    }
+
+    public AutotagRuntimeException(Throwable cause) {
+        super(cause);
+    }
+
+    public AutotagRuntimeException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java
new file mode 100644
index 0000000..10a940b
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java
@@ -0,0 +1,20 @@
+package org.apache.tiles.autotag.core;
+
+public class ClassParseException extends AutotagRuntimeException {
+
+    public ClassParseException() {
+    }
+
+    public ClassParseException(String message) {
+        super(message);
+    }
+
+    public ClassParseException(Throwable cause) {
+        super(cause);
+    }
+
+    public ClassParseException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java
new file mode 100644
index 0000000..184ddd4
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactory.java
@@ -0,0 +1,135 @@
+package org.apache.tiles.autotag.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tiles.autotag.model.TemplateClass;
+import org.apache.tiles.autotag.model.TemplateMethod;
+import org.apache.tiles.autotag.model.TemplateParameter;
+import org.apache.tiles.autotag.model.TemplateSuite;
+import org.apache.tiles.autotag.model.TemplateSuiteFactory;
+import org.apache.tiles.request.Request;
+
+import com.thoughtworks.qdox.JavaDocBuilder;
+import com.thoughtworks.qdox.model.DocletTag;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaMethod;
+import com.thoughtworks.qdox.model.JavaParameter;
+import com.thoughtworks.qdox.model.Type;
+
+public class QDoxTemplateSuiteFactory implements TemplateSuiteFactory {
+
+    private JavaDocBuilder builder;
+
+    private String suiteName;
+
+    private String suiteDocumentation;
+
+    public QDoxTemplateSuiteFactory(File...sourceFiles) {
+        builder = new JavaDocBuilder();
+        try {
+            for (File file : sourceFiles) {
+                builder.addSource(file);
+            }
+        } catch (IOException e) {
+            throw new ClassParseException("I/O Exception when adding source files", e);
+        }
+    }
+
+    public QDoxTemplateSuiteFactory(URL... urls) {
+        builder = new JavaDocBuilder();
+        try {
+            for (URL url: urls) {
+                builder.addSource(url);
+            }
+        } catch (IOException e) {
+            throw new ClassParseException("I/O Exception when adding source files", e);
+        }
+    }
+
+    public void setSuiteName(String suiteName) {
+        this.suiteName = suiteName;
+    }
+
+    public void setSuiteDocumentation(String suiteDocumentation) {
+        this.suiteDocumentation = suiteDocumentation;
+    }
+
+    @Override
+    public TemplateSuite createTemplateSuite() {
+        List<TemplateClass> classes = new ArrayList<TemplateClass>();
+        for (JavaClass clazz : builder.getClasses()) {
+            TemplateMethod startMethod = null;
+            TemplateMethod endMethod = null;
+            TemplateMethod executeMethod = null;
+            for (JavaMethod method : clazz.getMethods()) {
+                if (isFeasible(method)) {
+                    if ("start".equals(method.getName())) {
+                        TemplateMethod templateMethod = createMethod(method);
+                        startMethod = templateMethod;
+                    } else if ("end".equals(method.getName())) {
+                        endMethod = createMethod(method);
+                    } else if ("execute".equals(method.getName())) {
+                        executeMethod = createMethod(method);
+                    }
+                }
+            }
+            if ((startMethod != null && endMethod != null)
+                    || executeMethod != null) {
+                TemplateClass templateClass = new TemplateClass(
+                        clazz.getFullyQualifiedName(), startMethod, endMethod, executeMethod);
+                templateClass.setDocumentation(clazz.getComment());
+                classes.add(templateClass);
+            }
+        }
+        return new TemplateSuite(suiteName, suiteDocumentation, classes);
+    }
+
+    private TemplateMethod createMethod(JavaMethod method) {
+        List<TemplateParameter> params = new ArrayList<TemplateParameter>();
+        for (JavaParameter parameter : method.getParameters()) {
+            TemplateParameter templateParameter = new TemplateParameter(
+                    parameter.getName(), parameter.getType()
+                            .getFullyQualifiedName(), false, false);
+            params.add(templateParameter);
+        }
+        TemplateMethod templateMethod = new TemplateMethod(method.getName(),
+                params);
+        templateMethod.setDocumentation(method.getComment());
+        DocletTag[] tags = method.getTagsByName("param");
+        for (DocletTag tag : tags) {
+            String[] tagParams = tag.getParameters();
+            if (tagParams.length > 0) {
+                TemplateParameter templateParameter = templateMethod
+                        .getParameterByName(tagParams[0]);
+                if (templateParameter != null) {
+                    String tagValue = tag.getValue();
+                    int pos = tagValue.indexOf(" ");
+                    templateParameter.setDocumentation(tagValue.substring(pos)
+                            .trim());
+                }
+            }
+        }
+        return templateMethod;
+    }
+
+    private boolean isFeasible(JavaMethod method) {
+        Type returns = method.getReturns();
+        if (returns != null && "void".equals(returns.getFullyQualifiedName())
+                && method.isPublic() && !method.isStatic()
+                && !method.isAbstract() && !method.isConstructor()) {
+            JavaParameter[] params = method.getParameters();
+            if (params.length > 0) {
+                JavaParameter param = params[params.length - 1];
+                if (Request.class.getName().equals(
+                        param.getType().getFullyQualifiedName())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java
new file mode 100644
index 0000000..7c43cbf
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateClass.java
@@ -0,0 +1,59 @@
+package org.apache.tiles.autotag.model;
+
+public class TemplateClass {
+
+    private String name;
+
+    private String documentation;
+
+    private TemplateMethod startMethod;
+
+    private TemplateMethod endMethod;
+
+    private TemplateMethod executeMethod;
+
+    public TemplateClass(String name) {
+        this(name, null, null, null);
+    }
+
+    public TemplateClass(String name,
+            TemplateMethod startMethod, TemplateMethod endMethod,
+            TemplateMethod executeMethod) {
+        this.name = name;
+        this.startMethod = startMethod;
+        this.endMethod = endMethod;
+        this.executeMethod = executeMethod;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDocumentation() {
+        return documentation;
+    }
+
+    public void setDocumentation(String documentation) {
+        this.documentation = documentation;
+    }
+
+    public TemplateMethod getStartMethod() {
+        return startMethod;
+    }
+
+    public TemplateMethod getEndMethod() {
+        return endMethod;
+    }
+
+    public TemplateMethod getExecuteMethod() {
+        return executeMethod;
+    }
+
+    @Override
+    public String toString() {
+        return "TemplateClass\n[documentation=" + documentation + ",\nendMethod="
+                + endMethod + ",\nexecuteMethod=" + executeMethod + ",\nname="
+                + name + ",\nstartMethod=" + startMethod + "]";
+    }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java
new file mode 100644
index 0000000..aca9e80
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateMethod.java
@@ -0,0 +1,50 @@
+package org.apache.tiles.autotag.model;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class TemplateMethod {
+
+    private String name;
+
+    private String documentation;
+
+    private Map<String, TemplateParameter> parameters;
+
+    public TemplateMethod(String name,
+            Iterable<? extends TemplateParameter> parameters) {
+        this.name = name;
+        this.parameters = new LinkedHashMap<String, TemplateParameter>();
+        for (TemplateParameter parameter : parameters) {
+            this.parameters.put(parameter.getName(), parameter);
+        }
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDocumentation() {
+        return documentation;
+    }
+
+    public void setDocumentation(String documentation) {
+        this.documentation = documentation;
+    }
+
+    public Collection<TemplateParameter> getParameters() {
+        return parameters.values();
+    }
+
+    public TemplateParameter getParameterByName(String name) {
+        return parameters.get(name);
+    }
+
+    @Override
+    public String toString() {
+        return "TemplateMethod\n[documentation=" + documentation + ", name="
+                + name + ", parameters=\n" + parameters + "]";
+    }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java
new file mode 100644
index 0000000..a7dbfd6
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateParameter.java
@@ -0,0 +1,54 @@
+package org.apache.tiles.autotag.model;
+
+public class TemplateParameter {
+
+    private String name;
+
+    private String documentation;
+
+    private String type;
+
+    private boolean required;
+
+    private boolean body;
+
+    public TemplateParameter(String name, String type, boolean required,
+            boolean body) {
+        this.name = name;
+        this.type = type;
+        this.required = required;
+        this.body = body;
+    }
+
+    public String getDocumentation() {
+        return documentation;
+    }
+
+    public void setDocumentation(String documentation) {
+        this.documentation = documentation;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public boolean isRequired() {
+        return required;
+    }
+
+    public boolean isBody() {
+        return body;
+    }
+
+    @Override
+    public String toString() {
+        return "TemplateParameter\n[body=" + body + ",\ndocumentation="
+                + documentation + ",\nname=" + name + ", required=" + required
+                + ", type=" + type + "]";
+    }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java
new file mode 100644
index 0000000..3753e87
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuite.java
@@ -0,0 +1,57 @@
+package org.apache.tiles.autotag.model;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+public class TemplateSuite {
+
+    private String name;
+
+    private String documentation;
+
+    Map<String, TemplateClass> templateClasses;
+
+    public TemplateSuite(String name, String documentation) {
+        this(name, documentation, null);
+    }
+
+    public TemplateSuite(String name, String documentation,
+            Iterable<? extends TemplateClass> classes) {
+        this.name = name;
+        this.documentation = documentation;
+        templateClasses = new LinkedHashMap<String, TemplateClass>();
+        if (classes != null) {
+            for (TemplateClass templateClass : classes) {
+                templateClasses.put(templateClass.getName(), templateClass);
+            }
+        }
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDocumentation() {
+        return documentation;
+    }
+
+    public void addTemplateClass(TemplateClass clazz) {
+        templateClasses.put(clazz.getName(), clazz);
+    }
+
+    public Collection<TemplateClass> getTemplateClasses() {
+        return templateClasses.values();
+    }
+
+    public TemplateClass getTemplateClassByName(String name) {
+        return templateClasses.get(name);
+    }
+
+    @Override
+    public String toString() {
+        return "TemplateSuite\n[documentation=" + documentation + ", name="
+                + name + ", templateClasses=\n" + templateClasses + "]";
+    }
+
+}
diff --git a/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java
new file mode 100644
index 0000000..690c735
--- /dev/null
+++ b/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/model/TemplateSuiteFactory.java
@@ -0,0 +1,7 @@
+package org.apache.tiles.autotag.model;
+
+
+public interface TemplateSuiteFactory {
+
+    TemplateSuite createTemplateSuite();
+}
diff --git a/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactoryTest.java b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactoryTest.java
new file mode 100644
index 0000000..bfced11
--- /dev/null
+++ b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/QDoxTemplateSuiteFactoryTest.java
@@ -0,0 +1,124 @@
+/**
+ *
+ */
+package org.apache.tiles.autotag.core;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tiles.autotag.core.internal.ExampleExecutableTemplate;
+import org.apache.tiles.autotag.core.internal.ExampleTemplate;
+import org.apache.tiles.autotag.core.internal.NotFeasibleExampleTemplate;
+import org.apache.tiles.autotag.model.TemplateClass;
+import org.apache.tiles.autotag.model.TemplateMethod;
+import org.apache.tiles.autotag.model.TemplateParameter;
+import org.apache.tiles.autotag.model.TemplateSuite;
+import org.apache.tiles.request.Request;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests {@link QDoxTemplateSuiteFactory}.
+ *
+ * @version $Rev$ $Date$
+ */
+public class QDoxTemplateSuiteFactoryTest {
+
+    private QDoxTemplateSuiteFactory factory;
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() {
+        factory = new QDoxTemplateSuiteFactory(getClass().getResource("/org/apache/tiles/autotag/core/internal/ExampleTemplate.java"),
+                getClass().getResource("/org/apache/tiles/autotag/core/internal/ExampleExecutableTemplate.java"),
+                getClass().getResource("/org/apache/tiles/autotag/core/internal/NotFeasibleExampleTemplate.java"));
+        factory.setSuiteName("The suite name");
+        factory.setSuiteDocumentation("This are the docs");
+    }
+
+    /**
+     * Test method for {@link org.apache.tiles.autotag.core.DefaultTemplateSuiteFactory#createTemplateSuite()}.
+     */
+    @Test
+    public void testCreateTemplateSuite() {
+        TemplateSuite suite = factory.createTemplateSuite();
+        assertEquals("The suite name", suite.getName());
+        assertEquals("This are the docs", suite.getDocumentation());
+        assertEquals(2, suite.getTemplateClasses().size());
+
+        TemplateClass templateClass = suite.getTemplateClassByName(ExampleTemplate.class.getName());
+        assertNotNull(templateClass);
+        assertEquals(ExampleTemplate.class.getName(), templateClass.getName());
+        assertEquals("Example start/stop template.", templateClass.getDocumentation());
+        assertNull(templateClass.getExecuteMethod());
+        TemplateMethod templateMethod = templateClass.getStartMethod();
+        assertNotNull(templateMethod);
+        assertEquals("start", templateMethod.getName());
+        assertEquals("It starts.", templateMethod.getDocumentation());
+        List<TemplateParameter> parameters = new ArrayList<TemplateParameter>(templateMethod.getParameters());
+        assertEquals(3, parameters.size());
+        TemplateParameter parameter = parameters.get(0);
+        assertEquals("one", parameter.getName());
+        assertEquals("java.lang.String", parameter.getType());
+        assertEquals("Parameter one.", parameter.getDocumentation());
+        parameter = parameters.get(1);
+        assertEquals("two", parameter.getName());
+        assertEquals("int", parameter.getType());
+        assertEquals("Parameter two.", parameter.getDocumentation());
+        parameter = parameters.get(2);
+        assertEquals("request", parameter.getName());
+        assertEquals(Request.class.getName(), parameter.getType());
+        assertEquals("The request.", parameter.getDocumentation());
+
+        templateMethod = templateClass.getEndMethod();
+        assertNotNull(templateMethod);
+        assertEquals("end", templateMethod.getName());
+        assertEquals("It ends.", templateMethod.getDocumentation());
+        parameters = new ArrayList<TemplateParameter>(templateMethod.getParameters());
+        assertEquals(3, parameters.size());
+        parameter = parameters.get(0);
+        assertEquals("three", parameter.getName());
+        assertEquals("java.lang.Double", parameter.getType());
+        assertEquals("Parameter three.", parameter.getDocumentation());
+        parameter = parameters.get(1);
+        assertEquals("four", parameter.getName());
+        assertEquals("long", parameter.getType());
+        assertEquals("Parameter four.", parameter.getDocumentation());
+        parameter = parameters.get(2);
+        assertEquals("request", parameter.getName());
+        assertEquals(Request.class.getName(), parameter.getType());
+        assertEquals("The request.", parameter.getDocumentation());
+
+        templateClass = suite.getTemplateClassByName(ExampleExecutableTemplate.class.getName());
+        assertNotNull(templateClass);
+        assertEquals(ExampleExecutableTemplate.class.getName(), templateClass.getName());
+        assertEquals("Example executable template.", templateClass.getDocumentation());
+        assertNull(templateClass.getStartMethod());
+        assertNull(templateClass.getEndMethod());
+        templateMethod = templateClass.getExecuteMethod();
+        assertNotNull(templateMethod);
+        assertEquals("execute", templateMethod.getName());
+        assertEquals("It executes.", templateMethod.getDocumentation());
+        parameters = new ArrayList<TemplateParameter>(templateMethod.getParameters());
+        assertEquals(3, parameters.size());
+        parameter = parameters.get(0);
+        assertEquals("one", parameter.getName());
+        assertEquals("java.lang.String", parameter.getType());
+        assertEquals("Parameter one.", parameter.getDocumentation());
+        parameter = parameters.get(1);
+        assertEquals("two", parameter.getName());
+        assertEquals("int", parameter.getType());
+        assertEquals("Parameter two.", parameter.getDocumentation());
+        parameter = parameters.get(2);
+        assertEquals("request", parameter.getName());
+        assertEquals(Request.class.getName(), parameter.getType());
+        assertEquals("The request.", parameter.getDocumentation());
+
+        assertNull(suite.getTemplateClassByName(NotFeasibleExampleTemplate.class.getName()));
+    }
+
+}
diff --git a/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleExecutableTemplate.java b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleExecutableTemplate.java
new file mode 100644
index 0000000..45ac04d
--- /dev/null
+++ b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleExecutableTemplate.java
@@ -0,0 +1,22 @@
+package org.apache.tiles.autotag.core.internal;
+
+import org.apache.tiles.request.Request;
+
+/**
+ * Example executable template.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ExampleExecutableTemplate {
+
+    /**
+     * It executes.
+     *
+     * @param one Parameter one.
+     * @param two Parameter two.
+     * @param request The request.
+     */
+    public void execute(String one, int two, Request request) {
+        // Does nothing.
+    }
+}
diff --git a/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleTemplate.java b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleTemplate.java
new file mode 100644
index 0000000..66d9895
--- /dev/null
+++ b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/ExampleTemplate.java
@@ -0,0 +1,33 @@
+package org.apache.tiles.autotag.core.internal;
+
+import org.apache.tiles.request.Request;
+
+/**
+ * Example start/stop template.
+ *
+ * @version $Rev$ $Date$
+ */
+public class ExampleTemplate {
+
+    /**
+     * It starts.
+     *
+     * @param one Parameter one.
+     * @param two Parameter two.
+     * @param request The request.
+     */
+    public void start(String one, int two, Request request) {
+        // Does nothing.
+    }
+
+    /**
+     * It ends.
+     *
+     * @param three Parameter three.
+     * @param four Parameter four.
+     * @param request The request.
+     */
+    public void end(Double three, long four, Request request) {
+        // Does nothing.
+    }
+}
diff --git a/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/NotFeasibleExampleTemplate.java b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/NotFeasibleExampleTemplate.java
new file mode 100644
index 0000000..cfb12a9
--- /dev/null
+++ b/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/core/internal/NotFeasibleExampleTemplate.java
@@ -0,0 +1,18 @@
+package org.apache.tiles.autotag.core.internal;
+
+/**
+ * This won't be registered.
+ *
+ * @version $Rev$ $Date$
+ */
+public class NotFeasibleExampleTemplate {
+
+    /**
+     * It starts.
+     *
+     * @param whatever Doesn't matter.
+     */
+    public void start(String whatever) {
+        // Does nothing.
+    }
+}