Support for "==" relation (TT_EQEQ)
[cql-java-moved-to-github.git] / src / org / z3950 / zing / cql / CQLParser.java
index 6d49c56..b23506c 100644 (file)
@@ -1,4 +1,4 @@
-// $Id: CQLParser.java,v 1.33 2007-06-29 12:27:08 mike Exp $
+// $Id: CQLParser.java,v 1.36 2007-06-29 15:39:09 mike Exp $
 
 package org.z3950.zing.cql;
 import java.io.IOException;
@@ -12,15 +12,44 @@ import java.io.FileNotFoundException;
 /**
  * Compiles CQL strings into parse trees of CQLNode subtypes.
  *
- * @version    $Id: CQLParser.java,v 1.33 2007-06-29 12:27:08 mike Exp $
+ * @version    $Id: CQLParser.java,v 1.36 2007-06-29 15:39:09 mike Exp $
  * @see                <A href="http://zing.z3950.org/cql/index.html"
  *                     >http://zing.z3950.org/cql/index.html</A>
  */
 public class CQLParser {
     private CQLLexer lexer;
+    private int compat;        // When false, implement CQL 1.2
+    public static int V1POINT1 = 12368;
+    public static int V1POINT2 = 12369;
+    public static int V1POINT1SORT = 12370;
+
     static private boolean DEBUG = false;
     static private boolean LEXDEBUG = false;
 
+    /**
+     * The new parser implements a dialect of CQL specified by the
+     * <tt>compat</tt> argument:
+     * <ul>
+     *  <li>V1POINT1 - CQL version 1.1
+     *  </li>
+     *  <li>V1POINT2 - CQL version 1.2
+     *  </li>
+     *  <li>V1POINT1SORT - CQL version 1.1 but including
+     *         <tt>sortby</tt> as specified for CQL 1.2.
+     *  </li>
+     * </ul>
+     */
+    CQLParser(int compat) {
+       this.compat = compat;
+    }
+
+    /**
+     * The new parser implements CQL 1.2
+     */
+    CQLParser() {
+       this.compat = V1POINT2;
+    }
+
     private static void debug(String str) {
        if (DEBUG)
            System.err.println("PARSEDEBUG: " + str);
@@ -48,7 +77,8 @@ public class CQLParser {
 
        lexer.nextToken();
        debug("about to parseQuery()");
-       CQLNode root = parseQuery("srw.serverChoice", new CQLRelation("scr"));
+       CQLNode root = parseQuery("cql.serverChoice",
+                                 new CQLRelation(compat == V1POINT2 ? "=" : "scr"));
        if (lexer.ttype != lexer.TT_EOF)
            throw new CQLParseException("junk after end: " + lexer.render());
 
@@ -173,7 +203,8 @@ public class CQLParser {
                lexer.ttype == '=' ||
                lexer.ttype == lexer.TT_LE ||
                lexer.ttype == lexer.TT_GE ||
-               lexer.ttype == lexer.TT_NE);
+               lexer.ttype == lexer.TT_NE ||
+               lexer.ttype == lexer.TT_EQEQ);
     }
 
     private void match(int token)
@@ -204,13 +235,7 @@ public class CQLParser {
            lexer.ttype == lexer.TT_AND ||
            lexer.ttype == lexer.TT_OR ||
            lexer.ttype == lexer.TT_NOT ||
-           lexer.ttype == lexer.TT_PROX ||
-           lexer.ttype == lexer.TT_pWORD ||
-           lexer.ttype == lexer.TT_SENTENCE ||
-           lexer.ttype == lexer.TT_PARAGRAPH ||
-           lexer.ttype == lexer.TT_ELEMENT ||
-           lexer.ttype == lexer.TT_ORDERED ||
-           lexer.ttype == lexer.TT_UNORDERED) {
+           lexer.ttype == lexer.TT_PROX) {
            String symbol = (lexer.ttype == lexer.TT_NUMBER) ?
                lexer.render() : lexer.sval;
            match(lexer.ttype);
@@ -269,6 +294,10 @@ public class CQLParser {
      * &lt;/triple&gt;
      * </PRE>
      * <P>
+     * @param -1
+     * CQL version 1.1 (default version 1.2)
+     * @param -d
+     * Debug mode: extra output written to stderr.
      * @param -c
      * Causes the output to be written in CQL rather than XCQL - that
      * is, a query equivalent to that which was input, is output.  In
@@ -286,6 +315,12 @@ public class CQLParser {
            argv.add(args[i]);
        }
 
+       int compat = V1POINT2;
+       if (argv.size() > 0 && argv.get(0).equals("-1")) {
+           compat = V1POINT1;
+           argv.remove(0);
+       }
+
        if (argv.size() > 0 && argv.get(0).equals("-d")) {
            DEBUG = true;
            argv.remove(0);
@@ -302,7 +337,8 @@ public class CQLParser {
        }
 
        if (argv.size() > 1) {
-           System.err.println("Usage: CQLParser [-d] [-c] [-p <pqf-properties> [<CQL-query>]");
+           System.err.println("Usage: CQLParser [-1] [-d] [-c] " +
+                              "[-p <pqf-properties> [<CQL-query>]");
            System.err.println("If unspecified, query is read from stdin");
            System.exit(1);
        }
@@ -322,7 +358,7 @@ public class CQLParser {
            cql = new String(bytes);
        }
 
-       CQLParser parser = new CQLParser();
+       CQLParser parser = new CQLParser(compat);
        CQLNode root = null;
        try {
            root = parser.parse(cql);