diff --git a/src/adql/parser/.gitignore b/src/adql/parser/.gitignore
deleted file mode 100644
index 5e75933c6a3ba2a311cd3cd309c6159f5c3e1845..0000000000000000000000000000000000000000
--- a/src/adql/parser/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/ADQLParser.java
-/ADQLParserConstants.java
-/ADQLParserTokenManager.java
diff --git a/src/adql/parser/ADQLParser.java b/src/adql/parser/ADQLParser.java
index 5cff60b1f00518ab1a9a4fd19177b586e1ba3a7b..40d14d356b0ac2defe29a4826253f313716ae18f 100644
--- a/src/adql/parser/ADQLParser.java
+++ b/src/adql/parser/ADQLParser.java
@@ -1,5 +1,19 @@
 /* ADQLParser.java */
-/* Generated By:JavaCC: Do not edit this line. ADQLParser.java */
+/* Generated By:JavaCC: Do not edit this line. ADQLParser.java
+ * 
+ * Modified by Gregory Mantelet (ARI), March 2017
+ * Modification: line 5686, from:
+ * 
+ *   public ADQLParser(java.io.InputStream stream){
+ *     this(stream, null);
+ *   }
+ * 
+ *   to:
+ * 
+ *   public ADQLParser(java.io.InputStream stream){
+ *     this(stream, (String)null);
+ *   }
+ */
 package adql.parser;
 
 import java.io.FileReader;
diff --git a/src/adql/parser/ParseException.java b/src/adql/parser/ParseException.java
index fb440e49c031045c44c8607c1eaba226260b4665..108993a7ccccd9dfe17c2e84f088499cd734b6fe 100644
--- a/src/adql/parser/ParseException.java
+++ b/src/adql/parser/ParseException.java
@@ -1,7 +1,13 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 6.0 */
 /* JavaCCOptions:KEEP_LINE_COL=null
  * 
- * Modified by Grégory Mantelet (CDS), on February 2012
+ * Modified by Grégory Mantelet (CDS), on March 2017
+ * Modification: several small modifications.
+ *               /!\ DO NOT RE-GENERATE THIS FILE /!\
+ *               In case of re-generation, replace it by
+ *               ParseException.java.backup (but maybe after a diff
+ *               in case of significant modifications have been done
+ *               by a new version of JavaCC).
  */
 package adql.parser;
 
@@ -16,7 +22,6 @@ import adql.query.TextPosition;
  * You can modify this class to customize your error reporting
  * mechanisms so long as you retain the public fields.
  */
-@SuppressWarnings("all")
 public class ParseException extends Exception {
 
 	/**
@@ -148,23 +153,23 @@ public class ParseException extends Exception {
 		/*String eol = System.getProperty("line.separator", "\n");
 		StringBuffer expected = new StringBuffer();
 		int maxSize = 0;
-		for (int i = 0; i < expectedTokenSequences.length; i++) {
-			if (maxSize < expectedTokenSequences[i].length) {
+		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++) {
+			for(int j = 0; j < expectedTokenSequences[i].length; j++){
 				expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
 			}
-			if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+			if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0){
 				expected.append("...");
 			}
 			expected.append(eol).append("    ");
 		}
 		String retval = "Encountered \"";
 		Token tok = currentToken.next;
-		for (int i = 0; i < maxSize; i++) {
+		for(int i = 0; i < maxSize; i++){
 			if (i != 0) retval += " ";
-			if (tok.kind == 0) {
+			if (tok.kind == 0){
 				retval += tokenImage[0];
 				break;
 			}
@@ -176,9 +181,9 @@ public class ParseException extends Exception {
 		}
 		retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
 		retval += "." + eol;
-		if (expectedTokenSequences.length == 1) {
+		if (expectedTokenSequences.length == 1){
 			retval += "Was expecting:" + eol + "    ";
-		} else {
+		}else{
 			retval += "Was expecting one of:" + eol + "    ";
 		}
 		retval += expected.toString();
diff --git a/src/adql/parser/ParseException.java.backup b/src/adql/parser/ParseException.java.backup
index 0a275359cb74dff7647f4a73f018952dde70841f..108993a7ccccd9dfe17c2e84f088499cd734b6fe 100644
--- a/src/adql/parser/ParseException.java.backup
+++ b/src/adql/parser/ParseException.java.backup
@@ -1,5 +1,14 @@
-/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 5.0 */
-/* JavaCCOptions:KEEP_LINE_COL=null */
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 6.0 */
+/* JavaCCOptions:KEEP_LINE_COL=null
+ * 
+ * Modified by Gr&eacute;gory Mantelet (CDS), on March 2017
+ * Modification: several small modifications.
+ *               /!\ DO NOT RE-GENERATE THIS FILE /!\
+ *               In case of re-generation, replace it by
+ *               ParseException.java.backup (but maybe after a diff
+ *               in case of significant modifications have been done
+ *               by a new version of JavaCC).
+ */
 package adql.parser;
 
 import adql.query.TextPosition;
@@ -13,7 +22,6 @@ import adql.query.TextPosition;
  * You can modify this class to customize your error reporting
  * mechanisms so long as you retain the public fields.
  */
-@SuppressWarnings("all")
 public class ParseException extends Exception {
 
 	/**
@@ -29,11 +37,7 @@ public class ParseException extends Exception {
 	 * a new object of this type with the fields "currentToken",
 	 * "expectedTokenSequences", and "tokenImage" set.
 	 */
-	public ParseException(Token currentTokenVal,
-			int[][] expectedTokenSequencesVal,
-			String[] tokenImageVal
-	)
-	{
+	public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal){
 		super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
 		currentToken = currentTokenVal;
 		expectedTokenSequences = expectedTokenSequencesVal;
@@ -52,12 +56,12 @@ public class ParseException extends Exception {
 	 * these constructors.
 	 */
 
-	public ParseException() {
+	public ParseException(){
 		super();
 	}
 
 	/** Constructor with message. */
-	public ParseException(String message) {
+	public ParseException(String message){
 		super(message);
 	}
 
@@ -66,7 +70,6 @@ public class ParseException extends Exception {
 		position = errorPosition;
 	}
 
-
 	/**
 	 * This is the last token that has been consumed successfully.  If
 	 * this object has been created due to a parse error, the token
@@ -107,16 +110,16 @@ public class ParseException extends Exception {
 	 * from the parser) the correct error message
 	 * gets displayed.
 	 */
-	private static String initialise(Token currentToken, int[][] expectedTokenSequences, String[] tokenImage) {
+	private static String initialise(Token currentToken, int[][] expectedTokenSequences, String[] tokenImage){
 		int maxSize = 0;
 
 		// Build the list of expected tokens:
 		StringBuffer expected = new StringBuffer();
-		for (int i = 0; i < expectedTokenSequences.length; i++) {
-			if (maxSize < expectedTokenSequences[i].length) {
+		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++) {
+			for(int j = 0; j < expectedTokenSequences[i].length; j++){
 				expected.append(tokenImage[expectedTokenSequences[i][j]]);
 			}
 			expected.append(" ");
@@ -126,9 +129,10 @@ public class ParseException extends Exception {
 		StringBuffer msg = new StringBuffer();
 		msg.append(" Encountered \"");
 		Token tok = currentToken.next;
-		for (int i = 0; i < maxSize; i++) {
-			if (i != 0) msg.append(' ');
-			if (tok.kind == 0) {
+		for(int i = 0; i < maxSize; i++){
+			if (i != 0)
+				msg.append(' ');
+			if (tok.kind == 0){
 				msg.append(tokenImage[0]);
 				break;
 			}
@@ -138,9 +142,9 @@ public class ParseException extends Exception {
 		msg.append("\".");
 
 		// Append the expected tokens list:
-		if (expectedTokenSequences.length == 1) {
+		if (expectedTokenSequences.length == 1){
 			msg.append(" Was expecting: ");
-		} else {
+		}else{
 			msg.append(" Was expecting one of: ");
 		}
 		msg.append(expected);
@@ -149,23 +153,23 @@ public class ParseException extends Exception {
 		/*String eol = System.getProperty("line.separator", "\n");
 		StringBuffer expected = new StringBuffer();
 		int maxSize = 0;
-		for (int i = 0; i < expectedTokenSequences.length; i++) {
-			if (maxSize < expectedTokenSequences[i].length) {
+		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++) {
+			for(int j = 0; j < expectedTokenSequences[i].length; j++){
 				expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
 			}
-			if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+			if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0){
 				expected.append("...");
 			}
 			expected.append(eol).append("    ");
 		}
 		String retval = "Encountered \"";
 		Token tok = currentToken.next;
-		for (int i = 0; i < maxSize; i++) {
+		for(int i = 0; i < maxSize; i++){
 			if (i != 0) retval += " ";
-			if (tok.kind == 0) {
+			if (tok.kind == 0){
 				retval += tokenImage[0];
 				break;
 			}
@@ -177,9 +181,9 @@ public class ParseException extends Exception {
 		}
 		retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
 		retval += "." + eol;
-		if (expectedTokenSequences.length == 1) {
+		if (expectedTokenSequences.length == 1){
 			retval += "Was expecting:" + eol + "    ";
-		} else {
+		}else{
 			retval += "Was expecting one of:" + eol + "    ";
 		}
 		retval += expected.toString();
@@ -196,46 +200,45 @@ public class ParseException extends Exception {
 	 * when these raw version cannot be used as part of an ASCII
 	 * string literal.
 	 */
-	static String add_escapes(String str) {
+	static 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;
+		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/src/adql/parser/SimpleCharStream.java b/src/adql/parser/SimpleCharStream.java
index 75e085ef5a00279df789c1687ce3e4e42b127446..617d73edc85d9ffcdb9795666a3e944db25ca813 100644
--- a/src/adql/parser/SimpleCharStream.java
+++ b/src/adql/parser/SimpleCharStream.java
@@ -1,4 +1,4 @@
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 5.0 */
+/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 6.0 */
 /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 package adql.parser;
 
@@ -7,7 +7,6 @@ package adql.parser;
  * contain only ASCII characters (without unicode processing).
  */
 
-@SuppressWarnings("all")
 public class SimpleCharStream {
 	/** Whether parser is static. */
 	public static final boolean staticFlag = false;
@@ -31,12 +30,13 @@ public class SimpleCharStream {
 	protected int maxNextCharInd = 0;
 	protected int inBuf = 0;
 	protected int tabSize = 8;
+	protected boolean trackLineColumn = true;
 
-	protected void setTabSize(int i){
+	public void setTabSize(int i){
 		tabSize = i;
 	}
 
-	protected int getTabSize(int i){
+	public int getTabSize(){
 		return tabSize;
 	}
 
@@ -183,6 +183,7 @@ public class SimpleCharStream {
 	 * @deprecated
 	 * @see #getEndColumn
 	 */
+
 	public int getColumn(){
 		return bufcolumn[bufpos];
 	}
@@ -192,6 +193,7 @@ public class SimpleCharStream {
 	 * @deprecated
 	 * @see #getEndLine
 	 */
+
 	public int getLine(){
 		return bufline[bufpos];
 	}
@@ -402,5 +404,12 @@ public class SimpleCharStream {
 		column = bufcolumn[j];
 	}
 
+	boolean getTrackLineColumn(){
+		return trackLineColumn;
+	}
+
+	void setTrackLineColumn(boolean tlc){
+		trackLineColumn = tlc;
+	}
 }
-/* JavaCC - OriginalChecksum=42af0fefd9dd6e805cbddca0a6f8ad37 (do not edit this line) */
+/* JavaCC - OriginalChecksum=25c201ae6a86f1f10a8af29118337505 (do not edit this line) */
diff --git a/src/adql/parser/SimpleCharStream.java.backup b/src/adql/parser/SimpleCharStream.java.backup
index 1f6fca798b207268513e6d1062efa7b431a62f1f..617d73edc85d9ffcdb9795666a3e944db25ca813 100644
--- a/src/adql/parser/SimpleCharStream.java.backup
+++ b/src/adql/parser/SimpleCharStream.java.backup
@@ -1,4 +1,4 @@
-/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 5.0 */
+/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 6.0 */
 /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 package adql.parser;
 
@@ -7,466 +7,409 @@ package adql.parser;
  * contain only ASCII characters (without unicode processing).
  */
 
-@SuppressWarnings("all")
-public class SimpleCharStream
-{
-/** Whether parser is static. */
-  public static final boolean staticFlag = false;
-  int bufsize;
-  int available;
-  int tokenBegin;
-/** Position in buffer. */
-  public int bufpos = -1;
-  protected int bufline[];
-  protected int bufcolumn[];
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] buffer;
-  protected int maxNextCharInd = 0;
-  protected int inBuf = 0;
-  protected int tabSize = 8;
-
-  protected void setTabSize(int i) { tabSize = i; }
-  protected int getTabSize(int i) { return tabSize; }
-
-
-  protected 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;
-  }
-
-  protected 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 = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1)
-      {
-        inputStream.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;
-    }
-  }
-
-/** Start. */
-  public char BeginToken() throws java.io.IOException
-  {
-    tokenBegin = -1;
-    char c = readChar();
-    tokenBegin = bufpos;
-
-    return c;
-  }
-
-  protected 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 += (tabSize - (column % tabSize));
-        break;
-      default :
-        break;
-    }
-
-    bufline[bufpos] = line;
-    bufcolumn[bufpos] = column;
-  }
-
-/** Read a character. */
-  public char readChar() throws java.io.IOException
-  {
-    if (inBuf > 0)
-    {
-      --inBuf;
-
-      if (++bufpos == bufsize)
-        bufpos = 0;
-
-      return buffer[bufpos];
-    }
-
-    if (++bufpos >= maxNextCharInd)
-      FillBuff();
-
-    char c = buffer[bufpos];
-
-    UpdateLineColumn(c);
-    return c;
-  }
-
-  @Deprecated
-  /**
-   * @deprecated
-   * @see #getEndColumn
-   */
-
-  public int getColumn() {
-    return bufcolumn[bufpos];
-  }
-
-  @Deprecated
-  /**
-   * @deprecated
-   * @see #getEndLine
-   */
-
-  public int getLine() {
-    return bufline[bufpos];
-  }
-
-  /** Get token end column number. */
-  public int getEndColumn() {
-    return bufcolumn[bufpos];
-  }
-
-  /** Get token end line number. */
-  public int getEndLine() {
-     return bufline[bufpos];
-  }
-
-  /** Get token beginning column number. */
-  public int getBeginColumn() {
-    return bufcolumn[tokenBegin];
-  }
-
-  /** Get token beginning line number. */
-  public int getBeginLine() {
-    return bufline[tokenBegin];
-  }
-
-/** Backup a number of characters. */
-  public void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-      bufpos += bufsize;
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.Reader dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.Reader dstream, int startline,
-                          int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.Reader dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    inputStream = 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;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader dstream, int startline,
-                     int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-    this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
-                          int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, int startline,
-                          int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, 1, 1, 4096);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                          int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                          int startcolumn, int buffersize)
-  {
-    ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, 1, 1, 4096);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                     int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, startline, startcolumn, 4096);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-  /** Get token literal value. */
-  public 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);
-  }
-
-  /** Get the suffix. */
-  public 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;
-  }
-
-  /** Reset buffer when finished. */
-  public void Done()
-  {
-    buffer = null;
-    bufline = null;
-    bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  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];
-  }
-
+public class SimpleCharStream {
+	/** Whether parser is static. */
+	public static final boolean staticFlag = false;
+	int bufsize;
+	int available;
+	int tokenBegin;
+	/** Position in buffer. */
+	public int bufpos = -1;
+	protected int bufline[];
+	protected int bufcolumn[];
+
+	protected int column = 0;
+	protected int line = 1;
+
+	protected boolean prevCharIsCR = false;
+	protected boolean prevCharIsLF = false;
+
+	protected java.io.Reader inputStream;
+
+	protected char[] buffer;
+	protected int maxNextCharInd = 0;
+	protected int inBuf = 0;
+	protected int tabSize = 8;
+	protected boolean trackLineColumn = true;
+
+	public void setTabSize(int i){
+		tabSize = i;
+	}
+
+	public int getTabSize(){
+		return tabSize;
+	}
+
+	protected 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;
+	}
+
+	protected 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 = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1){
+				inputStream.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;
+		}
+	}
+
+	/** Start. */
+	public char BeginToken() throws java.io.IOException{
+		tokenBegin = -1;
+		char c = readChar();
+		tokenBegin = bufpos;
+
+		return c;
+	}
+
+	protected 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 += (tabSize - (column % tabSize));
+				break;
+			default:
+				break;
+		}
+
+		bufline[bufpos] = line;
+		bufcolumn[bufpos] = column;
+	}
+
+	/** Read a character. */
+	public char readChar() throws java.io.IOException{
+		if (inBuf > 0){
+			--inBuf;
+
+			if (++bufpos == bufsize)
+				bufpos = 0;
+
+			return buffer[bufpos];
+		}
+
+		if (++bufpos >= maxNextCharInd)
+			FillBuff();
+
+		char c = buffer[bufpos];
+
+		UpdateLineColumn(c);
+		return c;
+	}
+
+	@Deprecated
+	/**
+	 * @deprecated
+	 * @see #getEndColumn
+	 */
+
+	public int getColumn(){
+		return bufcolumn[bufpos];
+	}
+
+	@Deprecated
+	/**
+	 * @deprecated
+	 * @see #getEndLine
+	 */
+
+	public int getLine(){
+		return bufline[bufpos];
+	}
+
+	/** Get token end column number. */
+	public int getEndColumn(){
+		return bufcolumn[bufpos];
+	}
+
+	/** Get token end line number. */
+	public int getEndLine(){
+		return bufline[bufpos];
+	}
+
+	/** Get token beginning column number. */
+	public int getBeginColumn(){
+		return bufcolumn[tokenBegin];
+	}
+
+	/** Get token beginning line number. */
+	public int getBeginLine(){
+		return bufline[tokenBegin];
+	}
+
+	/** Backup a number of characters. */
+	public void backup(int amount){
+
+		inBuf += amount;
+		if ((bufpos -= amount) < 0)
+			bufpos += bufsize;
+	}
+
+	/** Constructor. */
+	public SimpleCharStream(java.io.Reader dstream, int startline, int startcolumn, int buffersize){
+		inputStream = dstream;
+		line = startline;
+		column = startcolumn - 1;
+
+		available = bufsize = buffersize;
+		buffer = new char[buffersize];
+		bufline = new int[buffersize];
+		bufcolumn = new int[buffersize];
+	}
+
+	/** Constructor. */
+	public SimpleCharStream(java.io.Reader dstream, int startline, int startcolumn){
+		this(dstream, startline, startcolumn, 4096);
+	}
+
+	/** Constructor. */
+	public SimpleCharStream(java.io.Reader dstream){
+		this(dstream, 1, 1, 4096);
+	}
+
+	/** Reinitialise. */
+	public void ReInit(java.io.Reader dstream, int startline, int startcolumn, int buffersize){
+		inputStream = 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;
+	}
+
+	/** Reinitialise. */
+	public void ReInit(java.io.Reader dstream, int startline, int startcolumn){
+		ReInit(dstream, startline, startcolumn, 4096);
+	}
+
+	/** Reinitialise. */
+	public void ReInit(java.io.Reader dstream){
+		ReInit(dstream, 1, 1, 4096);
+	}
+
+	/** Constructor. */
+	public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException{
+		this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+	}
+
+	/** Constructor. */
+	public SimpleCharStream(java.io.InputStream dstream, int startline, int startcolumn, int buffersize){
+		this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+	}
+
+	/** Constructor. */
+	public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, int startcolumn) throws java.io.UnsupportedEncodingException{
+		this(dstream, encoding, startline, startcolumn, 4096);
+	}
+
+	/** Constructor. */
+	public SimpleCharStream(java.io.InputStream dstream, int startline, int startcolumn){
+		this(dstream, startline, startcolumn, 4096);
+	}
+
+	/** Constructor. */
+	public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException{
+		this(dstream, encoding, 1, 1, 4096);
+	}
+
+	/** Constructor. */
+	public SimpleCharStream(java.io.InputStream dstream){
+		this(dstream, 1, 1, 4096);
+	}
+
+	/** Reinitialise. */
+	public void ReInit(java.io.InputStream dstream, String encoding, int startline, int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException{
+		ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+	}
+
+	/** Reinitialise. */
+	public void ReInit(java.io.InputStream dstream, int startline, int startcolumn, int buffersize){
+		ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+	}
+
+	/** Reinitialise. */
+	public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException{
+		ReInit(dstream, encoding, 1, 1, 4096);
+	}
+
+	/** Reinitialise. */
+	public void ReInit(java.io.InputStream dstream){
+		ReInit(dstream, 1, 1, 4096);
+	}
+
+	/** Reinitialise. */
+	public void ReInit(java.io.InputStream dstream, String encoding, int startline, int startcolumn) throws java.io.UnsupportedEncodingException{
+		ReInit(dstream, encoding, startline, startcolumn, 4096);
+	}
+
+	/** Reinitialise. */
+	public void ReInit(java.io.InputStream dstream, int startline, int startcolumn){
+		ReInit(dstream, startline, startcolumn, 4096);
+	}
+
+	/** Get token literal value. */
+	public 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);
+	}
+
+	/** Get the suffix. */
+	public 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;
+	}
+
+	/** Reset buffer when finished. */
+	public void Done(){
+		buffer = null;
+		bufline = null;
+		bufcolumn = null;
+	}
+
+	/**
+	 * Method to adjust line and column numbers for the start of a token.
+	 */
+	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];
+	}
+
+	boolean getTrackLineColumn(){
+		return trackLineColumn;
+	}
+
+	void setTrackLineColumn(boolean tlc){
+		trackLineColumn = tlc;
+	}
 }
-/* JavaCC - OriginalChecksum=42af0fefd9dd6e805cbddca0a6f8ad37 (do not edit this line) */
+/* JavaCC - OriginalChecksum=25c201ae6a86f1f10a8af29118337505 (do not edit this line) */
diff --git a/src/adql/parser/Token.java b/src/adql/parser/Token.java
index dc75a77f3e4dccb21715ca726f582fd3a2d437d1..4aa29136418f9a56274e07318b8ce1860e9aabca 100644
--- a/src/adql/parser/Token.java
+++ b/src/adql/parser/Token.java
@@ -1,4 +1,4 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 6.0 */
 /* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 package adql.parser;
 
@@ -6,7 +6,6 @@ package adql.parser;
  * Describes the input token stream.
  */
 
-@SuppressWarnings("all")
 public class Token implements java.io.Serializable {
 
 	/**
@@ -96,6 +95,7 @@ public class Token implements java.io.Serializable {
 	/**
 	 * Returns the image.
 	 */
+	@Override
 	public String toString(){
 		return image;
 	}
@@ -124,4 +124,4 @@ public class Token implements java.io.Serializable {
 	}
 
 }
-/* JavaCC - OriginalChecksum=d231e694113b489b136cc4eb57fc02f6 (do not edit this line) */
+/* JavaCC - OriginalChecksum=4c61cfbec4532a0e2168ba896283031a (do not edit this line) */
diff --git a/src/adql/parser/Token.java.backup b/src/adql/parser/Token.java.backup
index 01453f0d3d10d2605253b8561bc1e8db0ecd22e2..4aa29136418f9a56274e07318b8ce1860e9aabca 100644
--- a/src/adql/parser/Token.java.backup
+++ b/src/adql/parser/Token.java.backup
@@ -1,4 +1,4 @@
-/* Generated By:JavaCC: Do not edit this line. Token.java Version 5.0 */
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 6.0 */
 /* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COL=null,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
 package adql.parser;
 
@@ -6,127 +6,122 @@ package adql.parser;
  * Describes the input token stream.
  */
 
-@SuppressWarnings("all")
 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);
-  }
+	/**
+	 * 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.
+	 */
+	@Override
+	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=d231e694113b489b136cc4eb57fc02f6 (do not edit this line) */
+/* JavaCC - OriginalChecksum=4c61cfbec4532a0e2168ba896283031a (do not edit this line) */
diff --git a/src/adql/parser/TokenMgrError.java b/src/adql/parser/TokenMgrError.java
index b41b384078d9f119be346b62aa752b8411b10ce8..10af73d9a9a7ad0fbeacafbdd664ed307e41635e 100644
--- a/src/adql/parser/TokenMgrError.java
+++ b/src/adql/parser/TokenMgrError.java
@@ -1,10 +1,8 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 6.0 */
 /* JavaCCOptions: */
 package adql.parser;
 
 /** Token Manager Error. */
-
-@SuppressWarnings("all")
 public class TokenMgrError extends Error {
 
 	/**
@@ -44,12 +42,6 @@ public class TokenMgrError extends Error {
 	 */
 	int errorCode;
 
-	/** Indicates the line at which the error occurs. */
-	int errorLine = -1;
-
-	/** Indicates the column at which the error occurs. */
-	int errorColumn = -1;
-
 	/**
 	 * Replaces unprintable characters by their escaped (or unicode escaped)
 	 * equivalents in the given string
@@ -128,24 +120,6 @@ public class TokenMgrError extends Error {
 		return super.getMessage();
 	}
 
-	/**
-	 * Gets the line at which this error occurs.
-	 * 
-	 * @return	Error line or <code>-1</code> if unknown.
-	 */
-	public final int getErrorLine(){
-		return errorLine;
-	}
-
-	/**
-	 * Gets the column at which this error occurs.
-	 * 
-	 * @return	Error column or <code>-1</code> if unknown.
-	 */
-	public final int getErrorColumn(){
-		return errorColumn;
-	}
-
 	/*
 	 * Constructors of various flavors follow.
 	 */
@@ -162,8 +136,6 @@ public class TokenMgrError extends Error {
 	/** 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);
-		this.errorLine = errorLine;
-		this.errorColumn = errorColumn;
 	}
 }
-/* JavaCC - OriginalChecksum=be62b718c6ea188d507367a8560343a1 (do not edit this line) */
+/* JavaCC - OriginalChecksum=f63fc7c10226c13ff5a304e2fb1ae182 (do not edit this line) */
diff --git a/src/adql/parser/TokenMgrError.java.backup b/src/adql/parser/TokenMgrError.java.backup
index 152db90ac5100957b182443f11a7c673eca2d0e7..10af73d9a9a7ad0fbeacafbdd664ed307e41635e 100644
--- a/src/adql/parser/TokenMgrError.java.backup
+++ b/src/adql/parser/TokenMgrError.java.backup
@@ -1,18 +1,9 @@
-/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 5.0 */
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 6.0 */
 /* JavaCCOptions: */
 package adql.parser;
 
 /** Token Manager Error. */
-/**
- * TODO Javadoc of TokenMgrError !
- * 
- * @author Gr&eacute;gory Mantelet (CDS)
- * @version 08/2011
- * 
- */
-@SuppressWarnings("all")
-public class TokenMgrError extends Error
-{
+public class TokenMgrError extends Error {
 
 	/**
 	 * The version identifier for this Serializable class.
@@ -51,56 +42,49 @@ public class TokenMgrError extends Error
 	 */
 	int errorCode;
 
-	/** Indicates the line at which the error occurs. */
-	int errorLine = -1;
-
-	/** Indicates the column at which the error occurs. */
-	int errorColumn = -1;
-
 	/**
 	 * Replaces unprintable characters by their escaped (or unicode escaped)
 	 * equivalents in the given string
 	 */
-	protected static final String addEscapes(String str) {
+	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;
+		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();
@@ -118,12 +102,8 @@ public class TokenMgrError extends Error
 	 *    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) + "\"");
+	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) + "\"");
 	}
 
 	/**
@@ -135,47 +115,27 @@ public class TokenMgrError extends Error
 	 *
 	 * from this method for such cases in the release version of your parser.
 	 */
-	public String getMessage() {
+	@Override
+	public String getMessage(){
 		return super.getMessage();
 	}
 
-	/**
-	 * Gets the line at which this error occurs.
-	 * 
-	 * @return	Error line or <code>-1</code> if unknown.
-	 */
-	public final int getErrorLine(){
-		return errorLine;
-	}
-
-	/**
-	 * Gets the column at which this error occurs.
-	 * 
-	 * @return	Error column or <code>-1</code> if unknown.
-	 */
-	public final int getErrorColumn(){
-		return errorColumn;
-	}
-
 	/*
 	 * Constructors of various flavors follow.
 	 */
 
 	/** No arg constructor. */
-	public TokenMgrError() {
-	}
+	public TokenMgrError(){}
 
 	/** Constructor with message and reason. */
-	public TokenMgrError(String message, int 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) {
+	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);
-		this.errorLine = errorLine;
-		this.errorColumn = errorColumn;
 	}
 }
-/* JavaCC - OriginalChecksum=be62b718c6ea188d507367a8560343a1 (do not edit this line) */
+/* JavaCC - OriginalChecksum=f63fc7c10226c13ff5a304e2fb1ae182 (do not edit this line) */
diff --git a/src/adql/parser/adqlGrammar.jj b/src/adql/parser/adqlGrammar.jj
index 2abf0ddc9ba5203f2f5a8c98a7f0c03e28ac2cd4..c0106f9e130a540bdc1f2de0a72e48148c6d145c 100644
--- a/src/adql/parser/adqlGrammar.jj
+++ b/src/adql/parser/adqlGrammar.jj
@@ -20,7 +20,7 @@
 
 /*
 *  This JavaCC file implements the BNF definition of ADQL v2.0 (IVOA Recommendation 30 Oct 2008 - http://www.ivoa.net/Documents/cover/ADQL-20081030.html).
-*  To generate the parser with this file use JavaCC. This .jj file has been successfully tested with JavaCC 5.0.
+*  To generate the parser with this file use JavaCC. This .jj file has been successfully tested with JavaCC 6.0.
 *  
 *  The generated parser checks the syntax of the given ADQL query and generates an object representation but no coherence with any database is done.
 *  If the syntax is not conform to the ADQL definition an error message is printed else it will be the message "Correct syntax".