]> source.dussan.org Git - vaadin-framework.git/commitdiff
Revert "Theme Parser is deleted, build procedure now generates it (#13161)."
authorLeif Åstrand <leif@vaadin.com>
Thu, 16 Jan 2014 07:03:16 +0000 (07:03 +0000)
committerVaadin Code Review <review@vaadin.com>
Thu, 16 Jan 2014 07:32:07 +0000 (07:32 +0000)
Causes a multitude of compile errors on the build server.

This reverts commit d2874fde4b8c6afa24f0f6535e0d6fcabc489f51.

Change-Id: I49787b347944b614b9e98778b3219b7045cf2bfe

32 files changed:
.gitignore
build/ide.xml
theme-compiler/build.xml
theme-compiler/src/com/vaadin/sass/internal/ScssStylesheet.java
theme-compiler/src/com/vaadin/sass/internal/parser/CharStream.java [new file with mode: 0644]
theme-compiler/src/com/vaadin/sass/internal/parser/Generic_CharStream.java [new file with mode: 0644]
theme-compiler/src/com/vaadin/sass/internal/parser/Generic_CharStream.jj [deleted file]
theme-compiler/src/com/vaadin/sass/internal/parser/LocatorImpl.java
theme-compiler/src/com/vaadin/sass/internal/parser/ParseException.java
theme-compiler/src/com/vaadin/sass/internal/parser/ParseException.jj [deleted file]
theme-compiler/src/com/vaadin/sass/internal/parser/Parser.java
theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj [new file with mode: 0644]
theme-compiler/src/com/vaadin/sass/internal/parser/ParserConstants.java [new file with mode: 0644]
theme-compiler/src/com/vaadin/sass/internal/parser/ParserImpl.jj [deleted file]
theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java [new file with mode: 0644]
theme-compiler/src/com/vaadin/sass/internal/parser/Token.java [new file with mode: 0644]
theme-compiler/src/com/vaadin/sass/internal/parser/TokenMgrError.java [new file with mode: 0644]
theme-compiler/tests/src/com/vaadin/sass/parser/ParserTest.java
theme-compiler/tests/src/com/vaadin/sass/testcases/css/Interpolation.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/Comments.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/CompassImports.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ControlDirectives.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/Extends.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/Functions.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/Imports.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/Mixins.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/NestedProperties.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/Nesting.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentImports.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentSelector.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/VariableGuarded.java
theme-compiler/tests/src/com/vaadin/sass/testcases/scss/Variables.java

index 9b120c7c3a78ffcebf0f8b91ea19571c7d19cb21..30c8597b16f01472d86ce5e4ae45ea91b0f6bb56 100644 (file)
@@ -71,13 +71,3 @@ WebContent/VAADIN/vaadinPush.debug.js
 # build result folders
 */result
 result
-
-# /theme-compiler
-/theme-compiler/result
-/theme-compiler/src/com/vaadin/sass/internal/parser/CharStream.java
-/theme-compiler/src/com/vaadin/sass/internal/parser/ParserImpl.java
-/theme-compiler/src/com/vaadin/sass/internal/parser/ParserImplConstants.java
-/theme-compiler/src/com/vaadin/sass/internal/parser/ParserImplTokenManager.java
-/theme-compiler/src/com/vaadin/sass/internal/parser/Token.java
-/theme-compiler/src/com/vaadin/sass/internal/parser/TokenMgrError.java
-/theme-compiler/src/com/vaadin/sass/internal/parser/ParseException.java
index 51a9d822724a8fded3c1430c08fac04c42eae994..22e6818bea7ded862ac1df78a6020d1a536ed5c9 100755 (executable)
@@ -36,6 +36,7 @@
         <path location="${gwt.dev.super.src}" />
         <path location="${gwt.dev.src}" />
         <path refid="client-compiler.deps" />
+        <path refid="theme-compiler.deps" />
         <path refid="server.deps" />
         <path refid="shared.deps" />
         <path refid="uitest.deps" />
         </antcall>
     </target>
 
-    <target name="compile-theme" depends="generate-theme-compiler">
-        <path id="theme.classpath">
-            <path refid="classpath"/>
-            <path refid="theme-compiler.deps" />
-        </path>
-
+    <target name="compile-theme">
         <java classname="com.vaadin.buildhelpers.CompileTheme" failonerror="yes" fork="yes">
-            <classpath refid="theme.classpath" />
+            <classpath refid="classpath" />
             <jvmarg value="-Djava.awt.headless=true" />
             <arg value="--theme" />
             <arg value="${theme}" />
             </fileset>
         </copy>
     </target>
-    <target name="generate-theme-compiler">
-        <ant antfile="${basedir}/theme-compiler/build.xml" target="parser" dir="${basedir}/theme-compiler" />
-    </target>
 </project>
index 623d2e4ec76168a097ac28bbd28b3e57de35b5c6..03d0531a68dbe1d49bf4b363ca9c37a4e5741969 100644 (file)
@@ -23,7 +23,7 @@
     <!--<property name="classes.exclude" value="com/vaadin/buildhelpers/**" 
         /> -->
 
-    <target name="parser" depends="-check-parser" unless="parser.exists">
+    <target name="parser">
         <!-- Copy javacc-5.0.jar to ${result.dir}/javacc/javacc.jar as the 
             javacc task requires the jar to be named javacc.jar -->
         <property name="javacc.home" location="${result.dir}/javacc" />
         <mkdir dir="${generate.dir}" />
         <!-- Generate new parser files in another directory, this ensure
         they are always generated -->
-        <copy todir="${generate.dir}">
-            <fileset dir="${parser.src.dir}">
-                <exclude name="**/*.java"/>
-            </fileset>
-        </copy>
-        <javacc target="${generate.dir}/ParserImpl.jj" javacchome="${javacc.home}" errorreporting="true"/>
+        <copy file="${parser.src.dir}/Parser.jj" todir="${generate.dir}" />
+        <javacc target="${generate.dir}/Parser.jj" javacchome="${javacc.home}">
+        </javacc>
         <!-- Add headers to the generated files and copy back to src -->
         <antcontrib:foreach target="prepend.generated.file.header" param="path">
             <path>
                 <fileset dir="${generate.dir}" includes="*.java" excludes="ParseException.java" />
             </path>
         </antcontrib:foreach>
-        <copy todir="${parser.src.dir}">
-            <fileset dir="${generate.dir}">
-                <include name="*.jj"/>
-                <exclude name="ParserImpl.jj"/>
-            </fileset>
-            <globmapper from="*.jj" to="*.java"/>
-        </copy>
-    </target>
-
-    <target name="-check-parser">
-        <available file="${parser.src.dir}/ParserImpl.java"  property="parser.exists"/>
     </target>
 
     <target name="prepend.generated.file.header">
index 35400f7d40d35dedd735cd18499a6723c90293af..ed6b98f5ac8e4184926c725a498173ca30b66aaf 100644 (file)
@@ -171,7 +171,7 @@ public class ScssStylesheet extends Node {
             source.setEncoding(parentStylesheet.getCharset());
         }
 
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         parser.setErrorHandler(errorHandler);
         parser.setDocumentHandler(documentHandler);
 
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/CharStream.java b/theme-compiler/src/com/vaadin/sass/internal/parser/CharStream.java
new file mode 100644 (file)
index 0000000..c22f194
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed 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.
+ */
+/* Generated By:JavaCC: Do not edit this line. CharStream.java Version 5.0 */
+/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+package com.vaadin.sass.internal.parser;
+
+/**
+ * This interface describes a character stream that maintains line and
+ * column number positions of the characters.  It also has the capability
+ * to backup the stream to some extent.  An implementation of this
+ * interface is used in the TokenManager implementation generated by
+ * JavaCCParser.
+ *
+ * All the methods except backup can be implemented in any fashion. backup
+ * needs to be implemented correctly for the correct operation of the lexer.
+ * Rest of the methods are all used to get information like line number,
+ * column number and the String that constitutes a token and are not used
+ * by the lexer. Hence their implementation won't affect the generated lexer's
+ * operation.
+ */
+
+public
+interface CharStream {
+
+  /**
+   * Returns the next character from the selected input.  The method
+   * of selecting the input is the responsibility of the class
+   * implementing this interface.  Can throw any java.io.IOException.
+   */
+  char readChar() throws java.io.IOException;
+
+  @Deprecated
+  /**
+   * Returns the column position of the character last read.
+   * @deprecated
+   * @see #getEndColumn
+   */
+  int getColumn();
+
+  @Deprecated
+  /**
+   * Returns the line number of the character last read.
+   * @deprecated
+   * @see #getEndLine
+   */
+  int getLine();
+
+  /**
+   * Returns the column number of the last character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getEndColumn();
+
+  /**
+   * Returns the line number of the last character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getEndLine();
+
+  /**
+   * Returns the column number of the first character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getBeginColumn();
+
+  /**
+   * Returns the line number of the first character for current token (being
+   * matched after the last call to BeginTOken).
+   */
+  int getBeginLine();
+
+  /**
+   * Backs up the input stream by amount steps. Lexer calls this method if it
+   * had already read some characters, but could not use them to match a
+   * (longer) token. So, they will be used again as the prefix of the next
+   * token and it is the implemetation's responsibility to do this right.
+   */
+  void backup(int amount);
+
+  /**
+   * Returns the next character that marks the beginning of the next token.
+   * All characters must remain in the buffer between two successive calls
+   * to this method to implement backup correctly.
+   */
+  char BeginToken() throws java.io.IOException;
+
+  /**
+   * Returns a string made up of characters from the marked token beginning
+   * to the current buffer position. Implementations have the choice of returning
+   * anything that they want to. For example, for efficiency, one might decide
+   * to just return null, which is a valid implementation.
+   */
+  String GetImage();
+
+  /**
+   * Returns an array of characters that make up the suffix of length 'len' for
+   * the currently matched token. This is used to build up the matched string
+   * for use in actions in the case of MORE. A simple and inefficient
+   * implementation of this is as follows :
+   *
+   *   {
+   *      String t = GetImage();
+   *      return t.substring(t.length() - len, t.length()).toCharArray();
+   *   }
+   */
+  char[] GetSuffix(int len);
+
+  /**
+   * The lexer calls this function to indicate that it is done with the stream
+   * and hence implementations can free any resources held by this class.
+   * Again, the body of this function can be just empty and it will not
+   * affect the lexer's operation.
+   */
+  void Done();
+
+}
+/* JavaCC - OriginalChecksum=deb80d024b50bdc8bfaadaf528157233 (do not edit this line) */
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Generic_CharStream.java b/theme-compiler/src/com/vaadin/sass/internal/parser/Generic_CharStream.java
new file mode 100644 (file)
index 0000000..7bc2973
--- /dev/null
@@ -0,0 +1,370 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed 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.
+ */
+/* Generated By:JavaCC: Do not edit this line. Generic_CharStream.java Version 0.7pre6 */
+package com.vaadin.sass.internal.parser;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (without unicode processing).
+ */
+
+public final class Generic_CharStream implements CharStream
+{
+  public static final boolean staticFlag = false;
+  int bufsize;
+  int available;
+  int tokenBegin;
+  public int bufpos = -1;
+  private int bufline[];
+  private int bufcolumn[];
+
+  private int column = 0;
+  private int line = 1;
+
+  private boolean prevCharIsCR = false;
+  private boolean prevCharIsLF = false;
+
+  private java.io.Reader reader;
+
+  private char[] buffer;
+  private int maxNextCharInd = 0;
+  private int inBuf = 0;
+
+  private final void ExpandBuff(boolean wrapAround)
+  {
+     char[] newbuffer = new char[bufsize + 2048];
+     int newbufline[] = new int[bufsize + 2048];
+     int newbufcolumn[] = new int[bufsize + 2048];
+
+     try
+     {
+        if (wrapAround)
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           System.arraycopy(buffer, 0, newbuffer,
+                                             bufsize - tokenBegin, bufpos);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+        }
+        else
+        {
+           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+           buffer = newbuffer;
+
+           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+           bufline = newbufline;
+
+           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+           bufcolumn = newbufcolumn;
+
+           maxNextCharInd = (bufpos -= tokenBegin);
+        }
+     }
+     catch (Throwable t)
+     {
+        throw new Error(t.getMessage());
+     }
+
+
+     bufsize += 2048;
+     available = bufsize;
+     tokenBegin = 0;
+  }
+
+  private final void FillBuff() throws java.io.IOException
+  {
+     if (maxNextCharInd == available)
+     {
+        if (available == bufsize)
+        {
+           if (tokenBegin > 2048)
+           {
+              bufpos = maxNextCharInd = 0;
+              available = tokenBegin;
+           }
+           else if (tokenBegin < 0)
+              bufpos = maxNextCharInd = 0;
+           else
+              ExpandBuff(false);
+        }
+        else if (available > tokenBegin)
+           available = bufsize;
+        else if ((tokenBegin - available) < 2048)
+           ExpandBuff(true);
+        else
+           available = tokenBegin;
+     }
+
+     int i;
+     try {
+        if ((i = reader.read(buffer, maxNextCharInd,
+                                    available - maxNextCharInd)) == -1)
+        {
+           reader.close();
+           throw new java.io.IOException();
+        }
+        else
+           maxNextCharInd += i;
+        return;
+     }
+     catch(java.io.IOException e) {
+        --bufpos;
+        backup(0);
+        if (tokenBegin == -1)
+           tokenBegin = bufpos;
+        throw e;
+     }
+  }
+
+  public final char BeginToken() throws java.io.IOException
+  {
+     tokenBegin = -1;
+     char c = readChar();
+     tokenBegin = bufpos;
+
+     return c;
+  }
+
+  private final void UpdateLineColumn(char c)
+  {
+     column++;
+
+     if (prevCharIsLF)
+     {
+        prevCharIsLF = false;
+        line += (column = 1);
+     }
+     else if (prevCharIsCR)
+     {
+        prevCharIsCR = false;
+        if (c == '\n')
+        {
+           prevCharIsLF = true;
+        }
+        else
+           line += (column = 1);
+     }
+
+     switch (c)
+     {
+        case '\r' :
+           prevCharIsCR = true;
+           break;
+        case '\n' :
+           prevCharIsLF = true;
+           break;
+        case '\t' :
+           column--;
+           column += (8 - (column & 07));
+           break;
+        default :
+           break;
+     }
+
+     bufline[bufpos] = line;
+     bufcolumn[bufpos] = column;
+  }
+
+  public final char readChar() throws java.io.IOException
+  {
+     if (inBuf > 0)
+     {
+        --inBuf;
+        return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]);
+     }
+
+     if (++bufpos >= maxNextCharInd)
+        FillBuff();
+
+     char c = (char)((char)0xff & buffer[bufpos]);
+
+     UpdateLineColumn(c);
+     return (c);
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndColumn
+   */
+
+  public final int getColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  /**
+   * @deprecated 
+   * @see #getEndLine
+   */
+
+  public final int getLine() {
+     return bufline[bufpos];
+  }
+
+  public final int getEndColumn() {
+     return bufcolumn[bufpos];
+  }
+
+  public final int getEndLine() {
+     return bufline[bufpos];
+  }
+
+  public final int getBeginColumn() {
+     return bufcolumn[tokenBegin];
+  }
+
+  public final int getBeginLine() {
+     return bufline[tokenBegin];
+  }
+
+  public final void backup(int amount) {
+
+    inBuf += amount;
+    if ((bufpos -= amount) < 0)
+       bufpos += bufsize;
+  }
+
+  public Generic_CharStream(java.io.Reader dstream, int startline,
+                           int startcolumn, int buffersize)
+  {
+    reader = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    available = bufsize = buffersize;
+    buffer = new char[buffersize];
+    bufline = new int[buffersize];
+    bufcolumn = new int[buffersize];
+  }
+
+  public Generic_CharStream(java.io.Reader dstream, int startline,
+                           int startcolumn)
+  {
+     this(dstream, startline, startcolumn, 4096);
+  }
+  public void ReInit(java.io.Reader dstream, int startline,
+  int startcolumn, int buffersize)
+  {
+    reader = dstream;
+    line = startline;
+    column = startcolumn - 1;
+
+    if (buffer == null || buffersize != buffer.length)
+    {
+      available = bufsize = buffersize;
+      buffer = new char[buffersize];
+      bufline = new int[buffersize];
+      bufcolumn = new int[buffersize];
+    }
+    prevCharIsLF = prevCharIsCR = false;
+    tokenBegin = inBuf = maxNextCharInd = 0;
+    bufpos = -1;
+  }
+
+  public void ReInit(java.io.Reader dstream, int startline,
+                                                           int startcolumn)
+  {
+     ReInit(dstream, startline, startcolumn, 4096);
+  }
+
+  public final String GetImage()
+  {
+     if (bufpos >= tokenBegin)
+        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+     else
+        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+                              new String(buffer, 0, bufpos + 1);
+  }
+
+  public final char[] GetSuffix(int len)
+  {
+     char[] ret = new char[len];
+
+     if ((bufpos + 1) >= len)
+        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+     else
+     {
+        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+                                                          len - bufpos - 1);
+        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+     }
+     return ret;
+  }
+
+  public void Done()
+  {
+     buffer = null;
+     bufline = null;
+     bufcolumn = null;
+  }
+
+  /**
+   * Method to adjust line and column numbers for the start of a token.<BR>
+   */
+  public void adjustBeginLineColumn(int newLine, int newCol)
+  {
+     int start = tokenBegin;
+     int len;
+
+     if (bufpos >= tokenBegin)
+     {
+        len = bufpos - tokenBegin + inBuf + 1;
+     }
+     else
+     {
+        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+     }
+
+     int i = 0, j = 0, k = 0;
+     int nextColDiff = 0, columnDiff = 0;
+
+     while (i < len &&
+            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+     {
+        bufline[j] = newLine;
+        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+        bufcolumn[j] = newCol + columnDiff;
+        columnDiff = nextColDiff;
+        i++;
+     } 
+
+     if (i < len)
+     {
+        bufline[j] = newLine++;
+        bufcolumn[j] = newCol + columnDiff;
+
+        while (i++ < len)
+        {
+           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+              bufline[j] = newLine++;
+           else
+              bufline[j] = newLine;
+        }
+     }
+
+     line = bufline[j];
+     column = bufcolumn[j];
+  }
+
+}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Generic_CharStream.jj b/theme-compiler/src/com/vaadin/sass/internal/parser/Generic_CharStream.jj
deleted file mode 100644 (file)
index 7bc2973..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * Copyright 2000-2013 Vaadin Ltd.
- * 
- * Licensed 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.
- */
-/* Generated By:JavaCC: Do not edit this line. Generic_CharStream.java Version 0.7pre6 */
-package com.vaadin.sass.internal.parser;
-
-/**
- * An implementation of interface CharStream, where the stream is assumed to
- * contain only ASCII characters (without unicode processing).
- */
-
-public final class Generic_CharStream implements CharStream
-{
-  public static final boolean staticFlag = false;
-  int bufsize;
-  int available;
-  int tokenBegin;
-  public int bufpos = -1;
-  private int bufline[];
-  private int bufcolumn[];
-
-  private int column = 0;
-  private int line = 1;
-
-  private boolean prevCharIsCR = false;
-  private boolean prevCharIsLF = false;
-
-  private java.io.Reader reader;
-
-  private char[] buffer;
-  private int maxNextCharInd = 0;
-  private int inBuf = 0;
-
-  private final void ExpandBuff(boolean wrapAround)
-  {
-     char[] newbuffer = new char[bufsize + 2048];
-     int newbufline[] = new int[bufsize + 2048];
-     int newbufcolumn[] = new int[bufsize + 2048];
-
-     try
-     {
-        if (wrapAround)
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           System.arraycopy(buffer, 0, newbuffer,
-                                             bufsize - tokenBegin, bufpos);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-           bufcolumn = newbufcolumn;
-
-           maxNextCharInd = (bufpos += (bufsize - tokenBegin));
-        }
-        else
-        {
-           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-           buffer = newbuffer;
-
-           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-           bufline = newbufline;
-
-           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-           bufcolumn = newbufcolumn;
-
-           maxNextCharInd = (bufpos -= tokenBegin);
-        }
-     }
-     catch (Throwable t)
-     {
-        throw new Error(t.getMessage());
-     }
-
-
-     bufsize += 2048;
-     available = bufsize;
-     tokenBegin = 0;
-  }
-
-  private final void FillBuff() throws java.io.IOException
-  {
-     if (maxNextCharInd == available)
-     {
-        if (available == bufsize)
-        {
-           if (tokenBegin > 2048)
-           {
-              bufpos = maxNextCharInd = 0;
-              available = tokenBegin;
-           }
-           else if (tokenBegin < 0)
-              bufpos = maxNextCharInd = 0;
-           else
-              ExpandBuff(false);
-        }
-        else if (available > tokenBegin)
-           available = bufsize;
-        else if ((tokenBegin - available) < 2048)
-           ExpandBuff(true);
-        else
-           available = tokenBegin;
-     }
-
-     int i;
-     try {
-        if ((i = reader.read(buffer, maxNextCharInd,
-                                    available - maxNextCharInd)) == -1)
-        {
-           reader.close();
-           throw new java.io.IOException();
-        }
-        else
-           maxNextCharInd += i;
-        return;
-     }
-     catch(java.io.IOException e) {
-        --bufpos;
-        backup(0);
-        if (tokenBegin == -1)
-           tokenBegin = bufpos;
-        throw e;
-     }
-  }
-
-  public final char BeginToken() throws java.io.IOException
-  {
-     tokenBegin = -1;
-     char c = readChar();
-     tokenBegin = bufpos;
-
-     return c;
-  }
-
-  private final void UpdateLineColumn(char c)
-  {
-     column++;
-
-     if (prevCharIsLF)
-     {
-        prevCharIsLF = false;
-        line += (column = 1);
-     }
-     else if (prevCharIsCR)
-     {
-        prevCharIsCR = false;
-        if (c == '\n')
-        {
-           prevCharIsLF = true;
-        }
-        else
-           line += (column = 1);
-     }
-
-     switch (c)
-     {
-        case '\r' :
-           prevCharIsCR = true;
-           break;
-        case '\n' :
-           prevCharIsLF = true;
-           break;
-        case '\t' :
-           column--;
-           column += (8 - (column & 07));
-           break;
-        default :
-           break;
-     }
-
-     bufline[bufpos] = line;
-     bufcolumn[bufpos] = column;
-  }
-
-  public final char readChar() throws java.io.IOException
-  {
-     if (inBuf > 0)
-     {
-        --inBuf;
-        return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]);
-     }
-
-     if (++bufpos >= maxNextCharInd)
-        FillBuff();
-
-     char c = (char)((char)0xff & buffer[bufpos]);
-
-     UpdateLineColumn(c);
-     return (c);
-  }
-
-  /**
-   * @deprecated 
-   * @see #getEndColumn
-   */
-
-  public final int getColumn() {
-     return bufcolumn[bufpos];
-  }
-
-  /**
-   * @deprecated 
-   * @see #getEndLine
-   */
-
-  public final int getLine() {
-     return bufline[bufpos];
-  }
-
-  public final int getEndColumn() {
-     return bufcolumn[bufpos];
-  }
-
-  public final int getEndLine() {
-     return bufline[bufpos];
-  }
-
-  public final int getBeginColumn() {
-     return bufcolumn[tokenBegin];
-  }
-
-  public final int getBeginLine() {
-     return bufline[tokenBegin];
-  }
-
-  public final void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-       bufpos += bufsize;
-  }
-
-  public Generic_CharStream(java.io.Reader dstream, int startline,
-                           int startcolumn, int buffersize)
-  {
-    reader = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-  }
-
-  public Generic_CharStream(java.io.Reader dstream, int startline,
-                           int startcolumn)
-  {
-     this(dstream, startline, startcolumn, 4096);
-  }
-  public void ReInit(java.io.Reader dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    reader = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if (buffer == null || buffersize != buffer.length)
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-    }
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    bufpos = -1;
-  }
-
-  public void ReInit(java.io.Reader dstream, int startline,
-                                                           int startcolumn)
-  {
-     ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-  public final String GetImage()
-  {
-     if (bufpos >= tokenBegin)
-        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-     else
-        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                              new String(buffer, 0, bufpos + 1);
-  }
-
-  public final char[] GetSuffix(int len)
-  {
-     char[] ret = new char[len];
-
-     if ((bufpos + 1) >= len)
-        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-     else
-     {
-        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                          len - bufpos - 1);
-        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-     }
-     return ret;
-  }
-
-  public void Done()
-  {
-     buffer = null;
-     bufline = null;
-     bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.<BR>
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-     int start = tokenBegin;
-     int len;
-
-     if (bufpos >= tokenBegin)
-     {
-        len = bufpos - tokenBegin + inBuf + 1;
-     }
-     else
-     {
-        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-     }
-
-     int i = 0, j = 0, k = 0;
-     int nextColDiff = 0, columnDiff = 0;
-
-     while (i < len &&
-            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-     {
-        bufline[j] = newLine;
-        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-        bufcolumn[j] = newCol + columnDiff;
-        columnDiff = nextColDiff;
-        i++;
-     } 
-
-     if (i < len)
-     {
-        bufline[j] = newLine++;
-        bufcolumn[j] = newCol + columnDiff;
-
-        while (i++ < len)
-        {
-           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-              bufline[j] = newLine++;
-           else
-              bufline[j] = newLine;
-        }
-     }
-
-     line = bufline[j];
-     column = bufcolumn[j];
-  }
-
-}
index 825b65fa241a4ed61dd1a194026f68e3697b306b..ac244a95824eb1be805784ad664a1bfb0e65ca54 100644 (file)
@@ -51,34 +51,82 @@ public class LocatorImpl implements Locator {
     int line;
     int column;
 
-    @Override
     public String getURI() {
         return uri;
     }
 
-    @Override
     public int getLineNumber() {
         return line;
     }
 
-    @Override
     public int getColumnNumber() {
         return column;
     }
 
     /**
-     * Creates a LocatorImpl
+     * Creates a new LocatorImpl
+     */
+    public LocatorImpl(Parser p) {
+        if (W3CDebug) {
+            System.err.println("LocatorImpl::newLocator(" + p + ");");
+        }
+        uri = p.source.getURI();
+        line = p.token.beginLine;
+        column = p.token.beginColumn;
+    }
+
+    /**
+     * Reinitializes a LocatorImpl
+     */
+    public LocatorImpl(Parser p, Token tok) {
+        if (W3CDebug) {
+            System.err.println("LocatorImpl::newLocator(" + p + ", " + tok
+                    + ");");
+        }
+        uri = p.source.getURI();
+        line = tok.beginLine;
+        column = tok.beginColumn;
+    }
+
+    /**
+     * Reinitializes a LocatorImpl
      */
     public LocatorImpl(Parser p, int line, int column) {
         if (W3CDebug) {
             System.err.println("LocatorImpl::newLocator(" + p + ", " + line
                     + ", " + column + ");");
         }
-        uri = p.getInputSource().getURI();
+        uri = p.source.getURI();
         this.line = line;
         this.column = column;
     }
 
+    /**
+     * Reinitializes a LocatorImpl
+     */
+    public LocatorImpl reInit(Parser p) {
+        if (W3CDebug) {
+            System.err.println("LocatorImpl::reInit(" + p + ");");
+        }
+        uri = p.source.getURI();
+        line = p.token.beginLine;
+        column = p.token.beginColumn;
+        return this;
+    }
+
+    /**
+     * Reinitializes a LocatorImpl
+     */
+    public LocatorImpl reInit(Parser p, Token tok) {
+        if (W3CDebug) {
+            System.err.println("LocatorImpl::reInit(" + p + ", " + tok + ");");
+        }
+        uri = p.source.getURI();
+        line = tok.beginLine;
+        column = tok.beginColumn;
+        return this;
+    }
+
     /**
      * Reinitializes a LocatorImpl
      */
@@ -87,7 +135,7 @@ public class LocatorImpl implements Locator {
             System.err.println("LocatorImpl::reInit(" + p + ", " + line + ", "
                     + column + ");");
         }
-        uri = p.getInputSource().getURI();
+        uri = p.source.getURI();
         this.line = line;
         this.column = column;
         return this;
index d84decb771f0b35c6943258c84b40de63ba87645..392d71e767990b72016a53d3653e137b34480e48 100644 (file)
@@ -19,17 +19,185 @@ package com.vaadin.sass.internal.parser;
 import org.w3c.css.sac.CSSException;
 
 /**
- * Do not modify this file. It will be regenerated by the build procedure. Edit
- * ParseException.jj file instead. The reason of this file presence here: avoid
- * compilation errors if build procedure hasn't been yet executed.
+ * This exception is thrown when parse errors are encountered. You can
+ * explicitly create objects of this exception type by calling the method
+ * generateParseException in the generated parser.
+ * 
+ * You can modify this class to customize your error reporting mechanisms so
+ * long as you retain the public fields.
  */
 public class ParseException extends CSSException {
+    private static final long serialVersionUID = -8556588037264585977L;
+
+    /**
+     * This constructor is used by the method "generateParseException" in the
+     * generated parser. Calling this constructor generates a new object of this
+     * type with the fields "currentToken", "expectedTokenSequences", and
+     * "tokenImage" set. The boolean flag "specialConstructor" is also set to
+     * true to indicate that this constructor was used to create this object.
+     * This constructor calls its super class with the empty string to force the
+     * "toString" method of parent class "Throwable" to print the error message
+     * in the form: ParseException: <result of getMessage>
+     */
+    public ParseException(Token currentTokenVal,
+            int[][] expectedTokenSequencesVal, String[] tokenImageVal) {
+        super("");
+        specialConstructor = true;
+        currentToken = currentTokenVal;
+        expectedTokenSequences = expectedTokenSequencesVal;
+        tokenImage = tokenImageVal;
+    }
+
+    /**
+     * The following constructors are for use by you for whatever purpose you
+     * can think of. Constructing the exception in this manner makes the
+     * exception behave in the normal way - i.e., as documented in the class
+     * "Throwable". The fields "errorToken", "expectedTokenSequences", and
+     * "tokenImage" do not contain relevant information. The JavaCC generated
+     * code does not use these constructors.
+     */
 
     public ParseException() {
         super();
+        specialConstructor = false;
     }
 
     public ParseException(String message) {
         super(message);
+        specialConstructor = false;
+    }
+
+    /**
+     * This variable determines which constructor was used to create this object
+     * and thereby affects the semantics of the "getMessage" method (see below).
+     */
+    protected boolean specialConstructor;
+
+    /**
+     * This is the last token that has been consumed successfully. If this
+     * object has been created due to a parse error, the token followng this
+     * token will (therefore) be the first error token.
+     */
+    public Token currentToken;
+
+    /**
+     * Each entry in this array is an array of integers. Each array of integers
+     * represents a sequence of tokens (by their ordinal values) that is
+     * expected at this point of the parse.
+     */
+    public int[][] expectedTokenSequences;
+
+    /**
+     * This is a reference to the "tokenImage" array of the generated parser
+     * within which the parse error occurred. This array is defined in the
+     * generated ...Constants interface.
+     */
+    public String[] tokenImage;
+
+    /**
+     * This method has the standard behavior when this object has been created
+     * using the standard constructors. Otherwise, it uses "currentToken" and
+     * "expectedTokenSequences" to generate a parse error message and returns
+     * it. If this object has been created due to a parse error, and you do not
+     * catch it (it gets thrown from the parser), then this method is called
+     * during the printing of the final stack trace, and hence the correct error
+     * message gets displayed.
+     */
+    @Override
+    public String getMessage() {
+        if (!specialConstructor) {
+            return super.getMessage();
+        }
+        String expected = "";
+        int maxSize = 0;
+        for (int i = 0; i < expectedTokenSequences.length; i++) {
+            if (maxSize < expectedTokenSequences[i].length) {
+                maxSize = expectedTokenSequences[i].length;
+            }
+            for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+                expected += tokenImage[expectedTokenSequences[i][j]] + " ";
+            }
+            if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+                expected += "...";
+            }
+            expected += eol + "    ";
+        }
+        String retval = "Encountered \"";
+        Token tok = currentToken.next;
+        for (int i = 0; i < maxSize; i++) {
+            if (i != 0) {
+                retval += " ";
+            }
+            if (tok.kind == 0) {
+                retval += tokenImage[0];
+                break;
+            }
+            retval += add_escapes(tok.image);
+            tok = tok.next;
+        }
+        retval += "\" at line " + currentToken.next.beginLine + ", column "
+                + currentToken.next.beginColumn + "." + eol;
+        if (expectedTokenSequences.length == 1) {
+            retval += "Was expecting:" + eol + "    ";
+        } else {
+            retval += "Was expecting one of:" + eol + "    ";
+        }
+        retval += expected;
+        return retval;
     }
+
+    /**
+     * The end of line string for this machine.
+     */
+    protected String eol = System.getProperty("line.separator", "\n");
+
+    /**
+     * Used to convert raw characters to their escaped version when these raw
+     * version cannot be used as part of an ASCII string literal.
+     */
+    protected String add_escapes(String str) {
+        StringBuffer retval = new StringBuffer();
+        char ch;
+        for (int i = 0; i < str.length(); i++) {
+            switch (str.charAt(i)) {
+            case 0:
+                continue;
+            case '\b':
+                retval.append("\\b");
+                continue;
+            case '\t':
+                retval.append("\\t");
+                continue;
+            case '\n':
+                retval.append("\\n");
+                continue;
+            case '\f':
+                retval.append("\\f");
+                continue;
+            case '\r':
+                retval.append("\\r");
+                continue;
+            case '\"':
+                retval.append("\\\"");
+                continue;
+            case '\'':
+                retval.append("\\\'");
+                continue;
+            case '\\':
+                retval.append("\\\\");
+                continue;
+            default:
+                if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                    String s = "0000" + Integer.toString(ch, 16);
+                    retval.append("\\u"
+                            + s.substring(s.length() - 4, s.length()));
+                } else {
+                    retval.append(ch);
+                }
+                continue;
+            }
+        }
+        return retval.toString();
+    }
+
 }
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/ParseException.jj b/theme-compiler/src/com/vaadin/sass/internal/parser/ParseException.jj
deleted file mode 100644 (file)
index 392d71e..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright 2000-2013 Vaadin Ltd.
- * 
- * Licensed 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.
- */
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */
-package com.vaadin.sass.internal.parser;
-
-import org.w3c.css.sac.CSSException;
-
-/**
- * This exception is thrown when parse errors are encountered. You can
- * explicitly create objects of this exception type by calling the method
- * generateParseException in the generated parser.
- * 
- * You can modify this class to customize your error reporting mechanisms so
- * long as you retain the public fields.
- */
-public class ParseException extends CSSException {
-    private static final long serialVersionUID = -8556588037264585977L;
-
-    /**
-     * This constructor is used by the method "generateParseException" in the
-     * generated parser. Calling this constructor generates a new object of this
-     * type with the fields "currentToken", "expectedTokenSequences", and
-     * "tokenImage" set. The boolean flag "specialConstructor" is also set to
-     * true to indicate that this constructor was used to create this object.
-     * This constructor calls its super class with the empty string to force the
-     * "toString" method of parent class "Throwable" to print the error message
-     * in the form: ParseException: <result of getMessage>
-     */
-    public ParseException(Token currentTokenVal,
-            int[][] expectedTokenSequencesVal, String[] tokenImageVal) {
-        super("");
-        specialConstructor = true;
-        currentToken = currentTokenVal;
-        expectedTokenSequences = expectedTokenSequencesVal;
-        tokenImage = tokenImageVal;
-    }
-
-    /**
-     * The following constructors are for use by you for whatever purpose you
-     * can think of. Constructing the exception in this manner makes the
-     * exception behave in the normal way - i.e., as documented in the class
-     * "Throwable". The fields "errorToken", "expectedTokenSequences", and
-     * "tokenImage" do not contain relevant information. The JavaCC generated
-     * code does not use these constructors.
-     */
-
-    public ParseException() {
-        super();
-        specialConstructor = false;
-    }
-
-    public ParseException(String message) {
-        super(message);
-        specialConstructor = false;
-    }
-
-    /**
-     * This variable determines which constructor was used to create this object
-     * and thereby affects the semantics of the "getMessage" method (see below).
-     */
-    protected boolean specialConstructor;
-
-    /**
-     * This is the last token that has been consumed successfully. If this
-     * object has been created due to a parse error, the token followng this
-     * token will (therefore) be the first error token.
-     */
-    public Token currentToken;
-
-    /**
-     * Each entry in this array is an array of integers. Each array of integers
-     * represents a sequence of tokens (by their ordinal values) that is
-     * expected at this point of the parse.
-     */
-    public int[][] expectedTokenSequences;
-
-    /**
-     * This is a reference to the "tokenImage" array of the generated parser
-     * within which the parse error occurred. This array is defined in the
-     * generated ...Constants interface.
-     */
-    public String[] tokenImage;
-
-    /**
-     * This method has the standard behavior when this object has been created
-     * using the standard constructors. Otherwise, it uses "currentToken" and
-     * "expectedTokenSequences" to generate a parse error message and returns
-     * it. If this object has been created due to a parse error, and you do not
-     * catch it (it gets thrown from the parser), then this method is called
-     * during the printing of the final stack trace, and hence the correct error
-     * message gets displayed.
-     */
-    @Override
-    public String getMessage() {
-        if (!specialConstructor) {
-            return super.getMessage();
-        }
-        String expected = "";
-        int maxSize = 0;
-        for (int i = 0; i < expectedTokenSequences.length; i++) {
-            if (maxSize < expectedTokenSequences[i].length) {
-                maxSize = expectedTokenSequences[i].length;
-            }
-            for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-                expected += tokenImage[expectedTokenSequences[i][j]] + " ";
-            }
-            if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-                expected += "...";
-            }
-            expected += eol + "    ";
-        }
-        String retval = "Encountered \"";
-        Token tok = currentToken.next;
-        for (int i = 0; i < maxSize; i++) {
-            if (i != 0) {
-                retval += " ";
-            }
-            if (tok.kind == 0) {
-                retval += tokenImage[0];
-                break;
-            }
-            retval += add_escapes(tok.image);
-            tok = tok.next;
-        }
-        retval += "\" at line " + currentToken.next.beginLine + ", column "
-                + currentToken.next.beginColumn + "." + eol;
-        if (expectedTokenSequences.length == 1) {
-            retval += "Was expecting:" + eol + "    ";
-        } else {
-            retval += "Was expecting one of:" + eol + "    ";
-        }
-        retval += expected;
-        return retval;
-    }
-
-    /**
-     * The end of line string for this machine.
-     */
-    protected String eol = System.getProperty("line.separator", "\n");
-
-    /**
-     * Used to convert raw characters to their escaped version when these raw
-     * version cannot be used as part of an ASCII string literal.
-     */
-    protected String add_escapes(String str) {
-        StringBuffer retval = new StringBuffer();
-        char ch;
-        for (int i = 0; i < str.length(); i++) {
-            switch (str.charAt(i)) {
-            case 0:
-                continue;
-            case '\b':
-                retval.append("\\b");
-                continue;
-            case '\t':
-                retval.append("\\t");
-                continue;
-            case '\n':
-                retval.append("\\n");
-                continue;
-            case '\f':
-                retval.append("\\f");
-                continue;
-            case '\r':
-                retval.append("\\r");
-                continue;
-            case '\"':
-                retval.append("\\\"");
-                continue;
-            case '\'':
-                retval.append("\\\'");
-                continue;
-            case '\\':
-                retval.append("\\\\");
-                continue;
-            default:
-                if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                    String s = "0000" + Integer.toString(ch, 16);
-                    retval.append("\\u"
-                            + s.substring(s.length() - 4, s.length()));
-                } else {
-                    retval.append(ch);
-                }
-                continue;
-            }
-        }
-        return retval.toString();
-    }
-
-}
index e66925ae2da6daf80699622f781425958e186d37..53d1ee78caa7c129d108e17acfa10fc9b3482050 100644 (file)
  * License for the specific language governing permissions and limitations under
  * the License.
  */
+/* Generated By:JavaCC: Do not edit this line. Parser.java */
 package com.vaadin.sass.internal.parser;
 
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.UUID;
+
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
+import org.w3c.css.sac.ConditionFactory;
+import org.w3c.css.sac.DocumentHandler;
+import org.w3c.css.sac.ErrorHandler;
 import org.w3c.css.sac.InputSource;
+import org.w3c.css.sac.LexicalUnit;
+import org.w3c.css.sac.Locator;
+import org.w3c.css.sac.SelectorFactory;
+import org.w3c.css.sac.SelectorList;
+import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
+import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
+import org.w3c.flute.util.Encoding;
+
+import com.vaadin.sass.internal.handler.SCSSDocumentHandlerImpl;
+import com.vaadin.sass.internal.tree.Node;
+import com.vaadin.sass.internal.tree.VariableNode;
 
 /**
+ * A CSS2 parser
  * 
- * @since
- * @author Vaadin Ltd
+ * @author Philippe Le H�garet
+ * @version $Revision: 1.15 $
  */
-public interface Parser extends org.w3c.css.sac.Parser {
+public class Parser implements org.w3c.css.sac.Parser, ParserConstants {
+
+    // replaces all \t, \n, etc with this StringBuffer.
+    static final StringBuilder SPACE = new StringBuilder(" ");
+
+    // the document handler for the parser
+    protected SCSSDocumentHandlerImpl documentHandler;
+    // the error handler for the parser
+    protected ErrorHandler errorHandler;
+    // the input source for the parser
+    protected InputSource source;
+
+    protected ConditionFactory conditionFactory;
+    protected SelectorFactory selectorFactory;
+
+    // temporary place holder for pseudo-element ...
+    private String pseudoElt;
+
+    /**
+     * Creates a new Parser
+     */
+    public Parser() {
+        this((CharStream) null);
+    }
+
+    /**
+     * @@TODO
+     * @exception CSSException
+     *                Not yet implemented
+     */
+    @Override
+    public void setLocale(Locale locale) throws CSSException {
+        throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR);
+    }
+
+    public InputSource getInputSource() {
+        return source;
+    }
+
+    /**
+     * Set the document handler for this parser
+     */
+    @Override
+    public void setDocumentHandler(DocumentHandler handler) {
+        documentHandler = (SCSSDocumentHandlerImpl) handler;
+    }
+
+    @Override
+    public void setSelectorFactory(SelectorFactory selectorFactory) {
+        this.selectorFactory = selectorFactory;
+    }
+
+    @Override
+    public void setConditionFactory(ConditionFactory conditionFactory) {
+        this.conditionFactory = conditionFactory;
+    }
+
+    /**
+     * Set the error handler for this parser
+     */
+    @Override
+    public void setErrorHandler(ErrorHandler error) {
+        errorHandler = error;
+    }
+
+    /**
+     * Main parse methods
+     * 
+     * @param source
+     *            the source of the style sheet.
+     * @exception IOException
+     *                the source can't be parsed.
+     * @exception CSSException
+     *                the source is not CSS valid.
+     */
+    @Override
+    public void parseStyleSheet(InputSource source) throws CSSException,
+            IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+
+        parserUnit();
+    }
+
+    /**
+     * Convenient method for URIs.
+     * 
+     * @param systemId
+     *            the fully resolved URI of the style sheet.
+     * @exception IOException
+     *                the source can't be parsed.
+     * @exception CSSException
+     *                the source is not CSS valid.
+     */
+    @Override
+    public void parseStyleSheet(String systemId) throws CSSException,
+            IOException {
+        parseStyleSheet(new InputSource(systemId));
+    }
+
+    /**
+     * This method parses only one rule (style rule or at-rule, except
+     * @charset).
+     * 
+     * @param source
+     *            the source of the rule.
+     * @exception IOException
+     *                the source can't be parsed.
+     * @exception CSSException
+     *                the source is not CSS valid.
+     */
+    // TODO required by original parser but not used by Vaadin?
+    @Override
+    public void parseRule(InputSource source) throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+        _parseRule();
+    }
 
-    InputSource getInputSource();
+    /**
+     * This method parses a style declaration (including the surrounding curly
+     * braces).
+     * 
+     * @param source
+     *            the source of the style declaration.
+     * @exception IOException
+     *                the source can't be parsed.
+     * @exception CSSException
+     *                the source is not CSS valid.
+     */
+    @Override
+    public void parseStyleDeclaration(InputSource source) throws CSSException,
+            IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
 
-    class ParserAccessor {
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+        _parseDeclarationBlock();
+    }
+
+    /**
+     * This methods returns "http://www.w3.org/TR/REC-CSS2".
+     * 
+     * @return the string "http://www.w3.org/TR/REC-CSS2".
+     */
+    @Override
+    public String getParserVersion() {
+        return "http://www.w3.org/TR/REC-CSS2";
+    }
+
+    /**
+     * Parse methods used by DOM Level 2 implementation.
+     */
+    public void parseImportRule(InputSource source) throws CSSException,
+            IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+        _parseImportRule();
+    }
+
+    public void parseMediaRule(InputSource source) throws CSSException,
+            IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        if (selectorFactory == null) {
+            selectorFactory = new SelectorFactoryImpl();
+        }
+        if (conditionFactory == null) {
+            conditionFactory = new ConditionFactoryImpl();
+        }
+        _parseMediaRule();
+    }
+
+    @Override
+    public SelectorList parseSelectors(InputSource source) throws CSSException,
+            IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
 
-        public static Parser getParser() {
+        return null;
+    }
+
+    @Override
+    public LexicalUnit parsePropertyValue(InputSource source)
+            throws CSSException, IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        return expr();
+    }
+
+    @Override
+    public boolean parsePriority(InputSource source) throws CSSException,
+            IOException {
+        this.source = source;
+        ReInit(getCharStreamWithLurk(source));
+
+        return prio();
+    }
+
+    /**
+     * Convert the source into a Reader. Used only by DOM Level 2 parser
+     * methods.
+     */
+    private Reader getReader(InputSource source) throws IOException {
+        if (source.getCharacterStream() != null) {
+            return source.getCharacterStream();
+        } else if (source.getByteStream() != null) {
+            // My DOM level 2 implementation doesn't use this case.
+            if (source.getEncoding() == null) {
+                // unknown encoding, use ASCII as default.
+                return new InputStreamReader(source.getByteStream(), "ASCII");
+            } else {
+                return new InputStreamReader(source.getByteStream(),
+                        source.getEncoding());
+            }
+        } else {
+            // systemId
+            // @@TODO
+            throw new CSSException("not yet implemented");
+        }
+    }
+
+    /**
+     * Convert the source into a CharStream with encoding informations. The
+     * encoding can be found in the InputSource or in the CSS document. Since
+     * this method marks the reader and make a reset after looking for the
+     * charset declaration, you'll find the charset declaration into the stream.
+     */
+    private CharStream getCharStreamWithLurk(InputSource source)
+            throws CSSException, IOException {
+        if (source.getCharacterStream() != null) {
+            // all encoding are supposed to be resolved by the user
+            // return the reader
+            return new Generic_CharStream(source.getCharacterStream(), 1, 1);
+        } else if (source.getByteStream() == null) {
+            // @@CONTINUE ME. see also getReader() with systemId
             try {
-                String implClassName = Parser.class.getPackage().getName()
-                        + ".ParserImpl";
-                Class<?> clazz = Class.forName(implClassName);
-                return (Parser) clazz.newInstance();
+                source.setByteStream(new URL(source.getURI()).openStream());
             } catch (Exception e) {
-                throw new RuntimeException(
-                        "Unable to load parser implementation."
-                                + "Check whether you have generated parser "
-                                + "class using build procedure", e);
+                try {
+                    source.setByteStream(new FileInputStream(source.getURI()));
+                } catch (IOException ex) {
+                    throw new CSSException("invalid url ?");
+                }
+            }
+        }
+        // use UTF-8 as the default encoding.
+        String encoding = source.getEncoding();
+        InputStream input = source.getByteStream();
+        if (!input.markSupported()) {
+            // If mark is not supported, wrap it in a stream which supports mark
+            input = new BufferedInputStream(input);
+            source.setByteStream(input);
+        }
+        // Mark either the original stream or the wrapped stream
+        input.mark(100);
+        if (encoding == null) {
+            encoding = "ASCII";
+
+            char c = ' ';
+
+            c = (char) input.read();
+
+            if (c == '@') {
+                // hum, is it a charset ?
+                int size = 100;
+                byte[] buf = new byte[size];
+                input.read(buf, 0, 7);
+                String keyword = new String(buf, 0, 7);
+                if (keyword.equals("charset")) {
+                    // Yes, this is the charset declaration !
+
+                    // here I don't use the right declaration : white space are
+                    // ' '.
+                    while ((c = (char) input.read()) == ' ') {
+                        // find the first quote
+                    }
+                    char endChar = c;
+                    int i = 0;
+
+                    if ((endChar != '"') && (endChar != '\u005c'')) {
+                        // hum this is not a quote.
+                        throw new CSSException("invalid charset declaration");
+                    }
+
+                    while ((c = (char) input.read()) != endChar) {
+                        buf[i++] = (byte) c;
+                        if (i == size) {
+                            byte[] old = buf;
+                            buf = new byte[size + 100];
+                            System.arraycopy(old, 0, buf, 0, size);
+                            size += 100;
+                        }
+                    }
+                    while ((c = (char) input.read()) == ' ') {
+                        // find the next relevant character
+                    }
+                    if (c != ';') {
+                        // no semi colon at the end ?
+                        throw new CSSException("invalid charset declaration: "
+                                + "missing semi colon");
+                    }
+                    encoding = new String(buf, 0, i);
+                    if (source.getEncoding() != null) {
+                        // compare the two encoding informations.
+                        // For example, I don't accept to have ASCII and after
+                        // UTF-8.
+                        // Is it really good ? That is the question.
+                        if (!encoding.equals(source.getEncoding())) {
+                            throw new CSSException(
+                                    "invalid encoding information.");
+                        }
+                    }
+                } // else no charset declaration available
+            }
+        }
+        // ok set the real encoding of this source.
+        source.setEncoding(encoding);
+        // set the real reader of this source.
+        source.setCharacterStream(new InputStreamReader(source.getByteStream(),
+                Encoding.getJavaEncoding(encoding)));
+        // reset the stream (leave the charset declaration in the stream).
+        input.reset();
+
+        return new Generic_CharStream(source.getCharacterStream(), 1, 1);
+    }
+
+    private LocatorImpl currentLocator;
+
+    private Locator getLocator() {
+        if (currentLocator == null) {
+            currentLocator = new LocatorImpl(this);
+            return currentLocator;
+        }
+        return currentLocator.reInit(this);
+    }
+
+    private LocatorImpl getLocator(Token save) {
+        if (currentLocator == null) {
+            currentLocator = new LocatorImpl(this, save);
+            return currentLocator;
+        }
+        return currentLocator.reInit(this, save);
+    }
+
+    private void reportError(Locator l, Exception e) {
+        if (errorHandler != null) {
+            if (e instanceof ParseException) {
+                // construct a clean error message.
+                ParseException pe = (ParseException) e;
+                if (pe.specialConstructor) {
+                    StringBuffer errorM = new StringBuffer();
+                    if (pe.currentToken != null) {
+                        errorM.append("encountered \u005c"").append(
+                                pe.currentToken.next);
+                    }
+                    errorM.append('"');
+                    if (pe.expectedTokenSequences.length != 0) {
+                        errorM.append(". Was expecting one of: ");
+                        for (int i = 0; i < pe.expectedTokenSequences.length; i++) {
+                            for (int j = 0; j < pe.expectedTokenSequences[i].length; j++) {
+                                int kind = pe.expectedTokenSequences[i][j];
+                                if (kind != S) {
+                                    errorM.append(pe.tokenImage[kind]);
+                                    errorM.append(' ');
+                                }
+                            }
+                        }
+                    }
+                    errorHandler.error(new CSSParseException(errorM.toString(),
+                            l, e));
+                } else {
+                    errorHandler.error(new CSSParseException(e.getMessage(), l,
+                            e));
+                }
+            } else if (e == null) {
+                errorHandler.error(new CSSParseException("error", l, null));
+            } else {
+                errorHandler.error(new CSSParseException(e.getMessage(), l, e));
+            }
+        }
+    }
+
+    private void reportWarningSkipText(Locator l, String text) {
+        if (errorHandler != null && text != null) {
+            errorHandler.warning(new CSSParseException("Skipping: " + text, l));
+        }
+    }
+
+    /*
+     * The grammar of CSS2
+     */
+
+    /**
+     * The main entry for the parser.
+     * 
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void parserUnit() throws ParseException {
+        try {
+            documentHandler.startDocument(source);
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case CHARSET_SYM:
+                charset();
+                break;
+            default:
+                jj_la1[0] = jj_gen;
+                ;
+            }
+            label_1: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                case CDO:
+                case CDC:
+                case ATKEYWORD:
+                    ;
+                    break;
+                default:
+                    jj_la1[1] = jj_gen;
+                    break label_1;
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    jj_consume_token(S);
+                    comments();
+                    break;
+                case CDO:
+                case CDC:
+                case ATKEYWORD:
+                    ignoreStatement();
+                    break;
+                default:
+                    jj_la1[2] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+            }
+            label_2: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case IMPORT_SYM:
+                    ;
+                    break;
+                default:
+                    jj_la1[3] = jj_gen;
+                    break label_2;
+                }
+                importDeclaration();
+                label_3: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case CDO:
+                    case CDC:
+                    case ATKEYWORD:
+                        ;
+                        break;
+                    default:
+                        jj_la1[4] = jj_gen;
+                        break label_3;
+                    }
+                    ignoreStatement();
+                    label_4: while (true) {
+                        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                        case S:
+                            ;
+                            break;
+                        default:
+                            jj_la1[5] = jj_gen;
+                            break label_4;
+                        }
+                        jj_consume_token(S);
+                    }
+                }
+            }
+            afterImportDeclaration();
+            jj_consume_token(0);
+        } finally {
+            documentHandler.endDocument(source);
+        }
+    }
+
+    final public void charset() throws ParseException {
+        Token n;
+        try {
+            jj_consume_token(CHARSET_SYM);
+            label_5: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[6] = jj_gen;
+                    break label_5;
+                }
+                jj_consume_token(S);
+            }
+            n = jj_consume_token(STRING);
+            label_6: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[7] = jj_gen;
+                    break label_6;
+                }
+                jj_consume_token(S);
+            }
+            jj_consume_token(SEMICOLON);
+        } catch (ParseException e) {
+            reportError(getLocator(e.currentToken.next), e);
+            skipStatement();
+            // reportWarningSkipText(getLocator(), skipStatement());
+
+        } catch (Exception e) {
+            reportError(getLocator(), e);
+            skipStatement();
+            // reportWarningSkipText(getLocator(), skipStatement());
+
+        }
+    }
+
+    final public void afterImportDeclaration() throws ParseException {
+        String ret;
+        Locator l;
+        label_7: while (true) {
+            ;
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case DEBUG_SYM:
+            case WARN_SYM:
+                debuggingDirective();
+                break;
+            case MIXIN_SYM:
+                mixinDirective();
+                break;
+            case EACH_SYM:
+            case IF_SYM:
+                controlDirective();
+                break;
+            case INCLUDE_SYM:
+                includeDirective();
+                break;
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case INTERPOLATION:
+            case IDENT:
+            case HASH:
+                styleRule();
+                break;
+            case MEDIA_SYM:
+                media();
+                break;
+            case PAGE_SYM:
+                page();
+                break;
+            case FONT_FACE_SYM:
+                fontFace();
+                break;
+            case KEY_FRAME_SYM:
+                keyframes();
+                break;
+            default:
+                jj_la1[8] = jj_gen;
+                if (jj_2_1(2147483647)) {
+                    variable();
+                } else {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case VARIABLE:
+                        listModifyDirective();
+                        break;
+                    default:
+                        jj_la1[9] = jj_gen;
+                        l = getLocator();
+                        ret = skipStatement();
+                        if ((ret == null) || (ret.length() == 0)) {
+                            {
+                                if (true) {
+                                    return;
+                                }
+                            }
+                        }
+                        if (ret.charAt(0) == '@') {
+                            documentHandler.unrecognizedRule(ret);
+                        } else {
+                            reportWarningSkipText(l, ret);
+                        }
+                    }
+                }
+            }
+            label_8: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case CDO:
+                case CDC:
+                case ATKEYWORD:
+                    ;
+                    break;
+                default:
+                    jj_la1[10] = jj_gen;
+                    break label_8;
+                }
+                ignoreStatement();
+                label_9: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[11] = jj_gen;
+                        break label_9;
+                    }
+                    jj_consume_token(S);
+                }
+            }
+        }
+    }
+
+    final public void ignoreStatement() throws ParseException {
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case CDO:
+            jj_consume_token(CDO);
+            break;
+        case CDC:
+            jj_consume_token(CDC);
+            break;
+        case ATKEYWORD:
+            atRuleDeclaration();
+            break;
+        default:
+            jj_la1[12] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+    }
+
+    /**
+     * The import statement
+     * 
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void importDeclaration() throws ParseException {
+        Token n;
+        String uri;
+        MediaListImpl ml = new MediaListImpl();
+        boolean isURL = false;
+        try {
+            jj_consume_token(IMPORT_SYM);
+            label_10: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[13] = jj_gen;
+                    break label_10;
+                }
+                jj_consume_token(S);
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case STRING:
+                n = jj_consume_token(STRING);
+                uri = convertStringIndex(n.image, 1, n.image.length() - 1);
+                break;
+            case URL:
+                n = jj_consume_token(URL);
+                isURL = true;
+                uri = n.image.substring(4, n.image.length() - 1).trim();
+                if ((uri.charAt(0) == '"') || (uri.charAt(0) == '\u005c'')) {
+                    uri = uri.substring(1, uri.length() - 1);
+                }
+                break;
+            default:
+                jj_la1[14] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            label_11: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[15] = jj_gen;
+                    break label_11;
+                }
+                jj_consume_token(S);
+            }
+            mediaStatement(ml);
+            jj_consume_token(SEMICOLON);
+            label_12: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[16] = jj_gen;
+                    break label_12;
+                }
+                jj_consume_token(S);
+            }
+            if (ml.getLength() == 0) {
+                // see section 6.3 of the CSS2 recommandation.
+                ml.addItem("all");
+            }
+            documentHandler.importStyle(uri, ml, isURL);
+        } catch (ParseException e) {
+            reportError(getLocator(), e);
+            skipStatement();
+            // reportWarningSkipText(getLocator(), skipStatement());
+
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void keyframes() throws ParseException {
+        Token n;
+        boolean start = false;
+        String keyframeName = null;
+        String animationname = "";
+        try {
+            n = jj_consume_token(KEY_FRAME_SYM);
+            label_13: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[17] = jj_gen;
+                    break label_13;
+                }
+                jj_consume_token(S);
+            }
+            keyframeName = n.image;
+            label_14: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case IDENT:
+                    n = jj_consume_token(IDENT);
+                    animationname += n.image;
+                    break;
+                case INTERPOLATION:
+                    n = jj_consume_token(INTERPOLATION);
+                    animationname += n.image;
+                    break;
+                default:
+                    jj_la1[18] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case INTERPOLATION:
+                case IDENT:
+                    ;
+                    break;
+                default:
+                    jj_la1[19] = jj_gen;
+                    break label_14;
+                }
+            }
+            label_15: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[20] = jj_gen;
+                    break label_15;
+                }
+                jj_consume_token(S);
+            }
+            start = true;
+            documentHandler.startKeyFrames(keyframeName, animationname);
+            jj_consume_token(LBRACE);
+            label_16: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[21] = jj_gen;
+                    break label_16;
+                }
+                jj_consume_token(S);
+            }
+            label_17: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case TO:
+                case FROM:
+                case CONTENT_SYM:
+                case PERCENTAGE:
+                    ;
+                    break;
+                default:
+                    jj_la1[22] = jj_gen;
+                    break label_17;
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case TO:
+                case FROM:
+                case PERCENTAGE:
+                    keyframeSelector();
+                    break;
+                case CONTENT_SYM:
+                    contentDirective();
+                    break;
+                default:
+                    jj_la1[23] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+            }
+            jj_consume_token(RBRACE);
+            label_18: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[24] = jj_gen;
+                    break label_18;
+                }
+                jj_consume_token(S);
+            }
+        } catch (ParseException e) {
+            reportError(getLocator(), e);
+            skipStatement();
+        } finally {
+            if (start) {
+                documentHandler.endKeyFrames();
+            }
+        }
+    }
+
+    final public void keyframeSelector() throws ParseException {
+        Token n;
+        String selector = "";
+        boolean start = false;
+        try {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case FROM:
+                n = jj_consume_token(FROM);
+                break;
+            case TO:
+                n = jj_consume_token(TO);
+                break;
+            case PERCENTAGE:
+                n = jj_consume_token(PERCENTAGE);
+                break;
+            default:
+                jj_la1[25] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            selector += n.image;
+            label_19: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[26] = jj_gen;
+                    break label_19;
+                }
+                jj_consume_token(S);
+            }
+            label_20: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case COMMA:
+                    ;
+                    break;
+                default:
+                    jj_la1[27] = jj_gen;
+                    break label_20;
+                }
+                jj_consume_token(COMMA);
+                label_21: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[28] = jj_gen;
+                        break label_21;
+                    }
+                    jj_consume_token(S);
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case FROM:
+                    n = jj_consume_token(FROM);
+                    break;
+                case TO:
+                    n = jj_consume_token(TO);
+                    break;
+                case PERCENTAGE:
+                    n = jj_consume_token(PERCENTAGE);
+                    break;
+                default:
+                    jj_la1[29] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+                selector += (", " + n.image);
+                label_22: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[30] = jj_gen;
+                        break label_22;
+                    }
+                    jj_consume_token(S);
+                }
+            }
+            jj_consume_token(LBRACE);
+            label_23: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[31] = jj_gen;
+                    break label_23;
+                }
+                jj_consume_token(S);
+            }
+            start = true;
+            documentHandler.startKeyframeSelector(selector);
+            label_24: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case PLUS:
+                case PRECEDES:
+                case SIBLING:
+                case LBRACKET:
+                case ANY:
+                case PARENT:
+                case DOT:
+                case COLON:
+                case INTERPOLATION:
+                case INCLUDE_SYM:
+                case DEBUG_SYM:
+                case WARN_SYM:
+                case EACH_SYM:
+                case IF_SYM:
+                case EXTEND_SYM:
+                case CONTENT_SYM:
+                case MICROSOFT_RULE:
+                case IDENT:
+                case VARIABLE:
+                case HASH:
+                case MEDIA_SYM:
+                case KEY_FRAME_SYM:
+                case ATKEYWORD:
+                    ;
+                    break;
+                default:
+                    jj_la1[32] = jj_gen;
+                    break label_24;
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case PLUS:
+                case PRECEDES:
+                case SIBLING:
+                case LBRACKET:
+                case ANY:
+                case PARENT:
+                case DOT:
+                case COLON:
+                case INTERPOLATION:
+                case INCLUDE_SYM:
+                case DEBUG_SYM:
+                case WARN_SYM:
+                case EACH_SYM:
+                case IF_SYM:
+                case EXTEND_SYM:
+                case CONTENT_SYM:
+                case IDENT:
+                case VARIABLE:
+                case HASH:
+                case MEDIA_SYM:
+                case KEY_FRAME_SYM:
+                case ATKEYWORD:
+                    ifContentStatement();
+                    break;
+                case MICROSOFT_RULE:
+                    microsoftExtension();
+                    break;
+                default:
+                    jj_la1[33] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+            }
+            jj_consume_token(RBRACE);
+            label_25: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[34] = jj_gen;
+                    break label_25;
+                }
+                jj_consume_token(S);
+            }
+        } catch (ThrowedParseException e) {
+            if (errorHandler != null) {
+                LocatorImpl li = new LocatorImpl(this,
+                        e.e.currentToken.next.beginLine,
+                        e.e.currentToken.next.beginColumn - 1);
+                reportError(li, e.e);
+            }
+        } catch (ParseException e) {
+            reportError(getLocator(), e);
+            skipStatement();
+            // reportWarningSkipText(getLocator(), skipStatement());
+
+        } catch (TokenMgrError e) {
+            reportWarningSkipText(getLocator(), skipStatement());
+        } finally {
+            if (start) {
+                documentHandler.endKeyframeSelector();
+            }
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    /* see http://www.w3.org/TR/css3-mediaqueries/ */
+    final public void media() throws ParseException {
+        boolean start = false;
+        String ret;
+        MediaListImpl ml = new MediaListImpl();
+        try {
+            jj_consume_token(MEDIA_SYM);
+            label_26: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[35] = jj_gen;
+                    break label_26;
+                }
+                jj_consume_token(S);
+            }
+            mediaStatement(ml);
+            start = true;
+            documentHandler.startMedia(ml);
+            jj_consume_token(LBRACE);
+            label_27: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[36] = jj_gen;
+                    break label_27;
+                }
+                jj_consume_token(S);
+            }
+            label_28: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case CDO:
+                case LBRACE:
+                case DASHMATCH:
+                case INCLUDES:
+                case PLUS:
+                case MINUS:
+                case COMMA:
+                case SEMICOLON:
+                case PRECEDES:
+                case SIBLING:
+                case LBRACKET:
+                case ANY:
+                case PARENT:
+                case DOT:
+                case COLON:
+                case INTERPOLATION:
+                case NONASCII:
+                case DEBUG_SYM:
+                case WARN_SYM:
+                case STRING:
+                case IDENT:
+                case NUMBER:
+                case URL:
+                case PERCENTAGE:
+                case HASH:
+                case IMPORT_SYM:
+                case MEDIA_SYM:
+                case CHARSET_SYM:
+                case PAGE_SYM:
+                case FONT_FACE_SYM:
+                case ATKEYWORD:
+                case IMPORTANT_SYM:
+                case UNICODERANGE:
+                case FUNCTION:
+                case UNKNOWN:
+                    ;
+                    break;
+                default:
+                    jj_la1[37] = jj_gen;
+                    break label_28;
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case DEBUG_SYM:
+                case WARN_SYM:
+                    debuggingDirective();
+                    break;
+                case PLUS:
+                case PRECEDES:
+                case SIBLING:
+                case LBRACKET:
+                case ANY:
+                case PARENT:
+                case DOT:
+                case COLON:
+                case INTERPOLATION:
+                case IDENT:
+                case HASH:
+                    styleRule();
+                    break;
+                case CDO:
+                case LBRACE:
+                case DASHMATCH:
+                case INCLUDES:
+                case MINUS:
+                case COMMA:
+                case SEMICOLON:
+                case NONASCII:
+                case STRING:
+                case NUMBER:
+                case URL:
+                case PERCENTAGE:
+                case IMPORT_SYM:
+                case MEDIA_SYM:
+                case CHARSET_SYM:
+                case PAGE_SYM:
+                case FONT_FACE_SYM:
+                case ATKEYWORD:
+                case IMPORTANT_SYM:
+                case UNICODERANGE:
+                case FUNCTION:
+                case UNKNOWN:
+                    skipUnknownRule();
+                    break;
+                default:
+                    jj_la1[38] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+            }
+            jj_consume_token(RBRACE);
+            label_29: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[39] = jj_gen;
+                    break label_29;
+                }
+                jj_consume_token(S);
+            }
+        } catch (ParseException e) {
+            reportError(getLocator(), e);
+            skipStatement();
+            // reportWarningSkipText(getLocator(), skipStatement());
+
+        } finally {
+            if (start) {
+                documentHandler.endMedia(ml);
+            }
+        }
+    }
+
+    final public void mediaStatement(MediaListImpl ml) throws ParseException {
+        Token t;
+        t = getToken(1);
+        // loop over comma separated parts, add each to ml
+        while ((t.kind != LBRACE) && (t.kind != EOF) && (t.kind != SEMICOLON)) {
+            StringBuffer s = new StringBuffer();
+            s.append(getToken(0).image);
+            while ((t.kind != COMMA) && (t.kind != LBRACE) && (t.kind != EOF)
+                    && (t.kind != SEMICOLON)) {
+                s.append(t.image);
+                getNextToken();
+                t = getToken(1);
+            }
+            if (t.kind == COMMA) {
+                // skip the comma and the token before it that is still the
+                // active token
+                getNextToken();
+                getNextToken();
+                t = getToken(1);
+            }
+            String str = s.toString().trim();
+            if (str.length() > 0) {
+                ml.addItem(str);
+            }
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String medium() throws ParseException {
+        Token n;
+        n = jj_consume_token(IDENT);
+        {
+            if (true) {
+                return convertIdent(n.image);
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void page() throws ParseException {
+        boolean start = false;
+        Token n = null;
+        String page = null;
+        String pseudo = null;
+        try {
+            jj_consume_token(PAGE_SYM);
+            label_30: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[40] = jj_gen;
+                    break label_30;
+                }
+                jj_consume_token(S);
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case IDENT:
+                n = jj_consume_token(IDENT);
+                label_31: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[41] = jj_gen;
+                        break label_31;
+                    }
+                    jj_consume_token(S);
+                }
+                break;
+            default:
+                jj_la1[42] = jj_gen;
+                ;
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case COLON:
+                pseudo = pseudo_page();
+                break;
+            default:
+                jj_la1[43] = jj_gen;
+                ;
+            }
+            if (n != null) {
+                page = convertIdent(n.image);
+            }
+            jj_consume_token(LBRACE);
+            label_32: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[44] = jj_gen;
+                    break label_32;
+                }
+                jj_consume_token(S);
+            }
+            start = true;
+            documentHandler.startPage(page, pseudo);
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case INTERPOLATION:
+            case IDENT:
+                declaration();
+                break;
+            default:
+                jj_la1[45] = jj_gen;
+                ;
+            }
+            label_33: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case SEMICOLON:
+                    ;
+                    break;
+                default:
+                    jj_la1[46] = jj_gen;
+                    break label_33;
+                }
+                jj_consume_token(SEMICOLON);
+                label_34: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[47] = jj_gen;
+                        break label_34;
+                    }
+                    jj_consume_token(S);
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case INTERPOLATION:
+                case IDENT:
+                    declaration();
+                    break;
+                default:
+                    jj_la1[48] = jj_gen;
+                    ;
+                }
+            }
+            jj_consume_token(RBRACE);
+            label_35: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[49] = jj_gen;
+                    break label_35;
+                }
+                jj_consume_token(S);
+            }
+        } catch (ParseException e) {
+            if (errorHandler != null) {
+                LocatorImpl li = new LocatorImpl(this,
+                        e.currentToken.next.beginLine,
+                        e.currentToken.next.beginColumn - 1);
+                reportError(li, e);
+                skipStatement();
+                // reportWarningSkipText(li, skipStatement());
+            } else {
+                skipStatement();
+            }
+        } finally {
+            if (start) {
+                documentHandler.endPage(page, pseudo);
+            }
+        }
+    }
+
+    final public String pseudo_page() throws ParseException {
+        Token n;
+        jj_consume_token(COLON);
+        n = jj_consume_token(IDENT);
+        label_36: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[50] = jj_gen;
+                break label_36;
+            }
+            jj_consume_token(S);
+        }
+        {
+            if (true) {
+                return convertIdent(n.image);
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public void fontFace() throws ParseException {
+        boolean start = false;
+        try {
+            jj_consume_token(FONT_FACE_SYM);
+            label_37: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[51] = jj_gen;
+                    break label_37;
+                }
+                jj_consume_token(S);
+            }
+            jj_consume_token(LBRACE);
+            label_38: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[52] = jj_gen;
+                    break label_38;
+                }
+                jj_consume_token(S);
+            }
+            start = true;
+            documentHandler.startFontFace();
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case INTERPOLATION:
+            case IDENT:
+                declaration();
+                break;
+            default:
+                jj_la1[53] = jj_gen;
+                ;
+            }
+            label_39: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case SEMICOLON:
+                    ;
+                    break;
+                default:
+                    jj_la1[54] = jj_gen;
+                    break label_39;
+                }
+                jj_consume_token(SEMICOLON);
+                label_40: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[55] = jj_gen;
+                        break label_40;
+                    }
+                    jj_consume_token(S);
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case INTERPOLATION:
+                case IDENT:
+                    declaration();
+                    break;
+                default:
+                    jj_la1[56] = jj_gen;
+                    ;
+                }
+            }
+            jj_consume_token(RBRACE);
+            label_41: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[57] = jj_gen;
+                    break label_41;
+                }
+                jj_consume_token(S);
+            }
+        } catch (ParseException e) {
+            reportError(getLocator(), e);
+            skipStatement();
+            // reportWarningSkipText(getLocator(), skipStatement());
+
+        } finally {
+            if (start) {
+                documentHandler.endFontFace();
+            }
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void atRuleDeclaration() throws ParseException {
+        Token n;
+        String ret;
+        n = jj_consume_token(ATKEYWORD);
+        ret = skipStatement();
+        if ((ret != null) && (ret.charAt(0) == '@')) {
+            documentHandler.unrecognizedRule(ret);
+        } else {
+            reportWarningSkipText(getLocator(), ret);
+        }
+    }
+
+    final public void skipUnknownRule() throws ParseException {
+        Token n;
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case ATKEYWORD:
+            n = jj_consume_token(ATKEYWORD);
+            break;
+        case CDO:
+            n = jj_consume_token(CDO);
+            break;
+        case CHARSET_SYM:
+            n = jj_consume_token(CHARSET_SYM);
+            break;
+        case COMMA:
+            n = jj_consume_token(COMMA);
+            break;
+        case DASHMATCH:
+            n = jj_consume_token(DASHMATCH);
+            break;
+        case FONT_FACE_SYM:
+            n = jj_consume_token(FONT_FACE_SYM);
+            break;
+        case FUNCTION:
+            n = jj_consume_token(FUNCTION);
+            break;
+        case IMPORTANT_SYM:
+            n = jj_consume_token(IMPORTANT_SYM);
+            break;
+        case IMPORT_SYM:
+            n = jj_consume_token(IMPORT_SYM);
+            break;
+        case INCLUDES:
+            n = jj_consume_token(INCLUDES);
+            break;
+        case LBRACE:
+            n = jj_consume_token(LBRACE);
+            break;
+        case MEDIA_SYM:
+            n = jj_consume_token(MEDIA_SYM);
+            break;
+        case NONASCII:
+            n = jj_consume_token(NONASCII);
+            break;
+        case NUMBER:
+            n = jj_consume_token(NUMBER);
+            break;
+        case PAGE_SYM:
+            n = jj_consume_token(PAGE_SYM);
+            break;
+        case PERCENTAGE:
+            n = jj_consume_token(PERCENTAGE);
+            break;
+        case STRING:
+            n = jj_consume_token(STRING);
+            break;
+        case UNICODERANGE:
+            n = jj_consume_token(UNICODERANGE);
+            break;
+        case URL:
+            n = jj_consume_token(URL);
+            break;
+        case SEMICOLON:
+            n = jj_consume_token(SEMICOLON);
+            break;
+        case MINUS:
+            n = jj_consume_token(MINUS);
+            break;
+        case UNKNOWN:
+            n = jj_consume_token(UNKNOWN);
+            break;
+        default:
+            jj_la1[58] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        String ret;
+        Locator loc = getLocator();
+        ret = skipStatement();
+        if ((ret != null) && (n.image.charAt(0) == '@')) {
+            documentHandler.unrecognizedRule(ret);
+        } else {
+            reportWarningSkipText(loc, ret);
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public char combinator() throws ParseException {
+        char connector = ' ';
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case PLUS:
+        case PRECEDES:
+        case SIBLING:
+            connector = combinatorChar();
+            break;
+        case S:
+            jj_consume_token(S);
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+                connector = combinatorChar();
+                break;
+            default:
+                jj_la1[59] = jj_gen;
+                ;
+            }
+            break;
+        default:
+            jj_la1[60] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        {
+            if (true) {
+                return connector;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /** to refactor combinator and reuse in selector(). */
+    final public char combinatorChar() throws ParseException {
+        Token t;
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case PLUS:
+            t = jj_consume_token(PLUS);
+            break;
+        case PRECEDES:
+            t = jj_consume_token(PRECEDES);
+            break;
+        case SIBLING:
+            t = jj_consume_token(SIBLING);
+            break;
+        default:
+            jj_la1[61] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        label_42: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[62] = jj_gen;
+                break label_42;
+            }
+            jj_consume_token(S);
+        }
+        {
+            if (true) {
+                return t.image.charAt(0);
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public void microsoftExtension() throws ParseException {
+        Token n;
+        String name = "";
+        String value = "";
+        // This is not really taking the syntax of filter rules into account
+        n = jj_consume_token(MICROSOFT_RULE);
+        label_43: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[63] = jj_gen;
+                break label_43;
+            }
+            jj_consume_token(S);
+        }
+        name = n.image;
+        jj_consume_token(COLON);
+        label_44: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case IDENT:
+                n = jj_consume_token(IDENT);
+                value += n.image;
+                break;
+            case NUMBER:
+                n = jj_consume_token(NUMBER);
+                value += n.image;
+                break;
+            case STRING:
+                n = jj_consume_token(STRING);
+                value += n.image;
+                break;
+            case COMMA:
+                n = jj_consume_token(COMMA);
+                value += n.image;
+                break;
+            case INTERPOLATION:
+                n = jj_consume_token(INTERPOLATION);
+                value += n.image;
+                break;
+            case COLON:
+                n = jj_consume_token(COLON);
+                value += n.image;
+                break;
+            case FUNCTION:
+                n = jj_consume_token(FUNCTION);
+                value += n.image;
+                break;
+            case RPARAN:
+                n = jj_consume_token(RPARAN);
+                value += n.image;
+                break;
+            case EQ:
+                n = jj_consume_token(EQ);
+                value += n.image;
+                break;
+            case DOT:
+                n = jj_consume_token(DOT);
+                value += n.image;
+                break;
+            case S:
+                n = jj_consume_token(S);
+                if (value.lastIndexOf(' ') != value.length() - 1) {
+                    value += n.image;
+                }
+                break;
+            default:
+                jj_la1[64] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+            case EQ:
+            case COMMA:
+            case DOT:
+            case RPARAN:
+            case COLON:
+            case INTERPOLATION:
+            case STRING:
+            case IDENT:
+            case NUMBER:
+            case FUNCTION:
+                ;
+                break;
+            default:
+                jj_la1[65] = jj_gen;
+                break label_44;
+            }
+        }
+        jj_consume_token(SEMICOLON);
+        label_45: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[66] = jj_gen;
+                break label_45;
+            }
+            jj_consume_token(S);
+        }
+        documentHandler.microsoftDirective(name, value);
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String property() throws ParseException {
+        Token t;
+        String s = "";
+        label_46: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case IDENT:
+                t = jj_consume_token(IDENT);
+                s += t.image;
+                break;
+            case INTERPOLATION:
+                t = jj_consume_token(INTERPOLATION);
+                s += t.image;
+                break;
+            default:
+                jj_la1[67] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case INTERPOLATION:
+            case IDENT:
+                ;
+                break;
+            default:
+                jj_la1[68] = jj_gen;
+                break label_46;
+            }
+        }
+        label_47: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[69] = jj_gen;
+                break label_47;
+            }
+            jj_consume_token(S);
+        }
+        {
+            if (true) {
+                return s;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public String variableName() throws ParseException {
+        Token n;
+        n = jj_consume_token(VARIABLE);
+        label_48: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[70] = jj_gen;
+                break label_48;
+            }
+            jj_consume_token(S);
+        }
+        {
+            if (true) {
+                return convertIdent(n.image.substring(1));
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public String functionName() throws ParseException {
+        Token n;
+        n = jj_consume_token(FUNCTION);
+        label_49: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[71] = jj_gen;
+                break label_49;
+            }
+            jj_consume_token(S);
+        }
+        {
+            if (true) {
+                return convertIdent(n.image.substring(0, n.image.length() - 1));
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void styleRule() throws ParseException {
+        boolean start = false;
+        ArrayList<String> l = null;
+        Token save;
+        Locator loc;
+        try {
+            l = selectorList();
+            save = token;
+            jj_consume_token(LBRACE);
+            label_50: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[72] = jj_gen;
+                    break label_50;
+                }
+                jj_consume_token(S);
+            }
+            start = true;
+            documentHandler.startSelector(l);
+            label_51: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case PLUS:
+                case PRECEDES:
+                case SIBLING:
+                case LBRACKET:
+                case ANY:
+                case PARENT:
+                case DOT:
+                case COLON:
+                case INTERPOLATION:
+                case INCLUDE_SYM:
+                case DEBUG_SYM:
+                case WARN_SYM:
+                case EACH_SYM:
+                case IF_SYM:
+                case EXTEND_SYM:
+                case CONTENT_SYM:
+                case MICROSOFT_RULE:
+                case IDENT:
+                case VARIABLE:
+                case HASH:
+                case IMPORT_SYM:
+                case MEDIA_SYM:
+                case KEY_FRAME_SYM:
+                case ATKEYWORD:
+                    ;
+                    break;
+                default:
+                    jj_la1[73] = jj_gen;
+                    break label_51;
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case PLUS:
+                case PRECEDES:
+                case SIBLING:
+                case LBRACKET:
+                case ANY:
+                case PARENT:
+                case DOT:
+                case COLON:
+                case INTERPOLATION:
+                case INCLUDE_SYM:
+                case DEBUG_SYM:
+                case WARN_SYM:
+                case EACH_SYM:
+                case IF_SYM:
+                case EXTEND_SYM:
+                case CONTENT_SYM:
+                case IDENT:
+                case VARIABLE:
+                case HASH:
+                case MEDIA_SYM:
+                case KEY_FRAME_SYM:
+                case ATKEYWORD:
+                    ifContentStatement();
+                    break;
+                case MICROSOFT_RULE:
+                    microsoftExtension();
+                    break;
+                case IMPORT_SYM:
+                    importDeclaration();
+                    break;
+                default:
+                    jj_la1[74] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+            }
+            jj_consume_token(RBRACE);
+            label_52: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[75] = jj_gen;
+                    break label_52;
+                }
+                jj_consume_token(S);
+            }
+        } catch (ThrowedParseException e) {
+            if (errorHandler != null) {
+                LocatorImpl li = new LocatorImpl(this,
+                        e.e.currentToken.next.beginLine,
+                        e.e.currentToken.next.beginColumn - 1);
+                reportError(li, e.e);
+            }
+        } catch (ParseException e) {
+            reportError(getLocator(), e);
+            skipStatement();
+            // reportWarningSkipText(getLocator(), skipStatement());
+
+        } catch (TokenMgrError e) {
+            reportWarningSkipText(getLocator(), skipStatement());
+        } finally {
+            if (start) {
+                documentHandler.endSelector();
             }
         }
+    }
 
+    final public ArrayList<String> selectorList() throws ParseException {
+        ArrayList<String> selectors = new ArrayList<String>();
+        String selector;
+        selector = selector();
+        label_53: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case COMMA:
+                ;
+                break;
+            default:
+                jj_la1[76] = jj_gen;
+                break label_53;
+            }
+            jj_consume_token(COMMA);
+            label_54: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[77] = jj_gen;
+                    break label_54;
+                }
+                jj_consume_token(S);
+            }
+            selectors.add(selector);
+            selector = selector();
+        }
+        selectors.add(selector);
+        {
+            if (true) {
+                return selectors;
+            }
+        }
+        throw new Error("Missing return statement in function");
     }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String selector() throws ParseException {
+        String selector = null;
+        char comb;
+        try {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case INTERPOLATION:
+            case IDENT:
+            case HASH:
+                selector = simple_selector(null, ' ');
+                break;
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+                comb = combinatorChar();
+                selector = simple_selector(selector, comb);
+                break;
+            default:
+                jj_la1[78] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            label_55: while (true) {
+                if (jj_2_2(2)) {
+                    ;
+                } else {
+                    break label_55;
+                }
+                comb = combinator();
+                selector = simple_selector(selector, comb);
+            }
+            label_56: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[79] = jj_gen;
+                    break label_56;
+                }
+                jj_consume_token(S);
+            }
+            {
+                if (true) {
+                    return selector;
+                }
+            }
+        } catch (ParseException e) {
+            /*
+             * Token t = getToken(1); StringBuffer s = new StringBuffer();
+             * s.append(getToken(0).image); while ((t.kind != COMMA) && (t.kind
+             * != SEMICOLON) && (t.kind != LBRACE) && (t.kind != EOF)) {
+             * s.append(t.image); getNextToken(); t = getToken(1); }
+             * reportWarningSkipText(getLocator(), s.toString());
+             */
+            Token t = getToken(1);
+            while ((t.kind != COMMA) && (t.kind != SEMICOLON)
+                    && (t.kind != LBRACE) && (t.kind != EOF)) {
+                getNextToken();
+                t = getToken(1);
+            }
+
+            {
+                if (true) {
+                    throw new ThrowedParseException(e);
+                }
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String simple_selector(String selector, char comb)
+            throws ParseException {
+        String simple_current = null;
+        String cond = null;
+
+        pseudoElt = null;
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case ANY:
+        case PARENT:
+        case INTERPOLATION:
+        case IDENT:
+            simple_current = element_name();
+            label_57: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case LBRACKET:
+                case DOT:
+                case COLON:
+                case HASH:
+                    ;
+                    break;
+                default:
+                    jj_la1[80] = jj_gen;
+                    break label_57;
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case HASH:
+                    cond = hash(cond);
+                    break;
+                case DOT:
+                    cond = _class(cond);
+                    break;
+                case LBRACKET:
+                    cond = attrib(cond);
+                    break;
+                case COLON:
+                    cond = pseudo(cond);
+                    break;
+                default:
+                    jj_la1[81] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+            }
+            break;
+        case LBRACKET:
+        case DOT:
+        case COLON:
+        case HASH:
+            label_58: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case HASH:
+                    cond = hash(cond);
+                    break;
+                case DOT:
+                    cond = _class(cond);
+                    break;
+                case LBRACKET:
+                    cond = attrib(cond);
+                    break;
+                case COLON:
+                    cond = pseudo(cond);
+                    break;
+                default:
+                    jj_la1[82] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case LBRACKET:
+                case DOT:
+                case COLON:
+                case HASH:
+                    ;
+                    break;
+                default:
+                    jj_la1[83] = jj_gen;
+                    break label_58;
+                }
+            }
+            break;
+        default:
+            jj_la1[84] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        if (simple_current == null) {
+            simple_current = "";
+        }
+        if (cond != null) {
+            simple_current = simple_current + cond;
+        }
+        StringBuilder builder = new StringBuilder();
+        switch (comb) {
+        case ' ':
+            if (selector != null) {
+                builder.append(selector).append(" ");
+            }
+            break;
+        case '+':
+        case '>':
+        case '~':
+            if (selector != null) {
+                builder.append(selector).append(" ");
+            }
+            builder.append(comb).append(" ");
+            break;
+        default: {
+            if (true) {
+                throw new ParseException("invalid state. send a bug report");
+            }
+        }
+        }
+        builder.append(simple_current);
+        selector = builder.toString();
+
+        if (pseudoElt != null) {
+            selector = selector + pseudoElt;
+        }
+        {
+            if (true) {
+                return selector;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String _class(String pred) throws ParseException {
+        Token t;
+        String s = ".";
+        jj_consume_token(DOT);
+        label_59: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case IDENT:
+                t = jj_consume_token(IDENT);
+                s += t.image;
+                break;
+            case INTERPOLATION:
+                t = jj_consume_token(INTERPOLATION);
+                s += t.image;
+                break;
+            default:
+                jj_la1[85] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case INTERPOLATION:
+            case IDENT:
+                ;
+                break;
+            default:
+                jj_la1[86] = jj_gen;
+                break label_59;
+            }
+        }
+        if (pred == null) {
+            {
+                if (true) {
+                    return s;
+                }
+            }
+        } else {
+            {
+                if (true) {
+                    return pred + s;
+                }
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String element_name() throws ParseException {
+        Token t;
+        String s = "";
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case INTERPOLATION:
+        case IDENT:
+            label_60: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case IDENT:
+                    t = jj_consume_token(IDENT);
+                    s += t.image;
+                    break;
+                case INTERPOLATION:
+                    t = jj_consume_token(INTERPOLATION);
+                    s += t.image;
+                    break;
+                default:
+                    jj_la1[87] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case INTERPOLATION:
+                case IDENT:
+                    ;
+                    break;
+                default:
+                    jj_la1[88] = jj_gen;
+                    break label_60;
+                }
+            }
+            {
+                if (true) {
+                    return s;
+                }
+            }
+            break;
+        case ANY:
+            jj_consume_token(ANY);
+            {
+                if (true) {
+                    return "*";
+                }
+            }
+            break;
+        case PARENT:
+            jj_consume_token(PARENT);
+            {
+                if (true) {
+                    return "&";
+                }
+            }
+            break;
+        default:
+            jj_la1[89] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String attrib(String pred) throws ParseException {
+        int cases = 0;
+        Token att = null;
+        Token val = null;
+        String attValue = null;
+        jj_consume_token(LBRACKET);
+        label_61: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[90] = jj_gen;
+                break label_61;
+            }
+            jj_consume_token(S);
+        }
+        att = jj_consume_token(IDENT);
+        label_62: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[91] = jj_gen;
+                break label_62;
+            }
+            jj_consume_token(S);
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case DASHMATCH:
+        case CARETMATCH:
+        case DOLLARMATCH:
+        case STARMATCH:
+        case INCLUDES:
+        case EQ:
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case EQ:
+                jj_consume_token(EQ);
+                cases = 1;
+                break;
+            case INCLUDES:
+                jj_consume_token(INCLUDES);
+                cases = 2;
+                break;
+            case DASHMATCH:
+                jj_consume_token(DASHMATCH);
+                cases = 3;
+                break;
+            case CARETMATCH:
+                jj_consume_token(CARETMATCH);
+                cases = 4;
+                break;
+            case DOLLARMATCH:
+                jj_consume_token(DOLLARMATCH);
+                cases = 5;
+                break;
+            case STARMATCH:
+                jj_consume_token(STARMATCH);
+                cases = 6;
+                break;
+            default:
+                jj_la1[92] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            label_63: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[93] = jj_gen;
+                    break label_63;
+                }
+                jj_consume_token(S);
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case IDENT:
+                val = jj_consume_token(IDENT);
+                attValue = val.image;
+                break;
+            case STRING:
+                val = jj_consume_token(STRING);
+                attValue = val.image;
+                break;
+            default:
+                jj_la1[94] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            label_64: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[95] = jj_gen;
+                    break label_64;
+                }
+                jj_consume_token(S);
+            }
+            break;
+        default:
+            jj_la1[96] = jj_gen;
+            ;
+        }
+        jj_consume_token(RBRACKET);
+        String name = convertIdent(att.image);
+        String c;
+        switch (cases) {
+        case 0:
+            c = name;
+            break;
+        case 1:
+            c = name + "=" + attValue;
+            break;
+        case 2:
+            c = name + "~=" + attValue;
+            break;
+        case 3:
+            c = name + "|=" + attValue;
+            break;
+        case 4:
+            c = name + "^=" + attValue;
+            break;
+        case 5:
+            c = name + "$=" + attValue;
+            break;
+        case 6:
+            c = name + "*=" + attValue;
+            break;
+        default:
+            // never reached.
+            c = null;
+        }
+        c = "[" + c + "]";
+        if (pred == null) {
+            {
+                if (true) {
+                    return c;
+                }
+            }
+        } else {
+            {
+                if (true) {
+                    return pred + c;
+                }
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String pseudo(String pred) throws ParseException {
+        Token n;
+        Token param;
+        String d;
+        boolean isPseudoElement = false;
+        jj_consume_token(COLON);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case COLON:
+            jj_consume_token(COLON);
+            isPseudoElement = true;
+            break;
+        default:
+            jj_la1[97] = jj_gen;
+            ;
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case IDENT:
+            n = jj_consume_token(IDENT);
+            String s = ":" + convertIdent(n.image);
+            if (isPseudoElement) {
+                if (pseudoElt != null) {
+                    {
+                        if (true) {
+                            throw new CSSParseException(
+                                    "duplicate pseudo element definition " + s,
+                                    getLocator());
+                        }
+                    }
+                } else {
+                    pseudoElt = ":" + s;
+                    {
+                        if (true) {
+                            return pred;
+                        }
+                    }
+                }
+            } else {
+                String c = s;
+                if (pred == null) {
+                    {
+                        if (true) {
+                            return c;
+                        }
+                    }
+                } else {
+                    {
+                        if (true) {
+                            return pred + c;
+                        }
+                    }
+                }
+            }
+            break;
+        case FUNCTION:
+            n = jj_consume_token(FUNCTION);
+            label_65: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[98] = jj_gen;
+                    break label_65;
+                }
+                jj_consume_token(S);
+            }
+            d = skipStatementUntilMatchingRightParan();
+            jj_consume_token(RPARAN);
+            // accept anything between function and a right parenthesis
+            String f = convertIdent(n.image);
+            String colons = isPseudoElement ? "::" : ":";
+            String pseudofn = colons + f + d + ")";
+            if (pred == null) {
+                {
+                    if (true) {
+                        return pseudofn;
+                    }
+                }
+            } else {
+                {
+                    if (true) {
+                        return pred + pseudofn;
+                    }
+                }
+            }
+            break;
+        default:
+            jj_la1[99] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String hash(String pred) throws ParseException {
+        Token n;
+        n = jj_consume_token(HASH);
+        String d = n.image;
+        if (pred == null) {
+            {
+                if (true) {
+                    return d;
+                }
+            }
+        } else {
+            {
+                if (true) {
+                    return pred + d;
+                }
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public void variable() throws ParseException {
+        String name;
+        LexicalUnitImpl exp = null;
+        boolean guarded = false;
+        String raw;
+        try {
+            name = variableName();
+            jj_consume_token(COLON);
+            label_66: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[100] = jj_gen;
+                    break label_66;
+                }
+                jj_consume_token(S);
+            }
+            exp = expr();
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case GUARDED_SYM:
+                guarded = guarded();
+                break;
+            default:
+                jj_la1[101] = jj_gen;
+                ;
+            }
+            label_67: while (true) {
+                jj_consume_token(SEMICOLON);
+                label_68: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[102] = jj_gen;
+                        break label_68;
+                    }
+                    jj_consume_token(S);
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case SEMICOLON:
+                    ;
+                    break;
+                default:
+                    jj_la1[103] = jj_gen;
+                    break label_67;
+                }
+            }
+            documentHandler.variable(name, exp, guarded);
+        } catch (JumpException e) {
+            skipAfterExpression();
+        } catch (NumberFormatException e) {
+            if (errorHandler != null) {
+                errorHandler.error(new CSSParseException("Invalid number "
+                        + e.getMessage(), getLocator(), e));
+            }
+            reportWarningSkipText(getLocator(), skipAfterExpression());
+        } catch (ParseException e) {
+            if (errorHandler != null) {
+                if (e.currentToken != null) {
+                    LocatorImpl li = new LocatorImpl(this,
+                            e.currentToken.next.beginLine,
+                            e.currentToken.next.beginColumn - 1);
+                    reportError(li, e);
+                } else {
+                    reportError(getLocator(), e);
+                }
+                skipAfterExpression();
+            } else {
+                skipAfterExpression();
+            }
+        }
+    }
+
+    final public void controlDirective() throws ParseException {
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case IF_SYM:
+            ifDirective();
+            break;
+        case EACH_SYM:
+            eachDirective();
+            break;
+        default:
+            jj_la1[104] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+    }
+
+    final public void ifContentStatement() throws ParseException {
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case CONTENT_SYM:
+            contentDirective();
+            break;
+        case INCLUDE_SYM:
+            includeDirective();
+            break;
+        case MEDIA_SYM:
+            media();
+            break;
+        case EXTEND_SYM:
+            extendDirective();
+            break;
+        case PLUS:
+        case PRECEDES:
+        case SIBLING:
+        case LBRACKET:
+        case ANY:
+        case PARENT:
+        case DOT:
+        case COLON:
+        case INTERPOLATION:
+        case DEBUG_SYM:
+        case WARN_SYM:
+        case IDENT:
+        case HASH:
+            styleRuleOrDeclarationOrNestedProperties();
+            break;
+        case KEY_FRAME_SYM:
+            keyframes();
+            break;
+        default:
+            jj_la1[105] = jj_gen;
+            if (jj_2_3(2147483647)) {
+                variable();
+            } else {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case VARIABLE:
+                    listModifyDirective();
+                    break;
+                case EACH_SYM:
+                case IF_SYM:
+                    controlDirective();
+                    break;
+                case ATKEYWORD:
+                    atRuleDeclaration();
+                    break;
+                default:
+                    jj_la1[106] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+            }
+        }
+    }
+
+    final public void ifDirective() throws ParseException {
+        Token n = null;
+        String s = null;
+        String evaluator = "";
+        jj_consume_token(IF_SYM);
+        label_69: while (true) {
+            s = booleanExpressionToken();
+            evaluator += s;
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+            case EQ:
+            case PLUS:
+            case MINUS:
+            case PRECEDES:
+            case SUCCEEDS:
+            case DIV:
+            case ANY:
+            case LPARAN:
+            case RPARAN:
+            case COMPARE:
+            case OR:
+            case AND:
+            case NOT_EQ:
+            case IDENT:
+            case NUMBER:
+            case VARIABLE:
+            case CONTAINS:
+                ;
+                break;
+            default:
+                jj_la1[107] = jj_gen;
+                break label_69;
+            }
+        }
+        jj_consume_token(LBRACE);
+        label_70: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[108] = jj_gen;
+                break label_70;
+            }
+            jj_consume_token(S);
+        }
+        documentHandler.startIfElseDirective();
+        documentHandler.ifDirective(evaluator);
+        label_71: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case INTERPOLATION:
+            case INCLUDE_SYM:
+            case DEBUG_SYM:
+            case WARN_SYM:
+            case EACH_SYM:
+            case IF_SYM:
+            case EXTEND_SYM:
+            case CONTENT_SYM:
+            case IDENT:
+            case VARIABLE:
+            case HASH:
+            case MEDIA_SYM:
+            case FONT_FACE_SYM:
+            case KEY_FRAME_SYM:
+            case ATKEYWORD:
+                ;
+                break;
+            default:
+                jj_la1[109] = jj_gen;
+                break label_71;
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case INTERPOLATION:
+            case INCLUDE_SYM:
+            case DEBUG_SYM:
+            case WARN_SYM:
+            case EACH_SYM:
+            case IF_SYM:
+            case EXTEND_SYM:
+            case CONTENT_SYM:
+            case IDENT:
+            case VARIABLE:
+            case HASH:
+            case MEDIA_SYM:
+            case KEY_FRAME_SYM:
+            case ATKEYWORD:
+                ifContentStatement();
+                break;
+            case FONT_FACE_SYM:
+                fontFace();
+                break;
+            default:
+                jj_la1[110] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+        }
+        jj_consume_token(RBRACE);
+        label_72: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[111] = jj_gen;
+                break label_72;
+            }
+            jj_consume_token(S);
+        }
+        label_73: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case ELSE_SYM:
+                ;
+                break;
+            default:
+                jj_la1[112] = jj_gen;
+                break label_73;
+            }
+            elseDirective();
+        }
+        documentHandler.endIfElseDirective();
+    }
+
+    final public void elseDirective() throws ParseException {
+        String evaluator = "";
+        Token n = null;
+        String s = null;
+        jj_consume_token(ELSE_SYM);
+        label_74: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[113] = jj_gen;
+                break label_74;
+            }
+            jj_consume_token(S);
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case IF:
+            jj_consume_token(IF);
+            label_75: while (true) {
+                s = booleanExpressionToken();
+                evaluator += s;
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                case EQ:
+                case PLUS:
+                case MINUS:
+                case PRECEDES:
+                case SUCCEEDS:
+                case DIV:
+                case ANY:
+                case LPARAN:
+                case RPARAN:
+                case COMPARE:
+                case OR:
+                case AND:
+                case NOT_EQ:
+                case IDENT:
+                case NUMBER:
+                case VARIABLE:
+                case CONTAINS:
+                    ;
+                    break;
+                default:
+                    jj_la1[114] = jj_gen;
+                    break label_75;
+                }
+            }
+            break;
+        default:
+            jj_la1[115] = jj_gen;
+            ;
+        }
+        jj_consume_token(LBRACE);
+        label_76: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[116] = jj_gen;
+                break label_76;
+            }
+            jj_consume_token(S);
+        }
+        if (!evaluator.trim().equals("")) {
+            documentHandler.ifDirective(evaluator);
+        } else {
+            documentHandler.elseDirective();
+        }
+        label_77: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case INTERPOLATION:
+            case INCLUDE_SYM:
+            case DEBUG_SYM:
+            case WARN_SYM:
+            case EACH_SYM:
+            case IF_SYM:
+            case EXTEND_SYM:
+            case CONTENT_SYM:
+            case IDENT:
+            case VARIABLE:
+            case HASH:
+            case MEDIA_SYM:
+            case FONT_FACE_SYM:
+            case KEY_FRAME_SYM:
+            case ATKEYWORD:
+                ;
+                break;
+            default:
+                jj_la1[117] = jj_gen;
+                break label_77;
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case INTERPOLATION:
+            case INCLUDE_SYM:
+            case DEBUG_SYM:
+            case WARN_SYM:
+            case EACH_SYM:
+            case IF_SYM:
+            case EXTEND_SYM:
+            case CONTENT_SYM:
+            case IDENT:
+            case VARIABLE:
+            case HASH:
+            case MEDIA_SYM:
+            case KEY_FRAME_SYM:
+            case ATKEYWORD:
+                ifContentStatement();
+                break;
+            case FONT_FACE_SYM:
+                fontFace();
+                break;
+            default:
+                jj_la1[118] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+        }
+        jj_consume_token(RBRACE);
+        label_78: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[119] = jj_gen;
+                break label_78;
+            }
+            jj_consume_token(S);
+        }
+    }
+
+    final public String booleanExpressionToken() throws ParseException {
+        Token n = null;
+        String s = null;
+        if (jj_2_4(2147483647)) {
+            s = containsDirective();
+        } else {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case VARIABLE:
+                n = jj_consume_token(VARIABLE);
+                break;
+            case IDENT:
+                n = jj_consume_token(IDENT);
+                break;
+            case NUMBER:
+                n = jj_consume_token(NUMBER);
+                break;
+            case LPARAN:
+                n = jj_consume_token(LPARAN);
+                break;
+            case RPARAN:
+                n = jj_consume_token(RPARAN);
+                break;
+            case PLUS:
+                n = jj_consume_token(PLUS);
+                break;
+            case MINUS:
+                n = jj_consume_token(MINUS);
+                break;
+            case DIV:
+                n = jj_consume_token(DIV);
+                break;
+            case ANY:
+                n = jj_consume_token(ANY);
+                break;
+            case COMPARE:
+                n = jj_consume_token(COMPARE);
+                break;
+            case EQ:
+                n = jj_consume_token(EQ);
+                break;
+            case PRECEDES:
+                n = jj_consume_token(PRECEDES);
+                break;
+            case SUCCEEDS:
+                n = jj_consume_token(SUCCEEDS);
+                break;
+            case OR:
+                n = jj_consume_token(OR);
+                break;
+            case AND:
+                n = jj_consume_token(AND);
+                break;
+            case S:
+                n = jj_consume_token(S);
+                break;
+            case NOT_EQ:
+                n = jj_consume_token(NOT_EQ);
+                break;
+            default:
+                jj_la1[120] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+        }
+        if (n != null) {
+            {
+                if (true) {
+                    return n.image;
+                }
+            }
+        } else {
+            {
+                if (true) {
+                    return s;
+                }
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public void eachDirective() throws ParseException {
+        Token var;
+        ArrayList<String> list = null;
+        String listVariable = null;
+        jj_consume_token(EACH_SYM);
+        label_79: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[121] = jj_gen;
+                break label_79;
+            }
+            jj_consume_token(S);
+        }
+        var = jj_consume_token(VARIABLE);
+        label_80: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[122] = jj_gen;
+                break label_80;
+            }
+            jj_consume_token(S);
+        }
+        jj_consume_token(EACH_IN);
+        label_81: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[123] = jj_gen;
+                break label_81;
+            }
+            jj_consume_token(S);
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case IDENT:
+            list = stringList();
+            documentHandler.startEachDirective(var.image, list);
+            break;
+        case VARIABLE:
+            listVariable = variableName();
+            documentHandler.startEachDirective(var.image, listVariable);
+            break;
+        default:
+            jj_la1[124] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        jj_consume_token(LBRACE);
+        label_82: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[125] = jj_gen;
+                break label_82;
+            }
+            jj_consume_token(S);
+        }
+        label_83: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case INTERPOLATION:
+            case INCLUDE_SYM:
+            case DEBUG_SYM:
+            case WARN_SYM:
+            case EACH_SYM:
+            case IF_SYM:
+            case EXTEND_SYM:
+            case CONTENT_SYM:
+            case IDENT:
+            case VARIABLE:
+            case HASH:
+            case MEDIA_SYM:
+            case KEY_FRAME_SYM:
+            case ATKEYWORD:
+                ;
+                break;
+            default:
+                jj_la1[126] = jj_gen;
+                break label_83;
+            }
+            ifContentStatement();
+        }
+        jj_consume_token(RBRACE);
+        label_84: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[127] = jj_gen;
+                break label_84;
+            }
+            jj_consume_token(S);
+        }
+        documentHandler.endEachDirective();
+    }
+
+    final public ArrayList<String> stringList() throws ParseException {
+        ArrayList<String> strings = new ArrayList<String>();
+        Token input;
+        input = jj_consume_token(IDENT);
+        label_85: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[128] = jj_gen;
+                break label_85;
+            }
+            jj_consume_token(S);
+        }
+        strings.add(input.image);
+        label_86: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case COMMA:
+                ;
+                break;
+            default:
+                jj_la1[129] = jj_gen;
+                break label_86;
+            }
+            jj_consume_token(COMMA);
+            label_87: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[130] = jj_gen;
+                    break label_87;
+                }
+                jj_consume_token(S);
+            }
+            input = jj_consume_token(IDENT);
+            strings.add(input.image);
+            label_88: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[131] = jj_gen;
+                    break label_88;
+                }
+                jj_consume_token(S);
+            }
+        }
+        {
+            if (true) {
+                return strings;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public void mixinDirective() throws ParseException {
+        String name;
+        ArrayList<VariableNode> args = null;
+        String body;
+        jj_consume_token(MIXIN_SYM);
+        label_89: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[132] = jj_gen;
+                break label_89;
+            }
+            jj_consume_token(S);
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case INTERPOLATION:
+        case IDENT:
+            name = property();
+            break;
+        case FUNCTION:
+            name = functionName();
+            args = arglist();
+            jj_consume_token(RPARAN);
+            label_90: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[133] = jj_gen;
+                    break label_90;
+                }
+                jj_consume_token(S);
+            }
+            break;
+        default:
+            jj_la1[134] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        jj_consume_token(LBRACE);
+        label_91: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[135] = jj_gen;
+                break label_91;
+            }
+            jj_consume_token(S);
+        }
+        documentHandler.startMixinDirective(name, args);
+        label_92: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case INTERPOLATION:
+            case INCLUDE_SYM:
+            case DEBUG_SYM:
+            case WARN_SYM:
+            case EACH_SYM:
+            case IF_SYM:
+            case EXTEND_SYM:
+            case CONTENT_SYM:
+            case IDENT:
+            case VARIABLE:
+            case HASH:
+            case MEDIA_SYM:
+            case PAGE_SYM:
+            case FONT_FACE_SYM:
+            case KEY_FRAME_SYM:
+            case ATKEYWORD:
+                ;
+                break;
+            default:
+                jj_la1[136] = jj_gen;
+                break label_92;
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case PRECEDES:
+            case SIBLING:
+            case LBRACKET:
+            case ANY:
+            case PARENT:
+            case DOT:
+            case COLON:
+            case INTERPOLATION:
+            case INCLUDE_SYM:
+            case DEBUG_SYM:
+            case WARN_SYM:
+            case EACH_SYM:
+            case IF_SYM:
+            case EXTEND_SYM:
+            case CONTENT_SYM:
+            case IDENT:
+            case VARIABLE:
+            case HASH:
+            case MEDIA_SYM:
+            case KEY_FRAME_SYM:
+            case ATKEYWORD:
+                ifContentStatement();
+                break;
+            case FONT_FACE_SYM:
+                fontFace();
+                break;
+            case PAGE_SYM:
+                page();
+                break;
+            default:
+                jj_la1[137] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+        }
+        jj_consume_token(RBRACE);
+        label_93: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[138] = jj_gen;
+                break label_93;
+            }
+            jj_consume_token(S);
+        }
+        documentHandler.endMixinDirective(name, args);
+    }
+
+    final public ArrayList<VariableNode> arglist() throws ParseException {
+        ArrayList<VariableNode> args = new ArrayList<VariableNode>();
+        VariableNode arg;
+        boolean hasNonOptionalArgument = false;
+        arg = mixinArg();
+        label_94: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case COMMA:
+                ;
+                break;
+            default:
+                jj_la1[139] = jj_gen;
+                break label_94;
+            }
+            jj_consume_token(COMMA);
+            label_95: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[140] = jj_gen;
+                    break label_95;
+                }
+                jj_consume_token(S);
+            }
+            hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg,
+                    hasNonOptionalArgument);
+            args.add(arg);
+            arg = mixinArg();
+        }
+        hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg,
+                hasNonOptionalArgument);
+        args.add(arg);
+        {
+            if (true) {
+                return args;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    boolean checkMixinForNonOptionalArguments(VariableNode arg,
+            boolean hasNonOptionalArguments) throws ParseException {
+        boolean currentArgHasArguments = arg.getExpr() != null
+                && arg.getExpr().getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE
+                && arg.getExpr().getNextLexicalUnit() != null;
+
+        if (currentArgHasArguments) {
+            if (hasNonOptionalArguments) {
+                throw new ParseException("Sass Error: Required argument $"
+                        + arg.getName()
+                        + " must come before any optional arguments.");
+            }
+            return hasNonOptionalArguments;
+        } else {
+            return true;
+        }
+    }
+
+    final public VariableNode mixinArg() throws ParseException {
+        String name;
+        Token variable = null;
+        LexicalUnitImpl first = null;
+        LexicalUnitImpl prev = null;
+        LexicalUnitImpl next = null;
+        name = variableName();
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case COLON:
+        case VARIABLE:
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case COLON:
+                jj_consume_token(COLON);
+                label_96: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[141] = jj_gen;
+                        break label_96;
+                    }
+                    jj_consume_token(S);
+                }
+                first = nonVariableTerm(null);
+                prev = first;
+                label_97: while (true) {
+                    if (jj_2_5(3)) {
+                        ;
+                    } else {
+                        break label_97;
+                    }
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case COMMA:
+                        jj_consume_token(COMMA);
+                        label_98: while (true) {
+                            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                            case S:
+                                ;
+                                break;
+                            default:
+                                jj_la1[142] = jj_gen;
+                                break label_98;
+                            }
+                            jj_consume_token(S);
+                        }
+                        break;
+                    default:
+                        jj_la1[143] = jj_gen;
+                        ;
+                    }
+                    prev = nonVariableTerm(prev);
+                }
+                break;
+            case VARIABLE:
+                variable = jj_consume_token(VARIABLE);
+                first = LexicalUnitImpl.createVariable(token.beginLine,
+                        token.beginColumn, prev, variable.image);
+                break;
+            default:
+                jj_la1[144] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            break;
+        default:
+            jj_la1[145] = jj_gen;
+            ;
+        }
+        VariableNode arg = new VariableNode(name, first, false);
+        {
+            if (true) {
+                return arg;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public ArrayList<LexicalUnitImpl> argValuelist()
+            throws ParseException {
+        ArrayList<LexicalUnitImpl> args = new ArrayList<LexicalUnitImpl>();
+        LexicalUnitImpl first = null;
+        LexicalUnitImpl next = null;
+        LexicalUnitImpl prev = null;
+        first = term(null);
+        args.add(first);
+        prev = first;
+        label_99: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case MINUS:
+            case DOT:
+            case COLON:
+            case TO:
+            case THROUGH:
+            case FROM:
+            case STRING:
+            case IDENT:
+            case NUMBER:
+            case URL:
+            case VARIABLE:
+            case PERCENTAGE:
+            case PT:
+            case MM:
+            case CM:
+            case PC:
+            case IN:
+            case PX:
+            case EMS:
+            case LEM:
+            case REM:
+            case EXS:
+            case DEG:
+            case RAD:
+            case GRAD:
+            case MS:
+            case SECOND:
+            case HZ:
+            case KHZ:
+            case DIMEN:
+            case HASH:
+            case UNICODERANGE:
+            case FUNCTION:
+                ;
+                break;
+            default:
+                jj_la1[146] = jj_gen;
+                break label_99;
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case COLON:
+                jj_consume_token(COLON);
+                label_100: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[147] = jj_gen;
+                        break label_100;
+                    }
+                    jj_consume_token(S);
+                }
+                break;
+            default:
+                jj_la1[148] = jj_gen;
+                ;
+            }
+            next = term(prev);
+            prev.setNextLexicalUnit(next);
+            prev = next;
+        }
+        label_101: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case COMMA:
+                ;
+                break;
+            default:
+                jj_la1[149] = jj_gen;
+                break label_101;
+            }
+            jj_consume_token(COMMA);
+            label_102: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[150] = jj_gen;
+                    break label_102;
+                }
+                jj_consume_token(S);
+            }
+            first = term(null);
+            args.add(first);
+            prev = first;
+            label_103: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case PLUS:
+                case MINUS:
+                case DOT:
+                case COLON:
+                case TO:
+                case THROUGH:
+                case FROM:
+                case STRING:
+                case IDENT:
+                case NUMBER:
+                case URL:
+                case VARIABLE:
+                case PERCENTAGE:
+                case PT:
+                case MM:
+                case CM:
+                case PC:
+                case IN:
+                case PX:
+                case EMS:
+                case LEM:
+                case REM:
+                case EXS:
+                case DEG:
+                case RAD:
+                case GRAD:
+                case MS:
+                case SECOND:
+                case HZ:
+                case KHZ:
+                case DIMEN:
+                case HASH:
+                case UNICODERANGE:
+                case FUNCTION:
+                    ;
+                    break;
+                default:
+                    jj_la1[151] = jj_gen;
+                    break label_103;
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case COLON:
+                    jj_consume_token(COLON);
+                    label_104: while (true) {
+                        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                        case S:
+                            ;
+                            break;
+                        default:
+                            jj_la1[152] = jj_gen;
+                            break label_104;
+                        }
+                        jj_consume_token(S);
+                    }
+                    break;
+                default:
+                    jj_la1[153] = jj_gen;
+                    ;
+                }
+                next = term(prev);
+                prev.setNextLexicalUnit(next);
+                prev = next;
+            }
+        }
+        {
+            if (true) {
+                return args;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public void includeDirective() throws ParseException {
+        String name;
+        ArrayList<LexicalUnitImpl> args = null;
+        jj_consume_token(INCLUDE_SYM);
+        label_105: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[154] = jj_gen;
+                break label_105;
+            }
+            jj_consume_token(S);
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case INTERPOLATION:
+        case IDENT:
+            name = property();
+            break;
+        case VARIABLE:
+            name = variableName();
+            name = "$" + name;
+            break;
+        case FUNCTION:
+            name = functionName();
+            args = argValuelist();
+            jj_consume_token(RPARAN);
+            label_106: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[155] = jj_gen;
+                    break label_106;
+                }
+                jj_consume_token(S);
+            }
+            break;
+        default:
+            jj_la1[156] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case SEMICOLON:
+            label_107: while (true) {
+                jj_consume_token(SEMICOLON);
+                label_108: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[157] = jj_gen;
+                        break label_108;
+                    }
+                    jj_consume_token(S);
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case SEMICOLON:
+                    ;
+                    break;
+                default:
+                    jj_la1[158] = jj_gen;
+                    break label_107;
+                }
+            }
+            documentHandler.includeDirective(name, args);
+            break;
+        case LBRACE:
+            jj_consume_token(LBRACE);
+            label_109: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[159] = jj_gen;
+                    break label_109;
+                }
+                jj_consume_token(S);
+            }
+            documentHandler.startIncludeContentBlock(name, args);
+            label_110: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case PLUS:
+                case PRECEDES:
+                case SIBLING:
+                case LBRACKET:
+                case ANY:
+                case PARENT:
+                case DOT:
+                case COLON:
+                case INTERPOLATION:
+                case TO:
+                case FROM:
+                case DEBUG_SYM:
+                case WARN_SYM:
+                case IDENT:
+                case PERCENTAGE:
+                case HASH:
+                    ;
+                    break;
+                default:
+                    jj_la1[160] = jj_gen;
+                    break label_110;
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case PLUS:
+                case PRECEDES:
+                case SIBLING:
+                case LBRACKET:
+                case ANY:
+                case PARENT:
+                case DOT:
+                case COLON:
+                case INTERPOLATION:
+                case DEBUG_SYM:
+                case WARN_SYM:
+                case IDENT:
+                case HASH:
+                    styleRuleOrDeclarationOrNestedProperties();
+                    break;
+                case TO:
+                case FROM:
+                case PERCENTAGE:
+                    keyframeSelector();
+                    break;
+                default:
+                    jj_la1[161] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+            }
+            jj_consume_token(RBRACE);
+            label_111: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[162] = jj_gen;
+                    break label_111;
+                }
+                jj_consume_token(S);
+            }
+            documentHandler.endIncludeContentBlock();
+            break;
+        default:
+            jj_la1[163] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+    }
+
+    final public String interpolation() throws ParseException {
+        Token n;
+        n = jj_consume_token(INTERPOLATION);
+        {
+            if (true) {
+                return n.image;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public void listModifyDirective() throws ParseException {
+        String list = null;
+        String remove = null;
+        String separator = null;
+        String variable = null;
+        Token n = null;
+        Token type = null;
+        // refactor, remove those 3 LOOKAHEAD(5).
+        n = jj_consume_token(VARIABLE);
+        variable = n.image;
+        label_112: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[164] = jj_gen;
+                break label_112;
+            }
+            jj_consume_token(S);
+        }
+        jj_consume_token(COLON);
+        label_113: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[165] = jj_gen;
+                break label_113;
+            }
+            jj_consume_token(S);
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case APPEND:
+            type = jj_consume_token(APPEND);
+            break;
+        case REMOVE:
+            type = jj_consume_token(REMOVE);
+            break;
+        case CONTAINS:
+            type = jj_consume_token(CONTAINS);
+            break;
+        default:
+            jj_la1[166] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        label_114: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[167] = jj_gen;
+                break label_114;
+            }
+            jj_consume_token(S);
+        }
+        list = listModifyDirectiveArgs(0);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case RPARAN:
+            jj_consume_token(RPARAN);
+            break;
+        default:
+            jj_la1[168] = jj_gen;
+            ;
+        }
+        jj_consume_token(COMMA);
+        label_115: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[169] = jj_gen;
+                break label_115;
+            }
+            jj_consume_token(S);
+        }
+        remove = listModifyDirectiveArgs(1);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case COMMA:
+            jj_consume_token(COMMA);
+            label_116: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[170] = jj_gen;
+                    break label_116;
+                }
+                jj_consume_token(S);
+            }
+            n = jj_consume_token(IDENT);
+            separator = n.image;
+            label_117: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[171] = jj_gen;
+                    break label_117;
+                }
+                jj_consume_token(S);
+            }
+            break;
+        default:
+            jj_la1[172] = jj_gen;
+            ;
+        }
+        jj_consume_token(RPARAN);
+        switch (type.kind) {
+        case APPEND:
+            documentHandler.appendDirective(variable, list, remove, separator);
+            break;
+        case REMOVE:
+            documentHandler.removeDirective(variable, list, remove, separator);
+            break;
+        case CONTAINS:
+            if (variable == null) {
+                variable = "$var_" + UUID.randomUUID();
+            }
+            documentHandler
+                    .containsDirective(variable, list, remove, separator);
+            break;
+        default:
+            break;
+        }
+        label_118: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[173] = jj_gen;
+                break label_118;
+            }
+            jj_consume_token(S);
+        }
+        jj_consume_token(SEMICOLON);
+        label_119: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[174] = jj_gen;
+                break label_119;
+            }
+            jj_consume_token(S);
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void appendDirective() throws ParseException {
+        String list = null;
+        String remove = null;
+        String separator = null;
+        String variable = null;
+        Token n = null;
+        n = jj_consume_token(VARIABLE);
+        variable = n.image;
+        label_120: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[175] = jj_gen;
+                break label_120;
+            }
+            jj_consume_token(S);
+        }
+        jj_consume_token(COLON);
+        label_121: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[176] = jj_gen;
+                break label_121;
+            }
+            jj_consume_token(S);
+        }
+        jj_consume_token(APPEND);
+        label_122: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[177] = jj_gen;
+                break label_122;
+            }
+            jj_consume_token(S);
+        }
+        list = listModifyDirectiveArgs(0);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case RPARAN:
+            jj_consume_token(RPARAN);
+            break;
+        default:
+            jj_la1[178] = jj_gen;
+            ;
+        }
+        jj_consume_token(COMMA);
+        label_123: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[179] = jj_gen;
+                break label_123;
+            }
+            jj_consume_token(S);
+        }
+        remove = listModifyDirectiveArgs(1);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case COMMA:
+            jj_consume_token(COMMA);
+            label_124: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[180] = jj_gen;
+                    break label_124;
+                }
+                jj_consume_token(S);
+            }
+            n = jj_consume_token(IDENT);
+            separator = n.image;
+            label_125: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[181] = jj_gen;
+                    break label_125;
+                }
+                jj_consume_token(S);
+            }
+            break;
+        default:
+            jj_la1[182] = jj_gen;
+            ;
+        }
+        jj_consume_token(RPARAN);
+        documentHandler.appendDirective(variable, list, remove, separator);
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void removeDirective() throws ParseException {
+        String list = null;
+        String remove = null;
+        String separator = null;
+        String variable = null;
+        Token n = null;
+        n = jj_consume_token(VARIABLE);
+        variable = n.image;
+        label_126: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[183] = jj_gen;
+                break label_126;
+            }
+            jj_consume_token(S);
+        }
+        jj_consume_token(COLON);
+        label_127: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[184] = jj_gen;
+                break label_127;
+            }
+            jj_consume_token(S);
+        }
+        jj_consume_token(REMOVE);
+        label_128: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[185] = jj_gen;
+                break label_128;
+            }
+            jj_consume_token(S);
+        }
+        list = listModifyDirectiveArgs(0);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case RPARAN:
+            jj_consume_token(RPARAN);
+            break;
+        default:
+            jj_la1[186] = jj_gen;
+            ;
+        }
+        jj_consume_token(COMMA);
+        label_129: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[187] = jj_gen;
+                break label_129;
+            }
+            jj_consume_token(S);
+        }
+        remove = listModifyDirectiveArgs(1);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case COMMA:
+            jj_consume_token(COMMA);
+            label_130: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[188] = jj_gen;
+                    break label_130;
+                }
+                jj_consume_token(S);
+            }
+            n = jj_consume_token(IDENT);
+            separator = n.image;
+            label_131: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[189] = jj_gen;
+                    break label_131;
+                }
+                jj_consume_token(S);
+            }
+            break;
+        default:
+            jj_la1[190] = jj_gen;
+            ;
+        }
+        jj_consume_token(RPARAN);
+        documentHandler.removeDirective(variable, list, remove, separator);
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public String containsDirective() throws ParseException {
+        String list = null;
+        String remove = null;
+        String separator = null;
+        String variable = null;
+        Token n = null;
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case VARIABLE:
+            n = jj_consume_token(VARIABLE);
+            variable = n.image;
+            label_132: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[191] = jj_gen;
+                    break label_132;
+                }
+                jj_consume_token(S);
+            }
+            jj_consume_token(COLON);
+            label_133: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[192] = jj_gen;
+                    break label_133;
+                }
+                jj_consume_token(S);
+            }
+            break;
+        default:
+            jj_la1[193] = jj_gen;
+            ;
+        }
+        jj_consume_token(CONTAINS);
+        label_134: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[194] = jj_gen;
+                break label_134;
+            }
+            jj_consume_token(S);
+        }
+        list = listModifyDirectiveArgs(0);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case RPARAN:
+            jj_consume_token(RPARAN);
+            break;
+        default:
+            jj_la1[195] = jj_gen;
+            ;
+        }
+        jj_consume_token(COMMA);
+        label_135: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[196] = jj_gen;
+                break label_135;
+            }
+            jj_consume_token(S);
+        }
+        remove = listModifyDirectiveArgs(1);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case COMMA:
+            jj_consume_token(COMMA);
+            label_136: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[197] = jj_gen;
+                    break label_136;
+                }
+                jj_consume_token(S);
+            }
+            n = jj_consume_token(IDENT);
+            separator = n.image;
+            label_137: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[198] = jj_gen;
+                    break label_137;
+                }
+                jj_consume_token(S);
+            }
+            break;
+        default:
+            jj_la1[199] = jj_gen;
+            ;
+        }
+        jj_consume_token(RPARAN);
+        /*
+         * if it is not in the form like
+         * "$contains : contains($items, .v-button);"for example in @if, like
+         * "@if (contains(a b c, b))", then create a tempvariable for contains(a
+         * b c, b);
+         */
+        if (variable == null) {
+            variable = "$var_" + UUID.randomUUID();
+        }
+        documentHandler.containsDirective(variable, list, remove, separator);
+        {
+            if (true) {
+                return variable;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    String listModifyDirectiveArgs(int nest) throws ParseException {
+        String list = "";
+        int nesting = nest;
+        Token t = null;
+
+        while (true) {
+            t = getToken(1);
+            String s = t.image;
+            if (t.kind == VARIABLE || t.kind == IDENT) {
+                list += s;
+            } else if (s.toLowerCase().equals("auto")
+                    || s.toLowerCase().equals("space")
+                    || s.toLowerCase().equals("comma")) {
+                int i = 2;
+                Token temp = getToken(i);
+                boolean isLast = true;
+                while (temp.kind != SEMICOLON) {
+                    if (temp.kind != RPARAN || temp.kind != S) {
+                        isLast = false;
+                    }
+                    i++;
+                    temp = getToken(i);
+                }
+
+                if (isLast) {
+                    return list;
+                }
+            } else if (t.kind == STRING) {
+                list += s.substring(1, s.length()).substring(0, s.length() - 2);
+
+            } else if (t.kind == LPARAN) {
+                nesting++;
+                if (nesting > nest + 1) {
+                    throw new CSSParseException(
+                            "Only one ( ) pair per parameter allowed",
+                            getLocator());
+                }
+            } else if (t.kind == RPARAN) {
+                nesting--;
+                if (nesting == 0) {
+                    return list;
+                }
+            } else if (t.kind == COMMA) {
+                if (nesting == nest) {
+                    return list;
+                } else {
+                    list += ",";
+                }
+
+            } else if (t.kind == S) {
+                list += " ";
+            } else if (t.kind == LBRACE) {
+                throw new CSSParseException("Invalid token,'{' found",
+                        getLocator());
+            }
+
+            getNextToken();
+        }
+    }
+
+    final public Node returnDirective() throws ParseException {
+        String raw;
+        raw = skipStatement();
+        {
+            if (true) {
+                return null;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public void debuggingDirective() throws ParseException {
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case DEBUG_SYM:
+            debugDirective();
+            break;
+        case WARN_SYM:
+            warnDirective();
+            break;
+        default:
+            jj_la1[200] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+    }
+
+    final public void debugDirective() throws ParseException {
+        jj_consume_token(DEBUG_SYM);
+        String content = skipStatementUntilSemiColon();
+        // TODO should evaluate the content expression, call
+        // documentHandler.debugDirective() etc.
+        System.out.println(content);
+        label_138: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[201] = jj_gen;
+                break label_138;
+            }
+            jj_consume_token(S);
+        }
+    }
+
+    final public void warnDirective() throws ParseException {
+        jj_consume_token(WARN_SYM);
+        String content = skipStatementUntilSemiColon();
+        // TODO should evaluate the content expression, call
+        // documentHandler.warnDirective() etc.
+        System.err.println(content);
+        label_139: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[202] = jj_gen;
+                break label_139;
+            }
+            jj_consume_token(S);
+        }
+    }
+
+    final public Node forDirective() throws ParseException {
+        String var;
+        String from;
+        String to;
+        boolean exclusive;
+        String body;
+        Token tok;
+        var = variableName();
+        int[] toThrough = { TO, THROUGH };
+        from = skipStatementUntil(toThrough);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case TO:
+            tok = jj_consume_token(TO);
+            exclusive = true;
+            break;
+        case THROUGH:
+            tok = jj_consume_token(THROUGH);
+            exclusive = false;
+            break;
+        default:
+            jj_la1[203] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        to = skipStatementUntilLeftBrace();
+        label_140: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[204] = jj_gen;
+                break label_140;
+            }
+            jj_consume_token(S);
+        }
+        body = skipStatement();
+        {
+            if (true) {
+                return documentHandler.forDirective(var, from, to, exclusive,
+                        body);
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public Node whileDirective() throws ParseException {
+        String condition;
+        String body;
+        condition = skipStatementUntilLeftBrace();
+        body = skipStatement();
+        {
+            if (true) {
+                return documentHandler.whileDirective(condition, body);
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public void extendDirective() throws ParseException {
+        ArrayList<String> list;
+        jj_consume_token(EXTEND_SYM);
+        label_141: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[205] = jj_gen;
+                break label_141;
+            }
+            jj_consume_token(S);
+        }
+        list = selectorList();
+        label_142: while (true) {
+            jj_consume_token(SEMICOLON);
+            label_143: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[206] = jj_gen;
+                    break label_143;
+                }
+                jj_consume_token(S);
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case SEMICOLON:
+                ;
+                break;
+            default:
+                jj_la1[207] = jj_gen;
+                break label_142;
+            }
+        }
+        documentHandler.extendDirective(list);
+    }
+
+    final public void contentDirective() throws ParseException {
+        jj_consume_token(CONTENT_SYM);
+        label_144: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[208] = jj_gen;
+                break label_144;
+            }
+            jj_consume_token(S);
+        }
+        label_145: while (true) {
+            jj_consume_token(SEMICOLON);
+            label_146: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[209] = jj_gen;
+                    break label_146;
+                }
+                jj_consume_token(S);
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case SEMICOLON:
+                ;
+                break;
+            default:
+                jj_la1[210] = jj_gen;
+                break label_145;
+            }
+        }
+        documentHandler.contentDirective();
+    }
+
+    Node importDirective() throws ParseException {
+        return null;
+    }
+
+    Node charsetDirective() throws ParseException {
+        return null;
+    }
+
+    Node mozDocumentDirective() throws ParseException {
+        return null;
+    }
+
+    Node supportsDirective() throws ParseException {
+        return null;
+    }
+
+    final public void nestedProperties() throws ParseException {
+        String name;
+        LexicalUnit exp;
+        name = property();
+        jj_consume_token(COLON);
+        label_147: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[211] = jj_gen;
+                break label_147;
+            }
+            jj_consume_token(S);
+        }
+        jj_consume_token(LBRACE);
+        label_148: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[212] = jj_gen;
+                break label_148;
+            }
+            jj_consume_token(S);
+        }
+        documentHandler.startNestedProperties(name);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case INTERPOLATION:
+        case IDENT:
+            declaration();
+            break;
+        default:
+            jj_la1[213] = jj_gen;
+            ;
+        }
+        label_149: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case SEMICOLON:
+                ;
+                break;
+            default:
+                jj_la1[214] = jj_gen;
+                break label_149;
+            }
+            jj_consume_token(SEMICOLON);
+            label_150: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[215] = jj_gen;
+                    break label_150;
+                }
+                jj_consume_token(S);
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case INTERPOLATION:
+            case IDENT:
+                declaration();
+                break;
+            default:
+                jj_la1[216] = jj_gen;
+                ;
+            }
+        }
+        jj_consume_token(RBRACE);
+        documentHandler.endNestedProperties(name);
+        label_151: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[217] = jj_gen;
+                break label_151;
+            }
+            jj_consume_token(S);
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void styleRuleOrDeclarationOrNestedProperties()
+            throws ParseException {
+        try {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case DEBUG_SYM:
+            case WARN_SYM:
+                debuggingDirective();
+                break;
+            default:
+                jj_la1[218] = jj_gen;
+                if (jj_2_6(2147483647)) {
+                    styleRule();
+                } else if (jj_2_7(3)) {
+                    declarationOrNestedProperties();
+                } else {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case PLUS:
+                    case PRECEDES:
+                    case SIBLING:
+                    case LBRACKET:
+                    case ANY:
+                    case PARENT:
+                    case DOT:
+                    case COLON:
+                    case INTERPOLATION:
+                    case IDENT:
+                    case HASH:
+                        styleRule();
+                        break;
+                    default:
+                        jj_la1[219] = jj_gen;
+                        jj_consume_token(-1);
+                        throw new ParseException();
+                    }
+                }
+            }
+        } catch (JumpException e) {
+            skipAfterExpression();
+            // reportWarningSkipText(getLocator(), skipAfterExpression());
+
+        } catch (ParseException e) {
+            if (errorHandler != null) {
+                if (e.currentToken != null) {
+                    LocatorImpl li = new LocatorImpl(this,
+                            e.currentToken.next.beginLine,
+                            e.currentToken.next.beginColumn - 1);
+                    reportError(li, e);
+                } else {
+                    reportError(getLocator(), e);
+                }
+                skipAfterExpression();
+                /*
+                 * LocatorImpl loc = (LocatorImpl) getLocator(); loc.column--;
+                 * reportWarningSkipText(loc, skipAfterExpression());
+                 */
+            } else {
+                skipAfterExpression();
+            }
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void declarationOrNestedProperties() throws ParseException {
+        boolean important = false;
+        String name;
+        LexicalUnitImpl exp;
+        Token save;
+        String comment = null;
+        try {
+            name = property();
+            save = token;
+            jj_consume_token(COLON);
+            label_152: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[220] = jj_gen;
+                    break label_152;
+                }
+                jj_consume_token(S);
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case MINUS:
+            case DOT:
+            case TO:
+            case THROUGH:
+            case FROM:
+            case STRING:
+            case IDENT:
+            case NUMBER:
+            case URL:
+            case VARIABLE:
+            case PERCENTAGE:
+            case PT:
+            case MM:
+            case CM:
+            case PC:
+            case IN:
+            case PX:
+            case EMS:
+            case LEM:
+            case REM:
+            case EXS:
+            case DEG:
+            case RAD:
+            case GRAD:
+            case MS:
+            case SECOND:
+            case HZ:
+            case KHZ:
+            case DIMEN:
+            case HASH:
+            case UNICODERANGE:
+            case FUNCTION:
+                exp = expr();
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case IMPORTANT_SYM:
+                    important = prio();
+                    break;
+                default:
+                    jj_la1[221] = jj_gen;
+                    ;
+                }
+                Token next = getToken(1);
+                if (next.kind == SEMICOLON || next.kind == RBRACE) {
+                    while (next.kind == SEMICOLON) {
+                        skipStatement();
+                        next = getToken(1);
+                    }
+                    // only add special token kept for sprites '/**'
+                    if (token.specialToken != null
+                            && token.specialToken != null
+                            && token.specialToken.image.startsWith("/**")) {
+                        documentHandler.property(name, exp, important,
+                                token.specialToken.image);
+                    } else {
+                        documentHandler.property(name, exp, important, null);
+                    }
+                }
+                break;
+            case LBRACE:
+                jj_consume_token(LBRACE);
+                label_153: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[222] = jj_gen;
+                        break label_153;
+                    }
+                    jj_consume_token(S);
+                }
+                documentHandler.startNestedProperties(name);
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case INTERPOLATION:
+                case IDENT:
+                    declaration();
+                    break;
+                default:
+                    jj_la1[223] = jj_gen;
+                    ;
+                }
+                label_154: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case SEMICOLON:
+                        ;
+                        break;
+                    default:
+                        jj_la1[224] = jj_gen;
+                        break label_154;
+                    }
+                    jj_consume_token(SEMICOLON);
+                    label_155: while (true) {
+                        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                        case S:
+                            ;
+                            break;
+                        default:
+                            jj_la1[225] = jj_gen;
+                            break label_155;
+                        }
+                        jj_consume_token(S);
+                    }
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case INTERPOLATION:
+                    case IDENT:
+                        declaration();
+                        break;
+                    default:
+                        jj_la1[226] = jj_gen;
+                        ;
+                    }
+                }
+                jj_consume_token(RBRACE);
+                label_156: while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                    case S:
+                        ;
+                        break;
+                    default:
+                        jj_la1[227] = jj_gen;
+                        break label_156;
+                    }
+                    jj_consume_token(S);
+                }
+                documentHandler.endNestedProperties(name);
+                break;
+            default:
+                jj_la1[228] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+        } catch (JumpException e) {
+            skipAfterExpression();
+            // reportWarningSkipText(getLocator(), skipAfterExpression());
+
+        } catch (NumberFormatException e) {
+            if (errorHandler != null) {
+                errorHandler.error(new CSSParseException("Invalid number "
+                        + e.getMessage(), getLocator(), e));
+            }
+            reportWarningSkipText(getLocator(), skipAfterExpression());
+        } catch (ParseException e) {
+            if (errorHandler != null) {
+                if (e.currentToken != null) {
+                    LocatorImpl li = new LocatorImpl(this,
+                            e.currentToken.next.beginLine,
+                            e.currentToken.next.beginColumn - 1);
+                    reportError(li, e);
+                } else {
+                    reportError(getLocator(), e);
+                }
+                skipAfterExpression();
+                /*
+                 * LocatorImpl loc = (LocatorImpl) getLocator(); loc.column--;
+                 * reportWarningSkipText(loc, skipAfterExpression());
+                 */
+            } else {
+                skipAfterExpression();
+            }
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public void declaration() throws ParseException {
+        boolean important = false;
+        String name;
+        LexicalUnit exp;
+        Token save;
+        try {
+            name = property();
+            save = token;
+            jj_consume_token(COLON);
+            label_157: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[229] = jj_gen;
+                    break label_157;
+                }
+                jj_consume_token(S);
+            }
+            exp = expr();
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case IMPORTANT_SYM:
+                important = prio();
+                break;
+            default:
+                jj_la1[230] = jj_gen;
+                ;
+            }
+            documentHandler.property(name, exp, important);
+        } catch (JumpException e) {
+            skipAfterExpression();
+            // reportWarningSkipText(getLocator(), skipAfterExpression());
+
+        } catch (NumberFormatException e) {
+            if (errorHandler != null) {
+                errorHandler.error(new CSSParseException("Invalid number "
+                        + e.getMessage(), getLocator(), e));
+            }
+            reportWarningSkipText(getLocator(), skipAfterExpression());
+        } catch (ParseException e) {
+            if (errorHandler != null) {
+                if (e.currentToken != null) {
+                    LocatorImpl li = new LocatorImpl(this,
+                            e.currentToken.next.beginLine,
+                            e.currentToken.next.beginColumn - 1);
+                    reportError(li, e);
+                } else {
+                    reportError(getLocator(), e);
+                }
+                skipAfterExpression();
+                /*
+                 * LocatorImpl loc = (LocatorImpl) getLocator(); loc.column--;
+                 * reportWarningSkipText(loc, skipAfterExpression());
+                 */
+            } else {
+                skipAfterExpression();
+            }
+        }
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public boolean prio() throws ParseException {
+        jj_consume_token(IMPORTANT_SYM);
+        label_158: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[231] = jj_gen;
+                break label_158;
+            }
+            jj_consume_token(S);
+        }
+        {
+            if (true) {
+                return true;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public boolean guarded() throws ParseException {
+        jj_consume_token(GUARDED_SYM);
+        label_159: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[232] = jj_gen;
+                break label_159;
+            }
+            jj_consume_token(S);
+        }
+        {
+            if (true) {
+                return true;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public LexicalUnitImpl operator(LexicalUnitImpl prev)
+            throws ParseException {
+        Token n;
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case COMMA:
+            /*
+             * (comments copied from basic_arithmetics.scss)supports: 1.
+             * standard arithmetic operations (+, -, *, /, %) 2. / is treated as
+             * css operator, unless one of its operands is variable or there is
+             * another binary arithmetic operatorlimits: 1. cannot mix
+             * arithmetic and css operations, e.g. "margin: 1px + 3px 2px" will
+             * fail 2. space between add and minus operator and their following
+             * operand is mandatory. e.g. "1 + 2" is valid, "1+2" is not 3.
+             * parenthesis is not supported now.
+             */
+            n = jj_consume_token(COMMA);
+            label_160: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[233] = jj_gen;
+                    break label_160;
+                }
+                jj_consume_token(S);
+            }
+            {
+                if (true) {
+                    return LexicalUnitImpl.createComma(n.beginLine,
+                            n.beginColumn, prev);
+                }
+            }
+            break;
+        case DIV:
+            n = jj_consume_token(DIV);
+            label_161: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[234] = jj_gen;
+                    break label_161;
+                }
+                jj_consume_token(S);
+            }
+            {
+                if (true) {
+                    return LexicalUnitImpl.createSlash(n.beginLine,
+                            n.beginColumn, prev);
+                }
+            }
+            break;
+        case ANY:
+            n = jj_consume_token(ANY);
+            label_162: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[235] = jj_gen;
+                    break label_162;
+                }
+                jj_consume_token(S);
+            }
+            {
+                if (true) {
+                    return LexicalUnitImpl.createMultiply(n.beginLine,
+                            n.beginColumn, prev);
+                }
+            }
+            break;
+        case MOD:
+            n = jj_consume_token(MOD);
+            label_163: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[236] = jj_gen;
+                    break label_163;
+                }
+                jj_consume_token(S);
+            }
+            {
+                if (true) {
+                    return LexicalUnitImpl.createModulo(n.beginLine,
+                            n.beginColumn, prev);
+                }
+            }
+            break;
+        case PLUS:
+            n = jj_consume_token(PLUS);
+            label_164: while (true) {
+                jj_consume_token(S);
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[237] = jj_gen;
+                    break label_164;
+                }
+            }
+            {
+                if (true) {
+                    return LexicalUnitImpl.createAdd(n.beginLine,
+                            n.beginColumn, prev);
+                }
+            }
+            break;
+        case MINUS:
+            n = jj_consume_token(MINUS);
+            label_165: while (true) {
+                jj_consume_token(S);
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[238] = jj_gen;
+                    break label_165;
+                }
+            }
+            {
+                if (true) {
+                    return LexicalUnitImpl.createMinus(n.beginLine,
+                            n.beginColumn, prev);
+                }
+            }
+            break;
+        default:
+            jj_la1[239] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public LexicalUnitImpl expr() throws ParseException {
+        LexicalUnitImpl first, res;
+        char op;
+        first = term(null);
+        res = first;
+        label_166: while (true) {
+            if (jj_2_8(2)) {
+                ;
+            } else {
+                break label_166;
+            }
+            if (jj_2_9(2)) {
+                res = operator(res);
+            } else {
+                ;
+            }
+            res = term(res);
+        }
+        {
+            if (true) {
+                return first;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public char unaryOperator() throws ParseException {
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case MINUS:
+            jj_consume_token(MINUS);
+            {
+                if (true) {
+                    return '-';
+                }
+            }
+            break;
+        case PLUS:
+            jj_consume_token(PLUS);
+            {
+                if (true) {
+                    return '+';
+                }
+            }
+            break;
+        default:
+            jj_la1[240] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public LexicalUnitImpl term(LexicalUnitImpl prev)
+            throws ParseException {
+        LexicalUnitImpl result = null;
+        Token n = null;
+        char op = ' ';
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case PLUS:
+        case MINUS:
+        case DOT:
+        case TO:
+        case THROUGH:
+        case FROM:
+        case STRING:
+        case IDENT:
+        case NUMBER:
+        case URL:
+        case PERCENTAGE:
+        case PT:
+        case MM:
+        case CM:
+        case PC:
+        case IN:
+        case PX:
+        case EMS:
+        case LEM:
+        case REM:
+        case EXS:
+        case DEG:
+        case RAD:
+        case GRAD:
+        case MS:
+        case SECOND:
+        case HZ:
+        case KHZ:
+        case DIMEN:
+        case HASH:
+        case UNICODERANGE:
+        case FUNCTION:
+            result = nonVariableTerm(prev);
+            break;
+        case VARIABLE:
+            result = variableTerm(prev);
+            break;
+        default:
+            jj_la1[241] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        {
+            if (true) {
+                return result;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public LexicalUnitImpl variableTerm(LexicalUnitImpl prev)
+            throws ParseException {
+        LexicalUnitImpl result = null;
+        String varName = "";
+        varName = variableName();
+        result = LexicalUnitImpl.createVariable(token.beginLine,
+                token.beginColumn, prev, varName);
+        {
+            if (true) {
+                return result;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public LexicalUnitImpl nonVariableTerm(LexicalUnitImpl prev)
+            throws ParseException {
+        LexicalUnitImpl result = null;
+        Token n = null;
+        char op = ' ';
+        String varName;
+        String s = "";
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case PLUS:
+        case MINUS:
+        case NUMBER:
+        case PERCENTAGE:
+        case PT:
+        case MM:
+        case CM:
+        case PC:
+        case IN:
+        case PX:
+        case EMS:
+        case LEM:
+        case REM:
+        case EXS:
+        case DEG:
+        case RAD:
+        case GRAD:
+        case MS:
+        case SECOND:
+        case HZ:
+        case KHZ:
+        case DIMEN:
+        case FUNCTION:
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case PLUS:
+            case MINUS:
+                op = unaryOperator();
+                break;
+            default:
+                jj_la1[242] = jj_gen;
+                ;
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case NUMBER:
+                n = jj_consume_token(NUMBER);
+                result = LexicalUnitImpl.createNumber(n.beginLine,
+                        n.beginColumn, prev, number(op, n, 0));
+                break;
+            case PERCENTAGE:
+                n = jj_consume_token(PERCENTAGE);
+                result = LexicalUnitImpl.createPercentage(n.beginLine,
+                        n.beginColumn, prev, number(op, n, 1));
+                break;
+            case PT:
+                n = jj_consume_token(PT);
+                result = LexicalUnitImpl.createPT(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case CM:
+                n = jj_consume_token(CM);
+                result = LexicalUnitImpl.createCM(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case MM:
+                n = jj_consume_token(MM);
+                result = LexicalUnitImpl.createMM(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case PC:
+                n = jj_consume_token(PC);
+                result = LexicalUnitImpl.createPC(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case IN:
+                n = jj_consume_token(IN);
+                result = LexicalUnitImpl.createIN(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case PX:
+                n = jj_consume_token(PX);
+                result = LexicalUnitImpl.createPX(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case EMS:
+                n = jj_consume_token(EMS);
+                result = LexicalUnitImpl.createEMS(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case LEM:
+                n = jj_consume_token(LEM);
+                result = LexicalUnitImpl.createLEM(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 3));
+                break;
+            case REM:
+                n = jj_consume_token(REM);
+                result = LexicalUnitImpl.createREM(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 3));
+                break;
+            case EXS:
+                n = jj_consume_token(EXS);
+                result = LexicalUnitImpl.createEXS(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case DEG:
+                n = jj_consume_token(DEG);
+                result = LexicalUnitImpl.createDEG(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 3));
+                break;
+            case RAD:
+                n = jj_consume_token(RAD);
+                result = LexicalUnitImpl.createRAD(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 3));
+                break;
+            case GRAD:
+                n = jj_consume_token(GRAD);
+                result = LexicalUnitImpl.createGRAD(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 3));
+                break;
+            case SECOND:
+                n = jj_consume_token(SECOND);
+                result = LexicalUnitImpl.createS(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 1));
+                break;
+            case MS:
+                n = jj_consume_token(MS);
+                result = LexicalUnitImpl.createMS(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case HZ:
+                n = jj_consume_token(HZ);
+                result = LexicalUnitImpl.createHZ(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 2));
+                break;
+            case KHZ:
+                n = jj_consume_token(KHZ);
+                result = LexicalUnitImpl.createKHZ(n.beginLine, n.beginColumn,
+                        prev, number(op, n, 3));
+                break;
+            case DIMEN:
+                n = jj_consume_token(DIMEN);
+                s = n.image;
+                int i = 0;
+                while (i < s.length()
+                        && (Character.isDigit(s.charAt(i)) || (s.charAt(i) == '.'))) {
+                    i++;
+                }
+
+                result = LexicalUnitImpl.createDimen(n.beginLine,
+                        n.beginColumn, prev, number(op, n, s.length() - i),
+                        s.substring(i));
+                break;
+            case FUNCTION:
+                result = function(op, prev);
+                break;
+            default:
+                jj_la1[243] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            break;
+        case DOT:
+        case TO:
+        case THROUGH:
+        case FROM:
+        case STRING:
+        case IDENT:
+        case URL:
+        case HASH:
+        case UNICODERANGE:
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case STRING:
+                n = jj_consume_token(STRING);
+                result = LexicalUnitImpl.createString(n.beginLine,
+                        n.beginColumn, prev,
+                        convertStringIndex(n.image, 1, n.image.length() - 1));
+                break;
+            case DOT:
+            case TO:
+            case THROUGH:
+            case FROM:
+            case IDENT:
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case DOT:
+                    jj_consume_token(DOT);
+                    s += ".";
+                    break;
+                default:
+                    jj_la1[244] = jj_gen;
+                    ;
+                }
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case IDENT:
+                    n = jj_consume_token(IDENT);
+                    break;
+                case TO:
+                    n = jj_consume_token(TO);
+                    break;
+                case THROUGH:
+                    n = jj_consume_token(THROUGH);
+                    break;
+                case FROM:
+                    n = jj_consume_token(FROM);
+                    break;
+                default:
+                    jj_la1[245] = jj_gen;
+                    jj_consume_token(-1);
+                    throw new ParseException();
+                }
+                s += convertIdent(n.image);
+                if ("inherit".equals(s)) {
+                    result = LexicalUnitImpl.createInherit(n.beginLine,
+                            n.beginColumn, prev);
+                } else {
+                    result = LexicalUnitImpl.createIdent(n.beginLine,
+                            n.beginColumn, prev, convertIdent(n.image));
+                }
+
+                /*
+                 * / Auto correction code used in the CSS Validator but must not
+                 * be used by a conformant CSS2 parser. Common error : H1 {
+                 * color : black background : white }
+                 * 
+                 * Token t = getToken(1); Token semicolon = new Token();
+                 * semicolon.kind = SEMICOLON; semicolon.image = ";"; if (t.kind
+                 * == COLON) { // @@SEEME. (generate a warning?) // @@SEEME if
+                 * expression is a single ident, generate an error ?
+                 * rejectToken(semicolon);
+                 * 
+                 * result = prev; } /
+                 */
+
+                break;
+            case HASH:
+                result = hexcolor(prev);
+                break;
+            case URL:
+                result = url(prev);
+                break;
+            case UNICODERANGE:
+                result = unicode(prev);
+                break;
+            default:
+                jj_la1[246] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+            }
+            break;
+        default:
+            jj_la1[247] = jj_gen;
+            jj_consume_token(-1);
+            throw new ParseException();
+        }
+        label_167: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[248] = jj_gen;
+                break label_167;
+            }
+            jj_consume_token(S);
+        }
+        {
+            if (true) {
+                return result;
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * Handle all CSS2 functions.
+     * 
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public LexicalUnitImpl function(char operator, LexicalUnitImpl prev)
+            throws ParseException {
+        Token n;
+        LexicalUnit params = null;
+        n = jj_consume_token(FUNCTION);
+        label_168: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[249] = jj_gen;
+                break label_168;
+            }
+            jj_consume_token(S);
+        }
+        String fname = convertIdent(n.image);
+        if ("alpha(".equals(fname)) {
+            String body = skipStatementUntilSemiColon();
+            {
+                if (true) {
+                    return LexicalUnitImpl.createIdent(n.beginLine,
+                            n.beginColumn, null, "alpha(" + body);
+                }
+            }
+        } else if ("expression(".equals(fname)) {
+            String body = skipStatementUntilSemiColon();
+            {
+                if (true) {
+                    return LexicalUnitImpl.createIdent(n.beginLine,
+                            n.beginColumn, null, "expression(" + body);
+                }
+            }
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case PLUS:
+        case MINUS:
+        case DOT:
+        case TO:
+        case THROUGH:
+        case FROM:
+        case STRING:
+        case IDENT:
+        case NUMBER:
+        case URL:
+        case VARIABLE:
+        case PERCENTAGE:
+        case PT:
+        case MM:
+        case CM:
+        case PC:
+        case IN:
+        case PX:
+        case EMS:
+        case LEM:
+        case REM:
+        case EXS:
+        case DEG:
+        case RAD:
+        case GRAD:
+        case MS:
+        case SECOND:
+        case HZ:
+        case KHZ:
+        case DIMEN:
+        case HASH:
+        case UNICODERANGE:
+        case FUNCTION:
+            params = expr();
+            break;
+        default:
+            jj_la1[250] = jj_gen;
+            ;
+        }
+        jj_consume_token(RPARAN);
+        if (operator != ' ') {
+            {
+                if (true) {
+                    throw new CSSParseException(
+                            "invalid operator before a function.", getLocator());
+                }
+            }
+        }
+        String f = convertIdent(n.image);
+        LexicalUnitImpl l = (LexicalUnitImpl) params;
+        boolean loop = true;
+        if ("rgb(".equals(f)) {
+            // this is a RGB declaration (e.g. rgb(255, 50%, 0) )
+            int i = 0;
+            while (loop && l != null && i < 5) {
+                switch (i) {
+                case 0:
+                case 2:
+                case 4:
+                    if ((l.getLexicalUnitType() != LexicalUnit.SAC_INTEGER)
+                            && (l.getLexicalUnitType() != LexicalUnit.SAC_PERCENTAGE)) {
+                        loop = false;
+                    }
+                    break;
+                case 1:
+                case 3:
+                    if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                        loop = false;
+                    }
+                    break;
+                default: {
+                    if (true) {
+                        throw new ParseException("implementation error");
+                    }
+                }
+                }
+                if (loop) {
+                    l = l.getNextLexicalUnit();
+                    i++;
+                }
+            }
+            if ((i == 5) && loop && (l == null)) {
+                {
+                    if (true) {
+                        return LexicalUnitImpl.createRGBColor(n.beginLine,
+                                n.beginColumn, prev, params);
+                    }
+                }
+            } else {
+                if (errorHandler != null) {
+                    String errorText;
+                    Locator loc;
+                    if (i < 5) {
+                        if (params == null) {
+                            loc = new LocatorImpl(this, n.beginLine,
+                                    n.beginColumn - 1);
+                            errorText = "not enough parameters.";
+                        } else if (l == null) {
+                            loc = new LocatorImpl(this, n.beginLine,
+                                    n.beginColumn - 1);
+                            errorText = "not enough parameters: "
+                                    + params.toString();
+                        } else {
+                            loc = new LocatorImpl(this, l.getLineNumber(),
+                                    l.getColumnNumber());
+                            errorText = "invalid parameter: " + l.toString();
+                        }
+                    } else {
+                        loc = new LocatorImpl(this, l.getLineNumber(),
+                                l.getColumnNumber());
+                        errorText = "too many parameters: " + l.toString();
+                    }
+                    errorHandler.error(new CSSParseException(errorText, loc));
+                }
+
+                {
+                    if (true) {
+                        throw new JumpException();
+                    }
+                }
+            }
+        } else if ("counter".equals(f)) {
+            int i = 0;
+            while (loop && l != null && i < 3) {
+                switch (i) {
+                case 0:
+                case 2:
+                    if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+                        loop = false;
+                    }
+                    break;
+                case 1:
+                    if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                        loop = false;
+                    }
+                    break;
+                default: {
+                    if (true) {
+                        throw new ParseException("implementation error");
+                    }
+                }
+                }
+                l = l.getNextLexicalUnit();
+                i++;
+            }
+            if (((i == 1) || (i == 3)) && loop && (l == null)) {
+                {
+                    if (true) {
+                        return LexicalUnitImpl.createCounter(n.beginLine,
+                                n.beginColumn, prev, params);
+                    }
+                }
+            }
+
+        } else if ("counters(".equals(f)) {
+
+            int i = 0;
+            while (loop && l != null && i < 5) {
+                switch (i) {
+                case 0:
+                case 4:
+                    if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+                        loop = false;
+                    }
+                    break;
+                case 2:
+                    if (l.getLexicalUnitType() != LexicalUnit.SAC_STRING_VALUE) {
+                        loop = false;
+                    }
+                    break;
+                case 1:
+                case 3:
+                    if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                        loop = false;
+                    }
+                    break;
+                default: {
+                    if (true) {
+                        throw new ParseException("implementation error");
+                    }
+                }
+                }
+                l = l.getNextLexicalUnit();
+                i++;
+            }
+            if (((i == 3) || (i == 5)) && loop && (l == null)) {
+                {
+                    if (true) {
+                        return LexicalUnitImpl.createCounters(n.beginLine,
+                                n.beginColumn, prev, params);
+                    }
+                }
+            }
+        } else if ("attr(".equals(f)) {
+            if ((l != null) && (l.getNextLexicalUnit() == null)
+                    && (l.getLexicalUnitType() == LexicalUnit.SAC_IDENT)) {
+                {
+                    if (true) {
+                        return LexicalUnitImpl.createAttr(l.getLineNumber(),
+                                l.getColumnNumber(), prev, l.getStringValue());
+                    }
+                }
+            }
+        } else if ("rect(".equals(f)) {
+            int i = 0;
+            while (loop && l != null && i < 7) {
+                switch (i) {
+                case 0:
+                case 2:
+                case 4:
+                case 6:
+                    switch (l.getLexicalUnitType()) {
+                    case LexicalUnit.SAC_INTEGER:
+                        if (l.getIntegerValue() != 0) {
+                            loop = false;
+                        }
+                        break;
+                    case LexicalUnit.SAC_IDENT:
+                        if (!l.getStringValue().equals("auto")) {
+                            loop = false;
+                        }
+                        break;
+                    case LexicalUnit.SAC_EM:
+                    case LexicalUnit.SAC_EX:
+                    case LexicalUnit.SAC_PIXEL:
+                    case LexicalUnit.SAC_CENTIMETER:
+                    case LexicalUnit.SAC_MILLIMETER:
+                    case LexicalUnit.SAC_INCH:
+                    case LexicalUnit.SAC_POINT:
+                    case LexicalUnit.SAC_PICA:
+                        // nothing
+                        break;
+                    default:
+                        loop = false;
+                    }
+                    break;
+                case 1:
+                case 3:
+                case 5:
+                    if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                        loop = false;
+                    }
+                    break;
+                default: {
+                    if (true) {
+                        throw new ParseException("implementation error");
+                    }
+                }
+                }
+                l = l.getNextLexicalUnit();
+                i++;
+            }
+            if ((i == 7) && loop && (l == null)) {
+                {
+                    if (true) {
+                        return LexicalUnitImpl.createRect(n.beginLine,
+                                n.beginColumn, prev, params);
+                    }
+                }
+            }
+        }
+        {
+            if (true) {
+                return LexicalUnitImpl.createFunction(n.beginLine,
+                        n.beginColumn, prev, f.substring(0, f.length() - 1),
+                        params);
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public LexicalUnitImpl unicode(LexicalUnitImpl prev)
+            throws ParseException {
+        Token n;
+        n = jj_consume_token(UNICODERANGE);
+        LexicalUnitImpl params = null;
+        String s = n.image.substring(2);
+        int index = s.indexOf('-');
+        if (index == -1) {
+            params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                    params, Integer.parseInt(s, 16));
+        } else {
+            String s1 = s.substring(0, index);
+            String s2 = s.substring(index);
+
+            params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                    params, Integer.parseInt(s1, 16));
+            params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                    params, Integer.parseInt(s2, 16));
+        }
+
+        {
+            if (true) {
+                return LexicalUnitImpl.createUnicodeRange(n.beginLine,
+                        n.beginColumn, prev, params);
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    final public LexicalUnitImpl url(LexicalUnitImpl prev)
+            throws ParseException {
+        Token n;
+        n = jj_consume_token(URL);
+        String urlname = n.image.substring(4, n.image.length() - 1).trim();
+        {
+            if (true) {
+                return LexicalUnitImpl.createURL(n.beginLine, n.beginColumn,
+                        prev, urlname);
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    /**
+     * @exception ParseException
+     *                exception during the parse
+     */
+    final public LexicalUnitImpl hexcolor(LexicalUnitImpl prev)
+            throws ParseException {
+        Token n;
+        n = jj_consume_token(HASH);
+        int r;
+        LexicalUnitImpl first, params = null;
+        String s = n.image.substring(1);
+
+        if (s.length() != 3 && s.length() != 6) {
+            first = null;
+            {
+                if (true) {
+                    throw new CSSParseException(
+                            "invalid hexadecimal notation for RGB: " + s,
+                            getLocator());
+                }
+            }
+        }
+        {
+            if (true) {
+                return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+                        prev, n.image);
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    float number(char operator, Token n, int lengthUnit) throws ParseException {
+        String image = n.image;
+        float f = 0;
+
+        if (lengthUnit != 0) {
+            image = image.substring(0, image.length() - lengthUnit);
+        }
+        f = Float.valueOf(image).floatValue();
+        return (operator == '-') ? -f : f;
+    }
+
+    String skipStatementUntilSemiColon() throws ParseException {
+        int[] semicolon = { SEMICOLON };
+        return skipStatementUntil(semicolon);
+    }
+
+    String skipStatementUntilLeftBrace() throws ParseException {
+        int[] lBrace = { LBRACE };
+        return skipStatementUntil(lBrace);
+    }
+
+    String skipStatementUntilMatchingRightParan() throws ParseException {
+        int[] leftTokens = { LPARAN, FUNCTION }; // a FUNCTION also contains "("
+        int[] rightTokens = { RPARAN };
+        StringBuffer s = new StringBuffer();
+        int difference = 1;
+        Token tok;
+        while (difference != 0) {
+            tok = getToken(1);
+            if (tok.kind == EOF) {
+                return null;
+            }
+            for (int sym : leftTokens) {
+                if (tok.kind == sym) {
+                    difference++;
+                }
+            }
+            for (int sym : rightTokens) {
+                if (tok.kind == sym) {
+                    difference--;
+                }
+            }
+            if (difference != 0) {
+                if (tok.image != null) {
+                    s.append(tok.image);
+                }
+                getNextToken();
+            }
+        }
+        return s.toString().trim();
+    }
+
+    String skipStatementUntil(int[] symbols) throws ParseException {
+        StringBuffer s = new StringBuffer();
+        boolean stop = false;
+        Token tok;
+        while (!stop) {
+            tok = getToken(1);
+            if (tok.kind == EOF) {
+                return null;
+            }
+            for (int sym : symbols) {
+                if (tok.kind == sym) {
+                    stop = true;
+                    break;
+                }
+            }
+            if (!stop) {
+                if (tok.image != null) {
+                    s.append(tok.image);
+                }
+                getNextToken();
+            }
+        }
+        return s.toString().trim();
+    }
+
+    String skipStatement() throws ParseException {
+        StringBuffer s = new StringBuffer();
+        Token tok = getToken(0);
+        if (tok.image != null) {
+            s.append(tok.image);
+        }
+        while (true) {
+            tok = getToken(1);
+            if (tok.kind == EOF) {
+                return null;
+            }
+            s.append(tok.image);
+            if (tok.kind == LBRACE) {
+                getNextToken();
+                s.append(skip_to_matching_brace());
+                getNextToken();
+                tok = getToken(1);
+                break;
+            } else if (tok.kind == RBRACE) {
+                getNextToken();
+                tok = getToken(1);
+                break;
+            } else if (tok.kind == SEMICOLON) {
+                getNextToken();
+                tok = getToken(1);
+                break;
+            }
+            getNextToken();
+        }
+
+        // skip white space
+        while (true) {
+            if (tok.kind != S) {
+                break;
+            }
+            tok = getNextToken();
+            tok = getToken(1);
+        }
+
+        return s.toString().trim();
+    }
+
+    String skip_to_matching_brace() throws ParseException {
+        StringBuffer s = new StringBuffer();
+        Token tok;
+        int nesting = 1;
+        while (true) {
+            tok = getToken(1);
+            if (tok.kind == EOF) {
+                break;
+            }
+            s.append(tok.image);
+            if (tok.kind == LBRACE) {
+                nesting++;
+            } else if (tok.kind == RBRACE) {
+                nesting--;
+                if (nesting == 0) {
+                    break;
+                }
+            }
+            getNextToken();
+        }
+        return s.toString();
+    }
+
+    String convertStringIndex(String s, int start, int len)
+            throws ParseException {
+        StringBuffer buf = new StringBuffer(len);
+        int index = start;
+
+        while (index < len) {
+            char c = s.charAt(index);
+            if (c == '\u005c\u005c') {
+                if (++index < len) {
+                    c = s.charAt(index);
+                    switch (c) {
+                    case '0':
+                    case '1':
+                    case '2':
+                    case '3':
+                    case '4':
+                    case '5':
+                    case '6':
+                    case '7':
+                    case '8':
+                    case '9':
+                    case 'a':
+                    case 'b':
+                    case 'c':
+                    case 'd':
+                    case 'e':
+                    case 'f':
+                    case 'A':
+                    case 'B':
+                    case 'C':
+                    case 'D':
+                    case 'E':
+                    case 'F':
+                        buf.append('\u005c\u005c');
+                        while (index < len) {
+                            buf.append(s.charAt(index++));
+                        }
+                        break;
+                    case '\u005cn':
+                    case '\u005cf':
+                        break;
+                    case '\u005cr':
+                        if (index + 1 < len) {
+                            if (s.charAt(index + 1) == '\u005cn') {
+                                index++;
+                            }
+                        }
+                        break;
+                    default:
+                        buf.append(c);
+                    }
+                } else {
+                    throw new CSSParseException("invalid string " + s,
+                            getLocator());
+                }
+            } else {
+                buf.append(c);
+            }
+            index++;
+        }
+
+        return buf.toString();
+    }
+
+    String convertIdent(String s) throws ParseException {
+        return convertStringIndex(s, 0, s.length());
+    }
+
+    String convertString(String s) throws ParseException {
+        return convertStringIndex(s, 0, s.length());
+    }
+
+    void comments() throws ParseException {
+        /*
+         * keeps only the multiple line comments, single line comments are
+         * skipped
+         */
+        if (token.specialToken != null && token.specialToken.image != null
+                && token.specialToken.image.startsWith("/*")) {
+            Token tmp_t = token.specialToken;
+            while (tmp_t.specialToken != null) {
+                tmp_t = tmp_t.specialToken;
+            }
+            while (tmp_t != null) {
+                documentHandler.comment(tmp_t.image);
+                tmp_t = tmp_t.next;
+            }
+        }
+    }
+
+    void rejectToken(Token t) throws ParseException {
+        Token fakeToken = new Token();
+        t.next = token;
+        fakeToken.next = t;
+        token = fakeToken;
+    }
+
+    String skipAfterExpression() throws ParseException {
+        Token t = getToken(1);
+        StringBuffer s = new StringBuffer();
+        s.append(getToken(0).image);
+
+        while ((t.kind != RBRACE) && (t.kind != SEMICOLON) && (t.kind != EOF)) {
+            s.append(t.image);
+            getNextToken();
+            t = getToken(1);
+        }
+
+        return s.toString();
+    }
+
+    /**
+     * The following functions are useful for a DOM CSS implementation only and
+     * are not part of the general CSS2 parser.
+     */
+    // TODO required by original parser but not used by Vaadin?
+    final public void _parseRule() throws ParseException {
+        String ret = null;
+        label_169: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[251] = jj_gen;
+                break label_169;
+            }
+            jj_consume_token(S);
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case IMPORT_SYM:
+            importDeclaration();
+            break;
+        case DEBUG_SYM:
+        case WARN_SYM:
+            debuggingDirective();
+            break;
+        case PLUS:
+        case PRECEDES:
+        case SIBLING:
+        case LBRACKET:
+        case ANY:
+        case PARENT:
+        case DOT:
+        case COLON:
+        case INTERPOLATION:
+        case IDENT:
+        case HASH:
+            styleRule();
+            break;
+        case MEDIA_SYM:
+            media();
+            break;
+        case PAGE_SYM:
+            page();
+            break;
+        case FONT_FACE_SYM:
+            fontFace();
+            break;
+        default:
+            jj_la1[252] = jj_gen;
+            ret = skipStatement();
+            if ((ret == null) || (ret.length() == 0)) {
+                {
+                    if (true) {
+                        return;
+                    }
+                }
+            }
+            if (ret.charAt(0) == '@') {
+                documentHandler.unrecognizedRule(ret);
+            } else {
+                {
+                    if (true) {
+                        throw new CSSParseException("unrecognize rule: " + ret,
+                                getLocator());
+                    }
+                }
+            }
+        }
+    }
+
+    final public void _parseImportRule() throws ParseException {
+        label_170: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[253] = jj_gen;
+                break label_170;
+            }
+            jj_consume_token(S);
+        }
+        importDeclaration();
+    }
+
+    final public void _parseMediaRule() throws ParseException {
+        label_171: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[254] = jj_gen;
+                break label_171;
+            }
+            jj_consume_token(S);
+        }
+        media();
+    }
+
+    final public void _parseDeclarationBlock() throws ParseException {
+        label_172: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case S:
+                ;
+                break;
+            default:
+                jj_la1[255] = jj_gen;
+                break label_172;
+            }
+            jj_consume_token(S);
+        }
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+        case INTERPOLATION:
+        case IDENT:
+            declaration();
+            break;
+        default:
+            jj_la1[256] = jj_gen;
+            ;
+        }
+        label_173: while (true) {
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case SEMICOLON:
+                ;
+                break;
+            default:
+                jj_la1[257] = jj_gen;
+                break label_173;
+            }
+            jj_consume_token(SEMICOLON);
+            label_174: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[258] = jj_gen;
+                    break label_174;
+                }
+                jj_consume_token(S);
+            }
+            switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case INTERPOLATION:
+            case IDENT:
+                declaration();
+                break;
+            default:
+                jj_la1[259] = jj_gen;
+                ;
+            }
+        }
+    }
+
+    final public ArrayList<String> _parseSelectors() throws ParseException {
+        ArrayList<String> p = null;
+        try {
+            label_175: while (true) {
+                switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                case S:
+                    ;
+                    break;
+                default:
+                    jj_la1[260] = jj_gen;
+                    break label_175;
+                }
+                jj_consume_token(S);
+            }
+            p = selectorList();
+            {
+                if (true) {
+                    return p;
+                }
+            }
+        } catch (ThrowedParseException e) {
+            {
+                if (true) {
+                    throw (ParseException) e.e.fillInStackTrace();
+                }
+            }
+        }
+        throw new Error("Missing return statement in function");
+    }
+
+    private boolean jj_2_1(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        try {
+            return !jj_3_1();
+        } catch (LookaheadSuccess ls) {
+            return true;
+        } finally {
+            jj_save(0, xla);
+        }
+    }
+
+    private boolean jj_2_2(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        try {
+            return !jj_3_2();
+        } catch (LookaheadSuccess ls) {
+            return true;
+        } finally {
+            jj_save(1, xla);
+        }
+    }
+
+    private boolean jj_2_3(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        try {
+            return !jj_3_3();
+        } catch (LookaheadSuccess ls) {
+            return true;
+        } finally {
+            jj_save(2, xla);
+        }
+    }
+
+    private boolean jj_2_4(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        try {
+            return !jj_3_4();
+        } catch (LookaheadSuccess ls) {
+            return true;
+        } finally {
+            jj_save(3, xla);
+        }
+    }
+
+    private boolean jj_2_5(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        try {
+            return !jj_3_5();
+        } catch (LookaheadSuccess ls) {
+            return true;
+        } finally {
+            jj_save(4, xla);
+        }
+    }
+
+    private boolean jj_2_6(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        try {
+            return !jj_3_6();
+        } catch (LookaheadSuccess ls) {
+            return true;
+        } finally {
+            jj_save(5, xla);
+        }
+    }
+
+    private boolean jj_2_7(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        try {
+            return !jj_3_7();
+        } catch (LookaheadSuccess ls) {
+            return true;
+        } finally {
+            jj_save(6, xla);
+        }
+    }
+
+    private boolean jj_2_8(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        try {
+            return !jj_3_8();
+        } catch (LookaheadSuccess ls) {
+            return true;
+        } finally {
+            jj_save(7, xla);
+        }
+    }
+
+    private boolean jj_2_9(int xla) {
+        jj_la = xla;
+        jj_lastpos = jj_scanpos = token;
+        try {
+            return !jj_3_9();
+        } catch (LookaheadSuccess ls) {
+            return true;
+        } finally {
+            jj_save(8, xla);
+        }
+    }
+
+    private boolean jj_3R_209() {
+        if (jj_scan_token(MINUS)) {
+            return true;
+        }
+        Token xsp;
+        if (jj_scan_token(1)) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_188() {
+        if (jj_3R_210()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_208() {
+        if (jj_scan_token(PLUS)) {
+            return true;
+        }
+        Token xsp;
+        if (jj_scan_token(1)) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_207() {
+        if (jj_scan_token(MOD)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_206() {
+        if (jj_scan_token(ANY)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_205() {
+        if (jj_scan_token(DIV)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_204() {
+        if (jj_scan_token(COMMA)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_185() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_204()) {
+            jj_scanpos = xsp;
+            if (jj_3R_205()) {
+                jj_scanpos = xsp;
+                if (jj_3R_206()) {
+                    jj_scanpos = xsp;
+                    if (jj_3R_207()) {
+                        jj_scanpos = xsp;
+                        if (jj_3R_208()) {
+                            jj_scanpos = xsp;
+                            if (jj_3R_209()) {
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_212() {
+        if (jj_3R_211()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_211() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_scan_token(18)) {
+            jj_scanpos = xsp;
+            if (jj_scan_token(22)) {
+                jj_scanpos = xsp;
+                if (jj_scan_token(23)) {
+                    return true;
+                }
+            }
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_191() {
+        if (jj_scan_token(S)) {
+            return true;
+        }
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_212()) {
+            jj_scanpos = xsp;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_210() {
+        if (jj_scan_token(GUARDED_SYM)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_176() {
+        if (jj_3R_186()) {
+            return true;
+        }
+        if (jj_scan_token(COLON)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        if (jj_3R_187()) {
+            return true;
+        }
+        xsp = jj_scanpos;
+        if (jj_3R_188()) {
+            jj_scanpos = xsp;
+        }
+        if (jj_3R_189()) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_189()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_190() {
+        if (jj_3R_211()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_177() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_190()) {
+            jj_scanpos = xsp;
+            if (jj_3R_191()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_194() {
+        if (jj_scan_token(VARIABLE)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        if (jj_scan_token(COLON)) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_179() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_194()) {
+            jj_scanpos = xsp;
+        }
+        if (jj_scan_token(CONTAINS)) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        if (true) {
+            jj_la = 0;
+            jj_scanpos = jj_lastpos;
+            return false;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_262() {
+        if (jj_scan_token(HASH)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_279() {
+        if (jj_scan_token(IDENT)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_280() {
+        if (jj_scan_token(FUNCTION)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        if (true) {
+            jj_la = 0;
+            jj_scanpos = jj_lastpos;
+            return false;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_278() {
+        if (jj_scan_token(COLON)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_265() {
+        if (jj_scan_token(COLON)) {
+            return true;
+        }
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_278()) {
+            jj_scanpos = xsp;
+        }
+        xsp = jj_scanpos;
+        if (jj_3R_279()) {
+            jj_scanpos = xsp;
+            if (jj_3R_280()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3_7() {
+        if (jj_3R_183()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_201() {
+        if (jj_scan_token(LBRACE)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_290() {
+        if (jj_scan_token(STRING)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_288() {
+        if (jj_scan_token(STARMATCH)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_287() {
+        if (jj_scan_token(DOLLARMATCH)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_289() {
+        if (jj_scan_token(IDENT)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_286() {
+        if (jj_scan_token(CARETMATCH)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_285() {
+        if (jj_scan_token(DASHMATCH)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_284() {
+        if (jj_scan_token(INCLUDES)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_270() {
+        if (jj_scan_token(INTERPOLATION)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_283() {
+        if (jj_scan_token(EQ)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_200() {
+        if (jj_3R_187()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_277() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_283()) {
+            jj_scanpos = xsp;
+            if (jj_3R_284()) {
+                jj_scanpos = xsp;
+                if (jj_3R_285()) {
+                    jj_scanpos = xsp;
+                    if (jj_3R_286()) {
+                        jj_scanpos = xsp;
+                        if (jj_3R_287()) {
+                            jj_scanpos = xsp;
+                            if (jj_3R_288()) {
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        xsp = jj_scanpos;
+        if (jj_3R_289()) {
+            jj_scanpos = xsp;
+            if (jj_3R_290()) {
+                return true;
+            }
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3_6() {
+        if (jj_3R_182()) {
+            return true;
+        }
+        if (jj_scan_token(LBRACE)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_264() {
+        if (jj_scan_token(LBRACKET)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        if (jj_scan_token(IDENT)) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        xsp = jj_scanpos;
+        if (jj_3R_277()) {
+            jj_scanpos = xsp;
+        }
+        if (jj_scan_token(RBRACKET)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_183() {
+        if (jj_3R_199()) {
+            return true;
+        }
+        if (jj_scan_token(COLON)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        xsp = jj_scanpos;
+        if (jj_3R_200()) {
+            jj_scanpos = xsp;
+            if (jj_3R_201()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_282() {
+        if (jj_scan_token(INTERPOLATION)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_268() {
+        if (jj_3R_187()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_248() {
+        if (jj_scan_token(PARENT)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_247() {
+        if (jj_scan_token(ANY)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_261() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_269()) {
+            jj_scanpos = xsp;
+            if (jj_3R_270()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_269() {
+        if (jj_scan_token(IDENT)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_213() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_246()) {
+            jj_scanpos = xsp;
+            if (jj_3R_247()) {
+                jj_scanpos = xsp;
+                if (jj_3R_248()) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_246() {
+        Token xsp;
+        if (jj_3R_261()) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_261()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_254() {
+        if (jj_scan_token(FUNCTION)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        xsp = jj_scanpos;
+        if (jj_3R_268()) {
+            jj_scanpos = xsp;
+        }
+        if (jj_scan_token(RPARAN)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_180() {
+        if (jj_scan_token(COMMA)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_241() {
+        if (jj_3R_258()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_276() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_281()) {
+            jj_scanpos = xsp;
+            if (jj_3R_282()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_281() {
+        if (jj_scan_token(IDENT)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_240() {
+        if (jj_3R_257()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_239() {
+        if (jj_3R_256()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3_5() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_180()) {
+            jj_scanpos = xsp;
+        }
+        if (jj_3R_181()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_263() {
+        if (jj_scan_token(DOT)) {
+            return true;
+        }
+        Token xsp;
+        if (jj_3R_276()) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_276()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_252() {
+        if (jj_3R_265()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_275() {
+        if (jj_3R_265()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_273() {
+        if (jj_3R_263()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_250() {
+        if (jj_3R_263()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_251() {
+        if (jj_3R_264()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_274() {
+        if (jj_3R_264()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_255() {
+        if (jj_scan_token(DOT)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_271() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_272()) {
+            jj_scanpos = xsp;
+            if (jj_3R_273()) {
+                jj_scanpos = xsp;
+                if (jj_3R_274()) {
+                    jj_scanpos = xsp;
+                    if (jj_3R_275()) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_272() {
+        if (jj_3R_262()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_238() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_255()) {
+            jj_scanpos = xsp;
+        }
+        xsp = jj_scanpos;
+        if (jj_scan_token(72)) {
+            jj_scanpos = xsp;
+            if (jj_scan_token(49)) {
+                jj_scanpos = xsp;
+                if (jj_scan_token(50)) {
+                    jj_scanpos = xsp;
+                    if (jj_scan_token(52)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_237() {
+        if (jj_scan_token(STRING)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_214() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_249()) {
+            jj_scanpos = xsp;
+            if (jj_3R_250()) {
+                jj_scanpos = xsp;
+                if (jj_3R_251()) {
+                    jj_scanpos = xsp;
+                    if (jj_3R_252()) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_249() {
+        if (jj_3R_262()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_236() {
+        if (jj_3R_254()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_196() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_237()) {
+            jj_scanpos = xsp;
+            if (jj_3R_238()) {
+                jj_scanpos = xsp;
+                if (jj_3R_239()) {
+                    jj_scanpos = xsp;
+                    if (jj_3R_240()) {
+                        jj_scanpos = xsp;
+                        if (jj_3R_241()) {
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_193() {
+        Token xsp;
+        if (jj_3R_214()) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_214()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_192() {
+        if (jj_3R_213()) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_271()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_178() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_192()) {
+            jj_scanpos = xsp;
+            if (jj_3R_193()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_243() {
+        if (jj_3R_211()) {
+            return true;
+        }
+        if (jj_3R_178()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_235() {
+        if (jj_scan_token(DIMEN)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_234() {
+        if (jj_scan_token(KHZ)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_233() {
+        if (jj_scan_token(HZ)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_232() {
+        if (jj_scan_token(MS)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_231() {
+        if (jj_scan_token(SECOND)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_230() {
+        if (jj_scan_token(GRAD)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_229() {
+        if (jj_scan_token(RAD)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_228() {
+        if (jj_scan_token(DEG)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_227() {
+        if (jj_scan_token(EXS)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_226() {
+        if (jj_scan_token(REM)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3_2() {
+        if (jj_3R_177()) {
+            return true;
+        }
+        if (jj_3R_178()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_225() {
+        if (jj_scan_token(LEM)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_224() {
+        if (jj_scan_token(EMS)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_198() {
+        if (jj_scan_token(COMMA)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        if (jj_3R_197()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_242() {
+        if (jj_3R_178()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_223() {
+        if (jj_scan_token(PX)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_222() {
+        if (jj_scan_token(IN)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_197() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_242()) {
+            jj_scanpos = xsp;
+            if (jj_3R_243()) {
+                return true;
+            }
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3_2()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_221() {
+        if (jj_scan_token(PC)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_220() {
+        if (jj_scan_token(MM)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_219() {
+        if (jj_scan_token(CM)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_218() {
+        if (jj_scan_token(PT)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_217() {
+        if (jj_scan_token(PERCENTAGE)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_203() {
+        if (jj_3R_245()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3_1() {
+        if (jj_3R_176()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_182() {
+        if (jj_3R_197()) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_198()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_216() {
+        if (jj_scan_token(NUMBER)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_215() {
+        if (jj_3R_253()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_195() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_215()) {
+            jj_scanpos = xsp;
+        }
+        xsp = jj_scanpos;
+        if (jj_3R_216()) {
+            jj_scanpos = xsp;
+            if (jj_3R_217()) {
+                jj_scanpos = xsp;
+                if (jj_3R_218()) {
+                    jj_scanpos = xsp;
+                    if (jj_3R_219()) {
+                        jj_scanpos = xsp;
+                        if (jj_3R_220()) {
+                            jj_scanpos = xsp;
+                            if (jj_3R_221()) {
+                                jj_scanpos = xsp;
+                                if (jj_3R_222()) {
+                                    jj_scanpos = xsp;
+                                    if (jj_3R_223()) {
+                                        jj_scanpos = xsp;
+                                        if (jj_3R_224()) {
+                                            jj_scanpos = xsp;
+                                            if (jj_3R_225()) {
+                                                jj_scanpos = xsp;
+                                                if (jj_3R_226()) {
+                                                    jj_scanpos = xsp;
+                                                    if (jj_3R_227()) {
+                                                        jj_scanpos = xsp;
+                                                        if (jj_3R_228()) {
+                                                            jj_scanpos = xsp;
+                                                            if (jj_3R_229()) {
+                                                                jj_scanpos = xsp;
+                                                                if (jj_3R_230()) {
+                                                                    jj_scanpos = xsp;
+                                                                    if (jj_3R_231()) {
+                                                                        jj_scanpos = xsp;
+                                                                        if (jj_3R_232()) {
+                                                                            jj_scanpos = xsp;
+                                                                            if (jj_3R_233()) {
+                                                                                jj_scanpos = xsp;
+                                                                                if (jj_3R_234()) {
+                                                                                    jj_scanpos = xsp;
+                                                                                    if (jj_3R_235()) {
+                                                                                        jj_scanpos = xsp;
+                                                                                        if (jj_3R_236()) {
+                                                                                            return true;
+                                                                                        }
+                                                                                    }
+                                                                                }
+                                                                            }
+                                                                        }
+                                                                    }
+                                                                }
+                                                            }
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_181() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_195()) {
+            jj_scanpos = xsp;
+            if (jj_3R_196()) {
+                return true;
+            }
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_256() {
+        if (jj_scan_token(HASH)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3_4() {
+        if (jj_3R_179()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_245() {
+        if (jj_3R_186()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_257() {
+        if (jj_scan_token(URL)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_202() {
+        if (jj_3R_181()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_260() {
+        if (jj_scan_token(INTERPOLATION)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_184() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_202()) {
+            jj_scanpos = xsp;
+            if (jj_3R_203()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3_9() {
+        if (jj_3R_185()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3_3() {
+        if (jj_3R_176()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_267() {
+        if (jj_scan_token(PLUS)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_253() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_266()) {
+            jj_scanpos = xsp;
+            if (jj_3R_267()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_266() {
+        if (jj_scan_token(MINUS)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_258() {
+        if (jj_scan_token(UNICODERANGE)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3_8() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3_9()) {
+            jj_scanpos = xsp;
+        }
+        if (jj_3R_184()) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_186() {
+        if (jj_scan_token(VARIABLE)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_189() {
+        if (jj_scan_token(SEMICOLON)) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_187() {
+        if (jj_3R_184()) {
+            return true;
+        }
+        Token xsp;
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3_8()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_244() {
+        Token xsp;
+        xsp = jj_scanpos;
+        if (jj_3R_259()) {
+            jj_scanpos = xsp;
+            if (jj_3R_260()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean jj_3R_259() {
+        if (jj_scan_token(IDENT)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean jj_3R_199() {
+        Token xsp;
+        if (jj_3R_244()) {
+            return true;
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_3R_244()) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        while (true) {
+            xsp = jj_scanpos;
+            if (jj_scan_token(1)) {
+                jj_scanpos = xsp;
+                break;
+            }
+        }
+        return false;
+    }
+
+    /** Generated Token Manager. */
+    public ParserTokenManager token_source;
+    /** Current token. */
+    public Token token;
+    /** Next token. */
+    public Token jj_nt;
+    private int jj_ntk;
+    private Token jj_scanpos, jj_lastpos;
+    private int jj_la;
+    private int jj_gen;
+    final private int[] jj_la1 = new int[261];
+    static private int[] jj_la1_0;
+    static private int[] jj_la1_1;
+    static private int[] jj_la1_2;
+    static private int[] jj_la1_3;
+    static {
+        jj_la1_init_0();
+        jj_la1_init_1();
+        jj_la1_init_2();
+        jj_la1_init_3();
+    }
+
+    private static void jj_la1_init_0() {
+        jj_la1_0 = new int[] { 0x0, 0x302, 0x302, 0x0, 0x300, 0x2, 0x2, 0x2,
+                0xd4c40000, 0x0, 0x300, 0x2, 0x300, 0x2, 0x0, 0x2, 0x2, 0x2,
+                0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0, 0x2, 0x100000, 0x2,
+                0x0, 0x2, 0x2, 0xd4c40000, 0xd4c40000, 0x2, 0x2, 0x2,
+                0xd4fd1500, 0xd4fd1500, 0x2, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0,
+                0x200000, 0x2, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0x200000, 0x2,
+                0x0, 0x2, 0x391500, 0xc40000, 0xc40002, 0xc40000, 0x2, 0x2,
+                0x80120002, 0x80120002, 0x2, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2,
+                0xd4c40000, 0xd4c40000, 0x2, 0x100000, 0x2, 0xd4c40000, 0x2,
+                0x84000000, 0x84000000, 0x84000000, 0x84000000, 0xd4000000,
+                0x0, 0x0, 0x0, 0x0, 0x50000000, 0x2, 0x2, 0x3f000, 0x2, 0x0,
+                0x2, 0x3f000, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x200000, 0x0,
+                0xd4c40000, 0x0, 0x134e0002, 0x2, 0xd4c40000, 0xd4c40000, 0x2,
+                0x0, 0x2, 0x134e0002, 0x0, 0x2, 0xd4c40000, 0xd4c40000, 0x2,
+                0x134e0002, 0x2, 0x2, 0x2, 0x0, 0x2, 0xd4c40000, 0x2, 0x2,
+                0x100000, 0x2, 0x2, 0x2, 0x2, 0x0, 0x2, 0xd4c40000, 0xd4c40000,
+                0x2, 0x100000, 0x2, 0x2, 0x2, 0x100000, 0x0, 0x0, 0x800c0000,
+                0x2, 0x0, 0x100000, 0x2, 0x800c0000, 0x2, 0x0, 0x2, 0x2, 0x0,
+                0x2, 0x200000, 0x2, 0xd4c40000, 0xd4c40000, 0x2, 0x200400, 0x2,
+                0x2, 0x0, 0x2, 0x0, 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x2,
+                0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x2, 0x0,
+                0x2, 0x2, 0x2, 0x100000, 0x2, 0x2, 0x0, 0x2, 0x0, 0x2, 0x2,
+                0x2, 0x100000, 0x0, 0x2, 0x2, 0x0, 0x2, 0x2, 0x2, 0x200000,
+                0x2, 0x2, 0x200000, 0x2, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2,
+                0x0, 0xd4c40000, 0x2, 0x0, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2,
+                0x800c0400, 0x2, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2,
+                0x321c0000, 0xc0000, 0x800c0000, 0xc0000, 0x0, 0x80000000, 0x0,
+                0x80000000, 0x800c0000, 0x2, 0x2, 0x800c0000, 0x2, 0xd4c40000,
+                0x2, 0x2, 0x2, 0x0, 0x200000, 0x2, 0x0, 0x2, };
+    }
+
+    private static void jj_la1_init_1() {
+        jj_la1_1 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x566000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80,
+                0x80, 0x0, 0x0, 0x120000, 0x120000, 0x0, 0x120000, 0x0, 0x0,
+                0x0, 0x120000, 0x0, 0x0, 0x564000c0, 0x564000c0, 0x0, 0x0, 0x0,
+                0x60001c0, 0x60001c0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x80, 0x0,
+                0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0,
+                0x100, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc2, 0xc2, 0x0, 0x80, 0x80,
+                0x0, 0x0, 0x0, 0x0, 0x564000c0, 0x564000c0, 0x0, 0x0, 0x0,
+                0xc0, 0x0, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80, 0x80, 0x80,
+                0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x50000000, 0x64000c0, 0x50000000, 0x3f,
+                0x0, 0x564000c0, 0x564000c0, 0x0, 0x80000000, 0x0, 0x3f, 0x0,
+                0x0, 0x564000c0, 0x564000c0, 0x0, 0x3f, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x564000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0,
+                0x564000c0, 0x564000c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40,
+                0x40, 0x160040, 0x0, 0x40, 0x0, 0x0, 0x160040, 0x0, 0x40, 0x0,
+                0x0, 0x80, 0x0, 0x0, 0x0, 0x61200c0, 0x61200c0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0,
+                0x6000000, 0x0, 0x0, 0x60000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, 0x6000000, 0xc0, 0x0,
+                0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, 0x160000, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x160000, 0x0,
+                0x0, 0x0, 0x160000, 0x160000, 0x160000, 0x0, 0x0, 0x160000,
+                0x0, 0x60000c0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x80, 0x0, };
+    }
+
+    private static void jj_la1_init_2() {
+        jj_la1_2 = new int[] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100,
+                0x1000, 0x0, 0x0, 0x0, 0x0, 0x880, 0x0, 0x0, 0x0, 0x100, 0x100,
+                0x0, 0x0, 0x2008, 0x2008, 0x0, 0x2000, 0x0, 0x0, 0x0, 0x2000,
+                0x0, 0x0, 0x1119, 0x1119, 0x0, 0x0, 0x0, 0x2b80, 0x2b80, 0x0,
+                0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0,
+                0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x2a80, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x380, 0x380, 0x0, 0x100, 0x100, 0x0, 0x0, 0x0, 0x0,
+                0x1119, 0x1119, 0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x100, 0x100, 0x100, 0x100, 0x100, 0x100, 0x0, 0x0, 0x0, 0x0,
+                0x180, 0x0, 0x0, 0x0, 0x0, 0x100, 0x0, 0x40, 0x0, 0x0, 0x0,
+                0x109, 0x1000, 0x1300, 0x0, 0x1109, 0x1109, 0x0, 0x0, 0x0,
+                0x1300, 0x20, 0x0, 0x1109, 0x1109, 0x0, 0x1300, 0x0, 0x0, 0x0,
+                0x1100, 0x0, 0x1109, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x100,
+                0x0, 0x1109, 0x1109, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1000,
+                0x1000, 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0xfffffb80, 0x0, 0x0,
+                0x0, 0x0, 0x1100, 0x0, 0x0, 0x0, 0x2100, 0x2100, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x1000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, 0x0, 0x0, 0x100,
+                0x0, 0x0, 0x100, 0x0, 0xfffffb80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfffffb80, 0x0, 0xffffe200, 0x0,
+                0x100, 0x980, 0xffffeb80, 0x0, 0x0, 0xfffffb80, 0x0, 0x100,
+                0x0, 0x0, 0x0, 0x100, 0x0, 0x0, 0x100, 0x0, };
+    }
+
+    private static void jj_la1_init_3() {
+        jj_la1_3 = new int[] { 0x8, 0x80, 0x80, 0x2, 0x80, 0x0, 0x0, 0x0, 0x75,
+                0x0, 0x80, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5,
+                0xc5, 0x0, 0x0, 0x0, 0xc401bf, 0xc401bf, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0xc401be, 0x0, 0x0, 0x0, 0x0, 0x0, 0x400000,
+                0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc7, 0xc7, 0x0,
+                0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x400000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x80, 0x200000, 0x0,
+                0xe5, 0xe5, 0x0, 0x0, 0x0, 0x200000, 0x0, 0x0, 0xe5, 0xe5, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x400000, 0x0, 0xf5, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x440001, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0,
+                0x0, 0x0, 0x0, 0x400000, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0,
+                0x0, 0x0, 0x380000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x100, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x100, 0x0, 0x0, 0x0,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x440001, 0x0, 0x400000,
+                0x0, 0x0, 0x40001, 0x440001, 0x0, 0x0, 0x440001, 0x0, 0x37,
+                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, };
+    }
+
+    final private JJCalls[] jj_2_rtns = new JJCalls[9];
+    private boolean jj_rescan = false;
+    private int jj_gc = 0;
+
+    /** Constructor with user supplied CharStream. */
+    public Parser(CharStream stream) {
+        token_source = new ParserTokenManager(stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 261; i++) {
+            jj_la1[i] = -1;
+        }
+        for (int i = 0; i < jj_2_rtns.length; i++) {
+            jj_2_rtns[i] = new JJCalls();
+        }
+    }
+
+    /** Reinitialise. */
+    public void ReInit(CharStream stream) {
+        token_source.ReInit(stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 261; i++) {
+            jj_la1[i] = -1;
+        }
+        for (int i = 0; i < jj_2_rtns.length; i++) {
+            jj_2_rtns[i] = new JJCalls();
+        }
+    }
+
+    /** Constructor with generated Token Manager. */
+    public Parser(ParserTokenManager tm) {
+        token_source = tm;
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 261; i++) {
+            jj_la1[i] = -1;
+        }
+        for (int i = 0; i < jj_2_rtns.length; i++) {
+            jj_2_rtns[i] = new JJCalls();
+        }
+    }
+
+    /** Reinitialise. */
+    public void ReInit(ParserTokenManager tm) {
+        token_source = tm;
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 261; i++) {
+            jj_la1[i] = -1;
+        }
+        for (int i = 0; i < jj_2_rtns.length; i++) {
+            jj_2_rtns[i] = new JJCalls();
+        }
+    }
+
+    private Token jj_consume_token(int kind) throws ParseException {
+        Token oldToken;
+        if ((oldToken = token).next != null) {
+            token = token.next;
+        } else {
+            token = token.next = token_source.getNextToken();
+        }
+        jj_ntk = -1;
+        if (token.kind == kind) {
+            jj_gen++;
+            if (++jj_gc > 100) {
+                jj_gc = 0;
+                for (int i = 0; i < jj_2_rtns.length; i++) {
+                    JJCalls c = jj_2_rtns[i];
+                    while (c != null) {
+                        if (c.gen < jj_gen) {
+                            c.first = null;
+                        }
+                        c = c.next;
+                    }
+                }
+            }
+            return token;
+        }
+        token = oldToken;
+        jj_kind = kind;
+        throw generateParseException();
+    }
+
+    static private final class LookaheadSuccess extends java.lang.Error {
+    }
+
+    final private LookaheadSuccess jj_ls = new LookaheadSuccess();
+
+    private boolean jj_scan_token(int kind) {
+        if (jj_scanpos == jj_lastpos) {
+            jj_la--;
+            if (jj_scanpos.next == null) {
+                jj_lastpos = jj_scanpos = jj_scanpos.next = token_source
+                        .getNextToken();
+            } else {
+                jj_lastpos = jj_scanpos = jj_scanpos.next;
+            }
+        } else {
+            jj_scanpos = jj_scanpos.next;
+        }
+        if (jj_rescan) {
+            int i = 0;
+            Token tok = token;
+            while (tok != null && tok != jj_scanpos) {
+                i++;
+                tok = tok.next;
+            }
+            if (tok != null) {
+                jj_add_error_token(kind, i);
+            }
+        }
+        if (jj_scanpos.kind != kind) {
+            return true;
+        }
+        if (jj_la == 0 && jj_scanpos == jj_lastpos) {
+            throw jj_ls;
+        }
+        return false;
+    }
+
+    /** Get the next Token. */
+    final public Token getNextToken() {
+        if (token.next != null) {
+            token = token.next;
+        } else {
+            token = token.next = token_source.getNextToken();
+        }
+        jj_ntk = -1;
+        jj_gen++;
+        return token;
+    }
+
+    /** Get the specific Token. */
+    final public Token getToken(int index) {
+        Token t = token;
+        for (int i = 0; i < index; i++) {
+            if (t.next != null) {
+                t = t.next;
+            } else {
+                t = t.next = token_source.getNextToken();
+            }
+        }
+        return t;
+    }
+
+    private int jj_ntk() {
+        if ((jj_nt = token.next) == null) {
+            return (jj_ntk = (token.next = token_source.getNextToken()).kind);
+        } else {
+            return (jj_ntk = jj_nt.kind);
+        }
+    }
+
+    private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
+    private int[] jj_expentry;
+    private int jj_kind = -1;
+    private int[] jj_lasttokens = new int[100];
+    private int jj_endpos;
+
+    private void jj_add_error_token(int kind, int pos) {
+        if (pos >= 100) {
+            return;
+        }
+        if (pos == jj_endpos + 1) {
+            jj_lasttokens[jj_endpos++] = kind;
+        } else if (jj_endpos != 0) {
+            jj_expentry = new int[jj_endpos];
+            for (int i = 0; i < jj_endpos; i++) {
+                jj_expentry[i] = jj_lasttokens[i];
+            }
+            jj_entries_loop: for (java.util.Iterator<?> it = jj_expentries
+                    .iterator(); it.hasNext();) {
+                int[] oldentry = (int[]) (it.next());
+                if (oldentry.length == jj_expentry.length) {
+                    for (int i = 0; i < jj_expentry.length; i++) {
+                        if (oldentry[i] != jj_expentry[i]) {
+                            continue jj_entries_loop;
+                        }
+                    }
+                    jj_expentries.add(jj_expentry);
+                    break jj_entries_loop;
+                }
+            }
+            if (pos != 0) {
+                jj_lasttokens[(jj_endpos = pos) - 1] = kind;
+            }
+        }
+    }
+
+    /** Generate ParseException. */
+    public ParseException generateParseException() {
+        jj_expentries.clear();
+        boolean[] la1tokens = new boolean[120];
+        if (jj_kind >= 0) {
+            la1tokens[jj_kind] = true;
+            jj_kind = -1;
+        }
+        for (int i = 0; i < 261; i++) {
+            if (jj_la1[i] == jj_gen) {
+                for (int j = 0; j < 32; j++) {
+                    if ((jj_la1_0[i] & (1 << j)) != 0) {
+                        la1tokens[j] = true;
+                    }
+                    if ((jj_la1_1[i] & (1 << j)) != 0) {
+                        la1tokens[32 + j] = true;
+                    }
+                    if ((jj_la1_2[i] & (1 << j)) != 0) {
+                        la1tokens[64 + j] = true;
+                    }
+                    if ((jj_la1_3[i] & (1 << j)) != 0) {
+                        la1tokens[96 + j] = true;
+                    }
+                }
+            }
+        }
+        for (int i = 0; i < 120; i++) {
+            if (la1tokens[i]) {
+                jj_expentry = new int[1];
+                jj_expentry[0] = i;
+                jj_expentries.add(jj_expentry);
+            }
+        }
+        jj_endpos = 0;
+        jj_rescan_token();
+        jj_add_error_token(0, 0);
+        int[][] exptokseq = new int[jj_expentries.size()][];
+        for (int i = 0; i < jj_expentries.size(); i++) {
+            exptokseq[i] = jj_expentries.get(i);
+        }
+        return new ParseException(token, exptokseq, tokenImage);
+    }
+
+    /** Enable tracing. */
+    final public void enable_tracing() {
+    }
+
+    /** Disable tracing. */
+    final public void disable_tracing() {
+    }
+
+    private void jj_rescan_token() {
+        jj_rescan = true;
+        for (int i = 0; i < 9; i++) {
+            try {
+                JJCalls p = jj_2_rtns[i];
+                do {
+                    if (p.gen > jj_gen) {
+                        jj_la = p.arg;
+                        jj_lastpos = jj_scanpos = p.first;
+                        switch (i) {
+                        case 0:
+                            jj_3_1();
+                            break;
+                        case 1:
+                            jj_3_2();
+                            break;
+                        case 2:
+                            jj_3_3();
+                            break;
+                        case 3:
+                            jj_3_4();
+                            break;
+                        case 4:
+                            jj_3_5();
+                            break;
+                        case 5:
+                            jj_3_6();
+                            break;
+                        case 6:
+                            jj_3_7();
+                            break;
+                        case 7:
+                            jj_3_8();
+                            break;
+                        case 8:
+                            jj_3_9();
+                            break;
+                        }
+                    }
+                    p = p.next;
+                } while (p != null);
+            } catch (LookaheadSuccess ls) {
+            }
+        }
+        jj_rescan = false;
+    }
+
+    private void jj_save(int index, int xla) {
+        JJCalls p = jj_2_rtns[index];
+        while (p.gen > jj_gen) {
+            if (p.next == null) {
+                p = p.next = new JJCalls();
+                break;
+            }
+            p = p.next;
+        }
+        p.gen = jj_gen + xla - jj_la;
+        p.first = token;
+        p.arg = xla;
+    }
+
+    static final class JJCalls {
+        int gen;
+        Token first;
+        int arg;
+        JJCalls next;
+    }
+
 }
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj b/theme-compiler/src/com/vaadin/sass/internal/parser/Parser.jj
new file mode 100644 (file)
index 0000000..5fb7f23
--- /dev/null
@@ -0,0 +1,3028 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed 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.
+ */
+/* -*-java-extended-*-
+ * Copyright (c) 1999 World Wide Web Consortium
+ * (Massachusetts Institute of Technology, Institut National de Recherche
+ *  en Informatique et en Automatique, Keio University).
+ * All Rights Reserved. http://www.w3.org/Consortium/Legal/
+ *
+ * $Id: Parser.jj,v 1.15 2000/10/27 21:09:37 plehegar Exp $
+ */
+
+options {
+    IGNORE_CASE  = true;
+    STATIC = false;
+    USER_CHAR_STREAM = true;
+    /* DEBUG_TOKEN_MANAGER = true;
+       DEBUG_PARSER = true; */
+}
+
+PARSER_BEGIN(Parser)
+
+package com.vaadin.sass.internal.parser;
+
+import java.io.*;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
+
+import org.w3c.css.sac.ConditionFactory;
+import org.w3c.css.sac.Condition;
+import org.w3c.css.sac.SelectorFactory;
+import org.w3c.css.sac.SelectorList;
+import org.w3c.css.sac.Selector;
+import org.w3c.css.sac.SimpleSelector;
+import org.w3c.css.sac.DocumentHandler;
+import org.w3c.css.sac.InputSource;
+import org.w3c.css.sac.ErrorHandler;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
+import org.w3c.css.sac.Locator;
+import org.w3c.css.sac.LexicalUnit;
+
+import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
+import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
+
+import org.w3c.flute.util.Encoding;
+
+import com.vaadin.sass.internal.handler.*;
+
+import com.vaadin.sass.internal.tree.*;
+
+/**
+ * A CSS2 parser
+ *
+ * @author Philippe Le H�garet
+ * @version $Revision: 1.15 $
+ */
+public class Parser implements org.w3c.css.sac.Parser {
+
+    // replaces all \t, \n, etc with this StringBuffer.
+    static final StringBuilder SPACE = new StringBuilder(" ");
+
+    // the document handler for the parser
+    protected SCSSDocumentHandlerImpl documentHandler;
+    // the error handler for the parser
+    protected ErrorHandler errorHandler;
+    // the input source for the parser
+    protected InputSource source;
+
+    protected ConditionFactory conditionFactory;
+    protected SelectorFactory selectorFactory;
+
+    // temporary place holder for pseudo-element ...
+    private String pseudoElt;
+    
+    /**
+     * Creates a new Parser
+     */
+    public Parser() {
+       this((CharStream) null);
+    }
+
+    /**
+     * @@TODO
+     * @exception CSSException Not yet implemented
+     */    
+    public void setLocale(Locale locale) throws CSSException {
+       throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR);
+    }
+    
+    public InputSource getInputSource(){
+        return source;
+    }
+
+    /**
+     * Set the document handler for this parser
+     */    
+    public void setDocumentHandler(DocumentHandler handler) {
+       this.documentHandler = (SCSSDocumentHandlerImpl) handler;
+    }
+
+    public void setSelectorFactory(SelectorFactory selectorFactory) {
+       this.selectorFactory = selectorFactory;
+    }
+
+    public void setConditionFactory(ConditionFactory conditionFactory) {
+       this.conditionFactory = conditionFactory;
+    }
+
+    /**
+     * Set the error handler for this parser
+     */    
+    public void setErrorHandler(ErrorHandler error) {
+       this.errorHandler = error;
+    }
+    
+    /**
+     * Main parse methods
+     *
+     * @param source the source of the style sheet.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */
+    public void parseStyleSheet(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+
+       parserUnit();
+    }
+
+    /**
+     * Convenient method for URIs.
+     *
+     * @param systemId the fully resolved URI of the style sheet.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */    
+    public void parseStyleSheet(String systemId) 
+           throws CSSException, IOException {
+       parseStyleSheet(new InputSource(systemId));
+    }
+
+    /**
+     * This method parses only one rule (style rule or at-rule, except @charset).
+     *
+     * @param source the source of the rule.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */    
+    // TODO required by original parser but not used by Vaadin?
+    public void parseRule(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+       _parseRule();
+    }
+
+    /**
+     * This method parses a style declaration (including the surrounding curly
+     * braces).
+     *
+     * @param source the source of the style declaration.
+     * @exception IOException the source can't be parsed.
+     * @exception CSSException the source is not CSS valid.
+     */
+    public void parseStyleDeclaration(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+       _parseDeclarationBlock();
+    }
+
+    /**
+     * This methods returns "http://www.w3.org/TR/REC-CSS2".
+     * @return the string "http://www.w3.org/TR/REC-CSS2".
+     */    
+    public String getParserVersion() {
+       return "http://www.w3.org/TR/REC-CSS2";
+    }
+
+    /**
+     * Parse methods used by DOM Level 2 implementation.
+     */    
+    public void parseImportRule(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+       _parseImportRule();
+    }
+
+    public void parseMediaRule(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       if (selectorFactory == null) {
+           selectorFactory = new SelectorFactoryImpl();
+       }
+       if (conditionFactory == null) {
+           conditionFactory = new ConditionFactoryImpl();
+       }
+       _parseMediaRule();
+    }
+
+    public SelectorList parseSelectors(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       return null;
+    }
+
+    public LexicalUnit parsePropertyValue(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       return expr();
+    }
+
+    public boolean parsePriority(InputSource source) 
+           throws CSSException, IOException {
+       this.source = source;
+       ReInit(getCharStreamWithLurk(source));
+
+       return prio();
+    }
+
+    /**
+     * Convert the source into a Reader. Used only by DOM Level 2 parser methods.
+     */    
+    private Reader getReader(InputSource source) throws IOException {
+       if (source.getCharacterStream() != null) {
+           return source.getCharacterStream();
+       } else if (source.getByteStream() != null) {
+           // My DOM level 2 implementation doesn't use this case.
+           if (source.getEncoding() == null) {
+               // unknown encoding, use ASCII as default.
+               return new InputStreamReader(source.getByteStream(), "ASCII");
+           } else {
+               return new InputStreamReader(source.getByteStream(), 
+                                            source.getEncoding());
+           }
+       } else {
+           // systemId
+           // @@TODO
+           throw new CSSException("not yet implemented");
+       }
+    }
+
+    /**
+     * Convert the source into a CharStream with encoding informations.
+     * The encoding can be found in the InputSource or in the CSS document.
+     * Since this method marks the reader and make a reset after looking for
+     * the charset declaration, you'll find the charset declaration into the
+     * stream.  
+     */
+    private CharStream getCharStreamWithLurk(InputSource source)
+           throws CSSException, IOException {
+       if (source.getCharacterStream() != null) {
+           // all encoding are supposed to be resolved by the user
+           // return the reader
+           return new Generic_CharStream(source.getCharacterStream(), 1, 1);
+       } else if (source.getByteStream() == null) {
+           // @@CONTINUE ME. see also getReader() with systemId
+           try {
+               source.setByteStream(new URL(source.getURI()).openStream());
+           } catch (Exception e) {
+               try {
+                   source.setByteStream(new FileInputStream(source.getURI()));
+               } catch (IOException ex) {
+                   throw new CSSException("invalid url ?");
+               }
+           }
+       }
+       //use UTF-8 as the default encoding.
+       String encoding = source.getEncoding();
+       InputStream input = source.getByteStream();
+       if (!input.markSupported()) {
+            // If mark is not supported, wrap it in a stream which supports mark
+            input = new BufferedInputStream(input);
+            source.setByteStream(input);
+        }
+        // Mark either the original stream or the wrapped stream
+        input.mark(100);
+       if(encoding == null){
+           encoding = "ASCII";
+       
+           char c = ' ';
+
+           c = (char) input.read();
+
+           if (c == '@') {
+               // hum, is it a charset ?
+               int size   = 100;
+               byte[] buf = new byte[size];
+               input.read(buf, 0, 7);
+               String keyword = new String(buf, 0, 7);
+               if (keyword.equals("charset")) {
+                   // Yes, this is the charset declaration !
+
+                   // here I don't use the right declaration : white space are ' '.
+                   while ((c = (char) input.read()) == ' ') {
+                       // find the first quote
+                   }
+                   char endChar = c;
+                   int i = 0;
+
+                   if ((endChar != '"') && (endChar != '\'')) {
+                       // hum this is not a quote.
+                       throw new CSSException("invalid charset declaration");
+                   }
+
+                   while ((c = (char) input.read()) != endChar) {
+                       buf[i++] = (byte) c;
+                       if (i == size) {
+                           byte[] old = buf;
+                           buf = new byte[size + 100];
+                           System.arraycopy(old, 0, buf, 0, size);
+                           size += 100;
+                       }
+                   }
+                   while ((c = (char) input.read()) == ' ') {
+                       // find the next relevant character
+                   }
+                   if (c != ';') {
+                       // no semi colon at the end ?
+                       throw new CSSException("invalid charset declaration: "
+                                          + "missing semi colon");
+                   }
+                   encoding = new String(buf, 0, i);
+                   if (source.getEncoding() != null) {
+                       // compare the two encoding informations.
+                       // For example, I don't accept to have ASCII and after UTF-8.
+                       // Is it really good ? That is the question.
+                       if (!encoding.equals(source.getEncoding())) {
+                           throw new CSSException("invalid encoding information.");
+                       }
+                   }
+               } // else no charset declaration available
+           }
+       }
+       // ok set the real encoding of this source.
+       source.setEncoding(encoding);
+       // set the real reader of this source.
+       source.setCharacterStream(new InputStreamReader(source.getByteStream(),
+                                             Encoding.getJavaEncoding(encoding)));
+       // reset the stream (leave the charset declaration in the stream).
+       input.reset();
+
+       return new Generic_CharStream(source.getCharacterStream(), 1, 1);
+    }
+
+    private LocatorImpl currentLocator;
+    private Locator getLocator() {
+       if (currentLocator == null) {
+           currentLocator = new LocatorImpl(this);
+           return currentLocator;
+       }
+       return currentLocator.reInit(this);
+    }
+    private LocatorImpl getLocator(Token save) {
+       if (currentLocator == null) {
+           currentLocator = new LocatorImpl(this, save);
+           return currentLocator;
+       }
+       return currentLocator.reInit(this, save);
+    }
+
+    private void reportError(Locator l, Exception e) {
+       if (errorHandler != null) {
+           if (e instanceof ParseException) {
+               // construct a clean error message.
+               ParseException pe = (ParseException) e;
+               if (pe.specialConstructor) {
+                   StringBuffer errorM = new StringBuffer();
+                   if (pe.currentToken != null) {
+                       errorM.append("encountered \"")
+                           .append(pe.currentToken.next);
+                   }
+                   errorM.append('"');
+                   if (pe.expectedTokenSequences.length != 0) {
+                       errorM.append(". Was expecting one of: ");
+                       for (int i = 0; i < pe.expectedTokenSequences.length; i++) {
+                           for (int j = 0; j < pe.expectedTokenSequences[i].length; j++) {
+                               int kind = pe.expectedTokenSequences[i][j];
+                               if (kind != S) {
+                                   errorM.append(pe.tokenImage[kind]);
+                                   errorM.append(' ');
+                               }
+                           }
+                       }
+                   }
+                   errorHandler.error(new CSSParseException(errorM.toString(), 
+                                                            l, e));
+               } else {
+                   errorHandler.error(new CSSParseException(e.getMessage(), 
+                                                            l, e));
+               }
+           } else if (e == null) {
+               errorHandler.error(new CSSParseException("error", l, null));
+           } else {
+               errorHandler.error(new CSSParseException(e.getMessage(), l, e));
+           }
+       }
+    }
+
+    private void reportWarningSkipText(Locator l, String text) {
+       if (errorHandler != null && text  != null) {
+           errorHandler.warning(new CSSParseException("Skipping: " + text, l));
+       }
+    }
+}
+
+PARSER_END(Parser)
+
+/*
+ * The tokenizer 
+ */
+
+<DEFAULT>
+TOKEN :
+{
+    < S : ( [ " ", "\t" , "\n" , "\r", "\f" ] )+ > 
+       { image = Parser.SPACE; }
+}
+
+/*
+ * for fixing #11638: Ending an imported SCSS file with a comment causes an error in the Sass.
+ * now the single line comment is parsed as special token, before, they were simply skipped.
+ * solution got from http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#tth_sEc3.15
+ */
+<DEFAULT>
+SPECIAL_TOKEN : {
+< SINGLE_LINE_COMMENT: "//"(~["\n","\r"])* ("\n"|"\r"|"\r\n")? > }
+
+<DEFAULT>
+MORE :
+{
+  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
+|
+  "/*" : IN_MULTI_LINE_COMMENT
+}
+<IN_FORMAL_COMMENT>
+SPECIAL_TOKEN :
+{
+  <FORMAL_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_MULTI_LINE_COMMENT>
+SKIP :
+{
+  <MULTI_LINE_COMMENT: "*/" > : DEFAULT
+}
+
+<IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
+MORE :
+{
+  < ~[] >
+}
+
+<DEFAULT>
+TOKEN :
+{
+  < CDO : "<!--" >
+  | < CDC : "-->" >
+  | < LBRACE : "{" >
+  | < RBRACE : "}">
+  | < DASHMATCH : "|=" >
+  | < CARETMATCH : "^=" >
+  | < DOLLARMATCH : "$=" >
+  | < STARMATCH : "*=" >
+  | < INCLUDES  : "~=" >
+  | < EQ        : "=" >
+  | < PLUS      : "+" >
+  | < MINUS     : "-" >
+  | < COMMA     : "," >
+  | < SEMICOLON : ";" >
+  | < PRECEDES  : ">" >
+  | < SIBLING   : "~" >
+  | < SUCCEEDS : "<" >
+  | < DIV       : "/" >
+  | < LBRACKET  : "[" >
+  | < RBRACKET  : "]" >
+  | < ANY       : "*" >
+  | < MOD       : "%" >
+  | < PARENT    : "&" >
+  | < DOT       : "." >
+  | < LPARAN    : "(" >
+  | < RPARAN    : ")">
+  | < COMPARE   : "==" >
+  | < OR               : "||" >
+  | < AND              : "&&" >
+  | < NOT_EQ : "!=" >
+}
+
+<DEFAULT>
+TOKEN :
+{
+  < COLON     : ":" >
+}
+
+< DEFAULT >
+TOKEN :
+{
+       < INTERPOLATION : "#{"< VARIABLE > "}">
+}
+
+<DEFAULT>
+TOKEN : /* basic tokens */
+{ 
+    < NONASCII    : ["\200"-"\377"] >
+  | < #H          : ["0"-"9", "a"-"f"] >
+  | < #UNICODE    : "\\" <H> ( <H> )? /* I can't say {1,6} */
+                         ( <H> )? ( <H> )?
+                         ( <H> )? ( <H> )? 
+                    ( [ " ", "\t" , "\n" , "\r", "\f" ] )? >
+  | < #ESCAPE     : <UNICODE> | ( "\\" [ " "-"~","\200"-"\377" ] ) >
+  | < #NMSTART    : ("-")?[ "a"-"z","_"] | <NONASCII> | <ESCAPE> >
+  | < #NMCHAR    : ["a"-"z", "0"-"9", "-", "_"] | <NONASCII> | <ESCAPE> >
+  | < #STRINGCHAR : [ "\t"," ","!","#","$","%","&","("-"~" ] 
+                    | "\\\n" | "\\\r\n" | "\\\r" | "\\\f" 
+                    | <NONASCII> | <ESCAPE> >
+  | < #D          : ["0"-"9"] >
+  | < #NAME       : ( <NMCHAR> )+ >
+}
+
+<DEFAULT>
+TOKEN :
+{
+    <TO         : "to">
+    |<THROUGH   : "through">
+    |<EACH_IN        : "in">
+    |<FROM      : "from">
+}
+
+/* DERECTIVES */
+<DEFAULT>
+TOKEN :
+{
+    <MIXIN_SYM          : "@mixin">
+  | <INCLUDE_SYM        : "@include">
+  | <FUNCTION_SYM       : "@function">
+  | <RETURN_SYM         : "@return">
+  | <DEBUG_SYM          : "@debug">
+  | <WARN_SYM           : "@warn">
+  | <FOR_SYM            : "@for">
+  | <EACH_SYM           : "@each">
+  | <WHILE_SYM          : "@while">
+  | <IF_SYM             : "@if">
+  | <ELSE_SYM           : "@else">
+  | <EXTEND_SYM         : "@extend">
+  | <MOZ_DOCUMENT_SYM   : "@-moz-document">
+  | <SUPPORTS_SYM       : "@supports">
+  | <CONTENT_SYM        : "@content">
+}
+
+< DEFAULT >
+TOKEN:
+{
+  < MICROSOFT_RULE : "filter"|"-ms-filter" > 
+}
+
+< DEFAULT >
+TOKEN:
+{
+  < IF : "if" > 
+}
+
+<DEFAULT>
+TOKEN:
+{
+        < GUARDED_SYM : "!" ( <S> )? "default">
+}
+
+<DEFAULT>
+TOKEN :
+{
+  < STRING      : ( "\"" ( <STRINGCHAR> | "'" )* "\"" ) | 
+                  ( "'" ( <STRINGCHAR> | "\"" )* "'" ) >
+  | < IDENT         : <NMSTART> ( <NMCHAR> )* >
+  | < NUMBER     : ( <D> )+ | ( <D> )* "." ( <D> )+ > 
+  | < #_URL       : [ "!","#","$","%","&","*"-"~" ] | <NONASCII> | <ESCAPE> >
+  | < URL         : "url(" ( <S> )*
+                    ( <STRING> | ( <_URL> )* ) ( <S> )* ")" >            
+}
+
+<DEFAULT>
+TOKEN:
+{
+       < VARIABLE : "$" <IDENT>>
+}
+
+<DEFAULT>
+TOKEN :
+{
+   < PERCENTAGE : <NUMBER> "%" >
+ | < PT : <NUMBER> "pt" >
+ | < MM : <NUMBER> "mm" >
+ | < CM : <NUMBER> "cm" >
+ | < PC : <NUMBER> "pc" >
+ | < IN : <NUMBER> "in" >
+ | < PX : <NUMBER> "px" >
+ | < EMS : <NUMBER> "em" >
+ | < LEM : <NUMBER> "lem" >
+ | < REM : <NUMBER> "rem" >
+ | < EXS : <NUMBER> "ex" >
+ | < DEG : <NUMBER> "deg" >
+ | < RAD : <NUMBER> "rad" >
+ | < GRAD : <NUMBER> "grad" >
+ | < MS : <NUMBER> "ms" >
+ | < SECOND  : <NUMBER> "s" >
+ | < HZ : <NUMBER> "Hz" >
+ | < KHZ : <NUMBER> "kHz" >
+ | < DIMEN  : <NUMBER> <IDENT> >
+}
+
+<DEFAULT>
+TOKEN :
+{
+  < HASH : "#" <NAME> >
+}
+
+/* RESERVED ATRULE WORDS */
+<DEFAULT>
+TOKEN : 
+{
+    < IMPORT_SYM   : "@import">
+  | < MEDIA_SYM    : "@media" >
+  | < CHARSET_SYM  : "@charset" >
+  | < PAGE_SYM     : "@page"  >
+  | < FONT_FACE_SYM: "@font-face" >
+  | < KEY_FRAME_SYM: "@keyframes" | "@-moz-keyframes" | "@-o-keyframes" | "@-webkit-keyframes" | "@-ms-keyframes">
+  | < ATKEYWORD    : "@" <IDENT> >
+}
+
+<DEFAULT>
+TOKEN :
+{
+ < IMPORTANT_SYM : "!" ( <S> )? "important" >
+}
+
+<DEFAULT>
+TOKEN :
+{
+    < #RANGE0 : <H> <H> <H> <H>  <H> >
+    | < #RANGE1 : <H> <H> <H> <H> <H> ( "?" )? >
+    | < #RANGE2 : <H> <H> <H> <H> ( "?" )? ( "?" )? >
+    | < #RANGE3 : <H> <H> <H> ( "?" )? ( "?" )? ( "?" )? >
+    | < #RANGE4 : <H> <H> ( "?" )? ( "?" )? ( "?" )? ( "?" )? >
+    | < #RANGE5 : <H> ( "?" )? ( "?" )? ( "?" )? ( "?" )? ( "?" )? >
+    | < #RANGE6 : "?" ( "?" )? ( "?" )? ( "?" )? ( "?" )? ( "?" )? >
+    | < #RANGE  : <RANGE0> | <RANGE1> | <RANGE2> 
+                  | <RANGE3> | <RANGE4> | <RANGE5> | <RANGE6> >
+    | < #UNI    : <H> ( <H> )? ( <H> )? ( <H> )? ( <H> )? ( <H> )? >
+    | < UNICODERANGE : "U+" <RANGE>
+                        | "U+" <UNI> "-" <UNI> >
+}
+
+< DEFAULT >
+TOKEN :
+{
+       < REMOVE : "remove" (< S >)? "(" >
+    | < APPEND : "append" (< S >)? "(" >
+       | < CONTAINS : "contains" (< S >)? "(" >
+}
+
+<DEFAULT>
+TOKEN :
+{
+ < FUNCTION : <IDENT>(< S >)* "(" >
+}
+
+<DEFAULT, IN_MULTI_LINE_COMMENT>
+TOKEN :
+{ /* avoid token manager error */
+    < UNKNOWN : ~[] >
+}
+
+/*
+ * The grammar of CSS2
+ */
+
+/**
+ * The main entry for the parser.
+ *
+ * @exception ParseException exception during the parse
+ */
+void parserUnit() :
+{}
+{
+    try {
+       { documentHandler.startDocument(source); }
+       ( charset() )?
+       ( <S> comments()
+        | ignoreStatement() )*
+       ( importDeclaration() ( ignoreStatement() ( <S> )* )* )*
+       afterImportDeclaration()
+       <EOF>
+    } finally {
+       documentHandler.endDocument(source);
+    }
+}
+
+void charset() :
+{ Token n; }
+{  
+    try {
+       <CHARSET_SYM> ( <S> )* n=<STRING> ( <S> )* ";"
+    } catch (ParseException e) {
+        reportError(getLocator(e.currentToken.next), e);
+       skipStatement();
+       // reportWarningSkipText(getLocator(), skipStatement());
+    } catch (Exception e) {
+        reportError(getLocator(), e);
+       skipStatement();
+       // reportWarningSkipText(getLocator(), skipStatement());
+    }
+}
+
+void afterImportDeclaration() :
+{String ret; 
+ Locator l;
+}
+{
+  ( 
+     ( debuggingDirective() | mixinDirective() | controlDirective() | includeDirective() | styleRule() | media() 
+             | page() | fontFace() | keyframes() | LOOKAHEAD(variable()) variable() | listModifyDirective()
+      | { l = getLocator(); } ret=skipStatement() 
+      {
+         if ((ret == null) || (ret.length() == 0)) {
+             return; 
+         }
+         if (ret.charAt(0) == '@') {
+             documentHandler.unrecognizedRule(ret);
+         } else {
+             reportWarningSkipText(l, ret);
+         }
+      }
+      )
+    ( ignoreStatement() ( <S> )* )* )*
+}
+
+void ignoreStatement() :
+{}
+{
+   <CDO> | <CDC> | atRuleDeclaration()
+}
+
+/**
+ * The import statement
+ *
+ * @exception ParseException exception during the parse
+ */
+void importDeclaration() :
+{Token n;
+ String uri;
+ MediaListImpl ml = new MediaListImpl();
+ boolean isURL = false;
+}
+{
+ try {
+  <IMPORT_SYM> 
+       ( <S> )* ( n=<STRING> { uri = convertStringIndex(n.image, 1, 
+                                                       n.image.length() -1); }
+                 | n=<URL> 
+          {
+              isURL=true;            
+              uri = n.image.substring(4, n.image.length()-1).trim();
+              if ((uri.charAt(0) == '"')
+                  || (uri.charAt(0) == '\'')) {
+                  uri = uri.substring(1, uri.length()-1);
+              }
+          }
+                 )
+       ( <S> )* mediaStatement(ml) ";"
+       ( <S> )*
+          {
+              if (ml.getLength() == 0) {
+                  // see section 6.3 of the CSS2 recommandation.
+                  ml.addItem("all");
+              }
+              documentHandler.importStyle(uri, ml, isURL);
+          }
+ } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void keyframes() :
+{
+    Token n;
+    boolean start = false;
+    String keyframeName = null;
+    String animationname = "";
+}
+{
+ try {
+  n=<KEY_FRAME_SYM> ( <S> )* {keyframeName = n.image;}
+  (n = <IDENT>{animationname += n.image; }|n = < INTERPOLATION >{ animationname += n.image; })+(<S>)*
+   {start = true; documentHandler.startKeyFrames(keyframeName, animationname); }
+   <LBRACE> ( <S> )* ( keyframeSelector() | contentDirective() )* <RBRACE> ( <S> )*
+ } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+ } finally {
+     if (start) {
+         documentHandler.endKeyFrames();
+     }
+ }
+}
+
+void keyframeSelector():
+{
+    Token n;
+    String selector = "";
+    boolean start = false;
+}
+{
+    try{
+        (n = <FROM> | n = <TO> | n = <PERCENTAGE>){selector += n.image;} (<S>)*
+        (<COMMA> (<S>)* (n = <FROM> | n = <TO> | n = <PERCENTAGE>) {selector += (", " + n.image);} (<S>)* )*
+          <LBRACE> (<S>)*
+        {
+          start = true;
+          documentHandler.startKeyframeSelector(selector);
+         }
+        (ifContentStatement() | microsoftExtension() )*
+        <RBRACE> (<S>)*
+    }
+    catch (ThrowedParseException e) {
+        if (errorHandler != null) {
+            LocatorImpl li = new LocatorImpl(this,
+                                             e.e.currentToken.next.beginLine,
+                                             e.e.currentToken.next.beginColumn-1);
+            reportError(li, e.e);
+        }
+    } catch (ParseException e) {
+        reportError(getLocator(), e);
+        skipStatement();
+        // reportWarningSkipText(getLocator(), skipStatement());
+    } catch (TokenMgrError e) {
+        reportWarningSkipText(getLocator(), skipStatement());
+    } finally {
+        if (start) {
+            documentHandler.endKeyframeSelector();
+        }
+    }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+/* see http://www.w3.org/TR/css3-mediaqueries/ */
+void media() :
+{ 
+    boolean start = false;
+    String ret;
+    MediaListImpl ml = new MediaListImpl(); 
+}
+{
+ try {
+  <MEDIA_SYM> ( <S> )*
+   mediaStatement(ml)
+   { start = true; documentHandler.startMedia(ml); }
+   <LBRACE> ( <S> )* ( debuggingDirective() | styleRule() | skipUnknownRule() )* <RBRACE> ( <S> )*
+ } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+ } finally {
+     if (start) {
+        documentHandler.endMedia(ml);
+     }
+ }
+}
+
+void mediaStatement(MediaListImpl ml) :
+{
+  Token t;
+}
+{
+    {
+      t = getToken(1);
+      // loop over comma separated parts, add each to ml
+      while ((t.kind != LBRACE) && (t.kind != EOF) && (t.kind != SEMICOLON)) {
+        StringBuffer s = new StringBuffer();
+        s.append(getToken(0).image);
+        while ((t.kind != COMMA) && (t.kind != LBRACE) && (t.kind != EOF) && (t.kind != SEMICOLON)) {
+             s.append(t.image);
+             getNextToken();
+          t = getToken(1);
+        }
+        if (t.kind == COMMA) {
+          // skip the comma and the token before it that is still the active token
+          getNextToken();
+          getNextToken();
+          t = getToken(1);
+        }
+        String str = s.toString().trim();
+        if (str.length() > 0) {
+          ml.addItem(str);
+        }
+      }
+    }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String medium() : /* tv, projection, screen, ... */
+{Token n;}
+{
+    n=<IDENT> { return convertIdent(n.image); }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void page() :
+{
+ boolean start = false;
+ Token n = null;
+ String page = null;
+ String pseudo = null;
+}
+{
+ try {
+  <PAGE_SYM> ( <S> )* ( n=<IDENT> ( <S> )* )?
+  ( pseudo=pseudo_page() )? 
+      {
+         if (n != null) {
+             page = convertIdent(n.image);
+         }
+      }
+  <LBRACE> (<S>)* 
+      {
+         start = true;
+         documentHandler.startPage(page, pseudo);
+      }
+     ( declaration() )? ( ";" ( <S> )* ( declaration() )? )* 
+     <RBRACE> (<S>)*
+ } catch (ParseException e) {
+     if (errorHandler != null) {
+        LocatorImpl li = new LocatorImpl(this,
+                                         e.currentToken.next.beginLine,
+                                         e.currentToken.next.beginColumn-1);
+        reportError(li, e);
+        skipStatement();
+        // reportWarningSkipText(li, skipStatement());
+     } else {
+        skipStatement();
+     }
+ } finally {
+     if (start) {
+        documentHandler.endPage(page, pseudo);
+     }
+ }
+}
+
+String pseudo_page() :
+{ Token n; }
+{
+    ":" n=<IDENT> ( <S> )* { return convertIdent(n.image); }
+}
+
+void fontFace() :
+{
+    boolean start = false;
+}
+{
+ try {
+  <FONT_FACE_SYM> ( <S> )*
+     <LBRACE> (<S>)*
+      { start = true; documentHandler.startFontFace(); }
+     ( declaration() )? ( ";" ( <S> )* ( declaration() )? )*
+     <RBRACE> (<S>)*
+ } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+ } finally {
+     if (start) {
+        documentHandler.endFontFace();
+     }
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void atRuleDeclaration() :
+{Token n;
+ String ret;
+}
+{
+ n=<ATKEYWORD>
+    {
+       ret=skipStatement();
+       if ((ret != null) && (ret.charAt(0) == '@')) {
+           documentHandler.unrecognizedRule(ret);
+       } else {
+           reportWarningSkipText(getLocator(), ret);
+       }
+    }
+}
+
+void skipUnknownRule() :
+{ Token n;}
+{
+ ( n=<ATKEYWORD>
+| n=<CDO>
+| n=<CHARSET_SYM>
+| n=<COMMA>
+| n=<DASHMATCH>
+| n=<FONT_FACE_SYM>
+| n=<FUNCTION>
+| n=<IMPORTANT_SYM>
+| n=<IMPORT_SYM>
+| n=<INCLUDES>
+| n=<LBRACE>
+| n=<MEDIA_SYM>
+| n=<NONASCII>
+| n=<NUMBER>
+| n=<PAGE_SYM>
+| n=<PERCENTAGE>
+| n=<STRING>
+| n=<UNICODERANGE>
+| n=<URL>
+| n=";"
+| n="-"
+| n=<UNKNOWN>
+   ) {
+     String ret;
+     Locator loc = getLocator();
+     ret=skipStatement();
+     if ((ret != null) && (n.image.charAt(0) == '@')) {
+        documentHandler.unrecognizedRule(ret);
+     } else {
+     reportWarningSkipText(loc, ret);
+     }
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+char combinator() :
+{
+char connector = ' ';
+}
+{
+    (connector = combinatorChar()
+     | <S>  (connector = combinatorChar())?) { return connector; }
+}
+
+/**to refactor combinator and reuse in selector().*/
+char combinatorChar() :
+{Token t;}
+{
+    (t = <PLUS> | t = <PRECEDES> | t = <SIBLING>) (<S>)*
+    {
+        return t.image.charAt(0);
+    }
+}
+
+void microsoftExtension() :
+{
+  Token n;
+  String name = "";
+  String value = "";
+}
+
+{
+  // This is not really taking the syntax of filter rules into account
+  n = < MICROSOFT_RULE > (< S >)* { name = n.image; }
+       < COLON >
+       ((n = < IDENT > { value += n.image; })
+       | (n = < NUMBER > { value += n.image; }) 
+       | (n = < STRING > { value += n.image; })
+       | (n = < COMMA > { value += n.image; })
+       | (n = < INTERPOLATION > { value += n.image; })
+       | (n = < COLON > { value += n.image; })
+       | (n = < FUNCTION > { value += n.image; })
+       | (n = < RPARAN > { value += n.image; })
+       | (n = < EQ > { value += n.image; })
+       | (n = < DOT > { value += n.image; })
+       | (n = < S > { if(value.lastIndexOf(' ') != value.length()-1)
+       { value += n.image; } }
+       ) )+
+       < SEMICOLON >
+       (< S >)*
+       { documentHandler.microsoftDirective(name, value);      }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String property() :
+{Token t;String s = "";
+}
+{
+    (t = <IDENT>{s += t.image; }|t = < INTERPOLATION >{ s += t.image; })+(< S >)*
+    {
+        return s;
+    }
+}
+
+String variableName() :
+{Token n;}
+{
+    n=<VARIABLE> (<S>)* {return convertIdent(n.image.substring(1));}
+}
+
+String functionName() :
+{Token n;}
+{
+    n=<FUNCTION> ( <S> )* {return convertIdent(n.image.substring(0, n.image.length()-1));}
+}
+/**
+ * @exception ParseException exception during the parse
+ */
+void styleRule() :
+{
+    boolean start = false;
+    ArrayList<String> l = null;
+    Token save;
+    Locator loc;
+}
+{
+ try {
+     l=selectorList() { save = token; } <LBRACE> (<S>)*
+     {
+        start = true;
+        documentHandler.startSelector(l);
+     }
+     // a CSS import here will not work
+     ( ifContentStatement() | microsoftExtension() | importDeclaration() )*
+     <RBRACE> (<S>)*
+ } catch (ThrowedParseException e) {
+     if (errorHandler != null) {
+        LocatorImpl li = new LocatorImpl(this,
+                                         e.e.currentToken.next.beginLine,
+                                         e.e.currentToken.next.beginColumn-1);
+        reportError(li, e.e);
+     }
+ } catch (ParseException e) {
+     reportError(getLocator(), e);
+     skipStatement();
+     // reportWarningSkipText(getLocator(), skipStatement());
+ } catch (TokenMgrError e) {
+     reportWarningSkipText(getLocator(), skipStatement());
+ } finally {
+     if (start) {
+        documentHandler.endSelector();
+     }
+ }
+}
+
+ ArrayList<String> selectorList() :
+{
+     ArrayList<String> selectors = new  ArrayList<String>();
+     String selector;
+}
+{
+ selector=selector() ( <COMMA> (<S>)* { selectors.add(selector); } 
+                       selector=selector() )* 
+  { selectors.add(selector); 
+    return selectors;
+  }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String selector() :
+{   
+    String selector = null;
+    char    comb;
+}
+{
+ try {
+     // the selector can begin either a simple_selector, or a combinatorChar(+, >, ~).
+     // when beginning with combinatorChar, the next one should be a simple_selector().
+   (selector=simple_selector(null, ' ') | (comb=combinatorChar() selector=simple_selector(selector, comb)))
+       ( LOOKAHEAD(2) comb=combinator() 
+        selector=simple_selector(selector, comb) )* (<S>)*
+   {
+       return selector; 
+   }
+ } catch (ParseException e) {
+     /*
+     Token t = getToken(1);
+     StringBuffer s = new StringBuffer();
+     s.append(getToken(0).image);
+     while ((t.kind != COMMA) && (t.kind != SEMICOLON) 
+           && (t.kind != LBRACE) && (t.kind != EOF)) {
+        s.append(t.image);
+        getNextToken();
+        t = getToken(1);
+     }
+     reportWarningSkipText(getLocator(), s.toString());
+     */
+     Token t = getToken(1);
+     while ((t.kind != COMMA) && (t.kind != SEMICOLON) 
+           && (t.kind != LBRACE) && (t.kind != EOF)) {
+        getNextToken();
+        t = getToken(1);
+     }
+
+     throw new ThrowedParseException(e);
+  }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String simple_selector(String selector, char comb) :
+{
+    String simple_current = null;
+    String cond = null;
+
+    pseudoElt = null;
+}
+{
+    (  (simple_current=element_name() 
+            ( cond=hash(cond) | cond=_class(cond) 
+              | cond=attrib(cond) | cond=pseudo(cond) )* )
+     | ( cond = hash(cond) | cond=_class(cond) 
+            | cond=attrib(cond) | cond=pseudo(cond) )+      
+     )
+       {
+           if (simple_current == null) {
+               simple_current = "";
+           }
+           if (cond != null) {
+               simple_current = simple_current + cond;
+           }
+           StringBuilder builder = new StringBuilder();
+           switch (comb) {
+               case ' ':
+                   if(selector!=null){
+                       builder.append(selector).append(" ");
+                   }
+                   break;
+               case '+':
+               case '>':
+               case '~':
+                   if(selector!=null){
+                       builder.append(selector).append(" ");
+                   }
+                   builder.append(comb).append(" ");
+                   break;
+               default:
+                   throw new ParseException("invalid state. send a bug report");
+           }
+           builder.append(simple_current);
+           selector = builder.toString();
+           
+           if (pseudoElt != null) {
+               selector = selector + pseudoElt;
+           }
+           return selector;
+       }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String _class(String pred) :
+{Token t;
+String s = ".";
+}
+{
+  "." (t = <IDENT>{s += t.image; }|t =  < INTERPOLATION >{ s += t.image; })+
+      { 
+         
+         if (pred == null) {
+             return s;
+         } else {
+             return pred + s;
+         }
+      }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String element_name() :
+{Token t; String s = "";}
+{
+    (t = <IDENT>{s += t.image; }|t = < INTERPOLATION >{ s += t.image; })+
+    { 
+      return s; 
+    }
+      | "*"
+    { return "*"; }
+      | "&"
+    { return "&"; }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String attrib(String pred) :
+{
+    int cases = 0;
+    Token att = null;
+    Token val = null;
+    String attValue = null;
+}
+{
+  "[" ( <S> )* att=<IDENT> ( <S> )*
+      ( ( "="           { cases = 1; }
+         | <INCLUDES>  { cases = 2; }    
+         | <DASHMATCH> { cases = 3; }
+         | <CARETMATCH> { cases = 4; }
+         | <DOLLARMATCH> { cases = 5; }
+         | <STARMATCH> { cases = 6; } ) ( <S> )* 
+       ( val=<IDENT> { attValue = val.image; }
+         | val=<STRING> { attValue = val.image; }
+       )
+       ( <S> )* )?
+  "]"
+  {
+      String name = convertIdent(att.image);
+      String c;
+      switch (cases) {
+         case 0:
+         c = name;
+         break;
+         case 1:
+         c = name + "=" + attValue;
+         break;
+         case 2:
+         c = name + "~=" + attValue;
+         break;
+         case 3:
+         c = name + "|=" +attValue;
+         break;
+         case 4:
+         c = name + "^=" +attValue;
+         break;
+         case 5:
+         c = name + "$=" +attValue;
+         break;
+         case 6:
+         c = name + "*=" +attValue;
+         break;
+         default:
+         // never reached.
+         c = null;
+      }
+      c = "[" + c + "]";
+      if (pred == null) {
+         return c;
+      } else {
+         return pred + c;
+      }
+  }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String pseudo(String pred) :
+{Token n;
+Token param;
+String d;
+boolean isPseudoElement = false;
+}
+{
+    ":" (":"{isPseudoElement=true;})?( n=<IDENT>
+       {
+           String s = ":" + convertIdent(n.image);
+           if (isPseudoElement) {
+               if (pseudoElt != null) {
+                   throw new CSSParseException("duplicate pseudo element definition " 
+                                               + s, getLocator());
+               } else {
+                   pseudoElt = ":"+s;
+                   return pred;
+               }
+           } else {
+               String c = s;
+               if (pred == null) {
+                   return c;
+               } else {
+                   return pred + c;
+               }
+           }
+       }
+         | ( n=<FUNCTION> ( <S> )* d=skipStatementUntilMatchingRightParan() <RPARAN>
+                 {
+                 // accept anything between function and a right parenthesis
+                 String f = convertIdent(n.image);
+                 String colons = isPseudoElement ? "::" : ":";
+                 String pseudofn = colons + f + d + ")";
+                     if (pred == null) {
+                         return pseudofn;
+                     } else {
+                         return pred + pseudofn;
+                 }
+                 }
+             )
+         )
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String hash(String pred) :
+{Token n; }
+{
+  n=<HASH>
+  {
+      String d = n.image;
+      if (pred == null) {
+         return d;
+      } else {
+         return pred + d;
+      }
+  }
+}
+
+void variable() :
+{
+       String name;
+       LexicalUnitImpl exp = null;
+       boolean guarded = false;
+       String raw;
+}
+{
+       try{
+               name = variableName()
+               ":" ( <S> )* exp=expr() ( guarded=guarded() )?(";"(<S>)*)+
+               //raw=skipStatementUntilSemiColon()
+               {
+                   documentHandler.variable(name, exp, guarded);
+               }
+       }catch (JumpException e) {
+           skipAfterExpression();
+       } catch (NumberFormatException e) {
+           if (errorHandler != null) {
+               errorHandler.error(new CSSParseException("Invalid number " 
+                                                 + e.getMessage(),
+                                                 getLocator(), 
+                                                 e));
+           }
+           reportWarningSkipText(getLocator(), skipAfterExpression());
+        } catch (ParseException e) {
+           if (errorHandler != null) {
+               if (e.currentToken != null) {
+                       LocatorImpl li = new LocatorImpl(this,
+                                                     e.currentToken.next.beginLine,
+                                                     e.currentToken.next.beginColumn-1);
+                       reportError(li, e);
+               } else {
+                       reportError(getLocator(), e);
+           }
+               skipAfterExpression();
+           } else {
+               skipAfterExpression();
+           }
+       }
+}
+
+void controlDirective() :
+{}
+{
+  ifDirective() | eachDirective()
+}
+
+void ifContentStatement() :
+{}
+{
+    contentDirective() | includeDirective() | media() | extendDirective() | styleRuleOrDeclarationOrNestedProperties()
+    | keyframes() | LOOKAHEAD(variable()) variable() | listModifyDirective() | controlDirective() | atRuleDeclaration()
+}
+
+void ifDirective() :
+{
+  Token n = null;
+  String s = null;
+  String evaluator = "";
+}
+{
+  < IF_SYM >
+  ( s = booleanExpressionToken() { evaluator += s;} )+
+  < LBRACE >(< S >)*    
+  { documentHandler.startIfElseDirective();
+    documentHandler.ifDirective(evaluator);
+   }
+  ( ifContentStatement() | fontFace() )*
+  < RBRACE >(< S >)*
+  (elseDirective())*
+  { documentHandler.endIfElseDirective(); }
+}
+
+void elseDirective() :
+{
+  String evaluator = "";
+  Token n = null;
+  String s = null;
+}
+{
+  < ELSE_SYM >(< S >)* 
+  ( < IF > ( s = booleanExpressionToken() { evaluator += s; } )+ )?
+  < LBRACE >(< S >)*
+  { if(!evaluator.trim().equals("")){ documentHandler.ifDirective(evaluator); }
+    else{ documentHandler.elseDirective(); }  
+  }
+  ( ifContentStatement() | fontFace() )*
+  < RBRACE >(< S >)*
+}
+
+String booleanExpressionToken() :
+{
+  Token n = null;
+  String s = null;
+}
+{
+ (
+   LOOKAHEAD(containsDirective())
+   s = containsDirective()
+   |n = < VARIABLE >
+   |n = < IDENT >
+   |n = < NUMBER >
+   |n = < LPARAN >
+   |n = < RPARAN >
+   |n = < PLUS >
+   |n = < MINUS >
+   |n = < DIV >
+   |n = < ANY >
+   |n = < COMPARE >
+   |n = < EQ >
+   |n = < PRECEDES >
+   |n = < SUCCEEDS >
+   |n = < OR >
+   |n = < AND >
+   |n = < S >
+   |n = < NOT_EQ > 
+){
+   if(n!=null){return n.image;}  
+   else{return s;}
+ }
+}
+  
+void eachDirective() :
+{
+  Token var;
+  ArrayList<String> list = null;
+  String listVariable = null;
+}
+{
+  < EACH_SYM >
+  (< S >)*
+  var = < VARIABLE > (< S >)* < EACH_IN > (< S >)*
+  (list = stringList()
+  {documentHandler.startEachDirective(var.image, list);}
+  |listVariable = variableName()
+  {documentHandler.startEachDirective(var.image, listVariable);}
+  )
+  < LBRACE >(< S >)*
+  ( ifContentStatement() )*      
+  < RBRACE >(< S >)*
+  { documentHandler.endEachDirective();}
+}
+
+ArrayList<String > stringList():
+{
+       ArrayList<String > strings = new ArrayList<String >();
+       Token input;
+}
+{
+       (input = < IDENT > (< S >)*)
+       { strings.add(input.image); }
+
+       (< COMMA >(< S >)* input = < IDENT > { strings.add(input.image); } (< S >)*)*
+       { return strings; }
+
+}
+
+void mixinDirective() :
+{
+    String name;
+    ArrayList<VariableNode> args = null;
+    String body;
+}
+{
+    <MIXIN_SYM>
+    (<S>)*
+    (name = property()
+    |(name = functionName() 
+      args = arglist()) <RPARAN> (<S>)*) <LBRACE> (<S>)*
+    {documentHandler.startMixinDirective(name, args);}
+    ( ifContentStatement() | fontFace() | page())*
+    <RBRACE>(<S>)*
+    {documentHandler.endMixinDirective(name, args);}
+}
+
+ArrayList<VariableNode> arglist() :
+{
+    ArrayList<VariableNode> args = new ArrayList<VariableNode>();
+    VariableNode arg;
+    boolean hasNonOptionalArgument = false;
+}
+{
+    arg=mixinArg() ( <COMMA> (<S>)* { hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg); } 
+        arg=mixinArg() )* 
+    { hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg); 
+        return args;
+    }
+}
+
+JAVACODE
+boolean checkMixinForNonOptionalArguments(VariableNode arg, boolean hasNonOptionalArguments)\r{
+       boolean currentArgHasArguments = arg.getExpr() != null && arg.getExpr().getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE && arg.getExpr().getNextLexicalUnit() != null;
+  \r    if(currentArgHasArguments)\r     {
+               if(hasNonOptionalArguments)\r            {\r                      throw new ParseException("Sass Error: Required argument $"+ arg.getName() +" must come before any optional arguments.");
+               }
+               return hasNonOptionalArguments;
+       }else\r  {\r      return true;
+       }
+}
+
+VariableNode mixinArg() :
+{
+    String name;
+    Token variable = null;
+    LexicalUnitImpl first = null;
+    LexicalUnitImpl prev = null;
+    LexicalUnitImpl next = null;
+}
+{
+    name=variableName() (< COLON > (< S >)*
+
+    (\r      first = nonVariableTerm(null)\r      {
+        prev = first;\r      }
+         (LOOKAHEAD(3)(< COMMA >(< S >)*)? prev = nonVariableTerm(prev))*\r     )
+       | (variable = < VARIABLE >{ first = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
+                 prev, variable.image);}
+               
+       )
+    )?
+    {
+        VariableNode arg = new VariableNode(name, first, false);
+        return arg;
+    }
+}
+
+ArrayList<LexicalUnitImpl> argValuelist() :
+{
+    ArrayList<LexicalUnitImpl> args = new ArrayList<LexicalUnitImpl>();
+    LexicalUnitImpl first = null;
+    LexicalUnitImpl next = null;
+    LexicalUnitImpl prev = null;
+}
+{
+    first = term(null) { args.add(first); prev = first;}((< COLON > (< S >)*)?next=term(prev){prev.setNextLexicalUnit(next); prev = next;})*
+    ( <COMMA> (<S>)*
+    first = term(null) { args.add(first); prev = first;}((< COLON > (< S >)*)?next=term(prev){prev.setNextLexicalUnit(next); prev = next;})*
+    )* 
+    {return args;}
+}
+
+void includeDirective() :
+{
+    String name;
+    ArrayList<LexicalUnitImpl> args=null;
+}
+{
+    <INCLUDE_SYM>
+    (<S>)*
+    (name = property()|name = variableName(){ name = "$"+name;}
+         |(name = functionName() 
+           args = argValuelist()) <RPARAN>(<S>)*)
+    ((";"(<S>)*)+
+           {documentHandler.includeDirective(name, args);}
+    | <LBRACE> (<S>)* {documentHandler.startIncludeContentBlock(name, args);}
+      (styleRuleOrDeclarationOrNestedProperties() | keyframeSelector())*
+      <RBRACE> (<S>)* {documentHandler.endIncludeContentBlock();}
+    )
+}
+
+String interpolation() :
+{
+  Token n;
+}
+{
+  n = < INTERPOLATION >
+  {
+    return n.image;
+  }
+}
+
+void listModifyDirective() :
+{
+    String list = null;
+    String remove = null;
+    String separator = null;
+    String variable = null;
+    Token n = null;
+    Token type = null;
+}
+{
+  //refactor, remove those 3 LOOKAHEAD(5).
+  n = < VARIABLE >{ variable = n.image; }(< S >)* ":" (< S >)*
+  (type = < APPEND> | type = <REMOVE> | type=<CONTAINS> )(< S >)*
+  (list = listModifyDirectiveArgs(0))
+  (< RPARAN >)? < COMMA >(< S >)*
+  (remove = listModifyDirectiveArgs(1))
+  ( < COMMA >(< S >)* n = < IDENT >{ separator = n.image; } (< S >)*)?
+  < RPARAN >
+  {
+      switch (type.kind) {
+      case APPEND:
+          documentHandler.appendDirective(variable,list,remove,separator);
+          break;
+      case REMOVE:
+          documentHandler.removeDirective(variable,list,remove,separator);
+          break;
+      case CONTAINS:
+          if(variable == null){
+              variable = "$var_"+UUID.randomUUID();
+          }
+          documentHandler.containsDirective(variable,list,remove,separator);
+          break;
+      default:
+          break;
+      }
+      }
+      (< S >)*< SEMICOLON >(<S>)*
+}
+
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void appendDirective() :
+{
+       String list = null;
+       String remove = null;
+       String separator = null;
+       String variable = null;
+       Token n = null;
+}
+{
+  n = < VARIABLE >{ variable = n.image; }(< S >)* ":" (< S >)*
+  < APPEND >(< S >)*
+  (list = listModifyDirectiveArgs(0))
+  (< RPARAN >)? < COMMA >(< S >)*
+  (remove = listModifyDirectiveArgs(1))
+  ( < COMMA >(< S >)* n = < IDENT >{ separator = n.image; } (< S >)*)?
+  < RPARAN >
+
+  { documentHandler.appendDirective(variable,list,remove,separator); }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void removeDirective() :
+{
+    String list = null;
+    String remove = null;
+    String separator = null;
+    String variable = null;
+    Token n = null;
+}
+{
+  n = < VARIABLE >{ variable = n.image; }(< S >)* ":" (< S >)*
+  < REMOVE >(< S >)*
+  (list = listModifyDirectiveArgs(0))
+  (< RPARAN >)? < COMMA >(< S >)*
+  (remove = listModifyDirectiveArgs(1))
+  ( < COMMA >(< S >)* n = < IDENT >{ separator = n.image; } (< S >)*)?
+  < RPARAN >
+
+  { documentHandler.removeDirective(variable,list,remove,separator); }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+String containsDirective() :
+{
+       String list = null;
+       String remove = null;
+       String separator = null;
+       String variable = null;
+       Token n = null;
+}
+{
+  (n = < VARIABLE >{ variable = n.image; }(< S >)* ":" (< S >)*)?
+  < CONTAINS >(< S >)*
+  (list = listModifyDirectiveArgs(0))
+  (< RPARAN >)? < COMMA >(< S >)*
+  (remove = listModifyDirectiveArgs(1))
+  ( < COMMA >(< S >)* n = < IDENT >{ separator = n.image; } (< S >)*)?
+  < RPARAN >
+
+  {   /*
+       *if it is not in the form like "$contains : contains($items, .v-button);"
+       *for example in @if, like "@if (contains(a b c, b))", then create a temp
+       *variable for contains(a b c, b);
+       */
+      if(variable == null){
+          variable = "$var_"+UUID.randomUUID();
+      }
+      documentHandler.containsDirective(variable,list,remove,separator); 
+      return variable;
+  }
+}
+
+JAVACODE
+String listModifyDirectiveArgs(int nest)
+{
+       String list = "";
+       int nesting = nest;
+       Token t = null;
+       
+       while(true)
+       {
+               t = getToken(1);
+               String s = t.image;
+               if(t.kind == VARIABLE||t.kind == IDENT)\r                {
+                 list += s;
+               }else if(s.toLowerCase().equals("auto")||s.toLowerCase().equals("space")||s.toLowerCase().equals("comma"))\r             {
+                       int i = 2;
+                       Token temp = getToken(i);
+                       boolean isLast = true;
+                       while(temp.kind != SEMICOLON)
+                       {\r                              if(temp.kind != RPARAN || temp.kind != S)
+                               {\r                                isLast = false;\r                              }
+                               i++;
+                               temp = getToken(i);
+                       }
+
+                       if(isLast)\r                     {\r                      return list;
+                       }
+               }\r              else if(t.kind == STRING)\r              {\r                      list += s.substring(1,s.length()).substring(0,s.length()-2);
+                       
+               }else if(t.kind == LPARAN)\r             {\r                      nesting++;
+                       if(nesting > nest+1)\r                   {\r                              throw new CSSParseException("Only one ( ) pair per parameter allowed", getLocator());
+                       }
+               }else if(t.kind == RPARAN)\r             {\r                      nesting--;
+                       if(nesting == 0)\r                       {
+                               return list;
+                       }
+               } else if(t.kind == COMMA)\r             {
+                       if(nesting == nest)\r                    {
+                         return list;\r                 }else\r                  {
+                         list += ",";\r                 }
+                         
+               }else if(t.kind == S)\r          {
+                 list += " ";\r         } else if(t.kind == LBRACE)\r            {
+                 throw new CSSParseException("Invalid token,'{' found", getLocator());\r                }
+               \r               getNextToken();
+       }
+}
+
+Node returnDirective() :
+{
+    String raw;
+}
+{
+       raw = skipStatement()
+       {return null;}
+}
+
+void debuggingDirective() :
+{}
+{
+  debugDirective() | warnDirective()
+}
+
+void debugDirective() :
+{}
+{
+    <DEBUG_SYM>
+    { 
+    String content = skipStatementUntilSemiColon();
+    // TODO should evaluate the content expression, call documentHandler.debugDirective() etc.
+    System.out.println(content);
+    }
+    (<S>)*
+}
+
+void warnDirective() :
+{}
+{
+    <WARN_SYM>
+    { 
+    String content = skipStatementUntilSemiColon();
+    // TODO should evaluate the content expression, call documentHandler.warnDirective() etc.
+    System.err.println(content);
+    }
+    (<S>)*
+}
+
+Node forDirective() :
+{
+    String var;
+    String from;
+    String to;
+    boolean exclusive;
+    String body;
+    Token tok;
+}
+{
+    var = variableName()
+    {
+        int[] toThrough = {TO, THROUGH};
+        from = skipStatementUntil(toThrough);
+    }
+    (tok = <TO> {exclusive = true;}
+    | tok = <THROUGH> {exclusive = false;})
+    to = skipStatementUntilLeftBrace()
+    (<S>)*
+    body = skipStatement()
+    {return documentHandler.forDirective(var, from, to, exclusive, body);}
+}
+
+Node whileDirective() :
+{
+    String condition;
+    String body;
+}
+{
+    condition = skipStatementUntilLeftBrace()
+    body = skipStatement()
+    {   return documentHandler.whileDirective(condition, body);}
+}
+
+void extendDirective() : 
+{ArrayList<String> list;}
+{
+    <EXTEND_SYM>
+    (<S>)*
+    list = selectorList()
+    (";"(<S>)*)+
+    {documentHandler.extendDirective(list);}
+}
+
+void contentDirective() : 
+{}
+{
+    <CONTENT_SYM>
+    (<S>)*
+    (";"(<S>)*)+
+    {documentHandler.contentDirective();}
+}
+
+JAVACODE
+Node importDirective(){
+    return null;
+}
+
+JAVACODE
+Node charsetDirective(){
+    return null;
+}
+
+JAVACODE
+Node mozDocumentDirective(){
+    return null;
+}
+
+JAVACODE
+Node supportsDirective(){
+    return null;
+}
+
+
+void nestedProperties():
+{String name;
+LexicalUnit exp;}
+{
+    name=property()
+    ":" ( <S> )* 
+    <LBRACE> (<S>)*
+    {
+      documentHandler.startNestedProperties(name);
+    }
+    ( declaration() )? ( ";" ( <S> )* ( declaration() )? )*
+    <RBRACE>
+    {
+      documentHandler.endNestedProperties(name);
+    }
+    (<S>)*
+}
+/**
+ * @exception ParseException exception during the parse
+ */
+void styleRuleOrDeclarationOrNestedProperties() :
+{
+}
+{
+  try {
+    // differentiate between the colon of a pseudo and the colon of nested properties and the colon of a simple property
+    // first check if it is a normal styleRule, if not check if it is declarationOrNestedProperties(), if still fails, most likely, it is
+    // is styleRule with pseudo selector with contains functions. have to do it in this way, because both the styleRule and declarationOrNestedProperties()
+    // have 'skipStatementUntilXXX', which cannot be LOOKAHEAD properly.
+      ( debuggingDirective() | LOOKAHEAD(selectorList()<LBRACE>) styleRule() | LOOKAHEAD(3)declarationOrNestedProperties() | styleRule())
+  } catch (JumpException e) {
+     skipAfterExpression();
+     // reportWarningSkipText(getLocator(), skipAfterExpression());
+  } catch (ParseException e) {
+     if (errorHandler != null) {
+         if (e.currentToken != null) {
+             LocatorImpl li = new LocatorImpl(this,
+                                              e.currentToken.next.beginLine,
+                                              e.currentToken.next.beginColumn-1);
+             reportError(li, e);
+         } else {
+             reportError(getLocator(), e);
+         }
+         skipAfterExpression();
+         /*
+         LocatorImpl loc = (LocatorImpl) getLocator();
+         loc.column--;
+         reportWarningSkipText(loc, skipAfterExpression());
+         */
+     } else {
+         skipAfterExpression();
+     }
+  }
+}
+/**
+ * @exception ParseException exception during the parse
+ */
+void declarationOrNestedProperties() :
+{ boolean important = false;
+  String name;
+  LexicalUnitImpl exp;
+  Token save;
+  String comment = null;
+}
+{
+ try {
+     name=property()
+     { save = token; }
+     ":" ( <S> )* 
+     (exp=expr() ( important=prio() )?
+     {
+         Token next = getToken(1);
+         if(next.kind == SEMICOLON || next.kind == RBRACE){
+             while(next.kind == SEMICOLON){
+                 skipStatement();
+                 next = getToken(1);
+             }
+             //only add special token kept for sprites '/**'
+             if(token.specialToken!=null && token.specialToken!=null && token.specialToken.image.startsWith("/**")){
+                 documentHandler.property(name, exp, important, token.specialToken.image);
+             }else{
+                 documentHandler.property(name, exp, important, null);
+             }
+         }
+     }
+     |<LBRACE> (<S>)*
+     {
+         documentHandler.startNestedProperties(name);
+     }
+     ( declaration() )? ( ";" ( <S> )* ( declaration() )? )*
+     <RBRACE>(<S>)*
+     {
+         documentHandler.endNestedProperties(name);
+     }
+     )
+     
+ } catch (JumpException e) {
+     skipAfterExpression();
+     // reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (NumberFormatException e) {
+     if (errorHandler != null) {
+         errorHandler.error(new CSSParseException("Invalid number " 
+                                                  + e.getMessage(),
+                                                  getLocator(), 
+                                                  e));
+     }
+     reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (ParseException e) {
+     if (errorHandler != null) {
+         if (e.currentToken != null) {
+             LocatorImpl li = new LocatorImpl(this,
+                                              e.currentToken.next.beginLine,
+                                              e.currentToken.next.beginColumn-1);
+             reportError(li, e);
+         } else {
+             reportError(getLocator(), e);
+         }
+         skipAfterExpression();
+         /*
+         LocatorImpl loc = (LocatorImpl) getLocator();
+         loc.column--;
+         reportWarningSkipText(loc, skipAfterExpression());
+         */
+     } else {
+         skipAfterExpression();
+     }
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+void declaration() :
+{ boolean important = false;
+  String name;
+  LexicalUnit exp;
+  Token save;
+}
+{
+ try {
+     name=property()
+     { save = token; }
+     ":" ( <S> )* exp=expr() ( important=prio() )?
+     {
+        documentHandler.property(name, exp, important);
+     }
+ } catch (JumpException e) {
+     skipAfterExpression();
+     // reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (NumberFormatException e) {
+     if (errorHandler != null) {
+        errorHandler.error(new CSSParseException("Invalid number " 
+                                                 + e.getMessage(),
+                                                 getLocator(), 
+                                                 e));
+     }
+     reportWarningSkipText(getLocator(), skipAfterExpression());
+ } catch (ParseException e) {
+     if (errorHandler != null) {
+        if (e.currentToken != null) {
+            LocatorImpl li = new LocatorImpl(this,
+                                             e.currentToken.next.beginLine,
+                                             e.currentToken.next.beginColumn-1);
+            reportError(li, e);
+        } else {
+            reportError(getLocator(), e);
+        }
+        skipAfterExpression();
+        /*
+        LocatorImpl loc = (LocatorImpl) getLocator();
+        loc.column--;
+        reportWarningSkipText(loc, skipAfterExpression());
+        */
+     } else {
+        skipAfterExpression();
+     }
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+boolean prio() :
+{}
+{
+  <IMPORTANT_SYM> ( <S> )* { return true; }
+}
+
+boolean guarded() :
+{}
+{
+    <GUARDED_SYM> (<S>)* {return true;}
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+LexicalUnitImpl operator(LexicalUnitImpl prev) :
+{Token n;}
+{
+/* (comments copied from basic_arithmetics.scss)
+*supports:
+* 1. standard arithmetic operations (+, -, *, /, %)
+* 2. / is treated as css operator, unless one of its operands is variable or there is another binary arithmetic operator
+*limits:
+* 1. cannot mix arithmetic and css operations, e.g. "margin: 1px + 3px 2px" will fail
+* 2. space between add and minus operator and their following operand is mandatory. e.g. "1 + 2" is valid, "1+2" is not
+* 3. parenthesis is not supported now.  
+*/
+n="," ( <S> )* { return LexicalUnitImpl.createComma(n.beginLine, 
+            n.beginColumn,
+            prev); }
+|n="/" ( <S> )* { return LexicalUnitImpl.createSlash(n.beginLine, 
+            n.beginColumn,
+            prev); }
+| n="*" ( <S> )* { return LexicalUnitImpl.createMultiply(n.beginLine,
+            n.beginColumn,
+            prev); }
+| n="%" ( <S> )* { return LexicalUnitImpl.createModulo(n.beginLine,
+            n.beginColumn,
+            prev); }
+/*
+* for '+', since it can be either a binary operator or an unary operator,
+* which is ambiguous. To avoid this, the binary operator '+' always has
+* a space before the following term. so '2+3' is not a valid binary expression,
+* but '2 + 3' is.  The same for '-' operator.
+*/
+
+| n="+" ( <S> )+{ return LexicalUnitImpl.createAdd(n.beginLine,
+        n.beginColumn,
+        prev); }
+| n="-" ( <S> )+{ return LexicalUnitImpl.createMinus(n.beginLine,
+        n.beginColumn,
+        prev); }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+LexicalUnitImpl expr() :
+{
+    LexicalUnitImpl first, res;
+    char op;
+}
+{
+    first=term(null){ res = first; }
+    ( LOOKAHEAD(2) ( LOOKAHEAD(2) res=operator(res) )? res=term(res))*
+  { return first; }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+char unaryOperator() :
+{}
+{
+  "-" { return '-'; }
+| "+" { return '+'; }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+LexicalUnitImpl term(LexicalUnitImpl prev) :
+{ LexicalUnitImpl result = null;
+  Token n = null;
+  char op = ' ';
+}
+{
+  (result = nonVariableTerm(prev)| result = variableTerm(prev))
+      {
+         return result;
+      }
+}
+
+LexicalUnitImpl variableTerm(LexicalUnitImpl prev) :\r{
+  LexicalUnitImpl result = null;
+  String varName = "";\r}\r{
+  varName = variableName()
+         {result = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
+                 prev, varName); return result;}\r}
+
+LexicalUnitImpl nonVariableTerm(LexicalUnitImpl prev) :\r{\rLexicalUnitImpl result = null;
+  Token n = null;
+  char op = ' ';
+  String varName;
+  String s = "";
+}
+{
+( ( ( 
+    op=unaryOperator() )?
+    (n=<NUMBER>
+       { result = LexicalUnitImpl.createNumber(n.beginLine, n.beginColumn,
+                                               prev, number(op, n, 0)); }
+    | n=<PERCENTAGE>
+       { result = LexicalUnitImpl.createPercentage(n.beginLine, n.beginColumn,
+                                                   prev, number(op, n, 1)); }
+    | n=<PT>
+       { result = LexicalUnitImpl.createPT(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<CM>
+       { result = LexicalUnitImpl.createCM(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<MM>
+       { result = LexicalUnitImpl.createMM(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<PC>
+       { result = LexicalUnitImpl.createPC(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<IN>
+       { result = LexicalUnitImpl.createIN(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<PX>
+       { result = LexicalUnitImpl.createPX(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<EMS>
+       { result = LexicalUnitImpl.createEMS(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2)); }
+    | n=<LEM>
+        { result = LexicalUnitImpl.createLEM(n.beginLine, n.beginColumn,
+                                             prev, number(op, n, 3)); }
+    | n=<REM>       
+        { result = LexicalUnitImpl.createREM(n.beginLine, n.beginColumn,
+                                             prev, number(op, n, 3)); }
+    | n=<EXS>
+       { result = LexicalUnitImpl.createEXS(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 2)); }
+    | n=<DEG>
+       { result = LexicalUnitImpl.createDEG(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 3)); }
+    | n=<RAD>
+       { result = LexicalUnitImpl.createRAD(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 3)); }
+    | n=<GRAD>
+       { result = LexicalUnitImpl.createGRAD(n.beginLine, n.beginColumn,
+                                             prev, number(op, n, 3)); }
+    | n=<SECOND>
+       { result = LexicalUnitImpl.createS(n.beginLine, n.beginColumn,
+                                          prev, number(op, n, 1)); }
+    | n=<MS>
+       { result = LexicalUnitImpl.createMS(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<HZ>
+       { result = LexicalUnitImpl.createHZ(n.beginLine, n.beginColumn,
+                                           prev, number(op, n, 2)); }
+    | n=<KHZ>
+       { result = LexicalUnitImpl.createKHZ(n.beginLine, n.beginColumn,
+                                            prev, number(op, n, 3)); }
+    | n=<DIMEN>
+       {
+           s = n.image;
+           int i = 0;
+           while (i < s.length() 
+                  && (Character.isDigit(s.charAt(i)) || (s.charAt(i) == '.'))) {
+               i++;
+           }
+
+           result = LexicalUnitImpl.createDimen(n.beginLine, n.beginColumn, prev, 
+                                                number(op,n,s.length()-i),
+                                                s.substring(i));
+       }
+    | result=function(op, prev) ) )
+  | ( n=<STRING>
+       { result =
+         LexicalUnitImpl.createString(n.beginLine, n.beginColumn, prev,
+                                      convertStringIndex(n.image, 1, 
+                                                         n.image.length() -1));}
+  | (< DOT >{ s+="."; })?(n=<IDENT> | n=<TO> | n=<THROUGH> | n=<FROM>) 
+      { s += convertIdent(n.image);
+       if ("inherit".equals(s)) {
+           result = LexicalUnitImpl.createInherit(n.beginLine, n.beginColumn,
+                                              prev);
+       } else {
+           result = LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+                                              prev, convertIdent(n.image));
+       }
+
+         /* /
+         Auto correction code used in the CSS Validator but must not
+          be used by a conformant CSS2 parser.
+        * Common error :
+        * H1 {
+        *   color : black
+        *   background : white
+        * }
+        *
+       Token t = getToken(1);
+       Token semicolon = new Token();
+       semicolon.kind = SEMICOLON;
+       semicolon.image = ";";
+       if (t.kind == COLON) {
+           // @@SEEME. (generate a warning?)
+           // @@SEEME if expression is a single ident, 
+              generate an error ?
+           rejectToken(semicolon);
+           
+           result = prev;
+       }
+       / */
+    }
+       | result=hexcolor(prev) 
+        | result=url(prev)
+       | result=unicode(prev)
+         ) ) ( <S> )*
+  {
+    return result;\r  }\r}
+
+/**
+ * Handle all CSS2 functions.
+ * @exception ParseException exception during the parse
+ */
+LexicalUnitImpl function(char operator, LexicalUnitImpl prev) :
+{Token n;
+ LexicalUnit params = null;
+}
+{
+    n=<FUNCTION> ( <S> )*  
+    {
+        String fname = convertIdent(n.image);
+        if("alpha(".equals(fname)){
+            String body = skipStatementUntilSemiColon();
+            return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+                 null, "alpha("+body);
+        }else if("expression(".equals(fname)){
+            String body = skipStatementUntilSemiColon();
+            return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+                 null, "expression("+body);
+        }
+    }
+    ( params=expr() )? ")"
+    {
+        if (operator != ' ') {
+           throw new CSSParseException("invalid operator before a function.", 
+                                       getLocator());
+       }
+       String f = convertIdent(n.image);
+        LexicalUnitImpl l = (LexicalUnitImpl) params;
+       boolean loop = true;
+       if ("rgb(".equals(f)) {
+           // this is a RGB declaration (e.g. rgb(255, 50%, 0) )
+           int i = 0;
+           while (loop && l != null && i < 5) {
+               switch (i) {
+                   case 0:
+                   case 2:
+                   case 4:
+                       if ((l.getLexicalUnitType() != LexicalUnit.SAC_INTEGER)
+                           && (l.getLexicalUnitType() != LexicalUnit.SAC_PERCENTAGE)) {
+                           loop = false;
+                       }
+                       break;
+                   case 1:
+                   case 3:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                           loop = false;
+                       }
+                       break;
+                   default:
+                        throw new ParseException("implementation error");
+               }
+               if (loop) {
+                   l = (LexicalUnitImpl) l.getNextLexicalUnit();
+                   i ++;
+               }
+           }
+           if ((i == 5) && loop && (l == null)) {
+               return LexicalUnitImpl.createRGBColor(n.beginLine,
+                                                     n.beginColumn,
+                                                     prev, params);
+           } else {
+               if (errorHandler != null) {
+                   String errorText;
+                   Locator loc;
+                   if (i < 5) {
+                       if (params == null) {
+                           loc = new LocatorImpl(this, n.beginLine,
+                                                 n.beginColumn-1);
+                           errorText = "not enough parameters.";
+                       } else if (l == null) {
+                           loc = new LocatorImpl(this, n.beginLine,
+                                                 n.beginColumn-1);
+                           errorText = "not enough parameters: " 
+                               + params.toString();
+                       } else {
+                           loc = new LocatorImpl(this, l.getLineNumber(),
+                                                 l.getColumnNumber());
+                           errorText = "invalid parameter: "
+                               + l.toString();
+                       }
+                   } else {
+                       loc = new LocatorImpl(this, l.getLineNumber(),
+                                             l.getColumnNumber());
+                       errorText = "too many parameters: "
+                           + l.toString();
+                   }
+                   errorHandler.error(new CSSParseException(errorText, loc));
+               }
+
+               throw new JumpException();
+           }
+       } else if ("counter".equals(f)) {
+           int i = 0;
+           while (loop && l != null && i < 3) {
+               switch (i) {
+                   case 0:
+                   case 2:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+                           loop = false;
+                       }
+                       break;
+                   case 1:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                           loop = false;
+                       }
+                       break;
+                   default:
+                        throw new ParseException("implementation error");
+               }
+               l = (LexicalUnitImpl) l.getNextLexicalUnit();
+               i ++;
+           }
+           if (((i == 1) || (i == 3)) && loop && (l == null)) {
+               return LexicalUnitImpl.createCounter(n.beginLine, n.beginColumn,
+                                                    prev, params);
+           }
+
+       } else if ("counters(".equals(f)) {
+           
+           int i = 0;
+           while (loop && l != null && i < 5) {
+               switch (i) {
+                   case 0:
+                   case 4:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
+                           loop = false;
+                       }
+                       break;
+                   case 2:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_STRING_VALUE) {
+                           loop = false;
+                       }
+                       break;
+                   case 1:
+                   case 3:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                           loop = false;
+                       }
+                       break;
+                   default:
+                        throw new ParseException("implementation error");
+               }
+               l = (LexicalUnitImpl) l.getNextLexicalUnit();
+               i ++;
+           }
+           if (((i == 3) || (i == 5)) && loop && (l == null)) {
+               return LexicalUnitImpl.createCounters(n.beginLine, n.beginColumn,
+                                                     prev, params);
+           }
+       } else if ("attr(".equals(f)) {
+           if ((l != null)
+               && (l.getNextLexicalUnit() == null)
+               && (l.getLexicalUnitType() == LexicalUnit.SAC_IDENT)) {
+                return LexicalUnitImpl.createAttr(l.getLineNumber(), 
+                                                 l.getColumnNumber(),
+                                                 prev, l.getStringValue());
+           }
+       } else if ("rect(".equals(f)) {
+           int i = 0;
+           while (loop && l != null && i < 7) {
+               switch (i) {
+                   case 0:
+                   case 2:
+                   case 4:
+                   case 6:
+                       switch (l.getLexicalUnitType()) {
+                       case LexicalUnit.SAC_INTEGER:
+                           if (l.getIntegerValue() != 0) {
+                               loop = false;
+                           }
+                           break;
+                       case LexicalUnit.SAC_IDENT:
+                           if (!l.getStringValue().equals("auto")) {
+                               loop = false;
+                           }
+                           break;
+                       case LexicalUnit.SAC_EM:
+                       case LexicalUnit.SAC_EX:
+                       case LexicalUnit.SAC_PIXEL:
+                       case LexicalUnit.SAC_CENTIMETER:
+                       case LexicalUnit.SAC_MILLIMETER:
+                       case LexicalUnit.SAC_INCH:
+                       case LexicalUnit.SAC_POINT:
+                       case LexicalUnit.SAC_PICA:
+                           // nothing
+                           break;
+                       default:
+                           loop = false;
+                       }
+                       break;
+                   case 1:
+                   case 3:
+                   case 5:
+                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
+                           loop = false;
+                       }
+                       break;
+                   default:
+                        throw new ParseException("implementation error");
+               }
+               l = (LexicalUnitImpl) l.getNextLexicalUnit();
+               i ++;
+           }
+           if ((i == 7) && loop && (l == null)) {
+               return LexicalUnitImpl.createRect(n.beginLine, n.beginColumn,
+                                                 prev, params);
+           }
+       } 
+       return LexicalUnitImpl.createFunction(n.beginLine, n.beginColumn, prev, 
+                                             f.substring(0, 
+                                                       f.length() -1),
+                                             params);
+    }
+}
+
+LexicalUnitImpl unicode(LexicalUnitImpl prev) :
+{ Token n;
+}
+{
+  n=<UNICODERANGE>
+ {
+     LexicalUnitImpl params = null;
+     String s = n.image.substring(2);
+     int index = s.indexOf('-');
+     if (index == -1) {
+        params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                                               params, Integer.parseInt(s, 16));
+     } else {
+        String s1 = s.substring(0, index);
+        String s2 = s.substring(index);
+
+        params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                                               params, Integer.parseInt(s1, 16));
+        params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
+                                               params, Integer.parseInt(s2, 16));
+     }
+
+     return LexicalUnitImpl.createUnicodeRange(n.beginLine, n.beginColumn,
+                                              prev, params);
+ }
+}
+
+LexicalUnitImpl url(LexicalUnitImpl prev) :
+{ Token n;
+}
+{
+  n=<URL>
+ {
+   String urlname = n.image.substring(4, n.image.length()-1).trim();
+   return LexicalUnitImpl.createURL(n.beginLine, n.beginColumn, prev, urlname); 
+ }
+}
+
+/**
+ * @exception ParseException exception during the parse
+ */
+LexicalUnitImpl hexcolor(LexicalUnitImpl prev) :
+{Token n; 
+}
+{
+ n=<HASH>
+ { 
+     int r;
+     LexicalUnitImpl first, params = null;
+     String s = n.image.substring(1);
+     
+     if(s.length()!=3 && s.length()!=6) {
+        first = null;
+        throw new CSSParseException("invalid hexadecimal notation for RGB: " + s, 
+                                    getLocator());
+     }
+     return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
+             prev, n.image);
+ }
+}
+
+JAVACODE
+float number(char operator, Token n, int lengthUnit) {
+    String image  = n.image;
+    float f = 0;
+
+    if (lengthUnit != 0) {
+       image = image.substring(0, image.length() - lengthUnit);
+    }
+    f = Float.valueOf(image).floatValue();
+    return (operator == '-')? -f: f;
+}
+
+JAVACODE
+String skipStatementUntilSemiColon(){
+    int[] semicolon = {SEMICOLON};
+    return skipStatementUntil(semicolon);
+}
+
+JAVACODE
+String skipStatementUntilLeftBrace(){
+    int[] lBrace = {LBRACE};
+    return skipStatementUntil(lBrace);
+}
+
+JAVACODE
+String skipStatementUntilMatchingRightParan(){
+    int[] leftTokens = {LPARAN, FUNCTION}; // a FUNCTION also contains "("
+    int[] rightTokens = {RPARAN};
+    StringBuffer s = new StringBuffer();
+    int difference = 1;
+    Token tok;
+    while(difference != 0){
+        tok = getToken(1);
+        if(tok.kind == EOF) {
+            return null;
+        }
+        for(int sym : leftTokens){
+            if(tok.kind == sym){
+                difference++;
+            }
+        }
+        for(int sym : rightTokens){
+            if(tok.kind == sym){
+                difference--;
+            }
+        }
+        if(difference != 0){
+            if (tok.image != null) {
+                s.append(tok.image);
+            }
+            getNextToken();
+        }
+    }
+    return s.toString().trim();
+}
+
+JAVACODE
+String skipStatementUntil(int[] symbols){
+    StringBuffer s = new StringBuffer();
+    boolean stop = false;
+    Token tok;
+    while(!stop){
+        tok = getToken(1);
+        if(tok.kind == EOF) {
+            return null;
+        }
+        for(int sym : symbols){
+            if(tok.kind == sym){
+                stop = true;
+                break;
+            }
+        }
+        if(!stop){
+            if (tok.image != null) {
+                s.append(tok.image);
+            }
+            getNextToken();
+        }
+    }
+    return s.toString().trim();
+}
+
+
+JAVACODE
+String skipStatement() {
+    StringBuffer s = new StringBuffer();
+    Token tok = getToken(0);
+    if (tok.image != null) {
+        s.append(tok.image);    
+    }
+    while (true) {
+        tok = getToken(1);
+        if (tok.kind == EOF) {
+            return null;
+        } 
+        s.append(tok.image);
+        if (tok.kind == LBRACE) {
+            getNextToken();
+            s.append(skip_to_matching_brace());
+            getNextToken();
+            tok = getToken(1);
+            break;
+        } else if (tok.kind == RBRACE) {
+            getNextToken();
+            tok = getToken(1);
+            break;
+        } else if (tok.kind == SEMICOLON) {
+            getNextToken();
+            tok = getToken(1);
+            break;
+        }
+        getNextToken();
+    }
+    
+    // skip white space
+    while (true) {
+        if (tok.kind != S) {
+            break;
+        }
+        tok = getNextToken();
+        tok = getToken(1);
+    }
+
+    return s.toString().trim();
+}
+
+JAVACODE
+String skip_to_matching_brace() {
+    StringBuffer s = new StringBuffer();
+    Token tok;
+    int nesting = 1;
+    while (true) {
+        tok = getToken(1);
+        if (tok.kind == EOF) {
+            break;
+        }
+        s.append(tok.image);
+        if (tok.kind == LBRACE) {
+            nesting++;
+        } else if (tok.kind == RBRACE) {
+            nesting--;
+            if (nesting == 0) {
+                break;
+            }
+        }
+        getNextToken();
+    }
+    return s.toString();
+}
+
+/*
+ * Here I handle all CSS2 unicode character stuffs.
+ * I convert all \XXXXXX character into a single character.
+ * Don't forget that the parser has recognize the token before.
+ * (So IDENT won't contain newline and stuffs like this).
+ */
+JAVACODE
+String convertStringIndex(String s, int start, int len) {
+    StringBuffer buf = new StringBuffer(len);
+    int index = start;
+
+    while (index < len) {
+       char c = s.charAt(index);
+       if (c == '\\') {
+           if (++index < len) {
+               c = s.charAt(index);
+               switch (c) {
+               case '0': case '1': case '2': case '3': case '4':
+               case '5': case '6': case '7': case '8': case '9':
+               case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+               case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+                   buf.append('\\');
+                   while (index < len) {
+                       buf.append(s.charAt(index++));
+                   }
+                   break;
+               case '\n':
+               case '\f':
+                   break;
+               case '\r':
+                   if (index + 1 < len) {
+                       if (s.charAt(index + 1) == '\n') {
+                           index ++;
+                       }
+                   }
+                   break;
+               default:
+                   buf.append(c);
+               }
+           } else {
+               throw new CSSParseException("invalid string " + s, getLocator());
+           }
+       } else {
+           buf.append(c);
+       }
+       index++;
+    }
+
+    return buf.toString();
+}
+
+JAVACODE
+String convertIdent(String s) {
+    return convertStringIndex(s, 0, s.length());
+}
+
+JAVACODE
+String convertString(String s) {
+    return convertStringIndex(s, 0, s.length());
+}
+
+JAVACODE
+void comments(){
+       /*keeps only the multiple line comments, single line comments are skipped*/
+    if (token.specialToken != null && token.specialToken.image!=null && token.specialToken.image.startsWith("/*")){
+        Token tmp_t = token.specialToken;
+        while (tmp_t.specialToken != null) tmp_t = tmp_t.specialToken;
+        while (tmp_t != null) {
+            documentHandler.comment(tmp_t.image);
+            tmp_t = tmp_t.next;
+        }
+    }
+} 
+
+/*
+ * @@HACK
+ * I can't insert a token into the tokens flow.
+ * It's jj_consume_token implementation dependant! :-(
+ */
+JAVACODE
+void rejectToken(Token t) {
+    Token fakeToken = new Token();
+    t.next = token;
+    fakeToken.next = t;
+    token = fakeToken;
+}
+
+/**
+ * skip after an expression
+ */
+JAVACODE
+String skipAfterExpression() {
+    Token t = getToken(1);
+    StringBuffer s = new StringBuffer();
+    s.append(getToken(0).image);
+    
+    while ((t.kind != RBRACE) && (t.kind != SEMICOLON) && (t.kind != EOF)) {
+       s.append(t.image);
+       getNextToken();
+       t = getToken(1);
+    }
+    
+    return s.toString();
+}
+
+/**
+ * The following functions are useful for a DOM CSS implementation only and are
+ * not part of the general CSS2 parser.
+ */
+// TODO required by original parser but not used by Vaadin?
+void _parseRule() :
+{String ret = null;
+}
+{
+       ( <S> )*
+          ( importDeclaration() | debuggingDirective() | styleRule() | media() | page() | fontFace() | ret=skipStatement() 
+               {
+                   if ((ret == null) || (ret.length() == 0)) {
+                       return; 
+                   }
+                   if (ret.charAt(0) == '@') {
+                       documentHandler.unrecognizedRule(ret);
+                   } else {
+                       throw new CSSParseException("unrecognize rule: " + ret,
+                                                   getLocator());
+                   }
+               }
+         )
+}
+
+void _parseImportRule() :
+{
+}
+{
+    ( <S> )* importDeclaration()
+}
+
+void _parseMediaRule() :
+{
+}
+{
+    ( <S> )* media()
+}
+
+void _parseDeclarationBlock() :
+{
+}
+{
+    ( <S> )*
+       ( declaration() )? ( ";" ( <S> )* ( declaration() )? )* 
+ }
+
+ArrayList<String> _parseSelectors() :
+{ ArrayList<String> p = null;
+}
+{
+    try {
+       ( <S> )* p = selectorList()
+       { return p; }
+    } catch (ThrowedParseException e) {
+       throw (ParseException) e.e.fillInStackTrace();
+    }
+}
+
+/*
+ * Local Variables:
+ * compile-command: javacc Parser.jj & javac Parser.java
+ * End:
+ */
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/ParserConstants.java b/theme-compiler/src/com/vaadin/sass/internal/parser/ParserConstants.java
new file mode 100644 (file)
index 0000000..a3ab622
--- /dev/null
@@ -0,0 +1,392 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed 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.
+ */
+/* Generated By:JavaCC: Do not edit this line. ParserConstants.java */
+package com.vaadin.sass.internal.parser;
+
+
+/**
+ * Token literal values and constants.
+ * Generated by org.javacc.parser.OtherFilesGen#start()
+ */
+public interface ParserConstants {
+
+  /** End of File. */
+  int EOF = 0;
+  /** RegularExpression Id. */
+  int S = 1;
+  /** RegularExpression Id. */
+  int SINGLE_LINE_COMMENT = 2;
+  /** RegularExpression Id. */
+  int FORMAL_COMMENT = 5;
+  /** RegularExpression Id. */
+  int MULTI_LINE_COMMENT = 6;
+  /** RegularExpression Id. */
+  int CDO = 8;
+  /** RegularExpression Id. */
+  int CDC = 9;
+  /** RegularExpression Id. */
+  int LBRACE = 10;
+  /** RegularExpression Id. */
+  int RBRACE = 11;
+  /** RegularExpression Id. */
+  int DASHMATCH = 12;
+  /** RegularExpression Id. */
+  int CARETMATCH = 13;
+  /** RegularExpression Id. */
+  int DOLLARMATCH = 14;
+  /** RegularExpression Id. */
+  int STARMATCH = 15;
+  /** RegularExpression Id. */
+  int INCLUDES = 16;
+  /** RegularExpression Id. */
+  int EQ = 17;
+  /** RegularExpression Id. */
+  int PLUS = 18;
+  /** RegularExpression Id. */
+  int MINUS = 19;
+  /** RegularExpression Id. */
+  int COMMA = 20;
+  /** RegularExpression Id. */
+  int SEMICOLON = 21;
+  /** RegularExpression Id. */
+  int PRECEDES = 22;
+  /** RegularExpression Id. */
+  int SIBLING = 23;
+  /** RegularExpression Id. */
+  int SUCCEEDS = 24;
+  /** RegularExpression Id. */
+  int DIV = 25;
+  /** RegularExpression Id. */
+  int LBRACKET = 26;
+  /** RegularExpression Id. */
+  int RBRACKET = 27;
+  /** RegularExpression Id. */
+  int ANY = 28;
+  /** RegularExpression Id. */
+  int MOD = 29;
+  /** RegularExpression Id. */
+  int PARENT = 30;
+  /** RegularExpression Id. */
+  int DOT = 31;
+  /** RegularExpression Id. */
+  int LPARAN = 32;
+  /** RegularExpression Id. */
+  int RPARAN = 33;
+  /** RegularExpression Id. */
+  int COMPARE = 34;
+  /** RegularExpression Id. */
+  int OR = 35;
+  /** RegularExpression Id. */
+  int AND = 36;
+  /** RegularExpression Id. */
+  int NOT_EQ = 37;
+  /** RegularExpression Id. */
+  int COLON = 38;
+  /** RegularExpression Id. */
+  int INTERPOLATION = 39;
+  /** RegularExpression Id. */
+  int NONASCII = 40;
+  /** RegularExpression Id. */
+  int H = 41;
+  /** RegularExpression Id. */
+  int UNICODE = 42;
+  /** RegularExpression Id. */
+  int ESCAPE = 43;
+  /** RegularExpression Id. */
+  int NMSTART = 44;
+  /** RegularExpression Id. */
+  int NMCHAR = 45;
+  /** RegularExpression Id. */
+  int STRINGCHAR = 46;
+  /** RegularExpression Id. */
+  int D = 47;
+  /** RegularExpression Id. */
+  int NAME = 48;
+  /** RegularExpression Id. */
+  int TO = 49;
+  /** RegularExpression Id. */
+  int THROUGH = 50;
+  /** RegularExpression Id. */
+  int EACH_IN = 51;
+  /** RegularExpression Id. */
+  int FROM = 52;
+  /** RegularExpression Id. */
+  int MIXIN_SYM = 53;
+  /** RegularExpression Id. */
+  int INCLUDE_SYM = 54;
+  /** RegularExpression Id. */
+  int FUNCTION_SYM = 55;
+  /** RegularExpression Id. */
+  int RETURN_SYM = 56;
+  /** RegularExpression Id. */
+  int DEBUG_SYM = 57;
+  /** RegularExpression Id. */
+  int WARN_SYM = 58;
+  /** RegularExpression Id. */
+  int FOR_SYM = 59;
+  /** RegularExpression Id. */
+  int EACH_SYM = 60;
+  /** RegularExpression Id. */
+  int WHILE_SYM = 61;
+  /** RegularExpression Id. */
+  int IF_SYM = 62;
+  /** RegularExpression Id. */
+  int ELSE_SYM = 63;
+  /** RegularExpression Id. */
+  int EXTEND_SYM = 64;
+  /** RegularExpression Id. */
+  int MOZ_DOCUMENT_SYM = 65;
+  /** RegularExpression Id. */
+  int SUPPORTS_SYM = 66;
+  /** RegularExpression Id. */
+  int CONTENT_SYM = 67;
+  /** RegularExpression Id. */
+  int MICROSOFT_RULE = 68;
+  /** RegularExpression Id. */
+  int IF = 69;
+  /** RegularExpression Id. */
+  int GUARDED_SYM = 70;
+  /** RegularExpression Id. */
+  int STRING = 71;
+  /** RegularExpression Id. */
+  int IDENT = 72;
+  /** RegularExpression Id. */
+  int NUMBER = 73;
+  /** RegularExpression Id. */
+  int _URL = 74;
+  /** RegularExpression Id. */
+  int URL = 75;
+  /** RegularExpression Id. */
+  int VARIABLE = 76;
+  /** RegularExpression Id. */
+  int PERCENTAGE = 77;
+  /** RegularExpression Id. */
+  int PT = 78;
+  /** RegularExpression Id. */
+  int MM = 79;
+  /** RegularExpression Id. */
+  int CM = 80;
+  /** RegularExpression Id. */
+  int PC = 81;
+  /** RegularExpression Id. */
+  int IN = 82;
+  /** RegularExpression Id. */
+  int PX = 83;
+  /** RegularExpression Id. */
+  int EMS = 84;
+  /** RegularExpression Id. */
+  int LEM = 85;
+  /** RegularExpression Id. */
+  int REM = 86;
+  /** RegularExpression Id. */
+  int EXS = 87;
+  /** RegularExpression Id. */
+  int DEG = 88;
+  /** RegularExpression Id. */
+  int RAD = 89;
+  /** RegularExpression Id. */
+  int GRAD = 90;
+  /** RegularExpression Id. */
+  int MS = 91;
+  /** RegularExpression Id. */
+  int SECOND = 92;
+  /** RegularExpression Id. */
+  int HZ = 93;
+  /** RegularExpression Id. */
+  int KHZ = 94;
+  /** RegularExpression Id. */
+  int DIMEN = 95;
+  /** RegularExpression Id. */
+  int HASH = 96;
+  /** RegularExpression Id. */
+  int IMPORT_SYM = 97;
+  /** RegularExpression Id. */
+  int MEDIA_SYM = 98;
+  /** RegularExpression Id. */
+  int CHARSET_SYM = 99;
+  /** RegularExpression Id. */
+  int PAGE_SYM = 100;
+  /** RegularExpression Id. */
+  int FONT_FACE_SYM = 101;
+  /** RegularExpression Id. */
+  int KEY_FRAME_SYM = 102;
+  /** RegularExpression Id. */
+  int ATKEYWORD = 103;
+  /** RegularExpression Id. */
+  int IMPORTANT_SYM = 104;
+  /** RegularExpression Id. */
+  int RANGE0 = 105;
+  /** RegularExpression Id. */
+  int RANGE1 = 106;
+  /** RegularExpression Id. */
+  int RANGE2 = 107;
+  /** RegularExpression Id. */
+  int RANGE3 = 108;
+  /** RegularExpression Id. */
+  int RANGE4 = 109;
+  /** RegularExpression Id. */
+  int RANGE5 = 110;
+  /** RegularExpression Id. */
+  int RANGE6 = 111;
+  /** RegularExpression Id. */
+  int RANGE = 112;
+  /** RegularExpression Id. */
+  int UNI = 113;
+  /** RegularExpression Id. */
+  int UNICODERANGE = 114;
+  /** RegularExpression Id. */
+  int REMOVE = 115;
+  /** RegularExpression Id. */
+  int APPEND = 116;
+  /** RegularExpression Id. */
+  int CONTAINS = 117;
+  /** RegularExpression Id. */
+  int FUNCTION = 118;
+  /** RegularExpression Id. */
+  int UNKNOWN = 119;
+
+  /** Lexical state. */
+  int DEFAULT = 0;
+  /** Lexical state. */
+  int IN_FORMAL_COMMENT = 1;
+  /** Lexical state. */
+  int IN_MULTI_LINE_COMMENT = 2;
+
+  /** Literal token values. */
+  String[] tokenImage = {
+    "<EOF>",
+    "<S>",
+    "<SINGLE_LINE_COMMENT>",
+    "<token of kind 3>",
+    "\"/*\"",
+    "\"*/\"",
+    "\"*/\"",
+    "<token of kind 7>",
+    "\"<!--\"",
+    "\"-->\"",
+    "\"{\"",
+    "\"}\"",
+    "\"|=\"",
+    "\"^=\"",
+    "\"$=\"",
+    "\"*=\"",
+    "\"~=\"",
+    "\"=\"",
+    "\"+\"",
+    "\"-\"",
+    "\",\"",
+    "\";\"",
+    "\">\"",
+    "\"~\"",
+    "\"<\"",
+    "\"/\"",
+    "\"[\"",
+    "\"]\"",
+    "\"*\"",
+    "\"%\"",
+    "\"&\"",
+    "\".\"",
+    "\"(\"",
+    "\")\"",
+    "\"==\"",
+    "\"||\"",
+    "\"&&\"",
+    "\"!=\"",
+    "\":\"",
+    "<INTERPOLATION>",
+    "<NONASCII>",
+    "<H>",
+    "<UNICODE>",
+    "<ESCAPE>",
+    "<NMSTART>",
+    "<NMCHAR>",
+    "<STRINGCHAR>",
+    "<D>",
+    "<NAME>",
+    "\"to\"",
+    "\"through\"",
+    "\"in\"",
+    "\"from\"",
+    "\"@mixin\"",
+    "\"@include\"",
+    "\"@function\"",
+    "\"@return\"",
+    "\"@debug\"",
+    "\"@warn\"",
+    "\"@for\"",
+    "\"@each\"",
+    "\"@while\"",
+    "\"@if\"",
+    "\"@else\"",
+    "\"@extend\"",
+    "\"@-moz-document\"",
+    "\"@supports\"",
+    "\"@content\"",
+    "<MICROSOFT_RULE>",
+    "\"if\"",
+    "<GUARDED_SYM>",
+    "<STRING>",
+    "<IDENT>",
+    "<NUMBER>",
+    "<_URL>",
+    "<URL>",
+    "<VARIABLE>",
+    "<PERCENTAGE>",
+    "<PT>",
+    "<MM>",
+    "<CM>",
+    "<PC>",
+    "<IN>",
+    "<PX>",
+    "<EMS>",
+    "<LEM>",
+    "<REM>",
+    "<EXS>",
+    "<DEG>",
+    "<RAD>",
+    "<GRAD>",
+    "<MS>",
+    "<SECOND>",
+    "<HZ>",
+    "<KHZ>",
+    "<DIMEN>",
+    "<HASH>",
+    "\"@import\"",
+    "\"@media\"",
+    "\"@charset\"",
+    "\"@page\"",
+    "\"@font-face\"",
+    "<KEY_FRAME_SYM>",
+    "<ATKEYWORD>",
+    "<IMPORTANT_SYM>",
+    "<RANGE0>",
+    "<RANGE1>",
+    "<RANGE2>",
+    "<RANGE3>",
+    "<RANGE4>",
+    "<RANGE5>",
+    "<RANGE6>",
+    "<RANGE>",
+    "<UNI>",
+    "<UNICODERANGE>",
+    "<REMOVE>",
+    "<APPEND>",
+    "<CONTAINS>",
+    "<FUNCTION>",
+    "<UNKNOWN>",
+  };
+
+}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/ParserImpl.jj b/theme-compiler/src/com/vaadin/sass/internal/parser/ParserImpl.jj
deleted file mode 100644 (file)
index 0a69342..0000000
+++ /dev/null
@@ -1,3028 +0,0 @@
-/*
- * Copyright 2000-2013 Vaadin Ltd.
- * 
- * Licensed 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.
- */
-/* -*-java-extended-*-
- * Copyright (c) 1999 World Wide Web Consortium
- * (Massachusetts Institute of Technology, Institut National de Recherche
- *  en Informatique et en Automatique, Keio University).
- * All Rights Reserved. http://www.w3.org/Consortium/Legal/
- *
- * $Id: Parser.jj,v 1.15 2000/10/27 21:09:37 plehegar Exp $
- */
-
-options {
-    IGNORE_CASE  = true;
-    STATIC = false;
-    USER_CHAR_STREAM = true;
-    /* DEBUG_TOKEN_MANAGER = true;
-       DEBUG_PARSER = true; */
-}
-
-PARSER_BEGIN(ParserImpl)
-
-package com.vaadin.sass.internal.parser;
-
-import java.io.*;
-import java.net.*;
-import java.util.ArrayList;
-import java.util.Locale;
-import java.util.Map;
-import java.util.UUID;
-
-import org.w3c.css.sac.ConditionFactory;
-import org.w3c.css.sac.Condition;
-import org.w3c.css.sac.SelectorFactory;
-import org.w3c.css.sac.SelectorList;
-import org.w3c.css.sac.Selector;
-import org.w3c.css.sac.SimpleSelector;
-import org.w3c.css.sac.DocumentHandler;
-import org.w3c.css.sac.InputSource;
-import org.w3c.css.sac.ErrorHandler;
-import org.w3c.css.sac.CSSException;
-import org.w3c.css.sac.CSSParseException;
-import org.w3c.css.sac.Locator;
-import org.w3c.css.sac.LexicalUnit;
-
-import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
-import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
-
-import org.w3c.flute.util.Encoding;
-
-import com.vaadin.sass.internal.handler.*;
-
-import com.vaadin.sass.internal.tree.*;
-
-/**
- * A CSS2 parser
- *
- * @author Philippe Le H�garet
- * @version $Revision: 1.15 $
- */
-public class ParserImpl implements org.w3c.css.sac.Parser, Parser {
-
-    // replaces all \t, \n, etc with this StringBuffer.
-    static final StringBuilder SPACE = new StringBuilder(" ");
-
-    // the document handler for the parser
-    protected SCSSDocumentHandlerImpl documentHandler;
-    // the error handler for the parser
-    protected ErrorHandler errorHandler;
-    // the input source for the parser
-    protected InputSource source;
-
-    protected ConditionFactory conditionFactory;
-    protected SelectorFactory selectorFactory;
-
-    // temporary place holder for pseudo-element ...
-    private String pseudoElt;
-    
-    /**
-     * Creates a new Parser
-     */
-    public ParserImpl() {
-       this((CharStream) null);
-    }
-
-    /**
-     * @@TODO
-     * @exception CSSException Not yet implemented
-     */    
-    public void setLocale(Locale locale) throws CSSException {
-       throw new CSSException(CSSException.SAC_NOT_SUPPORTED_ERR);
-    }
-    
-    public InputSource getInputSource(){
-        return source;
-    }
-
-    /**
-     * Set the document handler for this parser
-     */    
-    public void setDocumentHandler(DocumentHandler handler) {
-       this.documentHandler = (SCSSDocumentHandlerImpl) handler;
-    }
-
-    public void setSelectorFactory(SelectorFactory selectorFactory) {
-       this.selectorFactory = selectorFactory;
-    }
-
-    public void setConditionFactory(ConditionFactory conditionFactory) {
-       this.conditionFactory = conditionFactory;
-    }
-
-    /**
-     * Set the error handler for this parser
-     */    
-    public void setErrorHandler(ErrorHandler error) {
-       this.errorHandler = error;
-    }
-    
-    /**
-     * Main parse methods
-     *
-     * @param source the source of the style sheet.
-     * @exception IOException the source can't be parsed.
-     * @exception CSSException the source is not CSS valid.
-     */
-    public void parseStyleSheet(InputSource source) 
-           throws CSSException, IOException {
-       this.source = source;
-       ReInit(getCharStreamWithLurk(source));
-       if (selectorFactory == null) {
-           selectorFactory = new SelectorFactoryImpl();
-       }
-       if (conditionFactory == null) {
-           conditionFactory = new ConditionFactoryImpl();
-       }
-
-       parserUnit();
-    }
-
-    /**
-     * Convenient method for URIs.
-     *
-     * @param systemId the fully resolved URI of the style sheet.
-     * @exception IOException the source can't be parsed.
-     * @exception CSSException the source is not CSS valid.
-     */    
-    public void parseStyleSheet(String systemId) 
-           throws CSSException, IOException {
-       parseStyleSheet(new InputSource(systemId));
-    }
-
-    /**
-     * This method parses only one rule (style rule or at-rule, except @charset).
-     *
-     * @param source the source of the rule.
-     * @exception IOException the source can't be parsed.
-     * @exception CSSException the source is not CSS valid.
-     */    
-    // TODO required by original parser but not used by Vaadin?
-    public void parseRule(InputSource source) 
-           throws CSSException, IOException {
-       this.source = source;
-       ReInit(getCharStreamWithLurk(source));
-
-       if (selectorFactory == null) {
-           selectorFactory = new SelectorFactoryImpl();
-       }
-       if (conditionFactory == null) {
-           conditionFactory = new ConditionFactoryImpl();
-       }
-       _parseRule();
-    }
-
-    /**
-     * This method parses a style declaration (including the surrounding curly
-     * braces).
-     *
-     * @param source the source of the style declaration.
-     * @exception IOException the source can't be parsed.
-     * @exception CSSException the source is not CSS valid.
-     */
-    public void parseStyleDeclaration(InputSource source) 
-           throws CSSException, IOException {
-       this.source = source;
-       ReInit(getCharStreamWithLurk(source));
-
-       if (selectorFactory == null) {
-           selectorFactory = new SelectorFactoryImpl();
-       }
-       if (conditionFactory == null) {
-           conditionFactory = new ConditionFactoryImpl();
-       }
-       _parseDeclarationBlock();
-    }
-
-    /**
-     * This methods returns "http://www.w3.org/TR/REC-CSS2".
-     * @return the string "http://www.w3.org/TR/REC-CSS2".
-     */    
-    public String getParserVersion() {
-       return "http://www.w3.org/TR/REC-CSS2";
-    }
-
-    /**
-     * Parse methods used by DOM Level 2 implementation.
-     */    
-    public void parseImportRule(InputSource source) 
-           throws CSSException, IOException {
-       this.source = source;
-       ReInit(getCharStreamWithLurk(source));
-
-       if (selectorFactory == null) {
-           selectorFactory = new SelectorFactoryImpl();
-       }
-       if (conditionFactory == null) {
-           conditionFactory = new ConditionFactoryImpl();
-       }
-       _parseImportRule();
-    }
-
-    public void parseMediaRule(InputSource source) 
-           throws CSSException, IOException {
-       this.source = source;
-       ReInit(getCharStreamWithLurk(source));
-
-       if (selectorFactory == null) {
-           selectorFactory = new SelectorFactoryImpl();
-       }
-       if (conditionFactory == null) {
-           conditionFactory = new ConditionFactoryImpl();
-       }
-       _parseMediaRule();
-    }
-
-    public SelectorList parseSelectors(InputSource source) 
-           throws CSSException, IOException {
-       this.source = source;
-       ReInit(getCharStreamWithLurk(source));
-
-       return null;
-    }
-
-    public LexicalUnit parsePropertyValue(InputSource source) 
-           throws CSSException, IOException {
-       this.source = source;
-       ReInit(getCharStreamWithLurk(source));
-
-       return expr();
-    }
-
-    public boolean parsePriority(InputSource source) 
-           throws CSSException, IOException {
-       this.source = source;
-       ReInit(getCharStreamWithLurk(source));
-
-       return prio();
-    }
-
-    /**
-     * Convert the source into a Reader. Used only by DOM Level 2 parser methods.
-     */    
-    private Reader getReader(InputSource source) throws IOException {
-       if (source.getCharacterStream() != null) {
-           return source.getCharacterStream();
-       } else if (source.getByteStream() != null) {
-           // My DOM level 2 implementation doesn't use this case.
-           if (source.getEncoding() == null) {
-               // unknown encoding, use ASCII as default.
-               return new InputStreamReader(source.getByteStream(), "ASCII");
-           } else {
-               return new InputStreamReader(source.getByteStream(), 
-                                            source.getEncoding());
-           }
-       } else {
-           // systemId
-           // @@TODO
-           throw new CSSException("not yet implemented");
-       }
-    }
-
-    /**
-     * Convert the source into a CharStream with encoding informations.
-     * The encoding can be found in the InputSource or in the CSS document.
-     * Since this method marks the reader and make a reset after looking for
-     * the charset declaration, you'll find the charset declaration into the
-     * stream.  
-     */
-    private CharStream getCharStreamWithLurk(InputSource source)
-           throws CSSException, IOException {
-       if (source.getCharacterStream() != null) {
-           // all encoding are supposed to be resolved by the user
-           // return the reader
-           return new Generic_CharStream(source.getCharacterStream(), 1, 1);
-       } else if (source.getByteStream() == null) {
-           // @@CONTINUE ME. see also getReader() with systemId
-           try {
-               source.setByteStream(new URL(source.getURI()).openStream());
-           } catch (Exception e) {
-               try {
-                   source.setByteStream(new FileInputStream(source.getURI()));
-               } catch (IOException ex) {
-                   throw new CSSException("invalid url ?");
-               }
-           }
-       }
-       //use UTF-8 as the default encoding.
-       String encoding = source.getEncoding();
-       InputStream input = source.getByteStream();
-       if (!input.markSupported()) {
-            // If mark is not supported, wrap it in a stream which supports mark
-            input = new BufferedInputStream(input);
-            source.setByteStream(input);
-        }
-        // Mark either the original stream or the wrapped stream
-        input.mark(100);
-       if(encoding == null){
-           encoding = "ASCII";
-       
-           char c = ' ';
-
-           c = (char) input.read();
-
-           if (c == '@') {
-               // hum, is it a charset ?
-               int size   = 100;
-               byte[] buf = new byte[size];
-               input.read(buf, 0, 7);
-               String keyword = new String(buf, 0, 7);
-               if (keyword.equals("charset")) {
-                   // Yes, this is the charset declaration !
-
-                   // here I don't use the right declaration : white space are ' '.
-                   while ((c = (char) input.read()) == ' ') {
-                       // find the first quote
-                   }
-                   char endChar = c;
-                   int i = 0;
-
-                   if ((endChar != '"') && (endChar != '\'')) {
-                       // hum this is not a quote.
-                       throw new CSSException("invalid charset declaration");
-                   }
-
-                   while ((c = (char) input.read()) != endChar) {
-                       buf[i++] = (byte) c;
-                       if (i == size) {
-                           byte[] old = buf;
-                           buf = new byte[size + 100];
-                           System.arraycopy(old, 0, buf, 0, size);
-                           size += 100;
-                       }
-                   }
-                   while ((c = (char) input.read()) == ' ') {
-                       // find the next relevant character
-                   }
-                   if (c != ';') {
-                       // no semi colon at the end ?
-                       throw new CSSException("invalid charset declaration: "
-                                          + "missing semi colon");
-                   }
-                   encoding = new String(buf, 0, i);
-                   if (source.getEncoding() != null) {
-                       // compare the two encoding informations.
-                       // For example, I don't accept to have ASCII and after UTF-8.
-                       // Is it really good ? That is the question.
-                       if (!encoding.equals(source.getEncoding())) {
-                           throw new CSSException("invalid encoding information.");
-                       }
-                   }
-               } // else no charset declaration available
-           }
-       }
-       // ok set the real encoding of this source.
-       source.setEncoding(encoding);
-       // set the real reader of this source.
-       source.setCharacterStream(new InputStreamReader(source.getByteStream(),
-                                             Encoding.getJavaEncoding(encoding)));
-       // reset the stream (leave the charset declaration in the stream).
-       input.reset();
-
-       return new Generic_CharStream(source.getCharacterStream(), 1, 1);
-    }
-
-    private LocatorImpl currentLocator;
-    private Locator getLocator() {
-       if (currentLocator == null) {
-           currentLocator = new LocatorImpl(this, token.beginLine, token.beginColumn);
-           return currentLocator;
-       }
-       return currentLocator.reInit(this, token.beginLine, token.beginColumn);
-    }
-    private LocatorImpl getLocator(Token save) {
-       if (currentLocator == null) {
-           currentLocator = new LocatorImpl(this, save.beginLine, save.beginColumn);
-           return currentLocator;
-       }
-       return currentLocator.reInit(this, save.beginLine, save.beginColumn);
-    }
-
-    private void reportError(Locator l, Exception e) {
-       if (errorHandler != null) {
-           if (e instanceof ParseException) {
-               // construct a clean error message.
-               ParseException pe = (ParseException) e;
-               if (pe.specialConstructor) {
-                   StringBuffer errorM = new StringBuffer();
-                   if (pe.currentToken != null) {
-                       errorM.append("encountered \"")
-                           .append(pe.currentToken.next);
-                   }
-                   errorM.append('"');
-                   if (pe.expectedTokenSequences.length != 0) {
-                       errorM.append(". Was expecting one of: ");
-                       for (int i = 0; i < pe.expectedTokenSequences.length; i++) {
-                           for (int j = 0; j < pe.expectedTokenSequences[i].length; j++) {
-                               int kind = pe.expectedTokenSequences[i][j];
-                               if (kind != S) {
-                                   errorM.append(pe.tokenImage[kind]);
-                                   errorM.append(' ');
-                               }
-                           }
-                       }
-                   }
-                   errorHandler.error(new CSSParseException(errorM.toString(), 
-                                                            l, e));
-               } else {
-                   errorHandler.error(new CSSParseException(e.getMessage(), 
-                                                            l, e));
-               }
-           } else if (e == null) {
-               errorHandler.error(new CSSParseException("error", l, null));
-           } else {
-               errorHandler.error(new CSSParseException(e.getMessage(), l, e));
-           }
-       }
-    }
-
-    private void reportWarningSkipText(Locator l, String text) {
-       if (errorHandler != null && text  != null) {
-           errorHandler.warning(new CSSParseException("Skipping: " + text, l));
-       }
-    }
-}
-
-PARSER_END(ParserImpl)
-
-/*
- * The tokenizer 
- */
-
-<DEFAULT>
-TOKEN :
-{
-    < S : ( [ " ", "\t" , "\n" , "\r", "\f" ] )+ > 
-       { image = ParserImpl.SPACE; }
-}
-
-/*
- * for fixing #11638: Ending an imported SCSS file with a comment causes an error in the Sass.
- * now the single line comment is parsed as special token, before, they were simply skipped.
- * solution got from http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#tth_sEc3.15
- */
-<DEFAULT>
-SPECIAL_TOKEN : {
-< SINGLE_LINE_COMMENT: "//"(~["\n","\r"])* ("\n"|"\r"|"\r\n")? > }
-
-<DEFAULT>
-MORE :
-{
-  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
-|
-  "/*" : IN_MULTI_LINE_COMMENT
-}
-<IN_FORMAL_COMMENT>
-SPECIAL_TOKEN :
-{
-  <FORMAL_COMMENT: "*/" > : DEFAULT
-}
-
-<IN_MULTI_LINE_COMMENT>
-SKIP :
-{
-  <MULTI_LINE_COMMENT: "*/" > : DEFAULT
-}
-
-<IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
-MORE :
-{
-  < ~[] >
-}
-
-<DEFAULT>
-TOKEN :
-{
-  < CDO : "<!--" >
-  | < CDC : "-->" >
-  | < LBRACE : "{" >
-  | < RBRACE : "}">
-  | < DASHMATCH : "|=" >
-  | < CARETMATCH : "^=" >
-  | < DOLLARMATCH : "$=" >
-  | < STARMATCH : "*=" >
-  | < INCLUDES  : "~=" >
-  | < EQ        : "=" >
-  | < PLUS      : "+" >
-  | < MINUS     : "-" >
-  | < COMMA     : "," >
-  | < SEMICOLON : ";" >
-  | < PRECEDES  : ">" >
-  | < SIBLING   : "~" >
-  | < SUCCEEDS : "<" >
-  | < DIV       : "/" >
-  | < LBRACKET  : "[" >
-  | < RBRACKET  : "]" >
-  | < ANY       : "*" >
-  | < MOD       : "%" >
-  | < PARENT    : "&" >
-  | < DOT       : "." >
-  | < LPARAN    : "(" >
-  | < RPARAN    : ")">
-  | < COMPARE   : "==" >
-  | < OR               : "||" >
-  | < AND              : "&&" >
-  | < NOT_EQ : "!=" >
-}
-
-<DEFAULT>
-TOKEN :
-{
-  < COLON     : ":" >
-}
-
-< DEFAULT >
-TOKEN :
-{
-       < INTERPOLATION : "#{"< VARIABLE > "}">
-}
-
-<DEFAULT>
-TOKEN : /* basic tokens */
-{ 
-    < NONASCII    : ["\200"-"\377"] >
-  | < #H          : ["0"-"9", "a"-"f"] >
-  | < #UNICODE    : "\\" <H> ( <H> )? /* I can't say {1,6} */
-                         ( <H> )? ( <H> )?
-                         ( <H> )? ( <H> )? 
-                    ( [ " ", "\t" , "\n" , "\r", "\f" ] )? >
-  | < #ESCAPE     : <UNICODE> | ( "\\" [ " "-"~","\200"-"\377" ] ) >
-  | < #NMSTART    : ("-")?[ "a"-"z","_"] | <NONASCII> | <ESCAPE> >
-  | < #NMCHAR    : ["a"-"z", "0"-"9", "-", "_"] | <NONASCII> | <ESCAPE> >
-  | < #STRINGCHAR : [ "\t"," ","!","#","$","%","&","("-"~" ] 
-                    | "\\\n" | "\\\r\n" | "\\\r" | "\\\f" 
-                    | <NONASCII> | <ESCAPE> >
-  | < #D          : ["0"-"9"] >
-  | < #NAME       : ( <NMCHAR> )+ >
-}
-
-<DEFAULT>
-TOKEN :
-{
-    <TO         : "to">
-    |<THROUGH   : "through">
-    |<EACH_IN        : "in">
-    |<FROM      : "from">
-}
-
-/* DERECTIVES */
-<DEFAULT>
-TOKEN :
-{
-    <MIXIN_SYM          : "@mixin">
-  | <INCLUDE_SYM        : "@include">
-  | <FUNCTION_SYM       : "@function">
-  | <RETURN_SYM         : "@return">
-  | <DEBUG_SYM          : "@debug">
-  | <WARN_SYM           : "@warn">
-  | <FOR_SYM            : "@for">
-  | <EACH_SYM           : "@each">
-  | <WHILE_SYM          : "@while">
-  | <IF_SYM             : "@if">
-  | <ELSE_SYM           : "@else">
-  | <EXTEND_SYM         : "@extend">
-  | <MOZ_DOCUMENT_SYM   : "@-moz-document">
-  | <SUPPORTS_SYM       : "@supports">
-  | <CONTENT_SYM        : "@content">
-}
-
-< DEFAULT >
-TOKEN:
-{
-  < MICROSOFT_RULE : "filter"|"-ms-filter" > 
-}
-
-< DEFAULT >
-TOKEN:
-{
-  < IF : "if" > 
-}
-
-<DEFAULT>
-TOKEN:
-{
-        < GUARDED_SYM : "!" ( <S> )? "default">
-}
-
-<DEFAULT>
-TOKEN :
-{
-  < STRING      : ( "\"" ( <STRINGCHAR> | "'" )* "\"" ) | 
-                  ( "'" ( <STRINGCHAR> | "\"" )* "'" ) >
-  | < IDENT         : <NMSTART> ( <NMCHAR> )* >
-  | < NUMBER     : ( <D> )+ | ( <D> )* "." ( <D> )+ > 
-  | < #_URL       : [ "!","#","$","%","&","*"-"~" ] | <NONASCII> | <ESCAPE> >
-  | < URL         : "url(" ( <S> )*
-                    ( <STRING> | ( <_URL> )* ) ( <S> )* ")" >            
-}
-
-<DEFAULT>
-TOKEN:
-{
-       < VARIABLE : "$" <IDENT>>
-}
-
-<DEFAULT>
-TOKEN :
-{
-   < PERCENTAGE : <NUMBER> "%" >
- | < PT : <NUMBER> "pt" >
- | < MM : <NUMBER> "mm" >
- | < CM : <NUMBER> "cm" >
- | < PC : <NUMBER> "pc" >
- | < IN : <NUMBER> "in" >
- | < PX : <NUMBER> "px" >
- | < EMS : <NUMBER> "em" >
- | < LEM : <NUMBER> "lem" >
- | < REM : <NUMBER> "rem" >
- | < EXS : <NUMBER> "ex" >
- | < DEG : <NUMBER> "deg" >
- | < RAD : <NUMBER> "rad" >
- | < GRAD : <NUMBER> "grad" >
- | < MS : <NUMBER> "ms" >
- | < SECOND  : <NUMBER> "s" >
- | < HZ : <NUMBER> "Hz" >
- | < KHZ : <NUMBER> "kHz" >
- | < DIMEN  : <NUMBER> <IDENT> >
-}
-
-<DEFAULT>
-TOKEN :
-{
-  < HASH : "#" <NAME> >
-}
-
-/* RESERVED ATRULE WORDS */
-<DEFAULT>
-TOKEN : 
-{
-    < IMPORT_SYM   : "@import">
-  | < MEDIA_SYM    : "@media" >
-  | < CHARSET_SYM  : "@charset" >
-  | < PAGE_SYM     : "@page"  >
-  | < FONT_FACE_SYM: "@font-face" >
-  | < KEY_FRAME_SYM: "@keyframes" | "@-moz-keyframes" | "@-o-keyframes" | "@-webkit-keyframes" | "@-ms-keyframes">
-  | < ATKEYWORD    : "@" <IDENT> >
-}
-
-<DEFAULT>
-TOKEN :
-{
- < IMPORTANT_SYM : "!" ( <S> )? "important" >
-}
-
-<DEFAULT>
-TOKEN :
-{
-    < #RANGE0 : <H> <H> <H> <H>  <H> >
-    | < #RANGE1 : <H> <H> <H> <H> <H> ( "?" )? >
-    | < #RANGE2 : <H> <H> <H> <H> ( "?" )? ( "?" )? >
-    | < #RANGE3 : <H> <H> <H> ( "?" )? ( "?" )? ( "?" )? >
-    | < #RANGE4 : <H> <H> ( "?" )? ( "?" )? ( "?" )? ( "?" )? >
-    | < #RANGE5 : <H> ( "?" )? ( "?" )? ( "?" )? ( "?" )? ( "?" )? >
-    | < #RANGE6 : "?" ( "?" )? ( "?" )? ( "?" )? ( "?" )? ( "?" )? >
-    | < #RANGE  : <RANGE0> | <RANGE1> | <RANGE2> 
-                  | <RANGE3> | <RANGE4> | <RANGE5> | <RANGE6> >
-    | < #UNI    : <H> ( <H> )? ( <H> )? ( <H> )? ( <H> )? ( <H> )? >
-    | < UNICODERANGE : "U+" <RANGE>
-                        | "U+" <UNI> "-" <UNI> >
-}
-
-< DEFAULT >
-TOKEN :
-{
-       < REMOVE : "remove" (< S >)? "(" >
-    | < APPEND : "append" (< S >)? "(" >
-       | < CONTAINS : "contains" (< S >)? "(" >
-}
-
-<DEFAULT>
-TOKEN :
-{
- < FUNCTION : <IDENT>(< S >)* "(" >
-}
-
-<DEFAULT, IN_MULTI_LINE_COMMENT>
-TOKEN :
-{ /* avoid token manager error */
-    < UNKNOWN : ~[] >
-}
-
-/*
- * The grammar of CSS2
- */
-
-/**
- * The main entry for the parser.
- *
- * @exception ParseException exception during the parse
- */
-void parserUnit() :
-{}
-{
-    try {
-       { documentHandler.startDocument(source); }
-       ( charset() )?
-       ( <S> comments()
-        | ignoreStatement() )*
-       ( importDeclaration() ( ignoreStatement() ( <S> )* )* )*
-       afterImportDeclaration()
-       <EOF>
-    } finally {
-       documentHandler.endDocument(source);
-    }
-}
-
-void charset() :
-{ Token n; }
-{  
-    try {
-       <CHARSET_SYM> ( <S> )* n=<STRING> ( <S> )* ";"
-    } catch (ParseException e) {
-        reportError(getLocator(e.currentToken.next), e);
-       skipStatement();
-       // reportWarningSkipText(getLocator(), skipStatement());
-    } catch (Exception e) {
-        reportError(getLocator(), e);
-       skipStatement();
-       // reportWarningSkipText(getLocator(), skipStatement());
-    }
-}
-
-void afterImportDeclaration() :
-{String ret; 
- Locator l;
-}
-{
-  ( 
-     ( debuggingDirective() | mixinDirective() | controlDirective() | includeDirective() | styleRule() | media() 
-             | page() | fontFace() | keyframes() | LOOKAHEAD(variable()) variable() | listModifyDirective()
-      | { l = getLocator(); } ret=skipStatement() 
-      {
-         if ((ret == null) || (ret.length() == 0)) {
-             return; 
-         }
-         if (ret.charAt(0) == '@') {
-             documentHandler.unrecognizedRule(ret);
-         } else {
-             reportWarningSkipText(l, ret);
-         }
-      }
-      )
-    ( ignoreStatement() ( <S> )* )* )*
-}
-
-void ignoreStatement() :
-{}
-{
-   <CDO> | <CDC> | atRuleDeclaration()
-}
-
-/**
- * The import statement
- *
- * @exception ParseException exception during the parse
- */
-void importDeclaration() :
-{Token n;
- String uri;
- MediaListImpl ml = new MediaListImpl();
- boolean isURL = false;
-}
-{
- try {
-  <IMPORT_SYM> 
-       ( <S> )* ( n=<STRING> { uri = convertStringIndex(n.image, 1, 
-                                                       n.image.length() -1); }
-                 | n=<URL> 
-          {
-              isURL=true;            
-              uri = n.image.substring(4, n.image.length()-1).trim();
-              if ((uri.charAt(0) == '"')
-                  || (uri.charAt(0) == '\'')) {
-                  uri = uri.substring(1, uri.length()-1);
-              }
-          }
-                 )
-       ( <S> )* mediaStatement(ml) ";"
-       ( <S> )*
-          {
-              if (ml.getLength() == 0) {
-                  // see section 6.3 of the CSS2 recommandation.
-                  ml.addItem("all");
-              }
-              documentHandler.importStyle(uri, ml, isURL);
-          }
- } catch (ParseException e) {
-     reportError(getLocator(), e);
-     skipStatement();
-     // reportWarningSkipText(getLocator(), skipStatement());
- }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-void keyframes() :
-{
-    Token n;
-    boolean start = false;
-    String keyframeName = null;
-    String animationname = "";
-}
-{
- try {
-  n=<KEY_FRAME_SYM> ( <S> )* {keyframeName = n.image;}
-  (n = <IDENT>{animationname += n.image; }|n = < INTERPOLATION >{ animationname += n.image; })+(<S>)*
-   {start = true; documentHandler.startKeyFrames(keyframeName, animationname); }
-   <LBRACE> ( <S> )* ( keyframeSelector() | contentDirective() )* <RBRACE> ( <S> )*
- } catch (ParseException e) {
-     reportError(getLocator(), e);
-     skipStatement();
- } finally {
-     if (start) {
-         documentHandler.endKeyFrames();
-     }
- }
-}
-
-void keyframeSelector():
-{
-    Token n;
-    String selector = "";
-    boolean start = false;
-}
-{
-    try{
-        (n = <FROM> | n = <TO> | n = <PERCENTAGE>){selector += n.image;} (<S>)*
-        (<COMMA> (<S>)* (n = <FROM> | n = <TO> | n = <PERCENTAGE>) {selector += (", " + n.image);} (<S>)* )*
-          <LBRACE> (<S>)*
-        {
-          start = true;
-          documentHandler.startKeyframeSelector(selector);
-         }
-        (ifContentStatement() | microsoftExtension() )*
-        <RBRACE> (<S>)*
-    }
-    catch (ThrowedParseException e) {
-        if (errorHandler != null) {
-            LocatorImpl li = new LocatorImpl(this,
-                                             e.e.currentToken.next.beginLine,
-                                             e.e.currentToken.next.beginColumn-1);
-            reportError(li, e.e);
-        }
-    } catch (ParseException e) {
-        reportError(getLocator(), e);
-        skipStatement();
-        // reportWarningSkipText(getLocator(), skipStatement());
-    } catch (TokenMgrError e) {
-        reportWarningSkipText(getLocator(), skipStatement());
-    } finally {
-        if (start) {
-            documentHandler.endKeyframeSelector();
-        }
-    }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-/* see http://www.w3.org/TR/css3-mediaqueries/ */
-void media() :
-{ 
-    boolean start = false;
-    String ret;
-    MediaListImpl ml = new MediaListImpl(); 
-}
-{
- try {
-  <MEDIA_SYM> ( <S> )*
-   mediaStatement(ml)
-   { start = true; documentHandler.startMedia(ml); }
-   <LBRACE> ( <S> )* ( debuggingDirective() | styleRule() | skipUnknownRule() )* <RBRACE> ( <S> )*
- } catch (ParseException e) {
-     reportError(getLocator(), e);
-     skipStatement();
-     // reportWarningSkipText(getLocator(), skipStatement());
- } finally {
-     if (start) {
-        documentHandler.endMedia(ml);
-     }
- }
-}
-
-void mediaStatement(MediaListImpl ml) :
-{
-  Token t;
-}
-{
-    {
-      t = getToken(1);
-      // loop over comma separated parts, add each to ml
-      while ((t.kind != LBRACE) && (t.kind != EOF) && (t.kind != SEMICOLON)) {
-        StringBuffer s = new StringBuffer();
-        s.append(getToken(0).image);
-        while ((t.kind != COMMA) && (t.kind != LBRACE) && (t.kind != EOF) && (t.kind != SEMICOLON)) {
-             s.append(t.image);
-             getNextToken();
-          t = getToken(1);
-        }
-        if (t.kind == COMMA) {
-          // skip the comma and the token before it that is still the active token
-          getNextToken();
-          getNextToken();
-          t = getToken(1);
-        }
-        String str = s.toString().trim();
-        if (str.length() > 0) {
-          ml.addItem(str);
-        }
-      }
-    }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String medium() : /* tv, projection, screen, ... */
-{Token n;}
-{
-    n=<IDENT> { return convertIdent(n.image); }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-void page() :
-{
- boolean start = false;
- Token n = null;
- String page = null;
- String pseudo = null;
-}
-{
- try {
-  <PAGE_SYM> ( <S> )* ( n=<IDENT> ( <S> )* )?
-  ( pseudo=pseudo_page() )? 
-      {
-         if (n != null) {
-             page = convertIdent(n.image);
-         }
-      }
-  <LBRACE> (<S>)* 
-      {
-         start = true;
-         documentHandler.startPage(page, pseudo);
-      }
-     ( declaration() )? ( ";" ( <S> )* ( declaration() )? )* 
-     <RBRACE> (<S>)*
- } catch (ParseException e) {
-     if (errorHandler != null) {
-        LocatorImpl li = new LocatorImpl(this,
-                                         e.currentToken.next.beginLine,
-                                         e.currentToken.next.beginColumn-1);
-        reportError(li, e);
-        skipStatement();
-        // reportWarningSkipText(li, skipStatement());
-     } else {
-        skipStatement();
-     }
- } finally {
-     if (start) {
-        documentHandler.endPage(page, pseudo);
-     }
- }
-}
-
-String pseudo_page() :
-{ Token n; }
-{
-    ":" n=<IDENT> ( <S> )* { return convertIdent(n.image); }
-}
-
-void fontFace() :
-{
-    boolean start = false;
-}
-{
- try {
-  <FONT_FACE_SYM> ( <S> )*
-     <LBRACE> (<S>)*
-      { start = true; documentHandler.startFontFace(); }
-     ( declaration() )? ( ";" ( <S> )* ( declaration() )? )*
-     <RBRACE> (<S>)*
- } catch (ParseException e) {
-     reportError(getLocator(), e);
-     skipStatement();
-     // reportWarningSkipText(getLocator(), skipStatement());
- } finally {
-     if (start) {
-        documentHandler.endFontFace();
-     }
- }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-void atRuleDeclaration() :
-{Token n;
- String ret;
-}
-{
- n=<ATKEYWORD>
-    {
-       ret=skipStatement();
-       if ((ret != null) && (ret.charAt(0) == '@')) {
-           documentHandler.unrecognizedRule(ret);
-       } else {
-           reportWarningSkipText(getLocator(), ret);
-       }
-    }
-}
-
-void skipUnknownRule() :
-{ Token n;}
-{
- ( n=<ATKEYWORD>
-| n=<CDO>
-| n=<CHARSET_SYM>
-| n=<COMMA>
-| n=<DASHMATCH>
-| n=<FONT_FACE_SYM>
-| n=<FUNCTION>
-| n=<IMPORTANT_SYM>
-| n=<IMPORT_SYM>
-| n=<INCLUDES>
-| n=<LBRACE>
-| n=<MEDIA_SYM>
-| n=<NONASCII>
-| n=<NUMBER>
-| n=<PAGE_SYM>
-| n=<PERCENTAGE>
-| n=<STRING>
-| n=<UNICODERANGE>
-| n=<URL>
-| n=";"
-| n="-"
-| n=<UNKNOWN>
-   ) {
-     String ret;
-     Locator loc = getLocator();
-     ret=skipStatement();
-     if ((ret != null) && (n.image.charAt(0) == '@')) {
-        documentHandler.unrecognizedRule(ret);
-     } else {
-     reportWarningSkipText(loc, ret);
-     }
- }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-char combinator() :
-{
-char connector = ' ';
-}
-{
-    (connector = combinatorChar()
-     | <S>  (connector = combinatorChar())?) { return connector; }
-}
-
-/**to refactor combinator and reuse in selector().*/
-char combinatorChar() :
-{Token t;}
-{
-    (t = <PLUS> | t = <PRECEDES> | t = <SIBLING>) (<S>)*
-    {
-        return t.image.charAt(0);
-    }
-}
-
-void microsoftExtension() :
-{
-  Token n;
-  String name = "";
-  String value = "";
-}
-
-{
-  // This is not really taking the syntax of filter rules into account
-  n = < MICROSOFT_RULE > (< S >)* { name = n.image; }
-       < COLON >
-       ((n = < IDENT > { value += n.image; })
-       | (n = < NUMBER > { value += n.image; }) 
-       | (n = < STRING > { value += n.image; })
-       | (n = < COMMA > { value += n.image; })
-       | (n = < INTERPOLATION > { value += n.image; })
-       | (n = < COLON > { value += n.image; })
-       | (n = < FUNCTION > { value += n.image; })
-       | (n = < RPARAN > { value += n.image; })
-       | (n = < EQ > { value += n.image; })
-       | (n = < DOT > { value += n.image; })
-       | (n = < S > { if(value.lastIndexOf(' ') != value.length()-1)
-       { value += n.image; } }
-       ) )+
-       < SEMICOLON >
-       (< S >)*
-       { documentHandler.microsoftDirective(name, value);      }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String property() :
-{Token t;String s = "";
-}
-{
-    (t = <IDENT>{s += t.image; }|t = < INTERPOLATION >{ s += t.image; })+(< S >)*
-    {
-        return s;
-    }
-}
-
-String variableName() :
-{Token n;}
-{
-    n=<VARIABLE> (<S>)* {return convertIdent(n.image.substring(1));}
-}
-
-String functionName() :
-{Token n;}
-{
-    n=<FUNCTION> ( <S> )* {return convertIdent(n.image.substring(0, n.image.length()-1));}
-}
-/**
- * @exception ParseException exception during the parse
- */
-void styleRule() :
-{
-    boolean start = false;
-    ArrayList<String> l = null;
-    Token save;
-    Locator loc;
-}
-{
- try {
-     l=selectorList() { save = token; } <LBRACE> (<S>)*
-     {
-        start = true;
-        documentHandler.startSelector(l);
-     }
-     // a CSS import here will not work
-     ( ifContentStatement() | microsoftExtension() | importDeclaration() )*
-     <RBRACE> (<S>)*
- } catch (ThrowedParseException e) {
-     if (errorHandler != null) {
-        LocatorImpl li = new LocatorImpl(this,
-                                         e.e.currentToken.next.beginLine,
-                                         e.e.currentToken.next.beginColumn-1);
-        reportError(li, e.e);
-     }
- } catch (ParseException e) {
-     reportError(getLocator(), e);
-     skipStatement();
-     // reportWarningSkipText(getLocator(), skipStatement());
- } catch (TokenMgrError e) {
-     reportWarningSkipText(getLocator(), skipStatement());
- } finally {
-     if (start) {
-        documentHandler.endSelector();
-     }
- }
-}
-
- ArrayList<String> selectorList() :
-{
-     ArrayList<String> selectors = new  ArrayList<String>();
-     String selector;
-}
-{
- selector=selector() ( <COMMA> (<S>)* { selectors.add(selector); } 
-                       selector=selector() )* 
-  { selectors.add(selector); 
-    return selectors;
-  }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String selector() :
-{   
-    String selector = null;
-    char    comb;
-}
-{
- try {
-     // the selector can begin either a simple_selector, or a combinatorChar(+, >, ~).
-     // when beginning with combinatorChar, the next one should be a simple_selector().
-   (selector=simple_selector(null, ' ') | (comb=combinatorChar() selector=simple_selector(selector, comb)))
-       ( LOOKAHEAD(2) comb=combinator() 
-        selector=simple_selector(selector, comb) )* (<S>)*
-   {
-       return selector; 
-   }
- } catch (ParseException e) {
-     /*
-     Token t = getToken(1);
-     StringBuffer s = new StringBuffer();
-     s.append(getToken(0).image);
-     while ((t.kind != COMMA) && (t.kind != SEMICOLON) 
-           && (t.kind != LBRACE) && (t.kind != EOF)) {
-        s.append(t.image);
-        getNextToken();
-        t = getToken(1);
-     }
-     reportWarningSkipText(getLocator(), s.toString());
-     */
-     Token t = getToken(1);
-     while ((t.kind != COMMA) && (t.kind != SEMICOLON) 
-           && (t.kind != LBRACE) && (t.kind != EOF)) {
-        getNextToken();
-        t = getToken(1);
-     }
-
-     throw new ThrowedParseException(e);
-  }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String simple_selector(String selector, char comb) :
-{
-    String simple_current = null;
-    String cond = null;
-
-    pseudoElt = null;
-}
-{
-    (  (simple_current=element_name() 
-            ( cond=hash(cond) | cond=_class(cond) 
-              | cond=attrib(cond) | cond=pseudo(cond) )* )
-     | ( cond = hash(cond) | cond=_class(cond) 
-            | cond=attrib(cond) | cond=pseudo(cond) )+      
-     )
-       {
-           if (simple_current == null) {
-               simple_current = "";
-           }
-           if (cond != null) {
-               simple_current = simple_current + cond;
-           }
-           StringBuilder builder = new StringBuilder();
-           switch (comb) {
-               case ' ':
-                   if(selector!=null){
-                       builder.append(selector).append(" ");
-                   }
-                   break;
-               case '+':
-               case '>':
-               case '~':
-                   if(selector!=null){
-                       builder.append(selector).append(" ");
-                   }
-                   builder.append(comb).append(" ");
-                   break;
-               default:
-                   throw new ParseException("invalid state. send a bug report");
-           }
-           builder.append(simple_current);
-           selector = builder.toString();
-           
-           if (pseudoElt != null) {
-               selector = selector + pseudoElt;
-           }
-           return selector;
-       }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String _class(String pred) :
-{Token t;
-String s = ".";
-}
-{
-  "." (t = <IDENT>{s += t.image; }|t =  < INTERPOLATION >{ s += t.image; })+
-      { 
-         
-         if (pred == null) {
-             return s;
-         } else {
-             return pred + s;
-         }
-      }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String element_name() :
-{Token t; String s = "";}
-{
-    (t = <IDENT>{s += t.image; }|t = < INTERPOLATION >{ s += t.image; })+
-    { 
-      return s; 
-    }
-      | "*"
-    { return "*"; }
-      | "&"
-    { return "&"; }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String attrib(String pred) :
-{
-    int cases = 0;
-    Token att = null;
-    Token val = null;
-    String attValue = null;
-}
-{
-  "[" ( <S> )* att=<IDENT> ( <S> )*
-      ( ( "="           { cases = 1; }
-         | <INCLUDES>  { cases = 2; }    
-         | <DASHMATCH> { cases = 3; }
-         | <CARETMATCH> { cases = 4; }
-         | <DOLLARMATCH> { cases = 5; }
-         | <STARMATCH> { cases = 6; } ) ( <S> )* 
-       ( val=<IDENT> { attValue = val.image; }
-         | val=<STRING> { attValue = val.image; }
-       )
-       ( <S> )* )?
-  "]"
-  {
-      String name = convertIdent(att.image);
-      String c;
-      switch (cases) {
-         case 0:
-         c = name;
-         break;
-         case 1:
-         c = name + "=" + attValue;
-         break;
-         case 2:
-         c = name + "~=" + attValue;
-         break;
-         case 3:
-         c = name + "|=" +attValue;
-         break;
-         case 4:
-         c = name + "^=" +attValue;
-         break;
-         case 5:
-         c = name + "$=" +attValue;
-         break;
-         case 6:
-         c = name + "*=" +attValue;
-         break;
-         default:
-         // never reached.
-         c = null;
-      }
-      c = "[" + c + "]";
-      if (pred == null) {
-         return c;
-      } else {
-         return pred + c;
-      }
-  }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String pseudo(String pred) :
-{Token n;
-Token param;
-String d;
-boolean isPseudoElement = false;
-}
-{
-    ":" (":"{isPseudoElement=true;})?( n=<IDENT>
-       {
-           String s = ":" + convertIdent(n.image);
-           if (isPseudoElement) {
-               if (pseudoElt != null) {
-                   throw new CSSParseException("duplicate pseudo element definition " 
-                                               + s, getLocator());
-               } else {
-                   pseudoElt = ":"+s;
-                   return pred;
-               }
-           } else {
-               String c = s;
-               if (pred == null) {
-                   return c;
-               } else {
-                   return pred + c;
-               }
-           }
-       }
-         | ( n=<FUNCTION> ( <S> )* d=skipStatementUntilMatchingRightParan() <RPARAN>
-                 {
-                 // accept anything between function and a right parenthesis
-                 String f = convertIdent(n.image);
-                 String colons = isPseudoElement ? "::" : ":";
-                 String pseudofn = colons + f + d + ")";
-                     if (pred == null) {
-                         return pseudofn;
-                     } else {
-                         return pred + pseudofn;
-                 }
-                 }
-             )
-         )
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String hash(String pred) :
-{Token n; }
-{
-  n=<HASH>
-  {
-      String d = n.image;
-      if (pred == null) {
-         return d;
-      } else {
-         return pred + d;
-      }
-  }
-}
-
-void variable() :
-{
-       String name;
-       LexicalUnitImpl exp = null;
-       boolean guarded = false;
-       String raw;
-}
-{
-       try{
-               name = variableName()
-               ":" ( <S> )* exp=expr() ( guarded=guarded() )?(";"(<S>)*)+
-               //raw=skipStatementUntilSemiColon()
-               {
-                   documentHandler.variable(name, exp, guarded);
-               }
-       }catch (JumpException e) {
-           skipAfterExpression();
-       } catch (NumberFormatException e) {
-           if (errorHandler != null) {
-               errorHandler.error(new CSSParseException("Invalid number " 
-                                                 + e.getMessage(),
-                                                 getLocator(), 
-                                                 e));
-           }
-           reportWarningSkipText(getLocator(), skipAfterExpression());
-        } catch (ParseException e) {
-           if (errorHandler != null) {
-               if (e.currentToken != null) {
-                       LocatorImpl li = new LocatorImpl(this,
-                                                     e.currentToken.next.beginLine,
-                                                     e.currentToken.next.beginColumn-1);
-                       reportError(li, e);
-               } else {
-                       reportError(getLocator(), e);
-           }
-               skipAfterExpression();
-           } else {
-               skipAfterExpression();
-           }
-       }
-}
-
-void controlDirective() :
-{}
-{
-  ifDirective() | eachDirective()
-}
-
-void ifContentStatement() :
-{}
-{
-    contentDirective() | includeDirective() | media() | extendDirective() | styleRuleOrDeclarationOrNestedProperties()
-    | keyframes() | LOOKAHEAD(variable()) variable() | listModifyDirective() | controlDirective() | atRuleDeclaration()
-}
-
-void ifDirective() :
-{
-  Token n = null;
-  String s = null;
-  String evaluator = "";
-}
-{
-  < IF_SYM >
-  ( s = booleanExpressionToken() { evaluator += s;} )+
-  < LBRACE >(< S >)*    
-  { documentHandler.startIfElseDirective();
-    documentHandler.ifDirective(evaluator);
-   }
-  ( ifContentStatement() | fontFace() )*
-  < RBRACE >(< S >)*
-  (elseDirective())*
-  { documentHandler.endIfElseDirective(); }
-}
-
-void elseDirective() :
-{
-  String evaluator = "";
-  Token n = null;
-  String s = null;
-}
-{
-  < ELSE_SYM >(< S >)* 
-  ( < IF > ( s = booleanExpressionToken() { evaluator += s; } )+ )?
-  < LBRACE >(< S >)*
-  { if(!evaluator.trim().equals("")){ documentHandler.ifDirective(evaluator); }
-    else{ documentHandler.elseDirective(); }  
-  }
-  ( ifContentStatement() | fontFace() )*
-  < RBRACE >(< S >)*
-}
-
-String booleanExpressionToken() :
-{
-  Token n = null;
-  String s = null;
-}
-{
- (
-   LOOKAHEAD(containsDirective())
-   s = containsDirective()
-   |n = < VARIABLE >
-   |n = < IDENT >
-   |n = < NUMBER >
-   |n = < LPARAN >
-   |n = < RPARAN >
-   |n = < PLUS >
-   |n = < MINUS >
-   |n = < DIV >
-   |n = < ANY >
-   |n = < COMPARE >
-   |n = < EQ >
-   |n = < PRECEDES >
-   |n = < SUCCEEDS >
-   |n = < OR >
-   |n = < AND >
-   |n = < S >
-   |n = < NOT_EQ > 
-){
-   if(n!=null){return n.image;}  
-   else{return s;}
- }
-}
-  
-void eachDirective() :
-{
-  Token var;
-  ArrayList<String> list = null;
-  String listVariable = null;
-}
-{
-  < EACH_SYM >
-  (< S >)*
-  var = < VARIABLE > (< S >)* < EACH_IN > (< S >)*
-  (list = stringList()
-  {documentHandler.startEachDirective(var.image, list);}
-  |listVariable = variableName()
-  {documentHandler.startEachDirective(var.image, listVariable);}
-  )
-  < LBRACE >(< S >)*
-  ( ifContentStatement() )*      
-  < RBRACE >(< S >)*
-  { documentHandler.endEachDirective();}
-}
-
-ArrayList<String > stringList():
-{
-       ArrayList<String > strings = new ArrayList<String >();
-       Token input;
-}
-{
-       (input = < IDENT > (< S >)*)
-       { strings.add(input.image); }
-
-       (< COMMA >(< S >)* input = < IDENT > { strings.add(input.image); } (< S >)*)*
-       { return strings; }
-
-}
-
-void mixinDirective() :
-{
-    String name;
-    ArrayList<VariableNode> args = null;
-    String body;
-}
-{
-    <MIXIN_SYM>
-    (<S>)*
-    (name = property()
-    |(name = functionName() 
-      args = arglist()) <RPARAN> (<S>)*) <LBRACE> (<S>)*
-    {documentHandler.startMixinDirective(name, args);}
-    ( ifContentStatement() | fontFace() | page())*
-    <RBRACE>(<S>)*
-    {documentHandler.endMixinDirective(name, args);}
-}
-
-ArrayList<VariableNode> arglist() :
-{
-    ArrayList<VariableNode> args = new ArrayList<VariableNode>();
-    VariableNode arg;
-    boolean hasNonOptionalArgument = false;
-}
-{
-    arg=mixinArg() ( <COMMA> (<S>)* { hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg); } 
-        arg=mixinArg() )* 
-    { hasNonOptionalArgument = checkMixinForNonOptionalArguments(arg, hasNonOptionalArgument); args.add(arg); 
-        return args;
-    }
-}
-
-JAVACODE
-boolean checkMixinForNonOptionalArguments(VariableNode arg, boolean hasNonOptionalArguments)\r{
-       boolean currentArgHasArguments = arg.getExpr() != null && arg.getExpr().getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE && arg.getExpr().getNextLexicalUnit() != null;
-  \r    if(currentArgHasArguments)\r     {
-               if(hasNonOptionalArguments)\r            {\r                      throw new ParseException("Sass Error: Required argument $"+ arg.getName() +" must come before any optional arguments.");
-               }
-               return hasNonOptionalArguments;
-       }else\r  {\r      return true;
-       }
-}
-
-VariableNode mixinArg() :
-{
-    String name;
-    Token variable = null;
-    LexicalUnitImpl first = null;
-    LexicalUnitImpl prev = null;
-    LexicalUnitImpl next = null;
-}
-{
-    name=variableName() (< COLON > (< S >)*
-
-    (\r      first = nonVariableTerm(null)\r      {
-        prev = first;\r      }
-         (LOOKAHEAD(3)(< COMMA >(< S >)*)? prev = nonVariableTerm(prev))*\r     )
-       | (variable = < VARIABLE >{ first = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
-                 prev, variable.image);}
-               
-       )
-    )?
-    {
-        VariableNode arg = new VariableNode(name, first, false);
-        return arg;
-    }
-}
-
-ArrayList<LexicalUnitImpl> argValuelist() :
-{
-    ArrayList<LexicalUnitImpl> args = new ArrayList<LexicalUnitImpl>();
-    LexicalUnitImpl first = null;
-    LexicalUnitImpl next = null;
-    LexicalUnitImpl prev = null;
-}
-{
-    first = term(null) { args.add(first); prev = first;}((< COLON > (< S >)*)?next=term(prev){prev.setNextLexicalUnit(next); prev = next;})*
-    ( <COMMA> (<S>)*
-    first = term(null) { args.add(first); prev = first;}((< COLON > (< S >)*)?next=term(prev){prev.setNextLexicalUnit(next); prev = next;})*
-    )* 
-    {return args;}
-}
-
-void includeDirective() :
-{
-    String name;
-    ArrayList<LexicalUnitImpl> args=null;
-}
-{
-    <INCLUDE_SYM>
-    (<S>)*
-    (name = property()|name = variableName(){ name = "$"+name;}
-         |(name = functionName() 
-           args = argValuelist()) <RPARAN>(<S>)*)
-    ((";"(<S>)*)+
-           {documentHandler.includeDirective(name, args);}
-    | <LBRACE> (<S>)* {documentHandler.startIncludeContentBlock(name, args);}
-      (styleRuleOrDeclarationOrNestedProperties() | keyframeSelector())*
-      <RBRACE> (<S>)* {documentHandler.endIncludeContentBlock();}
-    )
-}
-
-String interpolation() :
-{
-  Token n;
-}
-{
-  n = < INTERPOLATION >
-  {
-    return n.image;
-  }
-}
-
-void listModifyDirective() :
-{
-    String list = null;
-    String remove = null;
-    String separator = null;
-    String variable = null;
-    Token n = null;
-    Token type = null;
-}
-{
-  //refactor, remove those 3 LOOKAHEAD(5).
-  n = < VARIABLE >{ variable = n.image; }(< S >)* ":" (< S >)*
-  (type = < APPEND> | type = <REMOVE> | type=<CONTAINS> )(< S >)*
-  (list = listModifyDirectiveArgs(0))
-  (< RPARAN >)? < COMMA >(< S >)*
-  (remove = listModifyDirectiveArgs(1))
-  ( < COMMA >(< S >)* n = < IDENT >{ separator = n.image; } (< S >)*)?
-  < RPARAN >
-  {
-      switch (type.kind) {
-      case APPEND:
-          documentHandler.appendDirective(variable,list,remove,separator);
-          break;
-      case REMOVE:
-          documentHandler.removeDirective(variable,list,remove,separator);
-          break;
-      case CONTAINS:
-          if(variable == null){
-              variable = "$var_"+UUID.randomUUID();
-          }
-          documentHandler.containsDirective(variable,list,remove,separator);
-          break;
-      default:
-          break;
-      }
-      }
-      (< S >)*< SEMICOLON >(<S>)*
-}
-
-
-/**
- * @exception ParseException exception during the parse
- */
-void appendDirective() :
-{
-       String list = null;
-       String remove = null;
-       String separator = null;
-       String variable = null;
-       Token n = null;
-}
-{
-  n = < VARIABLE >{ variable = n.image; }(< S >)* ":" (< S >)*
-  < APPEND >(< S >)*
-  (list = listModifyDirectiveArgs(0))
-  (< RPARAN >)? < COMMA >(< S >)*
-  (remove = listModifyDirectiveArgs(1))
-  ( < COMMA >(< S >)* n = < IDENT >{ separator = n.image; } (< S >)*)?
-  < RPARAN >
-
-  { documentHandler.appendDirective(variable,list,remove,separator); }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-void removeDirective() :
-{
-    String list = null;
-    String remove = null;
-    String separator = null;
-    String variable = null;
-    Token n = null;
-}
-{
-  n = < VARIABLE >{ variable = n.image; }(< S >)* ":" (< S >)*
-  < REMOVE >(< S >)*
-  (list = listModifyDirectiveArgs(0))
-  (< RPARAN >)? < COMMA >(< S >)*
-  (remove = listModifyDirectiveArgs(1))
-  ( < COMMA >(< S >)* n = < IDENT >{ separator = n.image; } (< S >)*)?
-  < RPARAN >
-
-  { documentHandler.removeDirective(variable,list,remove,separator); }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-String containsDirective() :
-{
-       String list = null;
-       String remove = null;
-       String separator = null;
-       String variable = null;
-       Token n = null;
-}
-{
-  (n = < VARIABLE >{ variable = n.image; }(< S >)* ":" (< S >)*)?
-  < CONTAINS >(< S >)*
-  (list = listModifyDirectiveArgs(0))
-  (< RPARAN >)? < COMMA >(< S >)*
-  (remove = listModifyDirectiveArgs(1))
-  ( < COMMA >(< S >)* n = < IDENT >{ separator = n.image; } (< S >)*)?
-  < RPARAN >
-
-  {   /*
-       *if it is not in the form like "$contains : contains($items, .v-button);"
-       *for example in @if, like "@if (contains(a b c, b))", then create a temp
-       *variable for contains(a b c, b);
-       */
-      if(variable == null){
-          variable = "$var_"+UUID.randomUUID();
-      }
-      documentHandler.containsDirective(variable,list,remove,separator); 
-      return variable;
-  }
-}
-
-JAVACODE
-String listModifyDirectiveArgs(int nest)
-{
-       String list = "";
-       int nesting = nest;
-       Token t = null;
-       
-       while(true)
-       {
-               t = getToken(1);
-               String s = t.image;
-               if(t.kind == VARIABLE||t.kind == IDENT)\r                {
-                 list += s;
-               }else if(s.toLowerCase().equals("auto")||s.toLowerCase().equals("space")||s.toLowerCase().equals("comma"))\r             {
-                       int i = 2;
-                       Token temp = getToken(i);
-                       boolean isLast = true;
-                       while(temp.kind != SEMICOLON)
-                       {\r                              if(temp.kind != RPARAN || temp.kind != S)
-                               {\r                                isLast = false;\r                              }
-                               i++;
-                               temp = getToken(i);
-                       }
-
-                       if(isLast)\r                     {\r                      return list;
-                       }
-               }\r              else if(t.kind == STRING)\r              {\r                      list += s.substring(1,s.length()).substring(0,s.length()-2);
-                       
-               }else if(t.kind == LPARAN)\r             {\r                      nesting++;
-                       if(nesting > nest+1)\r                   {\r                              throw new CSSParseException("Only one ( ) pair per parameter allowed", getLocator());
-                       }
-               }else if(t.kind == RPARAN)\r             {\r                      nesting--;
-                       if(nesting == 0)\r                       {
-                               return list;
-                       }
-               } else if(t.kind == COMMA)\r             {
-                       if(nesting == nest)\r                    {
-                         return list;\r                 }else\r                  {
-                         list += ",";\r                 }
-                         
-               }else if(t.kind == S)\r          {
-                 list += " ";\r         } else if(t.kind == LBRACE)\r            {
-                 throw new CSSParseException("Invalid token,'{' found", getLocator());\r                }
-               \r               getNextToken();
-       }
-}
-
-Node returnDirective() :
-{
-    String raw;
-}
-{
-       raw = skipStatement()
-       {return null;}
-}
-
-void debuggingDirective() :
-{}
-{
-  debugDirective() | warnDirective()
-}
-
-void debugDirective() :
-{}
-{
-    <DEBUG_SYM>
-    { 
-    String content = skipStatementUntilSemiColon();
-    // TODO should evaluate the content expression, call documentHandler.debugDirective() etc.
-    System.out.println(content);
-    }
-    (<S>)*
-}
-
-void warnDirective() :
-{}
-{
-    <WARN_SYM>
-    { 
-    String content = skipStatementUntilSemiColon();
-    // TODO should evaluate the content expression, call documentHandler.warnDirective() etc.
-    System.err.println(content);
-    }
-    (<S>)*
-}
-
-Node forDirective() :
-{
-    String var;
-    String from;
-    String to;
-    boolean exclusive;
-    String body;
-    Token tok;
-}
-{
-    var = variableName()
-    {
-        int[] toThrough = {TO, THROUGH};
-        from = skipStatementUntil(toThrough);
-    }
-    (tok = <TO> {exclusive = true;}
-    | tok = <THROUGH> {exclusive = false;})
-    to = skipStatementUntilLeftBrace()
-    (<S>)*
-    body = skipStatement()
-    {return documentHandler.forDirective(var, from, to, exclusive, body);}
-}
-
-Node whileDirective() :
-{
-    String condition;
-    String body;
-}
-{
-    condition = skipStatementUntilLeftBrace()
-    body = skipStatement()
-    {   return documentHandler.whileDirective(condition, body);}
-}
-
-void extendDirective() : 
-{ArrayList<String> list;}
-{
-    <EXTEND_SYM>
-    (<S>)*
-    list = selectorList()
-    (";"(<S>)*)+
-    {documentHandler.extendDirective(list);}
-}
-
-void contentDirective() : 
-{}
-{
-    <CONTENT_SYM>
-    (<S>)*
-    (";"(<S>)*)+
-    {documentHandler.contentDirective();}
-}
-
-JAVACODE
-Node importDirective(){
-    return null;
-}
-
-JAVACODE
-Node charsetDirective(){
-    return null;
-}
-
-JAVACODE
-Node mozDocumentDirective(){
-    return null;
-}
-
-JAVACODE
-Node supportsDirective(){
-    return null;
-}
-
-
-void nestedProperties():
-{String name;
-LexicalUnit exp;}
-{
-    name=property()
-    ":" ( <S> )* 
-    <LBRACE> (<S>)*
-    {
-      documentHandler.startNestedProperties(name);
-    }
-    ( declaration() )? ( ";" ( <S> )* ( declaration() )? )*
-    <RBRACE>
-    {
-      documentHandler.endNestedProperties(name);
-    }
-    (<S>)*
-}
-/**
- * @exception ParseException exception during the parse
- */
-void styleRuleOrDeclarationOrNestedProperties() :
-{
-}
-{
-  try {
-    // differentiate between the colon of a pseudo and the colon of nested properties and the colon of a simple property
-    // first check if it is a normal styleRule, if not check if it is declarationOrNestedProperties(), if still fails, most likely, it is
-    // is styleRule with pseudo selector with contains functions. have to do it in this way, because both the styleRule and declarationOrNestedProperties()
-    // have 'skipStatementUntilXXX', which cannot be LOOKAHEAD properly.
-      ( debuggingDirective() | LOOKAHEAD(selectorList()<LBRACE>) styleRule() | LOOKAHEAD(3)declarationOrNestedProperties() | styleRule())
-  } catch (JumpException e) {
-     skipAfterExpression();
-     // reportWarningSkipText(getLocator(), skipAfterExpression());
-  } catch (ParseException e) {
-     if (errorHandler != null) {
-         if (e.currentToken != null) {
-             LocatorImpl li = new LocatorImpl(this,
-                                              e.currentToken.next.beginLine,
-                                              e.currentToken.next.beginColumn-1);
-             reportError(li, e);
-         } else {
-             reportError(getLocator(), e);
-         }
-         skipAfterExpression();
-         /*
-         LocatorImpl loc = (LocatorImpl) getLocator();
-         loc.column--;
-         reportWarningSkipText(loc, skipAfterExpression());
-         */
-     } else {
-         skipAfterExpression();
-     }
-  }
-}
-/**
- * @exception ParseException exception during the parse
- */
-void declarationOrNestedProperties() :
-{ boolean important = false;
-  String name;
-  LexicalUnitImpl exp;
-  Token save;
-  String comment = null;
-}
-{
- try {
-     name=property()
-     { save = token; }
-     ":" ( <S> )* 
-     (exp=expr() ( important=prio() )?
-     {
-         Token next = getToken(1);
-         if(next.kind == SEMICOLON || next.kind == RBRACE){
-             while(next.kind == SEMICOLON){
-                 skipStatement();
-                 next = getToken(1);
-             }
-             //only add special token kept for sprites '/**'
-             if(token.specialToken!=null && token.specialToken!=null && token.specialToken.image.startsWith("/**")){
-                 documentHandler.property(name, exp, important, token.specialToken.image);
-             }else{
-                 documentHandler.property(name, exp, important, null);
-             }
-         }
-     }
-     |<LBRACE> (<S>)*
-     {
-         documentHandler.startNestedProperties(name);
-     }
-     ( declaration() )? ( ";" ( <S> )* ( declaration() )? )*
-     <RBRACE>(<S>)*
-     {
-         documentHandler.endNestedProperties(name);
-     }
-     )
-     
- } catch (JumpException e) {
-     skipAfterExpression();
-     // reportWarningSkipText(getLocator(), skipAfterExpression());
- } catch (NumberFormatException e) {
-     if (errorHandler != null) {
-         errorHandler.error(new CSSParseException("Invalid number " 
-                                                  + e.getMessage(),
-                                                  getLocator(), 
-                                                  e));
-     }
-     reportWarningSkipText(getLocator(), skipAfterExpression());
- } catch (ParseException e) {
-     if (errorHandler != null) {
-         if (e.currentToken != null) {
-             LocatorImpl li = new LocatorImpl(this,
-                                              e.currentToken.next.beginLine,
-                                              e.currentToken.next.beginColumn-1);
-             reportError(li, e);
-         } else {
-             reportError(getLocator(), e);
-         }
-         skipAfterExpression();
-         /*
-         LocatorImpl loc = (LocatorImpl) getLocator();
-         loc.column--;
-         reportWarningSkipText(loc, skipAfterExpression());
-         */
-     } else {
-         skipAfterExpression();
-     }
- }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-void declaration() :
-{ boolean important = false;
-  String name;
-  LexicalUnit exp;
-  Token save;
-}
-{
- try {
-     name=property()
-     { save = token; }
-     ":" ( <S> )* exp=expr() ( important=prio() )?
-     {
-        documentHandler.property(name, exp, important);
-     }
- } catch (JumpException e) {
-     skipAfterExpression();
-     // reportWarningSkipText(getLocator(), skipAfterExpression());
- } catch (NumberFormatException e) {
-     if (errorHandler != null) {
-        errorHandler.error(new CSSParseException("Invalid number " 
-                                                 + e.getMessage(),
-                                                 getLocator(), 
-                                                 e));
-     }
-     reportWarningSkipText(getLocator(), skipAfterExpression());
- } catch (ParseException e) {
-     if (errorHandler != null) {
-        if (e.currentToken != null) {
-            LocatorImpl li = new LocatorImpl(this,
-                                             e.currentToken.next.beginLine,
-                                             e.currentToken.next.beginColumn-1);
-            reportError(li, e);
-        } else {
-            reportError(getLocator(), e);
-        }
-        skipAfterExpression();
-        /*
-        LocatorImpl loc = (LocatorImpl) getLocator();
-        loc.column--;
-        reportWarningSkipText(loc, skipAfterExpression());
-        */
-     } else {
-        skipAfterExpression();
-     }
- }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-boolean prio() :
-{}
-{
-  <IMPORTANT_SYM> ( <S> )* { return true; }
-}
-
-boolean guarded() :
-{}
-{
-    <GUARDED_SYM> (<S>)* {return true;}
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-LexicalUnitImpl operator(LexicalUnitImpl prev) :
-{Token n;}
-{
-/* (comments copied from basic_arithmetics.scss)
-*supports:
-* 1. standard arithmetic operations (+, -, *, /, %)
-* 2. / is treated as css operator, unless one of its operands is variable or there is another binary arithmetic operator
-*limits:
-* 1. cannot mix arithmetic and css operations, e.g. "margin: 1px + 3px 2px" will fail
-* 2. space between add and minus operator and their following operand is mandatory. e.g. "1 + 2" is valid, "1+2" is not
-* 3. parenthesis is not supported now.  
-*/
-n="," ( <S> )* { return LexicalUnitImpl.createComma(n.beginLine, 
-            n.beginColumn,
-            prev); }
-|n="/" ( <S> )* { return LexicalUnitImpl.createSlash(n.beginLine, 
-            n.beginColumn,
-            prev); }
-| n="*" ( <S> )* { return LexicalUnitImpl.createMultiply(n.beginLine,
-            n.beginColumn,
-            prev); }
-| n="%" ( <S> )* { return LexicalUnitImpl.createModulo(n.beginLine,
-            n.beginColumn,
-            prev); }
-/*
-* for '+', since it can be either a binary operator or an unary operator,
-* which is ambiguous. To avoid this, the binary operator '+' always has
-* a space before the following term. so '2+3' is not a valid binary expression,
-* but '2 + 3' is.  The same for '-' operator.
-*/
-
-| n="+" ( <S> )+{ return LexicalUnitImpl.createAdd(n.beginLine,
-        n.beginColumn,
-        prev); }
-| n="-" ( <S> )+{ return LexicalUnitImpl.createMinus(n.beginLine,
-        n.beginColumn,
-        prev); }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-LexicalUnitImpl expr() :
-{
-    LexicalUnitImpl first, res;
-    char op;
-}
-{
-    first=term(null){ res = first; }
-    ( LOOKAHEAD(2) ( LOOKAHEAD(2) res=operator(res) )? res=term(res))*
-  { return first; }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-char unaryOperator() :
-{}
-{
-  "-" { return '-'; }
-| "+" { return '+'; }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-LexicalUnitImpl term(LexicalUnitImpl prev) :
-{ LexicalUnitImpl result = null;
-  Token n = null;
-  char op = ' ';
-}
-{
-  (result = nonVariableTerm(prev)| result = variableTerm(prev))
-      {
-         return result;
-      }
-}
-
-LexicalUnitImpl variableTerm(LexicalUnitImpl prev) :\r{
-  LexicalUnitImpl result = null;
-  String varName = "";\r}\r{
-  varName = variableName()
-         {result = LexicalUnitImpl.createVariable(token.beginLine, token.beginColumn,
-                 prev, varName); return result;}\r}
-
-LexicalUnitImpl nonVariableTerm(LexicalUnitImpl prev) :\r{\rLexicalUnitImpl result = null;
-  Token n = null;
-  char op = ' ';
-  String varName;
-  String s = "";
-}
-{
-( ( ( 
-    op=unaryOperator() )?
-    (n=<NUMBER>
-       { result = LexicalUnitImpl.createNumber(n.beginLine, n.beginColumn,
-                                               prev, number(op, n, 0)); }
-    | n=<PERCENTAGE>
-       { result = LexicalUnitImpl.createPercentage(n.beginLine, n.beginColumn,
-                                                   prev, number(op, n, 1)); }
-    | n=<PT>
-       { result = LexicalUnitImpl.createPT(n.beginLine, n.beginColumn,
-                                           prev, number(op, n, 2)); }
-    | n=<CM>
-       { result = LexicalUnitImpl.createCM(n.beginLine, n.beginColumn,
-                                           prev, number(op, n, 2)); }
-    | n=<MM>
-       { result = LexicalUnitImpl.createMM(n.beginLine, n.beginColumn,
-                                           prev, number(op, n, 2)); }
-    | n=<PC>
-       { result = LexicalUnitImpl.createPC(n.beginLine, n.beginColumn,
-                                           prev, number(op, n, 2)); }
-    | n=<IN>
-       { result = LexicalUnitImpl.createIN(n.beginLine, n.beginColumn,
-                                           prev, number(op, n, 2)); }
-    | n=<PX>
-       { result = LexicalUnitImpl.createPX(n.beginLine, n.beginColumn,
-                                           prev, number(op, n, 2)); }
-    | n=<EMS>
-       { result = LexicalUnitImpl.createEMS(n.beginLine, n.beginColumn,
-                                            prev, number(op, n, 2)); }
-    | n=<LEM>
-        { result = LexicalUnitImpl.createLEM(n.beginLine, n.beginColumn,
-                                             prev, number(op, n, 3)); }
-    | n=<REM>       
-        { result = LexicalUnitImpl.createREM(n.beginLine, n.beginColumn,
-                                             prev, number(op, n, 3)); }
-    | n=<EXS>
-       { result = LexicalUnitImpl.createEXS(n.beginLine, n.beginColumn,
-                                            prev, number(op, n, 2)); }
-    | n=<DEG>
-       { result = LexicalUnitImpl.createDEG(n.beginLine, n.beginColumn,
-                                            prev, number(op, n, 3)); }
-    | n=<RAD>
-       { result = LexicalUnitImpl.createRAD(n.beginLine, n.beginColumn,
-                                            prev, number(op, n, 3)); }
-    | n=<GRAD>
-       { result = LexicalUnitImpl.createGRAD(n.beginLine, n.beginColumn,
-                                             prev, number(op, n, 3)); }
-    | n=<SECOND>
-       { result = LexicalUnitImpl.createS(n.beginLine, n.beginColumn,
-                                          prev, number(op, n, 1)); }
-    | n=<MS>
-       { result = LexicalUnitImpl.createMS(n.beginLine, n.beginColumn,
-                                           prev, number(op, n, 2)); }
-    | n=<HZ>
-       { result = LexicalUnitImpl.createHZ(n.beginLine, n.beginColumn,
-                                           prev, number(op, n, 2)); }
-    | n=<KHZ>
-       { result = LexicalUnitImpl.createKHZ(n.beginLine, n.beginColumn,
-                                            prev, number(op, n, 3)); }
-    | n=<DIMEN>
-       {
-           s = n.image;
-           int i = 0;
-           while (i < s.length() 
-                  && (Character.isDigit(s.charAt(i)) || (s.charAt(i) == '.'))) {
-               i++;
-           }
-
-           result = LexicalUnitImpl.createDimen(n.beginLine, n.beginColumn, prev, 
-                                                number(op,n,s.length()-i),
-                                                s.substring(i));
-       }
-    | result=function(op, prev) ) )
-  | ( n=<STRING>
-       { result =
-         LexicalUnitImpl.createString(n.beginLine, n.beginColumn, prev,
-                                      convertStringIndex(n.image, 1, 
-                                                         n.image.length() -1));}
-  | (< DOT >{ s+="."; })?(n=<IDENT> | n=<TO> | n=<THROUGH> | n=<FROM>) 
-      { s += convertIdent(n.image);
-       if ("inherit".equals(s)) {
-           result = LexicalUnitImpl.createInherit(n.beginLine, n.beginColumn,
-                                              prev);
-       } else {
-           result = LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
-                                              prev, convertIdent(n.image));
-       }
-
-         /* /
-         Auto correction code used in the CSS Validator but must not
-          be used by a conformant CSS2 parser.
-        * Common error :
-        * H1 {
-        *   color : black
-        *   background : white
-        * }
-        *
-       Token t = getToken(1);
-       Token semicolon = new Token();
-       semicolon.kind = SEMICOLON;
-       semicolon.image = ";";
-       if (t.kind == COLON) {
-           // @@SEEME. (generate a warning?)
-           // @@SEEME if expression is a single ident, 
-              generate an error ?
-           rejectToken(semicolon);
-           
-           result = prev;
-       }
-       / */
-    }
-       | result=hexcolor(prev) 
-        | result=url(prev)
-       | result=unicode(prev)
-         ) ) ( <S> )*
-  {
-    return result;\r  }\r}
-
-/**
- * Handle all CSS2 functions.
- * @exception ParseException exception during the parse
- */
-LexicalUnitImpl function(char operator, LexicalUnitImpl prev) :
-{Token n;
- LexicalUnit params = null;
-}
-{
-    n=<FUNCTION> ( <S> )*  
-    {
-        String fname = convertIdent(n.image);
-        if("alpha(".equals(fname)){
-            String body = skipStatementUntilSemiColon();
-            return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
-                 null, "alpha("+body);
-        }else if("expression(".equals(fname)){
-            String body = skipStatementUntilSemiColon();
-            return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
-                 null, "expression("+body);
-        }
-    }
-    ( params=expr() )? ")"
-    {
-        if (operator != ' ') {
-           throw new CSSParseException("invalid operator before a function.", 
-                                       getLocator());
-       }
-       String f = convertIdent(n.image);
-        LexicalUnitImpl l = (LexicalUnitImpl) params;
-       boolean loop = true;
-       if ("rgb(".equals(f)) {
-           // this is a RGB declaration (e.g. rgb(255, 50%, 0) )
-           int i = 0;
-           while (loop && l != null && i < 5) {
-               switch (i) {
-                   case 0:
-                   case 2:
-                   case 4:
-                       if ((l.getLexicalUnitType() != LexicalUnit.SAC_INTEGER)
-                           && (l.getLexicalUnitType() != LexicalUnit.SAC_PERCENTAGE)) {
-                           loop = false;
-                       }
-                       break;
-                   case 1:
-                   case 3:
-                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
-                           loop = false;
-                       }
-                       break;
-                   default:
-                        throw new ParseException("implementation error");
-               }
-               if (loop) {
-                   l = (LexicalUnitImpl) l.getNextLexicalUnit();
-                   i ++;
-               }
-           }
-           if ((i == 5) && loop && (l == null)) {
-               return LexicalUnitImpl.createRGBColor(n.beginLine,
-                                                     n.beginColumn,
-                                                     prev, params);
-           } else {
-               if (errorHandler != null) {
-                   String errorText;
-                   Locator loc;
-                   if (i < 5) {
-                       if (params == null) {
-                           loc = new LocatorImpl(this, n.beginLine,
-                                                 n.beginColumn-1);
-                           errorText = "not enough parameters.";
-                       } else if (l == null) {
-                           loc = new LocatorImpl(this, n.beginLine,
-                                                 n.beginColumn-1);
-                           errorText = "not enough parameters: " 
-                               + params.toString();
-                       } else {
-                           loc = new LocatorImpl(this, l.getLineNumber(),
-                                                 l.getColumnNumber());
-                           errorText = "invalid parameter: "
-                               + l.toString();
-                       }
-                   } else {
-                       loc = new LocatorImpl(this, l.getLineNumber(),
-                                             l.getColumnNumber());
-                       errorText = "too many parameters: "
-                           + l.toString();
-                   }
-                   errorHandler.error(new CSSParseException(errorText, loc));
-               }
-
-               throw new JumpException();
-           }
-       } else if ("counter".equals(f)) {
-           int i = 0;
-           while (loop && l != null && i < 3) {
-               switch (i) {
-                   case 0:
-                   case 2:
-                       if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
-                           loop = false;
-                       }
-                       break;
-                   case 1:
-                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
-                           loop = false;
-                       }
-                       break;
-                   default:
-                        throw new ParseException("implementation error");
-               }
-               l = (LexicalUnitImpl) l.getNextLexicalUnit();
-               i ++;
-           }
-           if (((i == 1) || (i == 3)) && loop && (l == null)) {
-               return LexicalUnitImpl.createCounter(n.beginLine, n.beginColumn,
-                                                    prev, params);
-           }
-
-       } else if ("counters(".equals(f)) {
-           
-           int i = 0;
-           while (loop && l != null && i < 5) {
-               switch (i) {
-                   case 0:
-                   case 4:
-                       if (l.getLexicalUnitType() != LexicalUnit.SAC_IDENT) {
-                           loop = false;
-                       }
-                       break;
-                   case 2:
-                       if (l.getLexicalUnitType() != LexicalUnit.SAC_STRING_VALUE) {
-                           loop = false;
-                       }
-                       break;
-                   case 1:
-                   case 3:
-                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
-                           loop = false;
-                       }
-                       break;
-                   default:
-                        throw new ParseException("implementation error");
-               }
-               l = (LexicalUnitImpl) l.getNextLexicalUnit();
-               i ++;
-           }
-           if (((i == 3) || (i == 5)) && loop && (l == null)) {
-               return LexicalUnitImpl.createCounters(n.beginLine, n.beginColumn,
-                                                     prev, params);
-           }
-       } else if ("attr(".equals(f)) {
-           if ((l != null)
-               && (l.getNextLexicalUnit() == null)
-               && (l.getLexicalUnitType() == LexicalUnit.SAC_IDENT)) {
-                return LexicalUnitImpl.createAttr(l.getLineNumber(), 
-                                                 l.getColumnNumber(),
-                                                 prev, l.getStringValue());
-           }
-       } else if ("rect(".equals(f)) {
-           int i = 0;
-           while (loop && l != null && i < 7) {
-               switch (i) {
-                   case 0:
-                   case 2:
-                   case 4:
-                   case 6:
-                       switch (l.getLexicalUnitType()) {
-                       case LexicalUnit.SAC_INTEGER:
-                           if (l.getIntegerValue() != 0) {
-                               loop = false;
-                           }
-                           break;
-                       case LexicalUnit.SAC_IDENT:
-                           if (!l.getStringValue().equals("auto")) {
-                               loop = false;
-                           }
-                           break;
-                       case LexicalUnit.SAC_EM:
-                       case LexicalUnit.SAC_EX:
-                       case LexicalUnit.SAC_PIXEL:
-                       case LexicalUnit.SAC_CENTIMETER:
-                       case LexicalUnit.SAC_MILLIMETER:
-                       case LexicalUnit.SAC_INCH:
-                       case LexicalUnit.SAC_POINT:
-                       case LexicalUnit.SAC_PICA:
-                           // nothing
-                           break;
-                       default:
-                           loop = false;
-                       }
-                       break;
-                   case 1:
-                   case 3:
-                   case 5:
-                       if (l.getLexicalUnitType() != LexicalUnit.SAC_OPERATOR_COMMA) {
-                           loop = false;
-                       }
-                       break;
-                   default:
-                        throw new ParseException("implementation error");
-               }
-               l = (LexicalUnitImpl) l.getNextLexicalUnit();
-               i ++;
-           }
-           if ((i == 7) && loop && (l == null)) {
-               return LexicalUnitImpl.createRect(n.beginLine, n.beginColumn,
-                                                 prev, params);
-           }
-       } 
-       return LexicalUnitImpl.createFunction(n.beginLine, n.beginColumn, prev, 
-                                             f.substring(0, 
-                                                       f.length() -1),
-                                             params);
-    }
-}
-
-LexicalUnitImpl unicode(LexicalUnitImpl prev) :
-{ Token n;
-}
-{
-  n=<UNICODERANGE>
- {
-     LexicalUnitImpl params = null;
-     String s = n.image.substring(2);
-     int index = s.indexOf('-');
-     if (index == -1) {
-        params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
-                                               params, Integer.parseInt(s, 16));
-     } else {
-        String s1 = s.substring(0, index);
-        String s2 = s.substring(index);
-
-        params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
-                                               params, Integer.parseInt(s1, 16));
-        params = LexicalUnitImpl.createInteger(n.beginLine, n.beginColumn,
-                                               params, Integer.parseInt(s2, 16));
-     }
-
-     return LexicalUnitImpl.createUnicodeRange(n.beginLine, n.beginColumn,
-                                              prev, params);
- }
-}
-
-LexicalUnitImpl url(LexicalUnitImpl prev) :
-{ Token n;
-}
-{
-  n=<URL>
- {
-   String urlname = n.image.substring(4, n.image.length()-1).trim();
-   return LexicalUnitImpl.createURL(n.beginLine, n.beginColumn, prev, urlname); 
- }
-}
-
-/**
- * @exception ParseException exception during the parse
- */
-LexicalUnitImpl hexcolor(LexicalUnitImpl prev) :
-{Token n; 
-}
-{
- n=<HASH>
- { 
-     int r;
-     LexicalUnitImpl first, params = null;
-     String s = n.image.substring(1);
-     
-     if(s.length()!=3 && s.length()!=6) {
-        first = null;
-        throw new CSSParseException("invalid hexadecimal notation for RGB: " + s, 
-                                    getLocator());
-     }
-     return LexicalUnitImpl.createIdent(n.beginLine, n.beginColumn,
-             prev, n.image);
- }
-}
-
-JAVACODE
-float number(char operator, Token n, int lengthUnit) {
-    String image  = n.image;
-    float f = 0;
-
-    if (lengthUnit != 0) {
-       image = image.substring(0, image.length() - lengthUnit);
-    }
-    f = Float.valueOf(image).floatValue();
-    return (operator == '-')? -f: f;
-}
-
-JAVACODE
-String skipStatementUntilSemiColon(){
-    int[] semicolon = {SEMICOLON};
-    return skipStatementUntil(semicolon);
-}
-
-JAVACODE
-String skipStatementUntilLeftBrace(){
-    int[] lBrace = {LBRACE};
-    return skipStatementUntil(lBrace);
-}
-
-JAVACODE
-String skipStatementUntilMatchingRightParan(){
-    int[] leftTokens = {LPARAN, FUNCTION}; // a FUNCTION also contains "("
-    int[] rightTokens = {RPARAN};
-    StringBuffer s = new StringBuffer();
-    int difference = 1;
-    Token tok;
-    while(difference != 0){
-        tok = getToken(1);
-        if(tok.kind == EOF) {
-            return null;
-        }
-        for(int sym : leftTokens){
-            if(tok.kind == sym){
-                difference++;
-            }
-        }
-        for(int sym : rightTokens){
-            if(tok.kind == sym){
-                difference--;
-            }
-        }
-        if(difference != 0){
-            if (tok.image != null) {
-                s.append(tok.image);
-            }
-            getNextToken();
-        }
-    }
-    return s.toString().trim();
-}
-
-JAVACODE
-String skipStatementUntil(int[] symbols){
-    StringBuffer s = new StringBuffer();
-    boolean stop = false;
-    Token tok;
-    while(!stop){
-        tok = getToken(1);
-        if(tok.kind == EOF) {
-            return null;
-        }
-        for(int sym : symbols){
-            if(tok.kind == sym){
-                stop = true;
-                break;
-            }
-        }
-        if(!stop){
-            if (tok.image != null) {
-                s.append(tok.image);
-            }
-            getNextToken();
-        }
-    }
-    return s.toString().trim();
-}
-
-
-JAVACODE
-String skipStatement() {
-    StringBuffer s = new StringBuffer();
-    Token tok = getToken(0);
-    if (tok.image != null) {
-        s.append(tok.image);    
-    }
-    while (true) {
-        tok = getToken(1);
-        if (tok.kind == EOF) {
-            return null;
-        } 
-        s.append(tok.image);
-        if (tok.kind == LBRACE) {
-            getNextToken();
-            s.append(skip_to_matching_brace());
-            getNextToken();
-            tok = getToken(1);
-            break;
-        } else if (tok.kind == RBRACE) {
-            getNextToken();
-            tok = getToken(1);
-            break;
-        } else if (tok.kind == SEMICOLON) {
-            getNextToken();
-            tok = getToken(1);
-            break;
-        }
-        getNextToken();
-    }
-    
-    // skip white space
-    while (true) {
-        if (tok.kind != S) {
-            break;
-        }
-        tok = getNextToken();
-        tok = getToken(1);
-    }
-
-    return s.toString().trim();
-}
-
-JAVACODE
-String skip_to_matching_brace() {
-    StringBuffer s = new StringBuffer();
-    Token tok;
-    int nesting = 1;
-    while (true) {
-        tok = getToken(1);
-        if (tok.kind == EOF) {
-            break;
-        }
-        s.append(tok.image);
-        if (tok.kind == LBRACE) {
-            nesting++;
-        } else if (tok.kind == RBRACE) {
-            nesting--;
-            if (nesting == 0) {
-                break;
-            }
-        }
-        getNextToken();
-    }
-    return s.toString();
-}
-
-/*
- * Here I handle all CSS2 unicode character stuffs.
- * I convert all \XXXXXX character into a single character.
- * Don't forget that the parser has recognize the token before.
- * (So IDENT won't contain newline and stuffs like this).
- */
-JAVACODE
-String convertStringIndex(String s, int start, int len) {
-    StringBuffer buf = new StringBuffer(len);
-    int index = start;
-
-    while (index < len) {
-       char c = s.charAt(index);
-       if (c == '\\') {
-           if (++index < len) {
-               c = s.charAt(index);
-               switch (c) {
-               case '0': case '1': case '2': case '3': case '4':
-               case '5': case '6': case '7': case '8': case '9':
-               case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
-               case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-                   buf.append('\\');
-                   while (index < len) {
-                       buf.append(s.charAt(index++));
-                   }
-                   break;
-               case '\n':
-               case '\f':
-                   break;
-               case '\r':
-                   if (index + 1 < len) {
-                       if (s.charAt(index + 1) == '\n') {
-                           index ++;
-                       }
-                   }
-                   break;
-               default:
-                   buf.append(c);
-               }
-           } else {
-               throw new CSSParseException("invalid string " + s, getLocator());
-           }
-       } else {
-           buf.append(c);
-       }
-       index++;
-    }
-
-    return buf.toString();
-}
-
-JAVACODE
-String convertIdent(String s) {
-    return convertStringIndex(s, 0, s.length());
-}
-
-JAVACODE
-String convertString(String s) {
-    return convertStringIndex(s, 0, s.length());
-}
-
-JAVACODE
-void comments(){
-       /*keeps only the multiple line comments, single line comments are skipped*/
-    if (token.specialToken != null && token.specialToken.image!=null && token.specialToken.image.startsWith("/*")){
-        Token tmp_t = token.specialToken;
-        while (tmp_t.specialToken != null) tmp_t = tmp_t.specialToken;
-        while (tmp_t != null) {
-            documentHandler.comment(tmp_t.image);
-            tmp_t = tmp_t.next;
-        }
-    }
-} 
-
-/*
- * @@HACK
- * I can't insert a token into the tokens flow.
- * It's jj_consume_token implementation dependant! :-(
- */
-JAVACODE
-void rejectToken(Token t) {
-    Token fakeToken = new Token();
-    t.next = token;
-    fakeToken.next = t;
-    token = fakeToken;
-}
-
-/**
- * skip after an expression
- */
-JAVACODE
-String skipAfterExpression() {
-    Token t = getToken(1);
-    StringBuffer s = new StringBuffer();
-    s.append(getToken(0).image);
-    
-    while ((t.kind != RBRACE) && (t.kind != SEMICOLON) && (t.kind != EOF)) {
-       s.append(t.image);
-       getNextToken();
-       t = getToken(1);
-    }
-    
-    return s.toString();
-}
-
-/**
- * The following functions are useful for a DOM CSS implementation only and are
- * not part of the general CSS2 parser.
- */
-// TODO required by original parser but not used by Vaadin?
-void _parseRule() :
-{String ret = null;
-}
-{
-       ( <S> )*
-          ( importDeclaration() | debuggingDirective() | styleRule() | media() | page() | fontFace() | ret=skipStatement() 
-               {
-                   if ((ret == null) || (ret.length() == 0)) {
-                       return; 
-                   }
-                   if (ret.charAt(0) == '@') {
-                       documentHandler.unrecognizedRule(ret);
-                   } else {
-                       throw new CSSParseException("unrecognize rule: " + ret,
-                                                   getLocator());
-                   }
-               }
-         )
-}
-
-void _parseImportRule() :
-{
-}
-{
-    ( <S> )* importDeclaration()
-}
-
-void _parseMediaRule() :
-{
-}
-{
-    ( <S> )* media()
-}
-
-void _parseDeclarationBlock() :
-{
-}
-{
-    ( <S> )*
-       ( declaration() )? ( ";" ( <S> )* ( declaration() )? )* 
- }
-
-ArrayList<String> _parseSelectors() :
-{ ArrayList<String> p = null;
-}
-{
-    try {
-       ( <S> )* p = selectorList()
-       { return p; }
-    } catch (ThrowedParseException e) {
-       throw (ParseException) e.e.fillInStackTrace();
-    }
-}
-
-/*
- * Local Variables:
- * compile-command: javacc Parser.jj & javac Parser.java
- * End:
- */
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java b/theme-compiler/src/com/vaadin/sass/internal/parser/ParserTokenManager.java
new file mode 100644 (file)
index 0000000..d54ab4f
--- /dev/null
@@ -0,0 +1,4997 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed 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.
+ */
+/* Generated By:JavaCC: Do not edit this line. ParserTokenManager.java */
+package com.vaadin.sass.internal.parser;
+import java.io.*;
+import java.net.*;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
+import org.w3c.css.sac.ConditionFactory;
+import org.w3c.css.sac.Condition;
+import org.w3c.css.sac.SelectorFactory;
+import org.w3c.css.sac.SelectorList;
+import org.w3c.css.sac.Selector;
+import org.w3c.css.sac.SimpleSelector;
+import org.w3c.css.sac.DocumentHandler;
+import org.w3c.css.sac.InputSource;
+import org.w3c.css.sac.ErrorHandler;
+import org.w3c.css.sac.CSSException;
+import org.w3c.css.sac.CSSParseException;
+import org.w3c.css.sac.Locator;
+import org.w3c.css.sac.LexicalUnit;
+import org.w3c.flute.parser.selectors.SelectorFactoryImpl;
+import org.w3c.flute.parser.selectors.ConditionFactoryImpl;
+import org.w3c.flute.util.Encoding;
+import com.vaadin.sass.internal.handler.*;
+import com.vaadin.sass.internal.tree.*;
+
+/** Token Manager. */
+public class ParserTokenManager implements ParserConstants
+{
+
+  /** Debug output. */
+  public  java.io.PrintStream debugStream = System.out;
+  /** Set debug output. */
+  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
+private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1)
+{
+   switch (pos)
+   {
+      case 0:
+         if ((active0 & 0xffe0000000000000L) != 0L || (active1 & 0x3e0000000fL) != 0L)
+            return 162;
+         if ((active0 & 0xe000000000000L) != 0L || (active1 & 0x20L) != 0L)
+         {
+            jjmatchedKind = 72;
+            return 522;
+         }
+         if ((active0 & 0x80000000L) != 0L)
+            return 523;
+         if ((active0 & 0x10000000000000L) != 0L)
+         {
+            jjmatchedKind = 72;
+            return 29;
+         }
+         if ((active0 & 0x4000L) != 0L)
+            return 75;
+         if ((active0 & 0x2000010L) != 0L)
+            return 216;
+         if ((active0 & 0x80200L) != 0L)
+            return 38;
+         if ((active0 & 0x2000000000L) != 0L)
+            return 524;
+         return -1;
+      case 1:
+         if ((active1 & 0x2L) != 0L)
+            return 174;
+         if ((active0 & 0xffe0000000000000L) != 0L || (active1 & 0x3e0000000dL) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 1;
+            return 525;
+         }
+         if ((active0 & 0x14000000000000L) != 0L)
+         {
+            jjmatchedKind = 72;
+            jjmatchedPos = 1;
+            return 522;
+         }
+         if ((active0 & 0xa000000000000L) != 0L || (active1 & 0x20L) != 0L)
+            return 522;
+         if ((active0 & 0x10L) != 0L)
+            return 221;
+         return -1;
+      case 2:
+         if ((active0 & 0xbfe0000000000000L) != 0L || (active1 & 0x3e0000000dL) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 2;
+            return 525;
+         }
+         if ((active0 & 0x4000000000000000L) != 0L)
+            return 525;
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 2;
+            return 173;
+         }
+         if ((active0 & 0x14000000000000L) != 0L)
+         {
+            jjmatchedKind = 72;
+            jjmatchedPos = 2;
+            return 522;
+         }
+         return -1;
+      case 3:
+         if ((active0 & 0xb7e0000000000000L) != 0L || (active1 & 0x3e0000000dL) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 3;
+            return 525;
+         }
+         if ((active0 & 0x800000000000000L) != 0L)
+            return 525;
+         if ((active0 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 72;
+            jjmatchedPos = 3;
+            return 522;
+         }
+         if ((active0 & 0x10000000000000L) != 0L)
+            return 522;
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 3;
+            return 172;
+         }
+         return -1;
+      case 4:
+         if ((active0 & 0x9400000000000000L) != 0L || (active1 & 0x1000000000L) != 0L)
+            return 525;
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 4;
+            return 171;
+         }
+         if ((active0 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 72;
+            jjmatchedPos = 4;
+            return 522;
+         }
+         if ((active0 & 0x23e0000000000000L) != 0L || (active1 & 0x2e0000000dL) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 4;
+            return 525;
+         }
+         return -1;
+      case 5:
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 5;
+            return 170;
+         }
+         if ((active0 & 0x4000000000000L) != 0L)
+         {
+            jjmatchedKind = 72;
+            jjmatchedPos = 5;
+            return 522;
+         }
+         if ((active0 & 0x2220000000000000L) != 0L || (active1 & 0x400000000L) != 0L)
+            return 525;
+         if ((active0 & 0x1c0000000000000L) != 0L || (active1 & 0x2a0000000dL) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 5;
+            return 525;
+         }
+         return -1;
+      case 6:
+         if ((active0 & 0x100000000000000L) != 0L || (active1 & 0x200000001L) != 0L)
+            return 525;
+         if ((active0 & 0x4000000000000L) != 0L)
+            return 522;
+         if ((active0 & 0xc0000000000000L) != 0L || (active1 & 0x280000000eL) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 6;
+            return 525;
+         }
+         return -1;
+      case 7:
+         if ((active0 & 0x40000000000000L) != 0L || (active1 & 0x800000008L) != 0L)
+            return 525;
+         if ((active0 & 0x80000000000000L) != 0L || (active1 & 0x2000000006L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 7;
+            return 525;
+         }
+         return -1;
+      case 8:
+         if ((active1 & 0x2000000002L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 8;
+            return 525;
+         }
+         if ((active0 & 0x80000000000000L) != 0L || (active1 & 0x4L) != 0L)
+            return 525;
+         return -1;
+      case 9:
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 9;
+            return 525;
+         }
+         if ((active1 & 0x2000000000L) != 0L)
+            return 525;
+         return -1;
+      case 10:
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 10;
+            return 525;
+         }
+         return -1;
+      case 11:
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 11;
+            return 525;
+         }
+         return -1;
+      case 12:
+         if ((active1 & 0x2L) != 0L)
+         {
+            jjmatchedKind = 103;
+            jjmatchedPos = 12;
+            return 525;
+         }
+         return -1;
+      default :
+         return -1;
+   }
+}
+private final int jjStartNfa_0(int pos, long active0, long active1)
+{
+   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1);
+}
+private int jjStopAtPos(int pos, int kind)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   return pos + 1;
+}
+private int jjMoveStringLiteralDfa0_0()
+{
+   switch(curChar)
+   {
+      case 33:
+         return jjMoveStringLiteralDfa1_0(0x2000000000L, 0x0L);
+      case 36:
+         return jjMoveStringLiteralDfa1_0(0x4000L, 0x0L);
+      case 37:
+         return jjStopAtPos(0, 29);
+      case 38:
+         jjmatchedKind = 30;
+         return jjMoveStringLiteralDfa1_0(0x1000000000L, 0x0L);
+      case 40:
+         return jjStopAtPos(0, 32);
+      case 41:
+         return jjStopAtPos(0, 33);
+      case 42:
+         jjmatchedKind = 28;
+         return jjMoveStringLiteralDfa1_0(0x8000L, 0x0L);
+      case 43:
+         return jjStopAtPos(0, 18);
+      case 44:
+         return jjStopAtPos(0, 20);
+      case 45:
+         jjmatchedKind = 19;
+         return jjMoveStringLiteralDfa1_0(0x200L, 0x0L);
+      case 46:
+         return jjStartNfaWithStates_0(0, 31, 523);
+      case 47:
+         jjmatchedKind = 25;
+         return jjMoveStringLiteralDfa1_0(0x10L, 0x0L);
+      case 58:
+         return jjStopAtPos(0, 38);
+      case 59:
+         return jjStopAtPos(0, 21);
+      case 60:
+         jjmatchedKind = 24;
+         return jjMoveStringLiteralDfa1_0(0x100L, 0x0L);
+      case 61:
+         jjmatchedKind = 17;
+         return jjMoveStringLiteralDfa1_0(0x400000000L, 0x0L);
+      case 62:
+         return jjStopAtPos(0, 22);
+      case 64:
+         return jjMoveStringLiteralDfa1_0(0xffe0000000000000L, 0x3e0000000fL);
+      case 91:
+         return jjStopAtPos(0, 26);
+      case 93:
+         return jjStopAtPos(0, 27);
+      case 94:
+         return jjMoveStringLiteralDfa1_0(0x2000L, 0x0L);
+      case 70:
+      case 102:
+         return jjMoveStringLiteralDfa1_0(0x10000000000000L, 0x0L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa1_0(0x8000000000000L, 0x20L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa1_0(0x6000000000000L, 0x0L);
+      case 123:
+         return jjStopAtPos(0, 10);
+      case 124:
+         return jjMoveStringLiteralDfa1_0(0x800001000L, 0x0L);
+      case 125:
+         return jjStopAtPos(0, 11);
+      case 126:
+         jjmatchedKind = 23;
+         return jjMoveStringLiteralDfa1_0(0x10000L, 0x0L);
+      default :
+         return jjMoveNfa_0(24, 0);
+   }
+}
+private int jjMoveStringLiteralDfa1_0(long active0, long active1)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(0, active0, active1);
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 33:
+         return jjMoveStringLiteralDfa2_0(active0, 0x100L, active1, 0L);
+      case 38:
+         if ((active0 & 0x1000000000L) != 0L)
+            return jjStopAtPos(1, 36);
+         break;
+      case 42:
+         if ((active0 & 0x10L) != 0L)
+            return jjStartNfaWithStates_0(1, 4, 221);
+         break;
+      case 45:
+         return jjMoveStringLiteralDfa2_0(active0, 0x200L, active1, 0x2L);
+      case 61:
+         if ((active0 & 0x1000L) != 0L)
+            return jjStopAtPos(1, 12);
+         else if ((active0 & 0x2000L) != 0L)
+            return jjStopAtPos(1, 13);
+         else if ((active0 & 0x4000L) != 0L)
+            return jjStopAtPos(1, 14);
+         else if ((active0 & 0x8000L) != 0L)
+            return jjStopAtPos(1, 15);
+         else if ((active0 & 0x10000L) != 0L)
+            return jjStopAtPos(1, 16);
+         else if ((active0 & 0x400000000L) != 0L)
+            return jjStopAtPos(1, 34);
+         else if ((active0 & 0x2000000000L) != 0L)
+            return jjStopAtPos(1, 37);
+         break;
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000008L);
+      case 68:
+      case 100:
+         return jjMoveStringLiteralDfa2_0(active0, 0x200000000000000L, active1, 0L);
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa2_0(active0, 0x9000000000000000L, active1, 0x1L);
+      case 70:
+      case 102:
+         if ((active1 & 0x20L) != 0L)
+            return jjStartNfaWithStates_0(1, 69, 522);
+         return jjMoveStringLiteralDfa2_0(active0, 0x880000000000000L, active1, 0x2000000000L);
+      case 72:
+      case 104:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000L, active1, 0L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa2_0(active0, 0x4040000000000000L, active1, 0x200000000L);
+      case 77:
+      case 109:
+         return jjMoveStringLiteralDfa2_0(active0, 0x20000000000000L, active1, 0x400000000L);
+      case 78:
+      case 110:
+         if ((active0 & 0x8000000000000L) != 0L)
+            return jjStartNfaWithStates_0(1, 51, 522);
+         break;
+      case 79:
+      case 111:
+         if ((active0 & 0x2000000000000L) != 0L)
+            return jjStartNfaWithStates_0(1, 49, 522);
+         break;
+      case 80:
+      case 112:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x1000000000L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa2_0(active0, 0x110000000000000L, active1, 0L);
+      case 83:
+      case 115:
+         return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x4L);
+      case 87:
+      case 119:
+         return jjMoveStringLiteralDfa2_0(active0, 0x2400000000000000L, active1, 0L);
+      case 124:
+         if ((active0 & 0x800000000L) != 0L)
+            return jjStopAtPos(1, 35);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(0, active0, active1);
+}
+private int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(0, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(1, active0, active1);
+      return 2;
+   }
+   switch(curChar)
+   {
+      case 45:
+         return jjMoveStringLiteralDfa3_0(active0, 0x100L, active1, 0L);
+      case 62:
+         if ((active0 & 0x200L) != 0L)
+            return jjStopAtPos(2, 9);
+         break;
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa3_0(active0, 0x1400000000000000L, active1, 0x1000000000L);
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa3_0(active0, 0x300000000000000L, active1, 0x400000000L);
+      case 70:
+      case 102:
+         if ((active0 & 0x4000000000000000L) != 0L)
+            return jjStartNfaWithStates_0(2, 62, 525);
+         break;
+      case 72:
+      case 104:
+         return jjMoveStringLiteralDfa3_0(active0, 0x2000000000000000L, active1, 0x800000000L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa3_0(active0, 0x20000000000000L, active1, 0L);
+      case 76:
+      case 108:
+         return jjMoveStringLiteralDfa3_0(active0, 0x8000000000000000L, active1, 0L);
+      case 77:
+      case 109:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x200000002L);
+      case 78:
+      case 110:
+         return jjMoveStringLiteralDfa3_0(active0, 0x40000000000000L, active1, 0L);
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa3_0(active0, 0x810000000000000L, active1, 0x2000000008L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000L, active1, 0L);
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa3_0(active0, 0x80000000000000L, active1, 0x4L);
+      case 88:
+      case 120:
+         return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(1, active0, active1);
+}
+private int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(1, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(2, active0, active1);
+      return 3;
+   }
+   switch(curChar)
+   {
+      case 45:
+         if ((active0 & 0x100L) != 0L)
+            return jjStopAtPos(3, 8);
+         break;
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x800000000L);
+      case 66:
+      case 98:
+         return jjMoveStringLiteralDfa4_0(active0, 0x200000000000000L, active1, 0L);
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa4_0(active0, 0x1040000000000000L, active1, 0L);
+      case 68:
+      case 100:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x400000000L);
+      case 71:
+      case 103:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x1000000000L);
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa4_0(active0, 0x2000000000000000L, active1, 0L);
+      case 77:
+      case 109:
+         if ((active0 & 0x10000000000000L) != 0L)
+            return jjStartNfaWithStates_0(3, 52, 522);
+         break;
+      case 78:
+      case 110:
+         return jjMoveStringLiteralDfa4_0(active0, 0x80000000000000L, active1, 0x2000000008L);
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa4_0(active0, 0x4000000000000L, active1, 0x2L);
+      case 80:
+      case 112:
+         return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x200000004L);
+      case 82:
+      case 114:
+         if ((active0 & 0x800000000000000L) != 0L)
+            return jjStartNfaWithStates_0(3, 59, 525);
+         return jjMoveStringLiteralDfa4_0(active0, 0x400000000000000L, active1, 0L);
+      case 83:
+      case 115:
+         return jjMoveStringLiteralDfa4_0(active0, 0x8000000000000000L, active1, 0L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa4_0(active0, 0x100000000000000L, active1, 0x1L);
+      case 88:
+      case 120:
+         return jjMoveStringLiteralDfa4_0(active0, 0x20000000000000L, active1, 0L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(2, active0, active1);
+}
+private int jjMoveStringLiteralDfa4_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(2, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(3, active0, active1);
+      return 4;
+   }
+   switch(curChar)
+   {
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa5_0(active0, 0x80000000000000L, active1, 0L);
+      case 69:
+      case 101:
+         if ((active0 & 0x8000000000000000L) != 0L)
+            return jjStartNfaWithStates_0(4, 63, 525);
+         else if ((active1 & 0x1000000000L) != 0L)
+            return jjStartNfaWithStates_0(4, 100, 525);
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1L);
+      case 72:
+      case 104:
+         if ((active0 & 0x1000000000000000L) != 0L)
+            return jjStartNfaWithStates_0(4, 60, 525);
+         break;
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa5_0(active0, 0x20000000000000L, active1, 0x400000000L);
+      case 76:
+      case 108:
+         return jjMoveStringLiteralDfa5_0(active0, 0x2040000000000000L, active1, 0L);
+      case 78:
+      case 110:
+         if ((active0 & 0x400000000000000L) != 0L)
+            return jjStartNfaWithStates_0(4, 58, 525);
+         break;
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x200000000L);
+      case 80:
+      case 112:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x4L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x800000000L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2000000008L);
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa5_0(active0, 0x304000000000000L, active1, 0L);
+      case 90:
+      case 122:
+         return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x2L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(3, active0, active1);
+}
+private int jjMoveStringLiteralDfa5_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(3, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(4, active0, active1);
+      return 5;
+   }
+   switch(curChar)
+   {
+      case 45:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2000000002L);
+      case 65:
+      case 97:
+         if ((active1 & 0x400000000L) != 0L)
+            return jjStartNfaWithStates_0(5, 98, 525);
+         break;
+      case 69:
+      case 101:
+         if ((active0 & 0x2000000000000000L) != 0L)
+            return jjStartNfaWithStates_0(5, 61, 525);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x8L);
+      case 71:
+      case 103:
+         if ((active0 & 0x200000000000000L) != 0L)
+            return jjStartNfaWithStates_0(5, 57, 525);
+         return jjMoveStringLiteralDfa6_0(active0, 0x4000000000000L, active1, 0L);
+      case 78:
+      case 110:
+         if ((active0 & 0x20000000000000L) != 0L)
+            return jjStartNfaWithStates_0(5, 53, 525);
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x1L);
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x4L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa6_0(active0, 0x100000000000000L, active1, 0x200000000L);
+      case 83:
+      case 115:
+         return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x800000000L);
+      case 84:
+      case 116:
+         return jjMoveStringLiteralDfa6_0(active0, 0x80000000000000L, active1, 0L);
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa6_0(active0, 0x40000000000000L, active1, 0L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(4, active0, active1);
+}
+private int jjMoveStringLiteralDfa6_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(4, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(5, active0, active1);
+      return 6;
+   }
+   switch(curChar)
+   {
+      case 68:
+      case 100:
+         if ((active1 & 0x1L) != 0L)
+            return jjStartNfaWithStates_0(6, 64, 525);
+         return jjMoveStringLiteralDfa7_0(active0, 0x40000000000000L, active1, 0x2L);
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x800000000L);
+      case 70:
+      case 102:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x2000000000L);
+      case 72:
+      case 104:
+         if ((active0 & 0x4000000000000L) != 0L)
+            return jjStartNfaWithStates_0(6, 50, 522);
+         break;
+      case 73:
+      case 105:
+         return jjMoveStringLiteralDfa7_0(active0, 0x80000000000000L, active1, 0L);
+      case 78:
+      case 110:
+         if ((active0 & 0x100000000000000L) != 0L)
+            return jjStartNfaWithStates_0(6, 56, 525);
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x8L);
+      case 82:
+      case 114:
+         return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x4L);
+      case 84:
+      case 116:
+         if ((active1 & 0x200000000L) != 0L)
+            return jjStartNfaWithStates_0(6, 97, 525);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(5, active0, active1);
+}
+private int jjMoveStringLiteralDfa7_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(5, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(6, active0, active1);
+      return 7;
+   }
+   switch(curChar)
+   {
+      case 65:
+      case 97:
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x2000000000L);
+      case 69:
+      case 101:
+         if ((active0 & 0x40000000000000L) != 0L)
+            return jjStartNfaWithStates_0(7, 54, 525);
+         break;
+      case 79:
+      case 111:
+         return jjMoveStringLiteralDfa8_0(active0, 0x80000000000000L, active1, 0x2L);
+      case 84:
+      case 116:
+         if ((active1 & 0x8L) != 0L)
+            return jjStartNfaWithStates_0(7, 67, 525);
+         else if ((active1 & 0x800000000L) != 0L)
+            return jjStartNfaWithStates_0(7, 99, 525);
+         return jjMoveStringLiteralDfa8_0(active0, 0L, active1, 0x4L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(6, active0, active1);
+}
+private int jjMoveStringLiteralDfa8_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(6, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(7, active0, active1);
+      return 8;
+   }
+   switch(curChar)
+   {
+      case 67:
+      case 99:
+         return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x2000000002L);
+      case 78:
+      case 110:
+         if ((active0 & 0x80000000000000L) != 0L)
+            return jjStartNfaWithStates_0(8, 55, 525);
+         break;
+      case 83:
+      case 115:
+         if ((active1 & 0x4L) != 0L)
+            return jjStartNfaWithStates_0(8, 66, 525);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(7, active0, active1);
+}
+private int jjMoveStringLiteralDfa9_0(long old0, long active0, long old1, long active1)
+{
+   if (((active0 &= old0) | (active1 &= old1)) == 0L)
+      return jjStartNfa_0(7, old0, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(8, 0L, active1);
+      return 9;
+   }
+   switch(curChar)
+   {
+      case 69:
+      case 101:
+         if ((active1 & 0x2000000000L) != 0L)
+            return jjStartNfaWithStates_0(9, 101, 525);
+         break;
+      case 85:
+      case 117:
+         return jjMoveStringLiteralDfa10_0(active1, 0x2L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(8, 0L, active1);
+}
+private int jjMoveStringLiteralDfa10_0(long old1, long active1)
+{
+   if (((active1 &= old1)) == 0L)
+      return jjStartNfa_0(8, 0L, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(9, 0L, active1);
+      return 10;
+   }
+   switch(curChar)
+   {
+      case 77:
+      case 109:
+         return jjMoveStringLiteralDfa11_0(active1, 0x2L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(9, 0L, active1);
+}
+private int jjMoveStringLiteralDfa11_0(long old1, long active1)
+{
+   if (((active1 &= old1)) == 0L)
+      return jjStartNfa_0(9, 0L, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(10, 0L, active1);
+      return 11;
+   }
+   switch(curChar)
+   {
+      case 69:
+      case 101:
+         return jjMoveStringLiteralDfa12_0(active1, 0x2L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(10, 0L, active1);
+}
+private int jjMoveStringLiteralDfa12_0(long old1, long active1)
+{
+   if (((active1 &= old1)) == 0L)
+      return jjStartNfa_0(10, 0L, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(11, 0L, active1);
+      return 12;
+   }
+   switch(curChar)
+   {
+      case 78:
+      case 110:
+         return jjMoveStringLiteralDfa13_0(active1, 0x2L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(11, 0L, active1);
+}
+private int jjMoveStringLiteralDfa13_0(long old1, long active1)
+{
+   if (((active1 &= old1)) == 0L)
+      return jjStartNfa_0(11, 0L, old1);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(12, 0L, active1);
+      return 13;
+   }
+   switch(curChar)
+   {
+      case 84:
+      case 116:
+         if ((active1 & 0x2L) != 0L)
+            return jjStartNfaWithStates_0(13, 65, 525);
+         break;
+      default :
+         break;
+   }
+   return jjStartNfa_0(12, 0L, active1);
+}
+private int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+   jjmatchedKind = kind;
+   jjmatchedPos = pos;
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) { return pos + 1; }
+   return jjMoveNfa_0(state, pos + 1);
+}
+static final long[] jjbitVec0 = {
+   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+private int jjMoveNfa_0(int startState, int curPos)
+{
+   int startsAt = 0;
+   jjnewStateCnt = 522;
+   int i = 1;
+   jjstateSet[0] = startState;
+   int kind = 0x7fffffff;
+   for (;;)
+   {
+      if (++jjround == 0x7fffffff)
+         ReInitRounds();
+      if (curChar < 64)
+      {
+         long l = 1L << curChar;
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 524:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(256, 265);
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(248, 255);
+                  break;
+               case 162:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 108;
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 213;
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 201;
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 185;
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 174;
+                  break;
+               case 29:
+                  if ((0x3ff200000000000L & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  else if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(236, 237);
+                  else if (curChar == 40)
+                  {
+                     if (kind > 118)
+                        kind = 118;
+                  }
+                  if ((0x3ff200000000000L & l) != 0L)
+                  {
+                     if (kind > 72)
+                        kind = 72;
+                     jjCheckNAddTwoStates(225, 226);
+                  }
+                  break;
+               case 171:
+                  if ((0x3ff200000000000L & l) != 0L)
+                  {
+                     if (kind > 103)
+                        kind = 103;
+                     jjCheckNAddTwoStates(109, 110);
+                  }
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 170;
+                  break;
+               case 523:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(4, 8);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(327, 330);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(324, 326);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(322, 323);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(319, 321);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(314, 318);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(310, 313);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(306, 309);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(303, 305);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(299, 302);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(295, 298);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(292, 294);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(289, 291);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(286, 288);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(283, 285);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(280, 282);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(277, 279);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(274, 276);
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(272, 273);
+                  if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 73)
+                        kind = 73;
+                     jjCheckNAdd(271);
+                  }
+                  break;
+               case 525:
+               case 109:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 216:
+                  if (curChar == 42)
+                     jjstateSet[jjnewStateCnt++] = 221;
+                  else if (curChar == 47)
+                  {
+                     if (kind > 2)
+                        kind = 2;
+                     jjCheckNAddStates(9, 11);
+                  }
+                  break;
+               case 173:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 24:
+                  if ((0x3ff000000000000L & l) != 0L)
+                  {
+                     if (kind > 73)
+                        kind = 73;
+                     jjCheckNAddStates(12, 93);
+                  }
+                  else if ((0x100003600L & l) != 0L)
+                  {
+                     if (kind > 1)
+                        kind = 1;
+                     jjCheckNAdd(0);
+                  }
+                  else if (curChar == 46)
+                     jjCheckNAddStates(94, 113);
+                  else if (curChar == 45)
+                     jjAddStates(114, 115);
+                  else if (curChar == 33)
+                     jjCheckNAddStates(116, 119);
+                  else if (curChar == 47)
+                     jjAddStates(120, 121);
+                  else if (curChar == 35)
+                     jjCheckNAddTwoStates(96, 97);
+                  else if (curChar == 36)
+                     jjCheckNAddStates(122, 125);
+                  else if (curChar == 39)
+                     jjCheckNAddStates(126, 129);
+                  else if (curChar == 34)
+                     jjCheckNAddStates(130, 133);
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 38;
+                  else if (curChar == 35)
+                     jjstateSet[jjnewStateCnt++] = 1;
+                  break;
+               case 172:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 170:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 75:
+                  if (curChar == 45)
+                     jjCheckNAdd(76);
+                  break;
+               case 522:
+                  if ((0x3ff200000000000L & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  else if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(236, 237);
+                  else if (curChar == 40)
+                  {
+                     if (kind > 118)
+                        kind = 118;
+                  }
+                  if ((0x3ff200000000000L & l) != 0L)
+                  {
+                     if (kind > 72)
+                        kind = 72;
+                     jjCheckNAddTwoStates(225, 226);
+                  }
+                  break;
+               case 0:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 1)
+                     kind = 1;
+                  jjCheckNAdd(0);
+                  break;
+               case 2:
+                  if (curChar == 36)
+                     jjCheckNAddStates(134, 137);
+                  break;
+               case 3:
+                  if (curChar == 45)
+                     jjCheckNAdd(4);
+                  break;
+               case 5:
+                  if ((0x3ff200000000000L & l) != 0L)
+                     jjCheckNAddStates(138, 140);
+                  break;
+               case 8:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(138, 140);
+                  break;
+               case 9:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(141, 145);
+                  break;
+               case 10:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(138, 140);
+                  break;
+               case 11:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(146, 153);
+                  break;
+               case 12:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(154, 157);
+                  break;
+               case 13:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(158, 162);
+                  break;
+               case 14:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(163, 168);
+                  break;
+               case 15:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(169, 175);
+                  break;
+               case 18:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(176, 180);
+                  break;
+               case 19:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(181, 188);
+                  break;
+               case 20:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(189, 192);
+                  break;
+               case 21:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(193, 197);
+                  break;
+               case 22:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(198, 203);
+                  break;
+               case 23:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(204, 210);
+                  break;
+               case 36:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 35;
+                  break;
+               case 39:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 38;
+                  break;
+               case 40:
+                  if (curChar == 34)
+                     jjCheckNAddStates(130, 133);
+                  break;
+               case 41:
+                  if ((0xfffffffb00000200L & l) != 0L)
+                     jjCheckNAddStates(130, 133);
+                  break;
+               case 42:
+                  if (curChar == 34 && kind > 71)
+                     kind = 71;
+                  break;
+               case 44:
+                  if (curChar == 12)
+                     jjCheckNAddStates(130, 133);
+                  break;
+               case 46:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(130, 133);
+                  break;
+               case 47:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(211, 216);
+                  break;
+               case 48:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(130, 133);
+                  break;
+               case 49:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(217, 225);
+                  break;
+               case 50:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(226, 230);
+                  break;
+               case 51:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(231, 236);
+                  break;
+               case 52:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(237, 243);
+                  break;
+               case 53:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(244, 251);
+                  break;
+               case 54:
+                  if (curChar == 13)
+                     jjCheckNAddStates(130, 133);
+                  break;
+               case 55:
+                  if (curChar == 10)
+                     jjCheckNAddStates(130, 133);
+                  break;
+               case 56:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 55;
+                  break;
+               case 57:
+                  if (curChar == 39)
+                     jjCheckNAddStates(126, 129);
+                  break;
+               case 58:
+                  if ((0xffffff7f00000200L & l) != 0L)
+                     jjCheckNAddStates(126, 129);
+                  break;
+               case 59:
+                  if (curChar == 39 && kind > 71)
+                     kind = 71;
+                  break;
+               case 61:
+                  if (curChar == 12)
+                     jjCheckNAddStates(126, 129);
+                  break;
+               case 63:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(126, 129);
+                  break;
+               case 64:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(252, 257);
+                  break;
+               case 65:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(126, 129);
+                  break;
+               case 66:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(258, 266);
+                  break;
+               case 67:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(267, 271);
+                  break;
+               case 68:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(272, 277);
+                  break;
+               case 69:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(278, 284);
+                  break;
+               case 70:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(285, 292);
+                  break;
+               case 71:
+                  if (curChar == 13)
+                     jjCheckNAddStates(126, 129);
+                  break;
+               case 72:
+                  if (curChar == 10)
+                     jjCheckNAddStates(126, 129);
+                  break;
+               case 73:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 72;
+                  break;
+               case 74:
+                  if (curChar == 36)
+                     jjCheckNAddStates(122, 125);
+                  break;
+               case 77:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddTwoStates(77, 78);
+                  break;
+               case 79:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddTwoStates(77, 78);
+                  break;
+               case 80:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(293, 296);
+                  break;
+               case 81:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddTwoStates(77, 78);
+                  break;
+               case 82:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(297, 303);
+                  break;
+               case 83:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(304, 306);
+                  break;
+               case 84:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(307, 310);
+                  break;
+               case 85:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(311, 315);
+                  break;
+               case 86:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(316, 321);
+                  break;
+               case 89:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(322, 325);
+                  break;
+               case 90:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(326, 332);
+                  break;
+               case 91:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(333, 335);
+                  break;
+               case 92:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(336, 339);
+                  break;
+               case 93:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(340, 344);
+                  break;
+               case 94:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(345, 350);
+                  break;
+               case 95:
+                  if (curChar == 35)
+                     jjCheckNAddTwoStates(96, 97);
+                  break;
+               case 96:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddTwoStates(96, 97);
+                  break;
+               case 98:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddTwoStates(96, 97);
+                  break;
+               case 99:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(351, 354);
+                  break;
+               case 100:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddTwoStates(96, 97);
+                  break;
+               case 101:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(355, 361);
+                  break;
+               case 102:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(362, 364);
+                  break;
+               case 103:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(365, 368);
+                  break;
+               case 104:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(369, 373);
+                  break;
+               case 105:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(374, 379);
+                  break;
+               case 107:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 108;
+                  break;
+               case 111:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 112:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(380, 383);
+                  break;
+               case 113:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 114:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(384, 390);
+                  break;
+               case 115:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(391, 393);
+                  break;
+               case 116:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(394, 397);
+                  break;
+               case 117:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(398, 402);
+                  break;
+               case 118:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(403, 408);
+                  break;
+               case 121:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(409, 412);
+                  break;
+               case 122:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(413, 419);
+                  break;
+               case 123:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(420, 422);
+                  break;
+               case 124:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(423, 426);
+                  break;
+               case 125:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(427, 431);
+                  break;
+               case 126:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(432, 437);
+                  break;
+               case 128:
+                  if ((0x100003600L & l) != 0L)
+                     jjAddStates(438, 439);
+                  break;
+               case 129:
+                  if (curChar == 40 && kind > 115)
+                     kind = 115;
+                  break;
+               case 136:
+                  if ((0x100003600L & l) != 0L)
+                     jjAddStates(440, 441);
+                  break;
+               case 137:
+                  if (curChar == 40 && kind > 116)
+                     kind = 116;
+                  break;
+               case 144:
+                  if ((0x100003600L & l) != 0L)
+                     jjAddStates(442, 443);
+                  break;
+               case 145:
+                  if (curChar == 40 && kind > 117)
+                     kind = 117;
+                  break;
+               case 175:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 174;
+                  break;
+               case 184:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 183;
+                  break;
+               case 186:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 185;
+                  break;
+               case 195:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 194;
+                  break;
+               case 202:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 201;
+                  break;
+               case 211:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 210;
+                  break;
+               case 214:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 213;
+                  break;
+               case 215:
+                  if (curChar == 47)
+                     jjAddStates(120, 121);
+                  break;
+               case 217:
+                  if ((0xffffffffffffdbffL & l) == 0L)
+                     break;
+                  if (kind > 2)
+                     kind = 2;
+                  jjCheckNAddStates(9, 11);
+                  break;
+               case 218:
+                  if ((0x2400L & l) != 0L && kind > 2)
+                     kind = 2;
+                  break;
+               case 219:
+                  if (curChar == 10 && kind > 2)
+                     kind = 2;
+                  break;
+               case 220:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 219;
+                  break;
+               case 221:
+                  if (curChar == 42)
+                     jjstateSet[jjnewStateCnt++] = 222;
+                  break;
+               case 222:
+                  if ((0xffff7fffffffffffL & l) != 0L && kind > 3)
+                     kind = 3;
+                  break;
+               case 223:
+                  if (curChar == 42)
+                     jjstateSet[jjnewStateCnt++] = 221;
+                  break;
+               case 225:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddTwoStates(225, 226);
+                  break;
+               case 227:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddTwoStates(225, 226);
+                  break;
+               case 228:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(444, 447);
+                  break;
+               case 229:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddTwoStates(225, 226);
+                  break;
+               case 230:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(448, 454);
+                  break;
+               case 231:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(455, 457);
+                  break;
+               case 232:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(458, 461);
+                  break;
+               case 233:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(462, 466);
+                  break;
+               case 234:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(467, 472);
+                  break;
+               case 235:
+                  if ((0x3ff200000000000L & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  break;
+               case 236:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(236, 237);
+                  break;
+               case 237:
+                  if (curChar == 40 && kind > 118)
+                     kind = 118;
+                  break;
+               case 239:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  break;
+               case 240:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(473, 477);
+                  break;
+               case 241:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  break;
+               case 242:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(478, 485);
+                  break;
+               case 243:
+               case 457:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(486, 489);
+                  break;
+               case 244:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(490, 494);
+                  break;
+               case 245:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(495, 500);
+                  break;
+               case 246:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(501, 507);
+                  break;
+               case 247:
+                  if (curChar == 33)
+                     jjCheckNAddStates(116, 119);
+                  break;
+               case 248:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(248, 255);
+                  break;
+               case 256:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(256, 265);
+                  break;
+               case 266:
+                  if (curChar == 45)
+                     jjAddStates(114, 115);
+                  break;
+               case 270:
+                  if (curChar == 46)
+                     jjCheckNAddStates(94, 113);
+                  break;
+               case 271:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 73)
+                     kind = 73;
+                  jjCheckNAdd(271);
+                  break;
+               case 272:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(272, 273);
+                  break;
+               case 273:
+                  if (curChar == 37 && kind > 77)
+                     kind = 77;
+                  break;
+               case 274:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(274, 276);
+                  break;
+               case 277:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(277, 279);
+                  break;
+               case 280:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(280, 282);
+                  break;
+               case 283:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(283, 285);
+                  break;
+               case 286:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(286, 288);
+                  break;
+               case 289:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(289, 291);
+                  break;
+               case 292:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(292, 294);
+                  break;
+               case 295:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(295, 298);
+                  break;
+               case 299:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(299, 302);
+                  break;
+               case 303:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(303, 305);
+                  break;
+               case 306:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(306, 309);
+                  break;
+               case 310:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(310, 313);
+                  break;
+               case 314:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(314, 318);
+                  break;
+               case 319:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(319, 321);
+                  break;
+               case 322:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(322, 323);
+                  break;
+               case 324:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(324, 326);
+                  break;
+               case 327:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(327, 330);
+                  break;
+               case 331:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(4, 8);
+                  break;
+               case 332:
+                  if (curChar == 45)
+                     jjCheckNAdd(333);
+                  break;
+               case 334:
+                  if ((0x3ff200000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddTwoStates(334, 335);
+                  break;
+               case 336:
+                  if ((0xffffffff00000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddTwoStates(334, 335);
+                  break;
+               case 337:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(508, 511);
+                  break;
+               case 338:
+                  if ((0x100003600L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddTwoStates(334, 335);
+                  break;
+               case 339:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(512, 518);
+                  break;
+               case 340:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(519, 521);
+                  break;
+               case 341:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(522, 525);
+                  break;
+               case 342:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(526, 530);
+                  break;
+               case 343:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(531, 536);
+                  break;
+               case 346:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(537, 540);
+                  break;
+               case 347:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(541, 547);
+                  break;
+               case 348:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(548, 550);
+                  break;
+               case 349:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(551, 554);
+                  break;
+               case 350:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(555, 559);
+                  break;
+               case 351:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(560, 565);
+                  break;
+               case 353:
+                  if (curChar == 40)
+                     jjCheckNAddStates(566, 571);
+                  break;
+               case 354:
+                  if ((0xfffffc7a00000000L & l) != 0L)
+                     jjCheckNAddStates(572, 575);
+                  break;
+               case 355:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddTwoStates(355, 356);
+                  break;
+               case 356:
+                  if (curChar == 41 && kind > 75)
+                     kind = 75;
+                  break;
+               case 358:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(572, 575);
+                  break;
+               case 359:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(576, 580);
+                  break;
+               case 360:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(572, 575);
+                  break;
+               case 361:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(581, 588);
+                  break;
+               case 362:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(589, 592);
+                  break;
+               case 363:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(593, 597);
+                  break;
+               case 364:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(598, 603);
+                  break;
+               case 365:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(604, 610);
+                  break;
+               case 366:
+                  if (curChar == 39)
+                     jjCheckNAddStates(611, 614);
+                  break;
+               case 367:
+                  if ((0xffffff7f00000200L & l) != 0L)
+                     jjCheckNAddStates(611, 614);
+                  break;
+               case 368:
+                  if (curChar == 39)
+                     jjCheckNAddTwoStates(355, 356);
+                  break;
+               case 370:
+                  if (curChar == 12)
+                     jjCheckNAddStates(611, 614);
+                  break;
+               case 372:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(611, 614);
+                  break;
+               case 373:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(615, 620);
+                  break;
+               case 374:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(611, 614);
+                  break;
+               case 375:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(621, 629);
+                  break;
+               case 376:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(630, 634);
+                  break;
+               case 377:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(635, 640);
+                  break;
+               case 378:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(641, 647);
+                  break;
+               case 379:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(648, 655);
+                  break;
+               case 380:
+                  if (curChar == 13)
+                     jjCheckNAddStates(611, 614);
+                  break;
+               case 381:
+                  if (curChar == 10)
+                     jjCheckNAddStates(611, 614);
+                  break;
+               case 382:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 381;
+                  break;
+               case 383:
+                  if (curChar == 34)
+                     jjCheckNAddStates(656, 659);
+                  break;
+               case 384:
+                  if ((0xfffffffb00000200L & l) != 0L)
+                     jjCheckNAddStates(656, 659);
+                  break;
+               case 385:
+                  if (curChar == 34)
+                     jjCheckNAddTwoStates(355, 356);
+                  break;
+               case 387:
+                  if (curChar == 12)
+                     jjCheckNAddStates(656, 659);
+                  break;
+               case 389:
+                  if ((0xffffffff00000000L & l) != 0L)
+                     jjCheckNAddStates(656, 659);
+                  break;
+               case 390:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(660, 665);
+                  break;
+               case 391:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(656, 659);
+                  break;
+               case 392:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(666, 674);
+                  break;
+               case 393:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(675, 679);
+                  break;
+               case 394:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(680, 685);
+                  break;
+               case 395:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(686, 692);
+                  break;
+               case 396:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(693, 700);
+                  break;
+               case 397:
+                  if (curChar == 13)
+                     jjCheckNAddStates(656, 659);
+                  break;
+               case 398:
+                  if (curChar == 10)
+                     jjCheckNAddStates(656, 659);
+                  break;
+               case 399:
+                  if (curChar == 13)
+                     jjstateSet[jjnewStateCnt++] = 398;
+                  break;
+               case 400:
+                  if ((0x100003600L & l) != 0L)
+                     jjCheckNAddStates(701, 707);
+                  break;
+               case 403:
+                  if (curChar == 43)
+                     jjAddStates(708, 709);
+                  break;
+               case 404:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 405;
+                  break;
+               case 405:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddStates(710, 713);
+                  break;
+               case 406:
+                  if (curChar == 63 && kind > 114)
+                     kind = 114;
+                  break;
+               case 407:
+               case 422:
+               case 426:
+               case 429:
+               case 432:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAdd(406);
+                  break;
+               case 408:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddTwoStates(406, 407);
+                  break;
+               case 409:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddStates(714, 716);
+                  break;
+               case 410:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjAddStates(717, 722);
+                  break;
+               case 411:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 412;
+                  break;
+               case 412:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 413;
+                  break;
+               case 413:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAdd(414);
+                  break;
+               case 414:
+                  if ((0x3ff000000000000L & l) != 0L && kind > 114)
+                     kind = 114;
+                  break;
+               case 415:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 416;
+                  break;
+               case 416:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 417;
+                  break;
+               case 417:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 418;
+                  break;
+               case 418:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAdd(406);
+                  break;
+               case 419:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 420;
+                  break;
+               case 420:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 421;
+                  break;
+               case 421:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 422;
+                  break;
+               case 423:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 424;
+                  break;
+               case 424:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 425;
+                  break;
+               case 425:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddTwoStates(406, 426);
+                  break;
+               case 427:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 428;
+                  break;
+               case 428:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddStates(723, 725);
+                  break;
+               case 430:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddTwoStates(406, 429);
+                  break;
+               case 431:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddStates(726, 729);
+                  break;
+               case 433:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddTwoStates(406, 432);
+                  break;
+               case 434:
+                  if (curChar != 63)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddStates(730, 732);
+                  break;
+               case 435:
+                  if (curChar == 43)
+                     jjstateSet[jjnewStateCnt++] = 436;
+                  break;
+               case 436:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(437, 443);
+                  break;
+               case 437:
+                  if (curChar == 45)
+                     jjstateSet[jjnewStateCnt++] = 438;
+                  break;
+               case 438:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 439;
+                  break;
+               case 439:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddStates(733, 736);
+                  break;
+               case 440:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAdd(414);
+                  break;
+               case 441:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddTwoStates(414, 440);
+                  break;
+               case 442:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddStates(737, 739);
+                  break;
+               case 443:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(740, 744);
+                  break;
+               case 444:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAdd(437);
+                  break;
+               case 445:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(444, 437);
+                  break;
+               case 446:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(745, 747);
+                  break;
+               case 447:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(748, 751);
+                  break;
+               case 449:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(752, 755);
+                  break;
+               case 450:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(756, 762);
+                  break;
+               case 451:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(763, 765);
+                  break;
+               case 452:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(766, 769);
+                  break;
+               case 453:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(770, 774);
+                  break;
+               case 454:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(775, 780);
+                  break;
+               case 455:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(781, 785);
+                  break;
+               case 456:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(786, 793);
+                  break;
+               case 458:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(794, 798);
+                  break;
+               case 459:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(799, 804);
+                  break;
+               case 460:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(805, 811);
+                  break;
+               case 461:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 73)
+                     kind = 73;
+                  jjCheckNAddStates(12, 93);
+                  break;
+               case 462:
+                  if ((0x3ff000000000000L & l) == 0L)
+                     break;
+                  if (kind > 73)
+                     kind = 73;
+                  jjCheckNAdd(462);
+                  break;
+               case 463:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(463, 464);
+                  break;
+               case 464:
+                  if (curChar == 46)
+                     jjCheckNAdd(271);
+                  break;
+               case 465:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(465, 273);
+                  break;
+               case 466:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(466, 467);
+                  break;
+               case 467:
+                  if (curChar == 46)
+                     jjCheckNAdd(272);
+                  break;
+               case 468:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(468, 276);
+                  break;
+               case 469:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(469, 470);
+                  break;
+               case 470:
+                  if (curChar == 46)
+                     jjCheckNAdd(274);
+                  break;
+               case 471:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(471, 279);
+                  break;
+               case 472:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(472, 473);
+                  break;
+               case 473:
+                  if (curChar == 46)
+                     jjCheckNAdd(277);
+                  break;
+               case 474:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(474, 282);
+                  break;
+               case 475:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(475, 476);
+                  break;
+               case 476:
+                  if (curChar == 46)
+                     jjCheckNAdd(280);
+                  break;
+               case 477:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(477, 285);
+                  break;
+               case 478:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(478, 479);
+                  break;
+               case 479:
+                  if (curChar == 46)
+                     jjCheckNAdd(283);
+                  break;
+               case 480:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(480, 288);
+                  break;
+               case 481:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(481, 482);
+                  break;
+               case 482:
+                  if (curChar == 46)
+                     jjCheckNAdd(286);
+                  break;
+               case 483:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(483, 291);
+                  break;
+               case 484:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(484, 485);
+                  break;
+               case 485:
+                  if (curChar == 46)
+                     jjCheckNAdd(289);
+                  break;
+               case 486:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(486, 294);
+                  break;
+               case 487:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(487, 488);
+                  break;
+               case 488:
+                  if (curChar == 46)
+                     jjCheckNAdd(292);
+                  break;
+               case 489:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(489, 298);
+                  break;
+               case 490:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(490, 491);
+                  break;
+               case 491:
+                  if (curChar == 46)
+                     jjCheckNAdd(295);
+                  break;
+               case 492:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(492, 302);
+                  break;
+               case 493:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(493, 494);
+                  break;
+               case 494:
+                  if (curChar == 46)
+                     jjCheckNAdd(299);
+                  break;
+               case 495:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(495, 305);
+                  break;
+               case 496:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(496, 497);
+                  break;
+               case 497:
+                  if (curChar == 46)
+                     jjCheckNAdd(303);
+                  break;
+               case 498:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(498, 309);
+                  break;
+               case 499:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(499, 500);
+                  break;
+               case 500:
+                  if (curChar == 46)
+                     jjCheckNAdd(306);
+                  break;
+               case 501:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(501, 313);
+                  break;
+               case 502:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(502, 503);
+                  break;
+               case 503:
+                  if (curChar == 46)
+                     jjCheckNAdd(310);
+                  break;
+               case 504:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(504, 318);
+                  break;
+               case 505:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(505, 506);
+                  break;
+               case 506:
+                  if (curChar == 46)
+                     jjCheckNAdd(314);
+                  break;
+               case 507:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(507, 321);
+                  break;
+               case 508:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(508, 509);
+                  break;
+               case 509:
+                  if (curChar == 46)
+                     jjCheckNAdd(319);
+                  break;
+               case 510:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(510, 323);
+                  break;
+               case 511:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(511, 512);
+                  break;
+               case 512:
+                  if (curChar == 46)
+                     jjCheckNAdd(322);
+                  break;
+               case 513:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(513, 326);
+                  break;
+               case 514:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(514, 515);
+                  break;
+               case 515:
+                  if (curChar == 46)
+                     jjCheckNAdd(324);
+                  break;
+               case 516:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(516, 330);
+                  break;
+               case 517:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(517, 518);
+                  break;
+               case 518:
+                  if (curChar == 46)
+                     jjCheckNAdd(327);
+                  break;
+               case 519:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddStates(812, 816);
+                  break;
+               case 520:
+                  if ((0x3ff000000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(520, 521);
+                  break;
+               case 521:
+                  if (curChar == 46)
+                     jjCheckNAdd(331);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else if (curChar < 128)
+      {
+         long l = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 524:
+                  if ((0x20000000200L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 264;
+                  else if ((0x1000000010L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 254;
+                  break;
+               case 162:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 103)
+                        kind = 103;
+                     jjCheckNAddTwoStates(109, 110);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(111, 121);
+                  if ((0x80000000800L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 161;
+                  break;
+               case 29:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(227, 228);
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 72)
+                        kind = 72;
+                     jjCheckNAddTwoStates(225, 226);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(239, 240);
+                  if ((0x20000000200L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 28;
+                  break;
+               case 171:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 103)
+                        kind = 103;
+                     jjCheckNAddTwoStates(109, 110);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(111, 112);
+                  break;
+               case 525:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 103)
+                        kind = 103;
+                     jjCheckNAddTwoStates(109, 110);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(111, 112);
+                  break;
+               case 38:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 72)
+                        kind = 72;
+                     jjCheckNAddTwoStates(225, 226);
+                  }
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 37;
+                  break;
+               case 173:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 103)
+                        kind = 103;
+                     jjCheckNAddTwoStates(109, 110);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(111, 112);
+                  if ((0x8000000080000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 211;
+                  else if ((0x800000008000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 172;
+                  break;
+               case 24:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 72)
+                        kind = 72;
+                     jjCheckNAddStates(817, 822);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddStates(823, 826);
+                  else if (curChar == 64)
+                     jjAddStates(827, 831);
+                  if ((0x20000000200000L & l) != 0L)
+                     jjAddStates(832, 834);
+                  else if ((0x800000008L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 151;
+                  else if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 141;
+                  else if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 133;
+                  else if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 29;
+                  else if (curChar == 64)
+                     jjAddStates(835, 838);
+                  break;
+               case 172:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 103)
+                        kind = 103;
+                     jjCheckNAddTwoStates(109, 110);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(111, 112);
+                  if ((0x400000004000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 171;
+                  break;
+               case 170:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 103)
+                        kind = 103;
+                     jjCheckNAddTwoStates(109, 110);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(111, 112);
+                  if ((0x80000000800L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 169;
+                  break;
+               case 174:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 103)
+                        kind = 103;
+                     jjCheckNAddTwoStates(109, 110);
+                  }
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 212;
+                  else if ((0x80000000800000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 200;
+                  else if ((0x800000008000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 184;
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 173;
+                  break;
+               case 75:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 76)
+                        kind = 76;
+                     jjCheckNAddTwoStates(77, 78);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(79, 89);
+                  break;
+               case 522:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(227, 228);
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                  {
+                     if (kind > 72)
+                        kind = 72;
+                     jjCheckNAddTwoStates(225, 226);
+                  }
+                  else if (curChar == 92)
+                     jjCheckNAddTwoStates(239, 240);
+                  break;
+               case 1:
+                  if (curChar == 123)
+                     jjstateSet[jjnewStateCnt++] = 2;
+                  break;
+               case 4:
+               case 5:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                     jjCheckNAddStates(138, 140);
+                  break;
+               case 6:
+                  if (curChar == 125 && kind > 39)
+                     kind = 39;
+                  break;
+               case 7:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(8, 9);
+                  break;
+               case 8:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(138, 140);
+                  break;
+               case 9:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(141, 145);
+                  break;
+               case 11:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(146, 153);
+                  break;
+               case 12:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(154, 157);
+                  break;
+               case 13:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(158, 162);
+                  break;
+               case 14:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(163, 168);
+                  break;
+               case 15:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(169, 175);
+                  break;
+               case 17:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(8, 18);
+                  break;
+               case 18:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(176, 180);
+                  break;
+               case 19:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(181, 188);
+                  break;
+               case 20:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(189, 192);
+                  break;
+               case 21:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(193, 197);
+                  break;
+               case 22:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(198, 203);
+                  break;
+               case 23:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(204, 210);
+                  break;
+               case 25:
+                  if ((0x4000000040000L & l) != 0L && kind > 68)
+                     kind = 68;
+                  break;
+               case 26:
+               case 31:
+                  if ((0x2000000020L & l) != 0L)
+                     jjCheckNAdd(25);
+                  break;
+               case 27:
+                  if ((0x10000000100000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 26;
+                  break;
+               case 28:
+                  if ((0x100000001000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 27;
+                  break;
+               case 30:
+                  if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 29;
+                  break;
+               case 32:
+                  if ((0x10000000100000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 31;
+                  break;
+               case 33:
+                  if ((0x100000001000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 32;
+                  break;
+               case 34:
+                  if ((0x20000000200L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 33;
+                  break;
+               case 35:
+                  if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 34;
+                  break;
+               case 37:
+                  if ((0x8000000080000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 36;
+                  break;
+               case 41:
+               case 46:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(130, 133);
+                  break;
+               case 43:
+                  if (curChar == 92)
+                     jjAddStates(839, 842);
+                  break;
+               case 45:
+                  if (curChar == 92)
+                     jjAddStates(843, 844);
+                  break;
+               case 47:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(211, 216);
+                  break;
+               case 49:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(217, 225);
+                  break;
+               case 50:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(226, 230);
+                  break;
+               case 51:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(231, 236);
+                  break;
+               case 52:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(237, 243);
+                  break;
+               case 53:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(244, 251);
+                  break;
+               case 58:
+               case 63:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(126, 129);
+                  break;
+               case 60:
+                  if (curChar == 92)
+                     jjAddStates(845, 848);
+                  break;
+               case 62:
+                  if (curChar == 92)
+                     jjAddStates(849, 850);
+                  break;
+               case 64:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(252, 257);
+                  break;
+               case 66:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(258, 266);
+                  break;
+               case 67:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(267, 271);
+                  break;
+               case 68:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(272, 277);
+                  break;
+               case 69:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(278, 284);
+                  break;
+               case 70:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(285, 292);
+                  break;
+               case 76:
+               case 77:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddTwoStates(77, 78);
+                  break;
+               case 78:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(79, 80);
+                  break;
+               case 79:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddTwoStates(77, 78);
+                  break;
+               case 80:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(293, 296);
+                  break;
+               case 82:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(297, 303);
+                  break;
+               case 83:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(304, 306);
+                  break;
+               case 84:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(307, 310);
+                  break;
+               case 85:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(311, 315);
+                  break;
+               case 86:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(316, 321);
+                  break;
+               case 88:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(79, 89);
+                  break;
+               case 89:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(322, 325);
+                  break;
+               case 90:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(326, 332);
+                  break;
+               case 91:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(333, 335);
+                  break;
+               case 92:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(336, 339);
+                  break;
+               case 93:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(340, 344);
+                  break;
+               case 94:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddStates(345, 350);
+                  break;
+               case 96:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddTwoStates(96, 97);
+                  break;
+               case 97:
+                  if (curChar == 92)
+                     jjAddStates(851, 852);
+                  break;
+               case 98:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddTwoStates(96, 97);
+                  break;
+               case 99:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(351, 354);
+                  break;
+               case 101:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(355, 361);
+                  break;
+               case 102:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(362, 364);
+                  break;
+               case 103:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(365, 368);
+                  break;
+               case 104:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(369, 373);
+                  break;
+               case 105:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddStates(374, 379);
+                  break;
+               case 106:
+                  if (curChar == 64)
+                     jjAddStates(835, 838);
+                  break;
+               case 108:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 109:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 110:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(111, 112);
+                  break;
+               case 111:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 112:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(380, 383);
+                  break;
+               case 114:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(384, 390);
+                  break;
+               case 115:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(391, 393);
+                  break;
+               case 116:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(394, 397);
+                  break;
+               case 117:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(398, 402);
+                  break;
+               case 118:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(403, 408);
+                  break;
+               case 120:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(111, 121);
+                  break;
+               case 121:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(409, 412);
+                  break;
+               case 122:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(413, 419);
+                  break;
+               case 123:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(420, 422);
+                  break;
+               case 124:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(423, 426);
+                  break;
+               case 125:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(427, 431);
+                  break;
+               case 126:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddStates(432, 437);
+                  break;
+               case 127:
+                  if ((0x2000000020L & l) != 0L)
+                     jjAddStates(438, 439);
+                  break;
+               case 130:
+                  if ((0x40000000400000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 127;
+                  break;
+               case 131:
+                  if ((0x800000008000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 130;
+                  break;
+               case 132:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 131;
+                  break;
+               case 133:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 132;
+                  break;
+               case 134:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 133;
+                  break;
+               case 135:
+                  if ((0x1000000010L & l) != 0L)
+                     jjAddStates(440, 441);
+                  break;
+               case 138:
+                  if ((0x400000004000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 135;
+                  break;
+               case 139:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 138;
+                  break;
+               case 140:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 139;
+                  break;
+               case 141:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 140;
+                  break;
+               case 142:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 141;
+                  break;
+               case 143:
+                  if ((0x8000000080000L & l) != 0L)
+                     jjAddStates(442, 443);
+                  break;
+               case 146:
+                  if ((0x400000004000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 143;
+                  break;
+               case 147:
+                  if ((0x20000000200L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 146;
+                  break;
+               case 148:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 147;
+                  break;
+               case 149:
+                  if ((0x10000000100000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 148;
+                  break;
+               case 150:
+                  if ((0x400000004000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 149;
+                  break;
+               case 151:
+                  if ((0x800000008000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 150;
+                  break;
+               case 152:
+                  if ((0x800000008L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 151;
+                  break;
+               case 153:
+                  if (curChar == 64)
+                     jjAddStates(827, 831);
+                  break;
+               case 154:
+                  if ((0x8000000080000L & l) != 0L && kind > 102)
+                     kind = 102;
+                  break;
+               case 155:
+               case 163:
+               case 176:
+               case 187:
+               case 203:
+                  if ((0x2000000020L & l) != 0L)
+                     jjCheckNAdd(154);
+                  break;
+               case 156:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 155;
+                  break;
+               case 157:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 156;
+                  break;
+               case 158:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 157;
+                  break;
+               case 159:
+                  if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 158;
+                  break;
+               case 160:
+                  if ((0x200000002000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 159;
+                  break;
+               case 161:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 160;
+                  break;
+               case 164:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 163;
+                  break;
+               case 165:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 164;
+                  break;
+               case 166:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 165;
+                  break;
+               case 167:
+                  if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 166;
+                  break;
+               case 168:
+                  if ((0x200000002000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 167;
+                  break;
+               case 169:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 168;
+                  break;
+               case 177:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 176;
+                  break;
+               case 178:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 177;
+                  break;
+               case 179:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 178;
+                  break;
+               case 180:
+                  if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 179;
+                  break;
+               case 181:
+                  if ((0x200000002000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 180;
+                  break;
+               case 182:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 181;
+                  break;
+               case 183:
+                  if ((0x80000000800L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 182;
+                  break;
+               case 185:
+                  if ((0x800000008000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 184;
+                  break;
+               case 188:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 187;
+                  break;
+               case 189:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 188;
+                  break;
+               case 190:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 189;
+                  break;
+               case 191:
+                  if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 190;
+                  break;
+               case 192:
+                  if ((0x200000002000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 191;
+                  break;
+               case 193:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 192;
+                  break;
+               case 194:
+                  if ((0x80000000800L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 193;
+                  break;
+               case 196:
+                  if ((0x10000000100000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 195;
+                  break;
+               case 197:
+                  if ((0x20000000200L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 196;
+                  break;
+               case 198:
+                  if ((0x80000000800L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 197;
+                  break;
+               case 199:
+                  if ((0x400000004L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 198;
+                  break;
+               case 200:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 199;
+                  break;
+               case 201:
+                  if ((0x80000000800000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 200;
+                  break;
+               case 204:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 203;
+                  break;
+               case 205:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 204;
+                  break;
+               case 206:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 205;
+                  break;
+               case 207:
+                  if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 206;
+                  break;
+               case 208:
+                  if ((0x200000002000000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 207;
+                  break;
+               case 209:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 208;
+                  break;
+               case 210:
+                  if ((0x80000000800L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 209;
+                  break;
+               case 212:
+                  if ((0x8000000080000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 211;
+                  break;
+               case 213:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 212;
+                  break;
+               case 217:
+                  if (kind > 2)
+                     kind = 2;
+                  jjAddStates(9, 11);
+                  break;
+               case 222:
+                  if (kind > 3)
+                     kind = 3;
+                  break;
+               case 225:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddTwoStates(225, 226);
+                  break;
+               case 226:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(227, 228);
+                  break;
+               case 227:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddTwoStates(225, 226);
+                  break;
+               case 228:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(444, 447);
+                  break;
+               case 230:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(448, 454);
+                  break;
+               case 231:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(455, 457);
+                  break;
+               case 232:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(458, 461);
+                  break;
+               case 233:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(462, 466);
+                  break;
+               case 234:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(467, 472);
+                  break;
+               case 235:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  break;
+               case 238:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(239, 240);
+                  break;
+               case 239:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  break;
+               case 240:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(473, 477);
+                  break;
+               case 242:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(478, 485);
+                  break;
+               case 243:
+               case 457:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(486, 489);
+                  break;
+               case 244:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(490, 494);
+                  break;
+               case 245:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(495, 500);
+                  break;
+               case 246:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(501, 507);
+                  break;
+               case 249:
+                  if ((0x10000000100000L & l) != 0L && kind > 70)
+                     kind = 70;
+                  break;
+               case 250:
+                  if ((0x100000001000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 249;
+                  break;
+               case 251:
+                  if ((0x20000000200000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 250;
+                  break;
+               case 252:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 251;
+                  break;
+               case 253:
+                  if ((0x4000000040L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 252;
+                  break;
+               case 254:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 253;
+                  break;
+               case 255:
+                  if ((0x1000000010L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 254;
+                  break;
+               case 257:
+                  if ((0x10000000100000L & l) != 0L && kind > 104)
+                     kind = 104;
+                  break;
+               case 258:
+                  if ((0x400000004000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 257;
+                  break;
+               case 259:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 258;
+                  break;
+               case 260:
+                  if ((0x10000000100000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 259;
+                  break;
+               case 261:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 260;
+                  break;
+               case 262:
+                  if ((0x800000008000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 261;
+                  break;
+               case 263:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 262;
+                  break;
+               case 264:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 263;
+                  break;
+               case 265:
+                  if ((0x20000000200L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 264;
+                  break;
+               case 267:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddTwoStates(225, 226);
+                  break;
+               case 268:
+                  if ((0x7fffffe87fffffeL & l) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  break;
+               case 269:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(817, 822);
+                  break;
+               case 275:
+                  if ((0x10000000100000L & l) != 0L && kind > 78)
+                     kind = 78;
+                  break;
+               case 276:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 275;
+                  break;
+               case 278:
+                  if ((0x200000002000L & l) != 0L && kind > 79)
+                     kind = 79;
+                  break;
+               case 279:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 278;
+                  break;
+               case 281:
+                  if ((0x200000002000L & l) != 0L && kind > 80)
+                     kind = 80;
+                  break;
+               case 282:
+                  if ((0x800000008L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 281;
+                  break;
+               case 284:
+                  if ((0x800000008L & l) != 0L && kind > 81)
+                     kind = 81;
+                  break;
+               case 285:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 284;
+                  break;
+               case 287:
+                  if ((0x400000004000L & l) != 0L && kind > 82)
+                     kind = 82;
+                  break;
+               case 288:
+                  if ((0x20000000200L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 287;
+                  break;
+               case 290:
+                  if ((0x100000001000000L & l) != 0L && kind > 83)
+                     kind = 83;
+                  break;
+               case 291:
+                  if ((0x1000000010000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 290;
+                  break;
+               case 293:
+                  if ((0x200000002000L & l) != 0L && kind > 84)
+                     kind = 84;
+                  break;
+               case 294:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 293;
+                  break;
+               case 296:
+                  if ((0x200000002000L & l) != 0L && kind > 85)
+                     kind = 85;
+                  break;
+               case 297:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 296;
+                  break;
+               case 298:
+                  if ((0x100000001000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 297;
+                  break;
+               case 300:
+                  if ((0x200000002000L & l) != 0L && kind > 86)
+                     kind = 86;
+                  break;
+               case 301:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 300;
+                  break;
+               case 302:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 301;
+                  break;
+               case 304:
+                  if ((0x100000001000000L & l) != 0L && kind > 87)
+                     kind = 87;
+                  break;
+               case 305:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 304;
+                  break;
+               case 307:
+                  if ((0x8000000080L & l) != 0L && kind > 88)
+                     kind = 88;
+                  break;
+               case 308:
+                  if ((0x2000000020L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 307;
+                  break;
+               case 309:
+                  if ((0x1000000010L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 308;
+                  break;
+               case 311:
+                  if ((0x1000000010L & l) != 0L && kind > 89)
+                     kind = 89;
+                  break;
+               case 312:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 311;
+                  break;
+               case 313:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 312;
+                  break;
+               case 315:
+                  if ((0x1000000010L & l) != 0L && kind > 90)
+                     kind = 90;
+                  break;
+               case 316:
+                  if ((0x200000002L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 315;
+                  break;
+               case 317:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 316;
+                  break;
+               case 318:
+                  if ((0x8000000080L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 317;
+                  break;
+               case 320:
+                  if ((0x8000000080000L & l) != 0L && kind > 91)
+                     kind = 91;
+                  break;
+               case 321:
+                  if ((0x200000002000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 320;
+                  break;
+               case 323:
+                  if ((0x8000000080000L & l) != 0L && kind > 92)
+                     kind = 92;
+                  break;
+               case 325:
+                  if ((0x400000004000000L & l) != 0L && kind > 93)
+                     kind = 93;
+                  break;
+               case 326:
+                  if ((0x10000000100L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 325;
+                  break;
+               case 328:
+                  if ((0x400000004000000L & l) != 0L && kind > 94)
+                     kind = 94;
+                  break;
+               case 329:
+                  if ((0x10000000100L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 328;
+                  break;
+               case 330:
+                  if ((0x80000000800L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 329;
+                  break;
+               case 333:
+               case 334:
+                  if ((0x7fffffe87fffffeL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddTwoStates(334, 335);
+                  break;
+               case 335:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(336, 337);
+                  break;
+               case 336:
+                  if ((0x7fffffffffffffffL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddTwoStates(334, 335);
+                  break;
+               case 337:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(508, 511);
+                  break;
+               case 339:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(512, 518);
+                  break;
+               case 340:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(519, 521);
+                  break;
+               case 341:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(522, 525);
+                  break;
+               case 342:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(526, 530);
+                  break;
+               case 343:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(531, 536);
+                  break;
+               case 345:
+                  if (curChar == 92)
+                     jjCheckNAddTwoStates(336, 346);
+                  break;
+               case 346:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(537, 540);
+                  break;
+               case 347:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(541, 547);
+                  break;
+               case 348:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(548, 550);
+                  break;
+               case 349:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(551, 554);
+                  break;
+               case 350:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(555, 559);
+                  break;
+               case 351:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddStates(560, 565);
+                  break;
+               case 352:
+                  if ((0x20000000200000L & l) != 0L)
+                     jjAddStates(832, 834);
+                  break;
+               case 354:
+               case 358:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(572, 575);
+                  break;
+               case 357:
+                  if (curChar == 92)
+                     jjAddStates(853, 854);
+                  break;
+               case 359:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(576, 580);
+                  break;
+               case 361:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(581, 588);
+                  break;
+               case 362:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(589, 592);
+                  break;
+               case 363:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(593, 597);
+                  break;
+               case 364:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(598, 603);
+                  break;
+               case 365:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(604, 610);
+                  break;
+               case 367:
+               case 372:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(611, 614);
+                  break;
+               case 369:
+                  if (curChar == 92)
+                     jjAddStates(855, 858);
+                  break;
+               case 371:
+                  if (curChar == 92)
+                     jjAddStates(859, 860);
+                  break;
+               case 373:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(615, 620);
+                  break;
+               case 375:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(621, 629);
+                  break;
+               case 376:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(630, 634);
+                  break;
+               case 377:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(635, 640);
+                  break;
+               case 378:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(641, 647);
+                  break;
+               case 379:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(648, 655);
+                  break;
+               case 384:
+               case 389:
+                  if ((0x7fffffffffffffffL & l) != 0L)
+                     jjCheckNAddStates(656, 659);
+                  break;
+               case 386:
+                  if (curChar == 92)
+                     jjAddStates(861, 864);
+                  break;
+               case 388:
+                  if (curChar == 92)
+                     jjAddStates(865, 866);
+                  break;
+               case 390:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(660, 665);
+                  break;
+               case 392:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(666, 674);
+                  break;
+               case 393:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(675, 679);
+                  break;
+               case 394:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(680, 685);
+                  break;
+               case 395:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(686, 692);
+                  break;
+               case 396:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(693, 700);
+                  break;
+               case 401:
+                  if ((0x100000001000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 353;
+                  break;
+               case 402:
+                  if ((0x4000000040000L & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 401;
+                  break;
+               case 410:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjAddStates(717, 722);
+                  break;
+               case 411:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 412;
+                  break;
+               case 412:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 413;
+                  break;
+               case 413:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAdd(414);
+                  break;
+               case 414:
+                  if ((0x7e0000007eL & l) != 0L && kind > 114)
+                     kind = 114;
+                  break;
+               case 415:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 416;
+                  break;
+               case 416:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 417;
+                  break;
+               case 417:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 418;
+                  break;
+               case 418:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 406;
+                  break;
+               case 419:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 420;
+                  break;
+               case 420:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 421;
+                  break;
+               case 421:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 422;
+                  break;
+               case 423:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjstateSet[jjnewStateCnt++] = 424;
+                  break;
+               case 424:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 425;
+                  break;
+               case 427:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 428;
+                  break;
+               case 436:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddTwoStates(437, 443);
+                  break;
+               case 438:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjstateSet[jjnewStateCnt++] = 439;
+                  break;
+               case 439:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddStates(733, 736);
+                  break;
+               case 440:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAdd(414);
+                  break;
+               case 441:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddTwoStates(414, 440);
+                  break;
+               case 442:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 114)
+                     kind = 114;
+                  jjCheckNAddStates(737, 739);
+                  break;
+               case 443:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(740, 744);
+                  break;
+               case 444:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAdd(437);
+                  break;
+               case 445:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddTwoStates(444, 437);
+                  break;
+               case 446:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(745, 747);
+                  break;
+               case 447:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(748, 751);
+                  break;
+               case 448:
+                  if (curChar == 92)
+                     jjCheckNAddStates(823, 826);
+                  break;
+               case 449:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(752, 755);
+                  break;
+               case 450:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(756, 762);
+                  break;
+               case 451:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(763, 765);
+                  break;
+               case 452:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(766, 769);
+                  break;
+               case 453:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(770, 774);
+                  break;
+               case 454:
+                  if ((0x7e0000007eL & l) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddStates(775, 780);
+                  break;
+               case 455:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(781, 785);
+                  break;
+               case 456:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(786, 793);
+                  break;
+               case 458:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(794, 798);
+                  break;
+               case 459:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(799, 804);
+                  break;
+               case 460:
+                  if ((0x7e0000007eL & l) != 0L)
+                     jjCheckNAddStates(805, 811);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      else
+      {
+         int i2 = (curChar & 0xff) >> 6;
+         long l2 = 1L << (curChar & 077);
+         do
+         {
+            switch(jjstateSet[--i])
+            {
+               case 162:
+               case 111:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 29:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                  {
+                     if (kind > 72)
+                        kind = 72;
+                     jjCheckNAddTwoStates(225, 226);
+                  }
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  break;
+               case 171:
+               case 109:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 525:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 173:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 24:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 40)
+                     kind = 40;
+                  jjCheckNAddStates(817, 822);
+                  break;
+               case 172:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 170:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 103)
+                     kind = 103;
+                  jjCheckNAddTwoStates(109, 110);
+                  break;
+               case 75:
+               case 77:
+               case 79:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 76)
+                     kind = 76;
+                  jjCheckNAddTwoStates(77, 78);
+                  break;
+               case 522:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                  {
+                     if (kind > 72)
+                        kind = 72;
+                     jjCheckNAddTwoStates(225, 226);
+                  }
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  break;
+               case 5:
+               case 8:
+               case 16:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(138, 140);
+                  break;
+               case 41:
+               case 46:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(130, 133);
+                  break;
+               case 58:
+               case 63:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(126, 129);
+                  break;
+               case 96:
+               case 98:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 96)
+                     kind = 96;
+                  jjCheckNAddTwoStates(96, 97);
+                  break;
+               case 217:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 2)
+                     kind = 2;
+                  jjAddStates(9, 11);
+                  break;
+               case 222:
+                  if ((jjbitVec0[i2] & l2) != 0L && kind > 3)
+                     kind = 3;
+                  break;
+               case 225:
+               case 227:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 72)
+                     kind = 72;
+                  jjCheckNAddTwoStates(225, 226);
+                  break;
+               case 235:
+               case 239:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(0, 3);
+                  break;
+               case 334:
+               case 336:
+               case 344:
+                  if ((jjbitVec0[i2] & l2) == 0L)
+                     break;
+                  if (kind > 95)
+                     kind = 95;
+                  jjCheckNAddTwoStates(334, 335);
+                  break;
+               case 354:
+               case 358:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(572, 575);
+                  break;
+               case 367:
+               case 372:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(611, 614);
+                  break;
+               case 384:
+               case 389:
+                  if ((jjbitVec0[i2] & l2) != 0L)
+                     jjCheckNAddStates(656, 659);
+                  break;
+               default : break;
+            }
+         } while(i != startsAt);
+      }
+      if (kind != 0x7fffffff)
+      {
+         jjmatchedKind = kind;
+         jjmatchedPos = curPos;
+         kind = 0x7fffffff;
+      }
+      ++curPos;
+      if ((i = jjnewStateCnt) == (startsAt = 522 - (jjnewStateCnt = startsAt)))
+         return curPos;
+      try { curChar = input_stream.readChar(); }
+      catch(java.io.IOException e) { return curPos; }
+   }
+}
+private int jjMoveStringLiteralDfa0_2()
+{
+   switch(curChar)
+   {
+      case 42:
+         return jjMoveStringLiteralDfa1_2(0x40L);
+      default :
+         return 1;
+   }
+}
+private int jjMoveStringLiteralDfa1_2(long active0)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 47:
+         if ((active0 & 0x40L) != 0L)
+            return jjStopAtPos(1, 6);
+         break;
+      default :
+         return 2;
+   }
+   return 2;
+}
+private int jjMoveStringLiteralDfa0_1()
+{
+   switch(curChar)
+   {
+      case 42:
+         return jjMoveStringLiteralDfa1_1(0x20L);
+      default :
+         return 1;
+   }
+}
+private int jjMoveStringLiteralDfa1_1(long active0)
+{
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      return 1;
+   }
+   switch(curChar)
+   {
+      case 47:
+         if ((active0 & 0x20L) != 0L)
+            return jjStopAtPos(1, 5);
+         break;
+      default :
+         return 2;
+   }
+   return 2;
+}
+static final int[] jjnextStates = {
+   235, 236, 237, 238, 331, 332, 333, 344, 345, 217, 218, 220, 462, 463, 464, 465, 
+   466, 467, 273, 468, 469, 470, 276, 471, 472, 473, 279, 474, 475, 476, 282, 477, 
+   478, 479, 285, 480, 481, 482, 288, 483, 484, 485, 291, 486, 487, 488, 294, 489, 
+   490, 491, 298, 492, 493, 494, 302, 495, 496, 497, 305, 498, 499, 500, 309, 501, 
+   502, 503, 313, 504, 505, 506, 318, 507, 508, 509, 321, 510, 511, 512, 323, 513, 
+   514, 515, 326, 516, 517, 518, 330, 519, 520, 521, 332, 333, 344, 345, 271, 272, 
+   274, 277, 280, 283, 286, 289, 292, 295, 299, 303, 306, 310, 314, 319, 322, 324, 
+   327, 331, 267, 268, 248, 255, 256, 265, 216, 223, 75, 76, 87, 88, 58, 59, 
+   60, 62, 41, 42, 43, 45, 3, 4, 16, 17, 5, 6, 7, 5, 10, 6, 
+   7, 11, 5, 12, 10, 6, 7, 13, 14, 15, 5, 10, 6, 7, 5, 12, 
+   10, 6, 7, 5, 12, 10, 6, 7, 13, 5, 12, 10, 6, 7, 13, 14, 
+   10, 5, 6, 7, 19, 20, 10, 5, 6, 7, 21, 22, 23, 10, 5, 6, 
+   7, 20, 10, 5, 6, 7, 20, 10, 5, 6, 7, 21, 20, 10, 5, 6, 
+   7, 21, 22, 41, 48, 42, 43, 45, 49, 41, 50, 48, 42, 43, 45, 51, 
+   52, 53, 41, 48, 42, 43, 45, 41, 50, 48, 42, 43, 45, 41, 50, 48, 
+   42, 43, 45, 51, 41, 50, 48, 42, 43, 45, 51, 52, 58, 65, 59, 60, 
+   62, 66, 58, 67, 65, 59, 60, 62, 68, 69, 70, 58, 65, 59, 60, 62, 
+   58, 67, 65, 59, 60, 62, 58, 67, 65, 59, 60, 62, 68, 58, 67, 65, 
+   59, 60, 62, 68, 69, 77, 81, 78, 82, 77, 83, 81, 78, 84, 85, 86, 
+   77, 81, 78, 77, 83, 81, 78, 77, 83, 81, 78, 84, 77, 83, 81, 78, 
+   84, 85, 81, 77, 78, 90, 91, 81, 77, 78, 92, 93, 94, 81, 77, 78, 
+   91, 81, 77, 78, 91, 81, 77, 78, 92, 91, 81, 77, 78, 92, 93, 96, 
+   100, 97, 101, 96, 102, 100, 97, 103, 104, 105, 96, 100, 97, 96, 102, 100, 
+   97, 96, 102, 100, 97, 103, 96, 102, 100, 97, 103, 104, 109, 113, 110, 114, 
+   109, 115, 113, 110, 116, 117, 118, 109, 113, 110, 109, 115, 113, 110, 109, 115, 
+   113, 110, 116, 109, 115, 113, 110, 116, 117, 113, 109, 110, 122, 123, 113, 109, 
+   110, 124, 125, 126, 113, 109, 110, 123, 113, 109, 110, 123, 113, 109, 110, 124, 
+   123, 113, 109, 110, 124, 125, 128, 129, 136, 137, 144, 145, 225, 229, 226, 230, 
+   225, 231, 229, 226, 232, 233, 234, 225, 229, 226, 225, 231, 229, 226, 225, 231, 
+   229, 226, 232, 225, 231, 229, 226, 232, 233, 235, 237, 238, 241, 242, 235, 243, 
+   237, 238, 241, 244, 245, 246, 235, 237, 238, 241, 235, 243, 237, 238, 241, 235, 
+   243, 237, 238, 241, 244, 235, 243, 237, 238, 241, 244, 245, 334, 338, 335, 339, 
+   334, 340, 338, 335, 341, 342, 343, 334, 338, 335, 334, 340, 338, 335, 334, 340, 
+   338, 335, 341, 334, 340, 338, 335, 341, 342, 338, 334, 335, 347, 348, 338, 334, 
+   335, 349, 350, 351, 338, 334, 335, 348, 338, 334, 335, 348, 338, 334, 335, 349, 
+   348, 338, 334, 335, 349, 350, 354, 366, 383, 356, 357, 400, 354, 355, 356, 357, 
+   354, 356, 357, 360, 361, 354, 362, 356, 357, 360, 363, 364, 365, 354, 356, 357, 
+   360, 354, 362, 356, 357, 360, 354, 362, 356, 357, 360, 363, 354, 362, 356, 357, 
+   360, 363, 364, 367, 368, 369, 371, 367, 374, 368, 369, 371, 375, 367, 376, 374, 
+   368, 369, 371, 377, 378, 379, 367, 374, 368, 369, 371, 367, 376, 374, 368, 369, 
+   371, 367, 376, 374, 368, 369, 371, 377, 367, 376, 374, 368, 369, 371, 377, 378, 
+   384, 385, 386, 388, 384, 391, 385, 386, 388, 392, 384, 393, 391, 385, 386, 388, 
+   394, 395, 396, 384, 391, 385, 386, 388, 384, 393, 391, 385, 386, 388, 384, 393, 
+   391, 385, 386, 388, 394, 384, 393, 391, 385, 386, 388, 394, 395, 354, 366, 383, 
+   355, 356, 357, 400, 404, 410, 406, 407, 408, 409, 406, 407, 408, 411, 415, 419, 
+   423, 427, 431, 406, 429, 430, 406, 432, 433, 434, 406, 432, 433, 414, 440, 441, 
+   442, 414, 440, 441, 444, 437, 445, 446, 447, 444, 437, 445, 444, 437, 445, 446, 
+   229, 225, 226, 450, 451, 229, 225, 226, 452, 453, 454, 229, 225, 226, 451, 229, 
+   225, 226, 451, 229, 225, 226, 452, 451, 229, 225, 226, 452, 453, 235, 237, 238, 
+   241, 456, 457, 235, 237, 238, 241, 458, 459, 460, 457, 235, 237, 238, 241, 457, 
+   235, 237, 238, 241, 458, 457, 235, 237, 238, 241, 458, 459, 519, 332, 333, 344, 
+   345, 225, 235, 236, 237, 238, 226, 227, 449, 239, 455, 162, 175, 186, 202, 214, 
+   402, 403, 435, 107, 108, 119, 120, 44, 54, 56, 55, 46, 47, 61, 71, 73, 
+   72, 63, 64, 98, 99, 358, 359, 370, 380, 382, 381, 372, 373, 387, 397, 399, 
+   398, 389, 390, 
+};
+
+/** Token literal values. */
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, null, null, "\74\41\55\55", "\55\55\76", 
+"\173", "\175", "\174\75", "\136\75", "\44\75", "\52\75", "\176\75", "\75", "\53", 
+"\55", "\54", "\73", "\76", "\176", "\74", "\57", "\133", "\135", "\52", "\45", 
+"\46", "\56", "\50", "\51", "\75\75", "\174\174", "\46\46", "\41\75", "\72", null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, null, null, null, null, };
+
+/** Lexer state names. */
+public static final String[] lexStateNames = {
+   "DEFAULT",
+   "IN_FORMAL_COMMENT",
+   "IN_MULTI_LINE_COMMENT",
+};
+
+/** Lex State array. */
+public static final int[] jjnewLexState = {
+   -1, -1, -1, 1, 2, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+};
+static final long[] jjtoToken = {
+   0xfffe01ffffffff03L, 0xfc01fffffffbffL, 
+};
+static final long[] jjtoSkip = {
+   0x64L, 0x0L, 
+};
+static final long[] jjtoSpecial = {
+   0x24L, 0x0L, 
+};
+static final long[] jjtoMore = {
+   0x98L, 0x0L, 
+};
+protected CharStream input_stream;
+private final int[] jjrounds = new int[522];
+private final int[] jjstateSet = new int[1044];
+private final StringBuilder jjimage = new StringBuilder();
+private StringBuilder image = jjimage;
+private int jjimageLen;
+private int lengthOfMatch;
+protected char curChar;
+/** Constructor. */
+public ParserTokenManager(CharStream stream){
+   input_stream = stream;
+}
+
+/** Constructor. */
+public ParserTokenManager(CharStream stream, int lexState){
+   this(stream);
+   SwitchTo(lexState);
+}
+
+/** Reinitialise parser. */
+public void ReInit(CharStream stream)
+{
+   jjmatchedPos = jjnewStateCnt = 0;
+   curLexState = defaultLexState;
+   input_stream = stream;
+   ReInitRounds();
+}
+private void ReInitRounds()
+{
+   int i;
+   jjround = 0x80000001;
+   for (i = 522; i-- > 0;)
+      jjrounds[i] = 0x80000000;
+}
+
+/** Reinitialise parser. */
+public void ReInit(CharStream stream, int lexState)
+{
+   ReInit(stream);
+   SwitchTo(lexState);
+}
+
+/** Switch to specified lex state. */
+public void SwitchTo(int lexState)
+{
+   if (lexState >= 3 || lexState < 0)
+      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+   else
+      curLexState = lexState;
+}
+
+protected Token jjFillToken()
+{
+   final Token t;
+   final String curTokenImage;
+   final int beginLine;
+   final int endLine;
+   final int beginColumn;
+   final int endColumn;
+   String im = jjstrLiteralImages[jjmatchedKind];
+   curTokenImage = (im == null) ? input_stream.GetImage() : im;
+   beginLine = input_stream.getBeginLine();
+   beginColumn = input_stream.getBeginColumn();
+   endLine = input_stream.getEndLine();
+   endColumn = input_stream.getEndColumn();
+   t = Token.newToken(jjmatchedKind, curTokenImage);
+
+   t.beginLine = beginLine;
+   t.endLine = endLine;
+   t.beginColumn = beginColumn;
+   t.endColumn = endColumn;
+
+   return t;
+}
+
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+/** Get the next Token. */
+public Token getNextToken() 
+{
+  Token specialToken = null;
+  Token matchedToken;
+  int curPos = 0;
+
+  EOFLoop :
+  for (;;)
+  {
+   try
+   {
+      curChar = input_stream.BeginToken();
+   }
+   catch(java.io.IOException e)
+   {
+      jjmatchedKind = 0;
+      matchedToken = jjFillToken();
+      matchedToken.specialToken = specialToken;
+      return matchedToken;
+   }
+   image = jjimage;
+   image.setLength(0);
+   jjimageLen = 0;
+
+   for (;;)
+   {
+     switch(curLexState)
+     {
+       case 0:
+         jjmatchedKind = 0x7fffffff;
+         jjmatchedPos = 0;
+         curPos = jjMoveStringLiteralDfa0_0();
+         if (jjmatchedPos == 0 && jjmatchedKind > 119)
+         {
+            jjmatchedKind = 119;
+         }
+         break;
+       case 1:
+         jjmatchedKind = 0x7fffffff;
+         jjmatchedPos = 0;
+         curPos = jjMoveStringLiteralDfa0_1();
+         if (jjmatchedPos == 0 && jjmatchedKind > 7)
+         {
+            jjmatchedKind = 7;
+         }
+         break;
+       case 2:
+         jjmatchedKind = 0x7fffffff;
+         jjmatchedPos = 0;
+         curPos = jjMoveStringLiteralDfa0_2();
+         if (jjmatchedPos == 0 && jjmatchedKind > 7)
+         {
+            jjmatchedKind = 7;
+         }
+         break;
+     }
+     if (jjmatchedKind != 0x7fffffff)
+     {
+        if (jjmatchedPos + 1 < curPos)
+           input_stream.backup(curPos - jjmatchedPos - 1);
+        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+        {
+           matchedToken = jjFillToken();
+           matchedToken.specialToken = specialToken;
+           TokenLexicalActions(matchedToken);
+       if (jjnewLexState[jjmatchedKind] != -1)
+         curLexState = jjnewLexState[jjmatchedKind];
+           return matchedToken;
+        }
+        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+        {
+           if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+           {
+              matchedToken = jjFillToken();
+              if (specialToken == null)
+                 specialToken = matchedToken;
+              else
+              {
+                 matchedToken.specialToken = specialToken;
+                 specialToken = (specialToken.next = matchedToken);
+              }
+              SkipLexicalActions(matchedToken);
+           }
+           else
+              SkipLexicalActions(null);
+         if (jjnewLexState[jjmatchedKind] != -1)
+           curLexState = jjnewLexState[jjmatchedKind];
+           continue EOFLoop;
+        }
+        MoreLexicalActions();
+      if (jjnewLexState[jjmatchedKind] != -1)
+        curLexState = jjnewLexState[jjmatchedKind];
+        curPos = 0;
+        jjmatchedKind = 0x7fffffff;
+        try {
+           curChar = input_stream.readChar();
+           continue;
+        }
+        catch (java.io.IOException e1) { }
+     }
+     int error_line = input_stream.getEndLine();
+     int error_column = input_stream.getEndColumn();
+     String error_after = null;
+     boolean EOFSeen = false;
+     try { input_stream.readChar(); input_stream.backup(1); }
+     catch (java.io.IOException e1) {
+        EOFSeen = true;
+        error_after = curPos <= 1 ? "" : input_stream.GetImage();
+        if (curChar == '\n' || curChar == '\r') {
+           error_line++;
+           error_column = 0;
+        }
+        else
+           error_column++;
+     }
+     if (!EOFSeen) {
+        input_stream.backup(1);
+        error_after = curPos <= 1 ? "" : input_stream.GetImage();
+     }
+     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+   }
+  }
+}
+
+void SkipLexicalActions(Token matchedToken)
+{
+   switch(jjmatchedKind)
+   {
+      default :
+         break;
+   }
+}
+void MoreLexicalActions()
+{
+   jjimageLen += (lengthOfMatch = jjmatchedPos + 1);
+   switch(jjmatchedKind)
+   {
+      case 3 :
+         image.append(input_stream.GetSuffix(jjimageLen));
+         jjimageLen = 0;
+                   input_stream.backup(1);
+         break;
+      default :
+         break;
+   }
+}
+void TokenLexicalActions(Token matchedToken)
+{
+   switch(jjmatchedKind)
+   {
+      case 1 :
+        image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
+          image = Parser.SPACE;
+         break;
+      default :
+         break;
+   }
+}
+private void jjCheckNAdd(int state)
+{
+   if (jjrounds[state] != jjround)
+   {
+      jjstateSet[jjnewStateCnt++] = state;
+      jjrounds[state] = jjround;
+   }
+}
+private void jjAddStates(int start, int end)
+{
+   do {
+      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+   } while (start++ != end);
+}
+private void jjCheckNAddTwoStates(int state1, int state2)
+{
+   jjCheckNAdd(state1);
+   jjCheckNAdd(state2);
+}
+
+private void jjCheckNAddStates(int start, int end)
+{
+   do {
+      jjCheckNAdd(jjnextStates[start]);
+   } while (start++ != end);
+}
+
+}
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/Token.java b/theme-compiler/src/com/vaadin/sass/internal/parser/Token.java
new file mode 100644 (file)
index 0000000..26d1121
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed 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.
+ */
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */
+/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
+package com.vaadin.sass.internal.parser;
+
+/**
+ * Describes the input token stream.
+ */
+
+public class Token implements java.io.Serializable {
+
+  /**
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * An integer that describes the kind of this token.  This numbering
+   * system is determined by JavaCCParser, and a table of these numbers is
+   * stored in the file ...Constants.java.
+   */
+  public int kind;
+
+  /** The line number of the first character of this Token. */
+  public int beginLine;
+  /** The column number of the first character of this Token. */
+  public int beginColumn;
+  /** The line number of the last character of this Token. */
+  public int endLine;
+  /** The column number of the last character of this Token. */
+  public int endColumn;
+
+  /**
+   * The string image of the token.
+   */
+  public String image;
+
+  /**
+   * A reference to the next regular (non-special) token from the input
+   * stream.  If this is the last token from the input stream, or if the
+   * token manager has not read tokens beyond this one, this field is
+   * set to null.  This is true only if this token is also a regular
+   * token.  Otherwise, see below for a description of the contents of
+   * this field.
+   */
+  public Token next;
+
+  /**
+   * This field is used to access special tokens that occur prior to this
+   * token, but after the immediately preceding regular (non-special) token.
+   * If there are no such special tokens, this field is set to null.
+   * When there are more than one such special token, this field refers
+   * to the last of these special tokens, which in turn refers to the next
+   * previous special token through its specialToken field, and so on
+   * until the first special token (whose specialToken field is null).
+   * The next fields of special tokens refer to other special tokens that
+   * immediately follow it (without an intervening regular token).  If there
+   * is no such token, this field is null.
+   */
+  public Token specialToken;
+
+  /**
+   * An optional attribute value of the Token.
+   * Tokens which are not used as syntactic sugar will often contain
+   * meaningful values that will be used later on by the compiler or
+   * interpreter. This attribute value is often different from the image.
+   * Any subclass of Token that actually wants to return a non-null value can
+   * override this method as appropriate.
+   */
+  public Object getValue() {
+    return null;
+  }
+
+  /**
+   * No-argument constructor
+   */
+  public Token() {}
+
+  /**
+   * Constructs a new token for the specified Image.
+   */
+  public Token(int kind)
+  {
+    this(kind, null);
+  }
+
+  /**
+   * Constructs a new token for the specified Image and Kind.
+   */
+  public Token(int kind, String image)
+  {
+    this.kind = kind;
+    this.image = image;
+  }
+
+  /**
+   * Returns the image.
+   */
+  public String toString()
+  {
+    return image;
+  }
+
+  /**
+   * Returns a new Token object, by default. However, if you want, you
+   * can create and return subclass objects based on the value of ofKind.
+   * Simply add the cases to the switch for all those special cases.
+   * For example, if you have a subclass of Token called IDToken that
+   * you want to create if ofKind is ID, simply add something like :
+   *
+   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
+   *
+   * to the following switch statement. Then you can cast matchedToken
+   * variable to the appropriate type and use sit in your lexical actions.
+   */
+  public static Token newToken(int ofKind, String image)
+  {
+    switch(ofKind)
+    {
+      default : return new Token(ofKind, image);
+    }
+  }
+
+  public static Token newToken(int ofKind)
+  {
+    return newToken(ofKind, null);
+  }
+
+}
+/* JavaCC - OriginalChecksum=dad2146dc89e68f66e77382c9e448fb7 (do not edit this line) */
diff --git a/theme-compiler/src/com/vaadin/sass/internal/parser/TokenMgrError.java b/theme-compiler/src/com/vaadin/sass/internal/parser/TokenMgrError.java
new file mode 100644 (file)
index 0000000..f093357
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed 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.
+ */
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
+/* JavaCCOptions: */
+package com.vaadin.sass.internal.parser;
+
+/** Token Manager Error. */
+public class TokenMgrError extends Error
+{
+
+  /**
+   * The version identifier for this Serializable class.
+   * Increment only if the <i>serialized</i> form of the
+   * class changes.
+   */
+  private static final long serialVersionUID = 1L;
+
+  /*
+   * Ordinals for various reasons why an Error of this type can be thrown.
+   */
+
+  /**
+   * Lexical error occurred.
+   */
+  static final int LEXICAL_ERROR = 0;
+
+  /**
+   * An attempt was made to create a second instance of a static token manager.
+   */
+  static final int STATIC_LEXER_ERROR = 1;
+
+  /**
+   * Tried to change to an invalid lexical state.
+   */
+  static final int INVALID_LEXICAL_STATE = 2;
+
+  /**
+   * Detected (and bailed out of) an infinite loop in the token manager.
+   */
+  static final int LOOP_DETECTED = 3;
+
+  /**
+   * Indicates the reason why the exception is thrown. It will have
+   * one of the above 4 values.
+   */
+  int errorCode;
+
+  /**
+   * Replaces unprintable characters by their escaped (or unicode escaped)
+   * equivalents in the given string
+   */
+  protected static final String addEscapes(String str) {
+    StringBuffer retval = new StringBuffer();
+    char ch;
+    for (int i = 0; i < str.length(); i++) {
+      switch (str.charAt(i))
+      {
+        case 0 :
+          continue;
+        case '\b':
+          retval.append("\\b");
+          continue;
+        case '\t':
+          retval.append("\\t");
+          continue;
+        case '\n':
+          retval.append("\\n");
+          continue;
+        case '\f':
+          retval.append("\\f");
+          continue;
+        case '\r':
+          retval.append("\\r");
+          continue;
+        case '\"':
+          retval.append("\\\"");
+          continue;
+        case '\'':
+          retval.append("\\\'");
+          continue;
+        case '\\':
+          retval.append("\\\\");
+          continue;
+        default:
+          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+            String s = "0000" + Integer.toString(ch, 16);
+            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+          } else {
+            retval.append(ch);
+          }
+          continue;
+      }
+    }
+    return retval.toString();
+  }
+
+  /**
+   * Returns a detailed message for the Error when it is thrown by the
+   * token manager to indicate a lexical error.
+   * Parameters :
+   *    EOFSeen     : indicates if EOF caused the lexical error
+   *    curLexState : lexical state in which this error occurred
+   *    errorLine   : line number when the error occurred
+   *    errorColumn : column number when the error occurred
+   *    errorAfter  : prefix that was seen before this error occurred
+   *    curchar     : the offending character
+   * Note: You can customize the lexical error message by modifying this method.
+   */
+  protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+    return("Lexical error at line " +
+          errorLine + ", column " +
+          errorColumn + ".  Encountered: " +
+          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+          "after : \"" + addEscapes(errorAfter) + "\"");
+  }
+
+  /**
+   * You can also modify the body of this method to customize your error messages.
+   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+   * of end-users concern, so you can return something like :
+   *
+   *     "Internal Error : Please file a bug report .... "
+   *
+   * from this method for such cases in the release version of your parser.
+   */
+  public String getMessage() {
+    return super.getMessage();
+  }
+
+  /*
+   * Constructors of various flavors follow.
+   */
+
+  /** No arg constructor. */
+  public TokenMgrError() {
+  }
+
+  /** Constructor with message and reason. */
+  public TokenMgrError(String message, int reason) {
+    super(message);
+    errorCode = reason;
+  }
+
+  /** Full Constructor. */
+  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+    this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+  }
+}
+/* JavaCC - OriginalChecksum=c7c96e9cf4a9320d03dd722437439354 (do not edit this line) */
index e70201b11a99577ca6b3b54d29a0350c71ac5a02..1ed5075bd57ff9d509aed023029ce60d85d13e04 100644 (file)
@@ -34,7 +34,7 @@ public class ParserTest {
 
     @Test
     public void testParsePropertyValue() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
 
         LexicalUnit value = parser.parsePropertyValue(new InputSource(
                 new StringReader("$margin/2;")));
@@ -53,7 +53,7 @@ public class ParserTest {
 
     @Test
     public void testCanIngoreSingleLineComment() {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         try {
index 32c4c37ce7055c2fbf63742d1c165a1cccd56502..d823ccf8609a24709915feb0f29bebc53bf72c45 100644 (file)
@@ -36,7 +36,7 @@ public class Interpolation extends AbstractTestBase {
     @Test
     public void testParser() throws CSSException, URISyntaxException,
             IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index 9e110ecd97c060588af7f075131a197179bf0b1a..6a09917d9994865edd15797344b9e3b2457d5262 100644 (file)
@@ -38,7 +38,7 @@ public class Comments extends AbstractTestBase {
     @Test
     public void testParser() throws CSSException, URISyntaxException,
             IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index 915bbb0f46c76171e2bf71104b17606a8284c32f..1e3eb09f0c1c466131dcd4a461b2b7bbbd6c1acb 100644 (file)
@@ -42,7 +42,7 @@ public class CompassImports extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scssOtherDirectory)
index e11cb854c9f69faa9a016afbb4994d588d65fa29..14cac4bb192f1bb9987277204d01ca86a12a6cb5 100644 (file)
@@ -43,7 +43,7 @@ public class ControlDirectives extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index 649a5777c31bab28842a4f8878f4e8071307ddfc..b3c20b0ab6c9fcc012cd1efb9d86ebc5124ecba1 100644 (file)
@@ -37,7 +37,7 @@ public class Extends extends AbstractTestBase {
     @Test
     public void testParser() throws CSSException, URISyntaxException,
             IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index ce0875a8848bd83898e033d046fc5b38d29f351a..5c41494ac60c4784ccd3631c2e7de1608f08c244 100644 (file)
@@ -36,7 +36,7 @@ public class Functions extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index 128cc2fe06b8527fc2d3d36168c087a5114996a9..aaa1a1439ad0b5a38e0c39aabbf8506783019c9c 100644 (file)
@@ -37,7 +37,7 @@ public class Imports extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index 0c441c7c2d88da270b79acadd3718acca0fbed9c..e4faee6e2ab99adfa4e56cc439243fbcd82c35c5 100644 (file)
@@ -42,7 +42,7 @@ public class Mixins extends AbstractTestBase {
     @Test
     public void testParser() throws CSSException, URISyntaxException,
             IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index 26b61a0888396771b5e069489e173457dc073872..9a91df04ba9bfb118f5ed422c74d96732e0a3e37 100644 (file)
@@ -38,7 +38,7 @@ public class NestedProperties extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index cd213f9de4bc611905b9f53d2ce333fb310ac421..04aca5e8d34039ffe2fa9f39abfb6e3890f4ccf8 100644 (file)
@@ -37,7 +37,7 @@ public class Nesting extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index 668d1e36f2b8d07607db8b712be858ca42ab2095..daa7dbbf0799ee7bba595a4ce107a4507d5b2b90 100644 (file)
@@ -37,7 +37,7 @@ public class ParentImports extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index a6608b75d6d9bf7d82b28ca07323ddf0182bc8b1..443d4a1086373cf78b21beb938409f9c83181d2d 100644 (file)
@@ -35,7 +35,7 @@ public class ParentSelector extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index 732426497f41b413caacfeedcdeefc02aecbb801..a0727736e47daedfb831173083fa8e0f3fea2340 100644 (file)
@@ -19,7 +19,7 @@ public class VariableGuarded extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());
index d623b00112f68620bf3a3c81ad53f0b1bc9a53a2..7f71d46f0dc7ff6c0906237914e516e055c39cb3 100644 (file)
@@ -40,7 +40,7 @@ public class Variables extends AbstractTestBase {
 
     @Test
     public void testParser() throws CSSException, IOException {
-        Parser parser = Parser.ParserAccessor.getParser();
+        Parser parser = new Parser();
         SCSSDocumentHandler handler = new SCSSDocumentHandlerImpl();
         parser.setDocumentHandler(handler);
         parser.parseStyleSheet(getClass().getResource(scss).getPath());