diff --git a/sound/forked-daapd/Makefile b/sound/forked-daapd/Makefile
new file mode 100644
index 000000000..585fa4fe1
--- /dev/null
+++ b/sound/forked-daapd/Makefile
@@ -0,0 +1,66 @@
+#
+# Copyright (C) 2006-2014 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=forked-daapd
+PKG_VERSION:=22.0
+PKG_RELEASE:=20141016
+PKG_REV:=61a4da215c05b621951aa3903d7d390fd1839537
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL:=git://github.com/ejurgensen/forked-daapd.git
+PKG_SOURCE_VERSION:=$(PKG_REV)
+PKG_FIXUP:=autoreconf
+PKG_USE_MIPS16:=0
+PKG_INSTALL:=1
+
+PKG_MAINTAINER:=Espen Jürgensen <espenjurgensen+openwrt@gmail.com>
+PKG_LICENSE:=GPL-2.0
+PKG_LICENSE_FILES:=COPYING
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/forked-daapd
+SECTION:=sound
+CATEGORY:=Sound
+TITLE:=Improved iTunes (DAAP) server. Support for Apple Remote and AirPlay.
+URL:=https://github.com/ejurgensen/forked-daapd
+DEPENDS:=+libgpg-error +libgcrypt +libgdbm +zlib +libexpat +libunistring \
+	+libevent +libdaemon +libantlr3c +confuse +glib2 +alsa-lib +libffmpeg-full \
+	+mxml +libavl +avahi-daemon +libavahi-client +sqlite3-cli +libplist
+endef
+
+define Package/forked-daapd/conffiles
+/etc/forked-daapd.conf
+endef
+
+CONFIGURE_ARGS += \
+	--enable-itunes
+
+# Fix for libevent
+TARGET_CPPFLAGS += -I$(STAGING_DIR)/usr/include/libevent
+TARGET_LDFLAGS += -L$(STAGING_DIR)/usr/lib/libevent
+
+TARGET_CFLAGS += $(FPIC)
+TARGET_LDFLAGS += -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
+
+define Package/forked-daapd/install
+	$(INSTALL_DIR) $(1)/etc
+	$(INSTALL_DATA) ./files/forked-daapd.conf $(1)/etc/
+	$(INSTALL_DIR) $(1)/usr/lib
+	$(INSTALL_DIR) $(1)/usr/lib/forked-daapd
+	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/forked-daapd/* $(1)/usr/lib/forked-daapd/
+	$(INSTALL_DIR) $(1)/usr/sbin
+	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/forked-daapd $(1)/usr/sbin/
+	$(INSTALL_DIR) $(1)/etc/init.d
+	$(INSTALL_BIN) ./files/forked-daapd.init $(1)/etc/init.d/forked-daapd
+endef
+
+$(eval $(call BuildPackage,forked-daapd))
diff --git a/sound/forked-daapd/files/forked-daapd.conf b/sound/forked-daapd/files/forked-daapd.conf
new file mode 100644
index 000000000..e0b3c0ccb
--- /dev/null
+++ b/sound/forked-daapd/files/forked-daapd.conf
@@ -0,0 +1,139 @@
+# A quick guide to configuring forked-daapd:
+#
+# For regular use, the most important setting to configure is "directories",
+# which should be the location of your media. Whatever user you have set as
+# "uid" must have read access to this location. Also make sure to add the user.
+# If the location is a network mount, please see the README.
+#
+# In all likelihood, that's all you need to do!
+
+general {
+	# Username
+	uid = "daapd"
+	logfile = "/var/log/forked-daapd.log"
+	# Database location
+	db_path = "/var/run/forked-daapd.db"
+	# Available levels: fatal, log, warning, info, debug, spam
+	loglevel = log
+	# Admin password for the non-existent web interface
+	admin_password = "unused"
+	# Enable/disable IPv6
+	ipv6 = no
+	# Location of DAAP cache
+	daapcache_path = "/var/run/daapcache.db"
+	# DAAP requests that take longer than this threshold (in msec) get their
+	# replies cached for next time. Set to 0 to disable caching.
+#	daapcache_threshold = 1000
+}
+
+# Library configuration
+library {
+	# Name of the library as displayed by the clients
+	# %h: hostname, %v: version
+	name = "My Music on %h"
+	# TCP port to listen on. Default port is 3689 (daap)
+	port = 3689
+	# Password for the library. Optional.
+#	password = ""
+
+	# Directories to index
+	directories = { "/srv/music" }
+
+	# Directories containing podcasts
+	# For each directory that is indexed the path is matched against these
+	# names. If there is a match all items in the directory are marked as 
+	# podcasts. Eg. if you index /srv/music, and your podcasts are in
+	# /srv/music/Podcasts, you can set this to "/Podcasts".
+	# (changing this setting only takes effect after rescan, see the README)
+	podcasts = { "/Podcasts" }
+
+	# Directories containing audiobooks
+	# For each directory that is indexed the path is matched against these
+	# names. If there is a match all items in the directory are marked as 
+	# audiobooks.
+	# (changing this setting only takes effect after rescan, see the README)
+	audiobooks = { "/Audiobooks" }
+
+	# Directories containing compilations (eg soundtracks)
+	# For each directory that is indexed the path is matched against these
+	# names. If there is a match all items in the directory are marked as 
+	# compilations.
+	# (changing this setting only takes effect after rescan, see the README)
+	compilations = { "/Compilations" }
+
+	# Compilations usually have many artists, and if you don't want every
+	# artist to be listed when artist browsing in Remote, you can set
+	# a single name which will be used for all music in the compilation dir
+	# (changing this setting only takes effect after rescan, see the README)
+	compilation_artist = "Various artists"
+
+	# There are 5 default playlists: "Library", "Music", "Movies", "TV Shows"
+	# and "Podcasts". Here you can change the names of these playlists.
+#	name_library    = "Library"
+#	name_music      = "Music"
+#	name_movies     = "Movies"
+#	name_tvshows    = "TV Shows"
+#	name_podcasts   = "Podcasts"
+#	name_audiobooks = "Audiobooks"
+
+	# Artwork file names (without file type extension)
+	# forked-daapd will look for jpg and png files with these base names
+#	artwork_basenames = { "artwork", "cover", "Folder" }
+
+	# File types the scanner should ignore
+	# Non-audio files will never be added to the database, but here you
+	# can prevent the scanner from even probing them. This might improve
+	# scan time. By default .db and .ini are ignored.
+#	filetypes_ignore = { ".db", ".ini" }
+
+	# Disable startup file scanning
+	# When forked-daapd starts it will do an initial file scan of your
+	# library (and then watch it for changes). If you are sure your library
+	# never changes while forked-daapd is not running, you can disable the
+	# initial file scan and save some system ressources. Disabling this scan
+	# may lead to forked-daapd's database coming out of sync with the
+	# library. If that happens read the instructions in the README on how
+	# to trigger a full rescan.
+#	filescan_disable = false
+
+	# Should iTunes metadata override ours?
+#	itunes_overrides = false
+
+	# Formats: mp4a, mp4v, mpeg, alac, flac, mpc, ogg, wma, wmal, wmav, aif, wav
+	# Formats that should never be transcoded
+#	no_transcode = { "alac", "mp4a" }
+	# Formats that should always be transcoded
+#	force_transcode = { "ogg", "flac" }
+}
+
+# Local audio output
+audio {
+	# Name - used in the speaker list in Remote
+	nickname = "OpenWrt"
+	# Audio device name for local audio output
+#	card = "default"
+	# Mixer channel to use for volume control - ALSA/Linux only
+	# If not set, PCM will be used if available, otherwise Master.
+#	mixer = ""
+}
+
+# AirPlay/Airport Express device settings
+# (make sure you get the capitalization of the device name right)
+#airplay "My AirPlay device" {
+	# forked-daapd's volume goes to 11! If that's more than you can handle
+	# you can set a lower value here
+#	max_volume = 11
+	# AirPlay password
+#	password = "s1kr3t"
+#}
+
+# Spotify settings (only have effect if Spotify enabled - see README/INSTALL)
+spotify {
+	# Directory where user settings should be stored (credentials)
+#	settings_dir = "/var/cache/forked-daapd/libspotify"
+	# Cache directory
+#	cache_dir = "/tmp"
+	# Set preferred bitrate for music streaming
+	# 0: No preference (default), 1: 96kbps, 2: 160kbps, 3: 320kbps
+#	bitrate = 0
+}
diff --git a/sound/forked-daapd/files/forked-daapd.init b/sound/forked-daapd/files/forked-daapd.init
new file mode 100644
index 000000000..3ae38f9ab
--- /dev/null
+++ b/sound/forked-daapd/files/forked-daapd.init
@@ -0,0 +1,15 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2014 OpenWrt.org
+
+START=99
+BIN=/usr/sbin/forked-daapd
+PID=/var/run/forked-daapd.pid
+SSD=start-stop-daemon
+
+start() {
+        $SSD -p $PID -S -x $BIN -- -P $PID
+}
+	
+stop() {
+        $SSD -p $PID -K -s SIGINT
+}
diff --git a/sound/forked-daapd/patches/010-include_pregen.patch b/sound/forked-daapd/patches/010-include_pregen.patch
new file mode 100644
index 000000000..2518ddae1
--- /dev/null
+++ b/sound/forked-daapd/patches/010-include_pregen.patch
@@ -0,0 +1,14782 @@
+diff --git a/src/pregen/DAAP.u b/src/pregen/DAAP.u
+new file mode 100644
+index 0000000..3de527b
+--- /dev/null
++++ b/src/pregen/DAAP.u
+@@ -0,0 +1,6 @@
++DAAPParser.c : DAAP.g
++./DAAP.tokens : DAAP.g
++DAAPParser.h : DAAP.g
++DAAPLexer.c : DAAP.g
++DAAPLexer.h : DAAP.g
++ANTLR_PRODUCTS += DAAPParser.c ./DAAP.tokens DAAPParser.h DAAPLexer.c DAAPLexer.h 
+\ No newline at end of file
+diff --git a/src/pregen/DAAP2SQL.c b/src/pregen/DAAP2SQL.c
+new file mode 100644
+index 0000000..3f94589
+--- /dev/null
++++ b/src/pregen/DAAP2SQL.c
+@@ -0,0 +1,929 @@
++/** \file
++ *  This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : DAAP2SQL.g
++ *     -                            On : 2014-09-30 21:42:43
++ *     -           for the tree parser : DAAP2SQLTreeParser *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++*/
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++
++/* =============================================================================
++ * This is what the grammar programmer asked us to put at the top of every file.
++ */
++
++	#include <stdio.h>
++	#include <stdlib.h>
++	#include <string.h>
++	#include <limits.h>
++	#include <errno.h>
++
++	#include "logger.h"
++	#include "db.h"
++	#include "daap_query.h"
++
++/* End of Header action.
++ * =============================================================================
++ */
++/* -----------------------------------------
++ * Include the ANTLR3 generated header file.
++ */
++#include    "DAAP2SQL.h"
++/* ----------------------------------------- */
++
++
++
++
++
++/* MACROS that hide the C interface implementations from the
++ * generated code, which makes it a little more understandable to the human eye.
++ * I am very much against using C pre-processor macros for function calls and bits
++ * of code as you cannot see what is happening when single stepping in debuggers
++ * and so on. The exception (in my book at least) is for generated code, where you are
++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
++ * hides some indirect calls, but is always referring to the input stream. This is
++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
++ * the runtime interfaces without changing the generated code too often, without
++ * confusing the reader of the generated output, who may not wish to know the gory
++ * details of the interface inheritance.
++ */
++ 
++#define		CTX	ctx
++
++/* Aids in accessing scopes for grammar programmers
++ */
++#undef	SCOPE_TYPE
++#undef	SCOPE_STACK
++#undef	SCOPE_TOP
++#define	SCOPE_TYPE(scope)   pDAAP2SQL_##scope##_SCOPE
++#define SCOPE_STACK(scope)  pDAAP2SQL_##scope##Stack
++#define	SCOPE_TOP(scope)    ctx->pDAAP2SQL_##scope##Top
++#define	SCOPE_SIZE(scope)		ctx->pDAAP2SQL_##scope##Stack_limit
++#define SCOPE_INSTANCE(scope, i)	(ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
++
++/* Macros for accessing things in the parser
++ */
++ 
++#undef	    PARSER
++#undef	    RECOGNIZER		    
++#undef	    HAVEPARSEDRULE
++#undef	    INPUT
++#undef	    STRSTREAM
++#undef	    HASEXCEPTION
++#undef	    EXCEPTION
++#undef	    MATCHT
++#undef	    MATCHANYT
++#undef	    FOLLOWSTACK
++#undef	    FOLLOWPUSH
++#undef	    FOLLOWPOP
++#undef	    PRECOVER
++#undef	    PREPORTERROR
++#undef	    LA
++#undef	    LT
++#undef	    CONSTRUCTEX
++#undef	    CONSUME
++#undef	    MARK
++#undef	    REWIND
++#undef	    REWINDLAST
++#undef	    PERRORRECOVERY
++#undef	    HASFAILED
++#undef	    FAILEDFLAG
++#undef	    RECOVERFROMMISMATCHEDSET
++#undef	    RECOVERFROMMISMATCHEDELEMENT
++#undef	    BACKTRACKING
++#undef      ADAPTOR
++#undef	    RULEMEMO		
++#undef		SEEK    
++#undef		INDEX
++#undef		DBG
++
++#define	    PARSER							ctx->pTreeParser  
++#define	    RECOGNIZER						PARSER->rec
++#define		PSRSTATE						RECOGNIZER->state
++#define	    HAVEPARSEDRULE(r)				RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
++#define	    INPUT							PARSER->ctnstream
++#define		ISTREAM							INPUT->tnstream->istream
++#define	    STRSTREAM						INPUT->tnstream
++#define	    HASEXCEPTION()					(PSRSTATE->error == ANTLR3_TRUE)
++#define	    EXCEPTION						PSRSTATE->exception
++#define	    MATCHT(t, fs)					RECOGNIZER->match(RECOGNIZER, t, fs)
++#define	    MATCHANYT()						RECOGNIZER->matchAny(RECOGNIZER)
++#define	    FOLLOWSTACK					    PSRSTATE->following
++#define	    FOLLOWPUSH(x)					FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
++#define	    FOLLOWPOP()						FOLLOWSTACK->pop(FOLLOWSTACK)
++#define	    PRECOVER()						RECOGNIZER->recover(RECOGNIZER)
++#define	    PREPORTERROR()					RECOGNIZER->reportError(RECOGNIZER)
++#define	    LA(n)							ISTREAM->_LA(ISTREAM, n)
++#define	    LT(n)							INPUT->tnstream->_LT(INPUT->tnstream, n)
++#define	    CONSTRUCTEX()					RECOGNIZER->exConstruct(RECOGNIZER)
++#define	    CONSUME()						ISTREAM->consume(ISTREAM)
++#define	    MARK()							ISTREAM->mark(ISTREAM)
++#define	    REWIND(m)						ISTREAM->rewind(ISTREAM, m)
++#define	    REWINDLAST()					ISTREAM->rewindLast(ISTREAM)
++#define	    PERRORRECOVERY					PSRSTATE->errorRecovery
++#define	    FAILEDFLAG						PSRSTATE->failed
++#define	    HASFAILED()						(FAILEDFLAG == ANTLR3_TRUE)
++#define	    BACKTRACKING					PSRSTATE->backtracking
++#define	    RECOVERFROMMISMATCHEDSET(s)		RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
++#define	    RECOVERFROMMISMATCHEDELEMENT(e)	RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
++#define     ADAPTOR                         INPUT->adaptor
++#define		RULEMEMO						PSRSTATE->ruleMemo
++#define		SEEK(n)							ISTREAM->seek(ISTREAM, n)
++#define		INDEX()							ISTREAM->index(ISTREAM)
++#define		DBG								RECOGNIZER->debugger
++
++
++#define		TOKTEXT(tok, txt)				tok, (pANTLR3_UINT8)txt
++
++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
++ * then for the present you must use different names for your defines as these are hard coded
++ * in the code generator. It would be better not to use such names internally, and maybe
++ * we can change this in a forthcoming release. I deliberately do not #undef these
++ * here as this will at least give you a redefined error somewhere if they clash.
++ */
++#define	    UP	    ANTLR3_TOKEN_UP
++#define	    DOWN    ANTLR3_TOKEN_DOWN
++#define	    EOR	    ANTLR3_TOKEN_EOR
++#define	    INVALID ANTLR3_TOKEN_INVALID
++
++
++/* =============================================================================
++ * Functions to create and destroy scopes. First come the rule scopes, followed
++ * by the global declared scopes.
++ */
++
++
++
++/* ============================================================================= */
++
++/* =============================================================================
++ * Start of recognizer
++ */
++
++
++
++/** \brief Table of all token names in symbolic order, mainly used for
++ *         error reporting.
++ */
++pANTLR3_UINT8   DAAP2SQLTokenNames[8+4]
++     = {
++        (pANTLR3_UINT8) "<invalid>",       /* String to print to indicate an invalid token */
++        (pANTLR3_UINT8) "<EOR>",
++        (pANTLR3_UINT8) "<DOWN>", 
++        (pANTLR3_UINT8) "<UP>", 
++        (pANTLR3_UINT8) "NEWLINE",
++        (pANTLR3_UINT8) "OPOR",
++        (pANTLR3_UINT8) "OPAND",
++        (pANTLR3_UINT8) "LPAR",
++        (pANTLR3_UINT8) "RPAR",
++        (pANTLR3_UINT8) "STR",
++        (pANTLR3_UINT8) "QUOTE",
++        (pANTLR3_UINT8) "ESCAPED"
++       };
++
++        
++
++// Forward declare the locally static matching functions we have generated.
++//
++static pANTLR3_STRING	query    (pDAAP2SQL ctx);
++static DAAP2SQL_expr_return	expr    (pDAAP2SQL ctx);
++static void	DAAP2SQLFree(pDAAP2SQL ctx);
++/* For use in tree output where we are accumulating rule labels via label += ruleRef
++ * we need a function that knows how to free a return scope when the list is destroyed. 
++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
++ */
++static	void ANTLR3_CDECL freeScope(void * scope)
++{
++    ANTLR3_FREE(scope);
++}
++
++/** \brief Name of the grammar file that generated this code
++ */
++static const char fileName[] = "DAAP2SQL.g";
++
++/** \brief Return the name of the grammar file that generated this code.
++ */
++static const char * getGrammarFileName()
++{
++	return fileName;
++}
++/** \brief Create a new DAAP2SQL parser and return a context for it.
++ *
++ * \param[in] instream Pointer to an input stream interface.
++ *
++ * \return Pointer to new parser context upon success.
++ */
++ANTLR3_API pDAAP2SQL
++DAAP2SQLNew   (pANTLR3_COMMON_TREE_NODE_STREAM instream)
++{
++	// See if we can create a new parser with the standard constructor
++	//
++	return DAAP2SQLNewSSD(instream, NULL);
++}
++
++/** \brief Create a new DAAP2SQL parser and return a context for it.
++ *
++ * \param[in] instream Pointer to an input stream interface.
++ *
++ * \return Pointer to new parser context upon success.
++ */
++ANTLR3_API pDAAP2SQL
++DAAP2SQLNewSSD   (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
++{
++    pDAAP2SQL ctx;	    /* Context structure we will build and return   */
++    
++    ctx	= (pDAAP2SQL) ANTLR3_CALLOC(1, sizeof(DAAP2SQL));
++    
++    if	(ctx == NULL)
++    {
++		// Failed to allocate memory for parser context
++		//
++        return  NULL;
++    }
++    
++    /* -------------------------------------------------------------------
++     * Memory for basic structure is allocated, now to fill in
++     * the base ANTLR3 structures. We initialize the function pointers
++     * for the standard ANTLR3 parser function set, but upon return
++     * from here, the programmer may set the pointers to provide custom
++     * implementations of each function. 
++     *
++     * We don't use the macros defined in DAAP2SQL.h here, in order that you can get a sense
++     * of what goes where.
++     */
++
++    /* Create a base Tree parser/recognizer, using the supplied tree node stream
++     */
++    ctx->pTreeParser		= antlr3TreeParserNewStream(ANTLR3_SIZE_HINT, instream, state);
++    /* Install the implementation of our DAAP2SQL interface
++     */
++    ctx->query	= query;
++    ctx->expr	= expr;
++    ctx->free			= DAAP2SQLFree;
++    ctx->getGrammarFileName	= getGrammarFileName;
++    
++    /* Install the scope pushing methods.
++     */
++
++        
++    
++
++	
++    /* Install the token table
++     */
++    PSRSTATE->tokenNames   = DAAP2SQLTokenNames;
++    
++    
++    /* Return the newly built parser to the caller
++     */
++    return  ctx;
++}
++
++/** Free the parser resources
++ */
++ static void
++ DAAP2SQLFree(pDAAP2SQL ctx)
++ {
++    /* Free any scope memory
++     */
++    
++        
++	// Free this parser
++	//
++    ctx->pTreeParser->free(ctx->pTreeParser);
++    ANTLR3_FREE(ctx);
++
++    /* Everything is released, so we can return
++     */
++    return;
++ }
++ 
++/** Return token names used by this tree parser
++ *
++ * The returned pointer is used as an index into the token names table (using the token 
++ * number as the index).
++ * 
++ * \return Pointer to first char * in the table.
++ */
++static pANTLR3_UINT8    *getTokenNames() 
++{
++        return DAAP2SQLTokenNames; 
++}
++
++
++    	struct dmap_query_field_map {
++    	  char *dmap_field;
++    	  char *db_col;
++    	  int as_int;
++    	};
++
++    	/* gperf static hash, daap_query.gperf */
++    	#include "daap_query_hash.c"
++
++    
++/* Declare the bitsets
++ */
++
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_query70  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_query70_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_query70	= { FOLLOW_expr_in_query70_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OPAND_in_expr95  */
++static	ANTLR3_BITWORD FOLLOW_OPAND_in_expr95_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_OPAND_in_expr95	= { FOLLOW_OPAND_in_expr95_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr101  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_expr101_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000260) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_expr101	= { FOLLOW_expr_in_expr101_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr107  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_expr107_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_expr107	= { FOLLOW_expr_in_expr107_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OPOR_in_expr118  */
++static	ANTLR3_BITWORD FOLLOW_OPOR_in_expr118_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_OPOR_in_expr118	= { FOLLOW_OPOR_in_expr118_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr124  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_expr124_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000260) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_expr124	= { FOLLOW_expr_in_expr124_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr130  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_expr130_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_expr130	= { FOLLOW_expr_in_expr130_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_expr140  */
++static	ANTLR3_BITWORD FOLLOW_STR_in_expr140_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_STR_in_expr140	= { FOLLOW_STR_in_expr140_bits, 1	};
++     
++
++ 
++ 
++/* ==============================================
++ * Parsing rules
++ */
++/** 
++ * $ANTLR start query
++ * DAAP2SQL.g:50:1: query returns [ pANTLR3_STRING result ] : e= expr ;
++ */
++static pANTLR3_STRING
++query(pDAAP2SQL ctx)
++{   
++    pANTLR3_STRING result = NULL;
++
++    DAAP2SQL_expr_return e;
++    #undef	RETURN_TYPE_e
++    #define	RETURN_TYPE_e DAAP2SQL_expr_return
++
++    /* Initialize rule variables
++     */
++
++
++     result= NULL; 
++    {
++        // DAAP2SQL.g:52:2: (e= expr )
++        // DAAP2SQL.g:52:4: e= expr
++        {
++            FOLLOWPUSH(FOLLOW_expr_in_query70);
++            e=expr(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto rulequeryEx;
++            }
++
++            {
++
++                			if (!e.valid)
++                			{
++                				result= NULL;
++                			}
++                			else
++                			{
++                				result= e.result->factory->newRaw(e.result->factory);
++                				result->append8(result, "(");
++                				result->appendS(result, e.result);
++                				result->append8(result, ")");
++                			}
++                		
++            }
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulequeryEx; /* Prevent compiler warnings */
++    rulequeryEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return result;
++}
++/* $ANTLR end query */
++
++/** 
++ * $ANTLR start expr
++ * DAAP2SQL.g:68:1: expr returns [ pANTLR3_STRING result, int valid ] : ( ^( OPAND a= expr b= expr ) | ^( OPOR a= expr b= expr ) | STR );
++ */
++static DAAP2SQL_expr_return
++expr(pDAAP2SQL ctx)
++{   
++    DAAP2SQL_expr_return retval;
++
++    pANTLR3_BASE_TREE    STR1;
++    DAAP2SQL_expr_return a;
++    #undef	RETURN_TYPE_a
++    #define	RETURN_TYPE_a DAAP2SQL_expr_return
++
++    DAAP2SQL_expr_return b;
++    #undef	RETURN_TYPE_b
++    #define	RETURN_TYPE_b DAAP2SQL_expr_return
++
++    /* Initialize rule variables
++     */
++
++
++     retval.result= NULL; retval.valid= 1; 
++    STR1       = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    {
++        {
++            //  DAAP2SQL.g:70:2: ( ^( OPAND a= expr b= expr ) | ^( OPOR a= expr b= expr ) | STR )
++            
++            ANTLR3_UINT32 alt1;
++
++            alt1=3;
++
++            switch ( LA(1) ) 
++            {
++            case OPAND:
++            	{
++            		alt1=1;
++            	}
++                break;
++            case OPOR:
++            	{
++            		alt1=2;
++            	}
++                break;
++            case STR:
++            	{
++            		alt1=3;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 1;
++                EXCEPTION->state        = 0;
++
++
++                goto ruleexprEx;
++            }
++
++            switch (alt1) 
++            {
++        	case 1:
++        	    // DAAP2SQL.g:70:4: ^( OPAND a= expr b= expr )
++        	    {
++        	         MATCHT(OPAND, &FOLLOW_OPAND_in_expr95); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_expr101);
++        	        a=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_expr107);
++        	        b=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_UP, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			if (!a.valid || !b.valid)
++        	            			{
++        	            				retval.valid= 0;
++        	            			}
++        	            			else
++        	            			{
++        	            				retval.result= a.result->factory->newRaw(a.result->factory);
++        	            				retval.result->append8(retval.result, "(");
++        	            				retval.result->appendS(retval.result, a.result);
++        	            				retval.result->append8(retval.result, " AND ");
++        	            				retval.result->appendS(retval.result, b.result);
++        	            				retval.result->append8(retval.result, ")");
++        	            			}
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // DAAP2SQL.g:86:4: ^( OPOR a= expr b= expr )
++        	    {
++        	         MATCHT(OPOR, &FOLLOW_OPOR_in_expr118); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_expr124);
++        	        a=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_expr130);
++        	        b=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_UP, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			if (!a.valid || !b.valid)
++        	            			{
++        	            				retval.valid= 0;
++        	            			}
++        	            			else
++        	            			{
++        	            				retval.result= a.result->factory->newRaw(a.result->factory);
++        	            				retval.result->append8(retval.result, "(");
++        	            				retval.result->appendS(retval.result, a.result);
++        	            				retval.result->append8(retval.result, " OR ");
++        	            				retval.result->appendS(retval.result, b.result);
++        	            				retval.result->append8(retval.result, ")");
++        	            			}
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 3:
++        	    // DAAP2SQL.g:102:4: STR
++        	    {
++        	        STR1 = (pANTLR3_BASE_TREE) MATCHT(STR, &FOLLOW_STR_in_expr140); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			pANTLR3_STRING str;
++        	            			pANTLR3_UINT8 field;
++        	            			pANTLR3_UINT8 val;
++        	            			pANTLR3_UINT8 escaped;
++        	            			ANTLR3_UINT8 op;
++        	            			int neg_op;
++        	            			const struct dmap_query_field_map *dqfm;
++        	            			char *end;
++        	            			long long llval;
++
++        	            			escaped = NULL;
++
++        	            			retval.result= (STR1->getText(STR1))->factory->newRaw((STR1->getText(STR1))->factory);
++
++        	            			str = (STR1->getText(STR1))->toUTF8((STR1->getText(STR1)));
++
++        	            			/* NOTE: the lexer delivers the string without quotes
++        	            			which may not be obvious from the grammar due to embedded code
++        	            			*/
++
++        	            			/* Make daap.songalbumid:0 a no-op */
++        	            			if (strcmp((char *)str->chars, "daap.songalbumid:0") == 0)
++        	            			{
++        	            				retval.result->append8(retval.result, "1 = 1");
++
++        	            				goto STR_out;
++        	            			}
++
++        	            			field = str->chars;
++
++        	            			val = field;
++        	            			while ((*val != '\0') && ((*val == '.')
++        	            				|| (*val == '-')
++        	            				|| ((*val >= 'a') && (*val <= 'z'))
++        	            				|| ((*val >= 'A') && (*val <= 'Z'))
++        	            				|| ((*val >= '0') && (*val <= '9'))))
++        	            			{
++        	            				val++;
++        	            			}
++
++        	            			if (*field == '\0')
++        	            			{
++        	            				DPRINTF(E_LOG, L_DAAP, "No field name found in clause '%s'\n", field);
++        	            				retval.valid= 0;
++        	            				goto STR_result_valid_0; /* ABORT */
++        	            			}
++
++        	            			if (*val == '\0')
++        	            			{
++        	            				DPRINTF(E_LOG, L_DAAP, "No operator found in clause '%s'\n", field);
++        	            				retval.valid= 0;
++        	            				goto STR_result_valid_0; /* ABORT */
++        	            			}
++
++        	            			op = *val;
++        	            			*val = '\0';
++        	            			val++;
++
++        	            			if (op == '!')
++        	            			{
++        	            				if (*val == '\0')
++        	            				{
++        	            					DPRINTF(E_LOG, L_DAAP, "Negation found but operator missing in clause '%s%c'\n", field, op);
++        	            					retval.valid= 0;
++        	            					goto STR_result_valid_0; /* ABORT */
++        	            				}
++
++        	            				neg_op = 1;
++        	            				op = *val;
++        	            				val++;
++        	            			}
++        	            			else
++        	            				neg_op = 0;
++
++        	            			/* Lookup DMAP field in the query field map */
++        	            			dqfm = daap_query_field_lookup((char *)field, strlen((char *)field));
++        	            			if (!dqfm)
++        	            			{
++        	            				DPRINTF(E_LOG, L_DAAP, "DMAP field '%s' is not a valid field in queries\n", field);
++        	            				retval.valid= 0;
++        	            				goto STR_result_valid_0; /* ABORT */
++        	            			}
++
++        	            			/* Empty values OK for string fields, NOK for integer */
++        	            			if (*val == '\0')
++        	            			{
++        	            				if (dqfm->as_int)
++        	            				{
++        	            					DPRINTF(E_LOG, L_DAAP, "No value given in clause '%s%s%c'\n", field, (neg_op) ? "!" : "", op);
++        	            					retval.valid= 0;
++        	            					goto STR_result_valid_0; /* ABORT */
++        	            				}
++
++        	            				/* Need to check against NULL too */
++        	            				if (op == ':')
++        	            					retval.result->append8(retval.result, "(");
++        	            			}
++
++        	            			retval.result->append8(retval.result, dqfm->db_col);
++
++        	            			/* Int field: check integer conversion */
++        	            			if (dqfm->as_int)
++        	            			{
++        	            				errno = 0;
++        	            				llval = strtoll((const char *)val, &end, 10);
++
++        	            				if (((errno == ERANGE) && ((llval == LLONG_MAX) || (llval == LLONG_MIN)))
++        	            					|| ((errno != 0) && (llval == 0)))
++        	            				{
++        	            					DPRINTF(E_LOG, L_DAAP, "Value '%s' in clause '%s%s%c%s' does not convert to an integer type\n",
++        	            					val, field, (neg_op) ? "!" : "", op, val);
++        	            					retval.valid= 0;
++        	            					goto STR_result_valid_0; /* ABORT */
++        	            				}
++
++        	            				if (end == (char *)val)
++        	            				{
++        	            					DPRINTF(E_LOG, L_DAAP, "Value '%s' in clause '%s%s%c%s' does not represent an integer value\n",
++        	            					val, field, (neg_op) ? "!" : "", op, val);
++        	            					retval.valid= 0;
++        	            					goto STR_result_valid_0; /* ABORT */
++        	            				}
++
++        	            				*end = '\0'; /* Cut out potential garbage - we're being kind */
++        	            			}
++        	            			/* String field: escape string, check for '*' */
++        	            			else
++        	            			{
++        	            				if (op != ':')
++        	            				{
++        	            					DPRINTF(E_LOG, L_DAAP, "Operation '%c' not valid for string values\n", op);
++        	            					retval.valid= 0;
++        	            					goto STR_result_valid_0; /* ABORT */
++        	            				}
++
++        	            				escaped = (pANTLR3_UINT8)db_escape_string((char *)val);
++        	            				if (!escaped)
++        	            				{
++        	            					DPRINTF(E_LOG, L_DAAP, "Could not escape value\n");
++        	            					retval.valid= 0;
++        	            					goto STR_result_valid_0; /* ABORT */
++        	            				}
++
++        	            				val = escaped;
++
++        	            				if (val[0] == '*')
++        	            				{
++        	            					op = '%';
++        	            					val[0] = '%';
++        	            				}
++
++        	            				if (val[strlen((char *)val) - 1] == '*')
++        	            				{
++        	            					op = '%';
++        	            					val[strlen((char *)val) - 1] = '%';
++        	            				}
++        	            			}
++
++        	            			switch(op)
++        	            			{
++        	            				case ':':
++        	            					if (neg_op)
++        	            						retval.result->append8(retval.result, " <> ");
++        	            					else
++        	            						retval.result->append8(retval.result, " = ");
++        	            					break;
++
++        	            				case '+':
++        	            					if (neg_op)
++        	            						retval.result->append8(retval.result, " <= ");
++        	            					else
++        	            						retval.result->append8(retval.result, " > ");
++        	            					break;
++
++        	            				case '-':
++        	            					if (neg_op)
++        	            						retval.result->append8(retval.result, " >= ");
++        	            					else
++        	            						retval.result->append8(retval.result, " < ");
++        	            					break;
++
++        	            				case '%':
++        	            					retval.result->append8(retval.result, " LIKE ");
++        	            					break;
++
++        	            				default:
++        	            					if (neg_op)
++        	            						DPRINTF(E_LOG, L_DAAP, "Missing or unknown operator '%c' in clause '%s!%c%s'\n", op, field, op, val);
++        	            					else
++        	            						DPRINTF(E_LOG, L_DAAP, "Unknown operator '%c' in clause '%s%c%s'\n", op, field, op, val);
++        	            					retval.valid= 0;
++        	            					goto STR_result_valid_0; /* ABORT */
++        	            					break;
++        	            			}
++
++        	            			if (!dqfm->as_int)
++        	            				retval.result->append8(retval.result, "'");
++        	            	
++        	            			retval.result->append8(retval.result, (const char *)val);
++        	            	
++        	            			if (!dqfm->as_int)
++        	            				retval.result->append8(retval.result, "'");
++
++        	            			/* For empty string value, we need to check against NULL too */
++        	            			if ((*val == '\0') && (op == ':'))
++        	            			{
++        	            				if (neg_op)
++        	            					retval.result->append8(retval.result, " AND ");
++        	            				else
++        	            					retval.result->append8(retval.result, " OR ");
++
++        	            				retval.result->append8(retval.result, dqfm->db_col);
++
++        	            				if (neg_op)
++        	            					retval.result->append8(retval.result, " IS NOT NULL");
++        	            				else
++        	            					retval.result->append8(retval.result, " IS NULL");
++
++        	            				retval.result->append8(retval.result, ")");
++        	            			}
++
++        	            			STR_result_valid_0: /* bail out label */
++        	            				;
++
++        	            			if (escaped)
++        	            				free(escaped);
++
++        	            			STR_out: /* get out of here */
++        	            				;
++        	            		
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleexprEx; /* Prevent compiler warnings */
++    ruleexprEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return retval;
++}
++/* $ANTLR end expr */
++/* End of parsing rules
++ * ==============================================
++ */
++
++/* ==============================================
++ * Syntactic predicates
++ */
++/* End of syntactic predicates
++ * ==============================================
++ */
++
++ 
++ 
++
++
++
++/* End of code
++ * =============================================================================
++ */
+diff --git a/src/pregen/DAAP2SQL.h b/src/pregen/DAAP2SQL.h
+new file mode 100644
+index 0000000..e170f6c
+--- /dev/null
++++ b/src/pregen/DAAP2SQL.h
+@@ -0,0 +1,195 @@
++/** \file
++ *  This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : DAAP2SQL.g
++ *     -                            On : 2014-09-30 21:42:43
++ *     -           for the tree parser : DAAP2SQLTreeParser *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++ * The tree parser DAAP2SQL has the callable functions (rules) shown below,
++ * which will invoke the code for the associated rule in the source grammar
++ * assuming that the input stream is pointing to a token/text stream that could begin
++ * this rule.
++ * 
++ * For instance if you call the first (topmost) rule in a parser grammar, you will
++ * get the results of a full parse, but calling a rule half way through the grammar will
++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
++ * in editors and so on.
++ *
++ * The parser entry points are called indirectly (by function pointer to function) via
++ * a parser context typedef pDAAP2SQL, which is returned from a call to DAAP2SQLNew().
++ *
++ * The methods in pDAAP2SQL are  as follows:
++ *
++ *  - pANTLR3_STRING      pDAAP2SQL->query(pDAAP2SQL)
++ *  - DAAP2SQL_expr_return      pDAAP2SQL->expr(pDAAP2SQL)
++ *
++ * The return type for any particular rule is of course determined by the source
++ * grammar file.
++ */
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++#ifndef	_DAAP2SQL_H
++#define _DAAP2SQL_H
++/* =============================================================================
++ * Standard antlr3 C runtime definitions
++ */
++#include    <antlr3.h>
++
++/* End of standard antlr 3 runtime definitions
++ * =============================================================================
++ */
++ 
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++// Forward declare the context typedef so that we can use it before it is
++// properly defined. Delegators and delegates (from import statements) are
++// interdependent and their context structures contain pointers to each other
++// C only allows such things to be declared if you pre-declare the typedef.
++//
++typedef struct DAAP2SQL_Ctx_struct DAAP2SQL, * pDAAP2SQL;
++
++
++
++	#include <stdio.h>
++	#include <stdlib.h>
++	#include <string.h>
++	#include <limits.h>
++	#include <errno.h>
++
++	#include "logger.h"
++	#include "db.h"
++	#include "daap_query.h"
++
++
++#ifdef	ANTLR3_WINDOWS
++// Disable: Unreferenced parameter,							- Rules with parameters that are not used
++//          constant conditional,							- ANTLR realizes that a prediction is always true (synpred usually)
++//          initialized but unused variable					- tree rewrite variables declared but not needed
++//          Unreferenced local variable						- lexer rule declares but does not always use _type
++//          potentially unitialized variable used			- retval always returned from a rule 
++//			unreferenced local function has been removed	- susually getTokenNames or freeScope, they can go without warnigns
++//
++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
++// this is a matter of orthogonality hence I disable that one.
++//
++#pragma warning( disable : 4100 )
++#pragma warning( disable : 4101 )
++#pragma warning( disable : 4127 )
++#pragma warning( disable : 4189 )
++#pragma warning( disable : 4505 )
++#pragma warning( disable : 4701 )
++#endif
++typedef struct DAAP2SQL_expr_return_struct
++{
++    pANTLR3_BASE_TREE       start;
++    pANTLR3_BASE_TREE       stop;   
++    pANTLR3_STRING result;
++    int valid;
++}
++    DAAP2SQL_expr_return;
++
++
++
++/** Context tracking structure for DAAP2SQL
++ */
++struct DAAP2SQL_Ctx_struct
++{
++    /** Built in ANTLR3 context tracker contains all the generic elements
++     *  required for context tracking.
++     */
++    pANTLR3_TREE_PARSER	    pTreeParser;
++
++
++     pANTLR3_STRING (*query)	(struct DAAP2SQL_Ctx_struct * ctx);
++     DAAP2SQL_expr_return (*expr)	(struct DAAP2SQL_Ctx_struct * ctx);
++    // Delegated rules
++    const char * (*getGrammarFileName)();
++    void	    (*free)   (struct DAAP2SQL_Ctx_struct * ctx);
++        
++};
++
++// Function protoypes for the constructor functions that external translation units
++// such as delegators and delegates may wish to call.
++//
++ANTLR3_API pDAAP2SQL DAAP2SQLNew         (pANTLR3_COMMON_TREE_NODE_STREAM instream);
++ANTLR3_API pDAAP2SQL DAAP2SQLNewSSD      (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
++
++/** Symbolic definitions of all the tokens that the tree parser will work with.
++ * \{
++ *
++ * Antlr will define EOF, but we can't use that as it it is too common in
++ * in C header files and that would be confusing. There is no way to filter this out at the moment
++ * so we just undef it here for now. That isn't the value we get back from C recognizers
++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
++ */
++#ifdef	EOF
++#undef	EOF
++#endif
++#ifdef	Tokens
++#undef	Tokens
++#endif 
++#define STR      9
++#define QUOTE      10
++#define NEWLINE      4
++#define LPAR      7
++#define OPOR      5
++#define RPAR      8
++#define ESCAPED      11
++#define OPAND      6
++#define EOF      -1
++#ifdef	EOF
++#undef	EOF
++#define	EOF	ANTLR3_TOKEN_EOF
++#endif
++
++#ifndef TOKENSOURCE
++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
++#endif
++
++/* End of token definitions for DAAP2SQL
++ * =============================================================================
++ */
++/** \} */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
++
++/* END - Note:Keep extra line feed to satisfy UNIX systems */
+diff --git a/src/pregen/DAAP2SQL.u b/src/pregen/DAAP2SQL.u
+new file mode 100644
+index 0000000..385d80b
+--- /dev/null
++++ b/src/pregen/DAAP2SQL.u
+@@ -0,0 +1,5 @@
++DAAP2SQL.g: DAAP.tokens
++DAAP2SQL.c : DAAP2SQL.g
++./DAAP2SQL.tokens : DAAP2SQL.g
++DAAP2SQL.h : DAAP2SQL.g
++ANTLR_PRODUCTS += DAAP2SQL.c ./DAAP2SQL.tokens DAAP2SQL.h 
+\ No newline at end of file
+diff --git a/src/pregen/DAAPLexer.c b/src/pregen/DAAPLexer.c
+new file mode 100644
+index 0000000..12e7ef3
+--- /dev/null
++++ b/src/pregen/DAAPLexer.c
+@@ -0,0 +1,1101 @@
++/** \file
++ *  This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : DAAP.g
++ *     -                            On : 2014-09-30 21:42:40
++ *     -                 for the lexer : DAAPLexerLexer *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++*/
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++/* -----------------------------------------
++ * Include the ANTLR3 generated header file.
++ */
++#include    "DAAPLexer.h"
++/* ----------------------------------------- */
++
++
++
++
++
++/* MACROS that hide the C interface implementations from the
++ * generated code, which makes it a little more understandable to the human eye.
++ * I am very much against using C pre-processor macros for function calls and bits
++ * of code as you cannot see what is happening when single stepping in debuggers
++ * and so on. The exception (in my book at least) is for generated code, where you are
++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
++ * hides some indirect calls, but is always referring to the input stream. This is
++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
++ * the runtime interfaces without changing the generated code too often, without
++ * confusing the reader of the generated output, who may not wish to know the gory
++ * details of the interface inheritance.
++ */
++ 
++#define		CTX	ctx
++
++/* Aids in accessing scopes for grammar programmers
++ */
++#undef	SCOPE_TYPE
++#undef	SCOPE_STACK
++#undef	SCOPE_TOP
++#define	SCOPE_TYPE(scope)   pDAAPLexer_##scope##_SCOPE
++#define SCOPE_STACK(scope)  pDAAPLexer_##scope##Stack
++#define	SCOPE_TOP(scope)    ctx->pDAAPLexer_##scope##Top
++#define	SCOPE_SIZE(scope)		ctx->pDAAPLexer_##scope##Stack_limit
++#define SCOPE_INSTANCE(scope, i)	(ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
++
++ 
++/* Macros for accessing things in a lexer
++ */
++#undef	    LEXER
++#undef	    RECOGNIZER		    
++#undef	    RULEMEMO		    
++#undef	    GETCHARINDEX
++#undef	    GETLINE
++#undef	    GETCHARPOSITIONINLINE
++#undef	    EMIT
++#undef	    EMITNEW
++#undef	    MATCHC
++#undef	    MATCHS
++#undef	    MATCHRANGE
++#undef	    LTOKEN
++#undef	    HASFAILED
++#undef	    FAILEDFLAG
++#undef	    INPUT
++#undef	    STRSTREAM
++#undef	    LA
++#undef	    HASEXCEPTION
++#undef	    EXCEPTION
++#undef	    CONSTRUCTEX
++#undef	    CONSUME
++#undef	    LRECOVER
++#undef	    MARK
++#undef	    REWIND
++#undef	    REWINDLAST
++#undef	    BACKTRACKING
++#undef		MATCHANY
++#undef		MEMOIZE
++#undef		HAVEPARSEDRULE
++#undef		GETTEXT
++#undef		INDEX
++#undef		SEEK
++#undef		PUSHSTREAM
++#undef		POPSTREAM
++#undef		SETTEXT
++#undef		SETTEXT8
++
++#define	    LEXER					ctx->pLexer
++#define	    RECOGNIZER			    LEXER->rec
++#define		LEXSTATE				RECOGNIZER->state
++#define		TOKSOURCE				LEXSTATE->tokSource
++#define	    GETCHARINDEX()			LEXER->getCharIndex(LEXER)
++#define	    GETLINE()				LEXER->getLine(LEXER)
++#define	    GETTEXT()				LEXER->getText(LEXER)
++#define	    GETCHARPOSITIONINLINE() LEXER->getCharPositionInLine(LEXER)
++#define	    EMIT()					LEXSTATE->type = _type; LEXER->emit(LEXER)
++#define	    EMITNEW(t)				LEXER->emitNew(LEXER, t)
++#define	    MATCHC(c)				LEXER->matchc(LEXER, c)
++#define	    MATCHS(s)				LEXER->matchs(LEXER, s)
++#define	    MATCHRANGE(c1,c2)	    LEXER->matchRange(LEXER, c1, c2)
++#define	    MATCHANY()				LEXER->matchAny(LEXER)
++#define	    LTOKEN  				LEXSTATE->token
++#define	    HASFAILED()				(LEXSTATE->failed == ANTLR3_TRUE)
++#define	    BACKTRACKING			LEXSTATE->backtracking
++#define	    FAILEDFLAG				LEXSTATE->failed
++#define	    INPUT					LEXER->input
++#define	    STRSTREAM				INPUT
++#define		ISTREAM					INPUT->istream
++#define		INDEX()					ISTREAM->index(ISTREAM)
++#define		SEEK(n)					ISTREAM->seek(ISTREAM, n)
++#define	    EOF_TOKEN				&(LEXSTATE->tokSource->eofToken)
++#define	    HASEXCEPTION()			(LEXSTATE->error == ANTLR3_TRUE)
++#define	    EXCEPTION				LEXSTATE->exception
++#define	    CONSTRUCTEX()			RECOGNIZER->exConstruct(RECOGNIZER)
++#define	    LRECOVER()				LEXER->recover(LEXER)
++#define	    MARK()					ISTREAM->mark(ISTREAM)
++#define	    REWIND(m)				ISTREAM->rewind(ISTREAM, m)
++#define	    REWINDLAST()			ISTREAM->rewindLast(ISTREAM)
++#define		MEMOIZE(ri,si)			RECOGNIZER->memoize(RECOGNIZER, ri, si)
++#define		HAVEPARSEDRULE(r)		RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
++#define		PUSHSTREAM(str)			LEXER->pushCharStream(LEXER, str)
++#define		POPSTREAM()				LEXER->popCharStream(LEXER)
++#define		SETTEXT(str)			LEXSTATE->text = str
++#define		SKIP()					LEXSTATE->token = &(TOKSOURCE->skipToken)
++#define		USER1					LEXSTATE->user1
++#define		USER2					LEXSTATE->user2
++#define		USER3					LEXSTATE->user3
++#define		CUSTOM					LEXSTATE->custom
++#define		RULEMEMO				LEXSTATE->ruleMemo
++#define		DBG						RECOGNIZER->debugger
++
++/* If we have been told we can rely on the standard 8 bit or 16 bit input
++ * stream, then we can define our macros to use the direct pointers
++ * in the input object, which is much faster than indirect calls. This
++ * is really only significant to lexers with a lot of fragment rules (which
++ * do not place LA(1) in a temporary at the moment) and even then
++ * only if there is a lot of input (order of say 1M or so).
++ */
++#if	defined(ANTLR3_INLINE_INPUT_ASCII) || defined(ANTLR3_INLINE_INPUT_UTF16)
++
++# ifdef	ANTLR3_INLINE_INPUT_ASCII
++
++/* 8 bit "ASCII" (actually any 8 bit character set) */
++
++#  define	    NEXTCHAR			((pANTLR3_UINT8)(INPUT->nextChar))
++#  define	    DATAP				((pANTLR3_UINT8)(INPUT->data))
++
++# else
++
++#  define	    NEXTCHAR			((pANTLR3_UINT16)(INPUT->nextChar)) 
++#  define	    DATAP				((pANTLR3_UINT16)(INPUT->data))
++
++# endif
++
++# define	    LA(n) ((NEXTCHAR + n) > (DATAP + INPUT->sizeBuf) ? ANTLR3_CHARSTREAM_EOF : (ANTLR3_UCHAR)(*(NEXTCHAR + n - 1)))
++# define	    CONSUME()											\
++{																	\
++    if	(NEXTCHAR < (DATAP + INPUT->sizeBuf))						\
++    {																\
++		INPUT->charPositionInLine++;								\
++		if  ((ANTLR3_UCHAR)(*NEXTCHAR) == INPUT->newlineChar)		\
++		{															\
++			INPUT->line++;											\
++			INPUT->charPositionInLine	= 0;						\
++			INPUT->currentLine		= (void *)(NEXTCHAR + 1);		\
++		}															\
++		INPUT->nextChar = (void *)(NEXTCHAR + 1);					\
++    }																\
++}
++
++#else
++
++// Pick up the input character by calling the input stream implementation.
++//
++#define	    CONSUME()				INPUT->istream->consume(INPUT->istream)
++#define	    LA(n)					INPUT->istream->_LA(INPUT->istream, n)
++
++#endif
++#define		TOKTEXT(tok, txt)				tok, (pANTLR3_UINT8)txt
++
++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
++ * then for the present you must use different names for your defines as these are hard coded
++ * in the code generator. It would be better not to use such names internally, and maybe
++ * we can change this in a forthcoming release. I deliberately do not #undef these
++ * here as this will at least give you a redefined error somewhere if they clash.
++ */
++#define	    UP	    ANTLR3_TOKEN_UP
++#define	    DOWN    ANTLR3_TOKEN_DOWN
++#define	    EOR	    ANTLR3_TOKEN_EOR
++#define	    INVALID ANTLR3_TOKEN_INVALID
++
++
++/* =============================================================================
++ * Functions to create and destroy scopes. First come the rule scopes, followed
++ * by the global declared scopes.
++ */
++
++
++
++/* ============================================================================= */
++
++/* =============================================================================
++ * Start of recognizer
++ */
++
++
++/* Forward declare the locally static matching functions we have generated and any predicate functions.
++ */
++static ANTLR3_INLINE  void	mQUOTE    (pDAAPLexer ctx);
++static ANTLR3_INLINE  void	mLPAR    (pDAAPLexer ctx);
++static ANTLR3_INLINE  void	mRPAR    (pDAAPLexer ctx);
++static ANTLR3_INLINE  void	mOPAND    (pDAAPLexer ctx);
++static ANTLR3_INLINE  void	mOPOR    (pDAAPLexer ctx);
++static ANTLR3_INLINE  void	mNEWLINE    (pDAAPLexer ctx);
++static ANTLR3_INLINE  void	mSTR    (pDAAPLexer ctx);
++static ANTLR3_INLINE  void	mESCAPED    (pDAAPLexer ctx);
++static ANTLR3_INLINE  void	mTokens    (pDAAPLexer ctx);
++static void	DAAPLexerFree(pDAAPLexer ctx);
++
++/* =========================================================================
++ * Lexer matching rules end.
++ * =========================================================================
++ */
++
++
++
++static void
++DAAPLexerFree  (pDAAPLexer ctx)
++{
++    LEXER->free(LEXER);
++    
++    ANTLR3_FREE(ctx);
++}
++
++/** \brief Name of the grammar file that generated this code
++ */
++static const char fileName[] = "DAAP.g";
++
++/** \brief Return the name of the grammar file that generated this code.
++ */
++static const char * getGrammarFileName()
++{
++	return fileName;
++}
++
++/** \brief Create a new lexer called DAAPLexer
++ *
++ * \param[in]    instream Pointer to an initialized input stream
++ * \return 
++ *     - Success pDAAPLexer initialized for the lex start
++ *     - Fail NULL
++ */
++ANTLR3_API pDAAPLexer DAAPLexerNew         
++(pANTLR3_INPUT_STREAM instream)
++{
++	// See if we can create a new lexer with the standard constructor
++	//
++	return DAAPLexerNewSSD(instream, NULL);
++}
++
++/** \brief Create a new lexer called DAAPLexer
++ *
++ * \param[in]    instream Pointer to an initialized input stream
++ * \param[state] state Previously created shared recognizer stat
++ * \return 
++ *     - Success pDAAPLexer initialized for the lex start
++ *     - Fail NULL
++ */
++ANTLR3_API pDAAPLexer DAAPLexerNewSSD         
++(pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
++{
++    pDAAPLexer ctx; // Context structure we will build and return
++
++    ctx = (pDAAPLexer) ANTLR3_CALLOC(1, sizeof(DAAPLexer));
++
++    if  (ctx == NULL)
++    {
++        // Failed to allocate memory for lexer context
++        return  NULL;
++    }
++
++    /* -------------------------------------------------------------------
++     * Memory for basic structure is allocated, now to fill in
++     * in base ANTLR3 structures. We initialize the function pointers
++     * for the standard ANTLR3 lexer function set, but upon return
++     * from here, the programmer may set the pointers to provide custom
++     * implementations of each function. 
++     *
++     * We don't use the macros defined in DAAPLexer.h here so you can get a sense
++     * of what goes where.
++     */
++    
++    /* Create a base lexer, using the supplied input stream
++     */
++    ctx->pLexer	= antlr3LexerNewStream(ANTLR3_SIZE_HINT, instream, state);
++    
++    /* Check that we allocated the memory correctly
++     */
++    if	(ctx->pLexer == NULL)
++    {
++		ANTLR3_FREE(ctx);
++		return  NULL;
++    }
++    /* Install the implementation of our DAAPLexer interface
++     */
++    ctx->mQUOTE	= mQUOTE;
++    ctx->mLPAR	= mLPAR;
++    ctx->mRPAR	= mRPAR;
++    ctx->mOPAND	= mOPAND;
++    ctx->mOPOR	= mOPOR;
++    ctx->mNEWLINE	= mNEWLINE;
++    ctx->mSTR	= mSTR;
++    ctx->mESCAPED	= mESCAPED;
++    ctx->mTokens	= mTokens;
++    
++    /** When the nextToken() call is made to this lexer's pANTLR3_TOKEN_SOURCE
++     *  it will call mTokens() in this generated code, and will pass it the ctx
++     * pointer of this lexer, not the context of the base lexer, so store that now.
++     */
++    ctx->pLexer->ctx	    = ctx;
++    
++    /**Install the token matching function
++     */
++    ctx->pLexer->mTokens = (void (*) (void *))(mTokens);
++    
++    ctx->getGrammarFileName	= getGrammarFileName;
++    ctx->free		= DAAPLexerFree;
++
++    
++    
++
++
++    /* Return the newly built lexer to the caller
++     */
++    return  ctx;
++}
++ 
++
++/* =========================================================================
++ * Functions to match the lexer grammar defined tokens from the input stream
++ */
++
++//   Comes from: 40:7: ( '\\'' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start QUOTE
++ *
++ * Looks to match the characters the constitute the token QUOTE
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mQUOTE(pDAAPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = QUOTE;
++       
++    
++    // DAAP.g:40:7: ( '\\'' )
++    // DAAP.g:40:9: '\\''
++    {
++        MATCHC('\''); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleQUOTEEx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleQUOTEEx; /* Prevent compiler warnings */
++    ruleQUOTEEx: ;
++
++}
++// $ANTLR end QUOTE
++
++//   Comes from: 41:6: ( '(' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start LPAR
++ *
++ * Looks to match the characters the constitute the token LPAR
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mLPAR(pDAAPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = LPAR;
++       
++    
++    // DAAP.g:41:6: ( '(' )
++    // DAAP.g:41:8: '('
++    {
++        MATCHC('('); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleLPAREx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleLPAREx; /* Prevent compiler warnings */
++    ruleLPAREx: ;
++
++}
++// $ANTLR end LPAR
++
++//   Comes from: 42:6: ( ')' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start RPAR
++ *
++ * Looks to match the characters the constitute the token RPAR
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mRPAR(pDAAPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = RPAR;
++       
++    
++    // DAAP.g:42:6: ( ')' )
++    // DAAP.g:42:8: ')'
++    {
++        MATCHC(')'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleRPAREx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleRPAREx; /* Prevent compiler warnings */
++    ruleRPAREx: ;
++
++}
++// $ANTLR end RPAR
++
++//   Comes from: 44:7: ( '+' | ' ' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start OPAND
++ *
++ * Looks to match the characters the constitute the token OPAND
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mOPAND(pDAAPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = OPAND;
++       
++    
++    // DAAP.g:44:7: ( '+' | ' ' )
++    // DAAP.g:
++    {
++        if ( LA(1) == ' ' || LA(1) == '+' )
++        {
++            CONSUME();
++
++        }
++        else 
++        {
++            CONSTRUCTEX();
++            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++
++            LRECOVER();    goto ruleOPANDEx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleOPANDEx; /* Prevent compiler warnings */
++    ruleOPANDEx: ;
++
++}
++// $ANTLR end OPAND
++
++//   Comes from: 45:6: ( ',' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start OPOR
++ *
++ * Looks to match the characters the constitute the token OPOR
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mOPOR(pDAAPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = OPOR;
++       
++    
++    // DAAP.g:45:6: ( ',' )
++    // DAAP.g:45:8: ','
++    {
++        MATCHC(','); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleOPOREx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleOPOREx; /* Prevent compiler warnings */
++    ruleOPOREx: ;
++
++}
++// $ANTLR end OPOR
++
++//   Comes from: 47:9: ( ( '\\r' )? '\\n' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start NEWLINE
++ *
++ * Looks to match the characters the constitute the token NEWLINE
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mNEWLINE(pDAAPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = NEWLINE;
++       
++    
++    // DAAP.g:47:9: ( ( '\\r' )? '\\n' )
++    // DAAP.g:47:11: ( '\\r' )? '\\n'
++    {
++
++        // DAAP.g:47:11: ( '\\r' )?
++        {
++            int alt1=2;
++            switch ( LA(1) ) 
++            {
++                case '\r':
++                	{
++                		alt1=1;
++                	}
++                    break;
++            }
++
++            switch (alt1) 
++            {
++        	case 1:
++        	    // DAAP.g:47:11: '\\r'
++        	    {
++        	        MATCHC('\r'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleNEWLINEEx;
++        	        }
++
++
++        	    }
++        	    break;
++
++            }
++        }
++        MATCHC('\n'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleNEWLINEEx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleNEWLINEEx; /* Prevent compiler warnings */
++    ruleNEWLINEEx: ;
++
++}
++// $ANTLR end NEWLINE
++
++//   Comes from: 55:2: ( QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start STR
++ *
++ * Looks to match the characters the constitute the token STR
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mSTR(pDAAPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++    pANTLR3_COMMON_TOKEN esc;
++    ANTLR3_UINT32 reg;
++
++
++    esc = NULL;
++
++    _type	    = STR;
++       
++     pANTLR3_STRING unesc = GETTEXT()->factory->newRaw(GETTEXT()->factory); 
++    
++    // DAAP.g:55:2: ( QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE )
++    // DAAP.g:55:4: QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE
++    {
++        /* 55:4: QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE */
++        mQUOTE(ctx ); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleSTREx;
++        }
++
++        // DAAP.g:55:10: (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+
++        {
++            int cnt2=0;
++
++            for (;;)
++            {
++                int alt2=3;
++        	{
++        	   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
++        	    */
++        	    int LA2_0 = LA(1);
++        	    if ( (((LA2_0 >= 0x0000) && (LA2_0 <= '&')) || ((LA2_0 >= '(') && (LA2_0 <= '[')) || ((LA2_0 >= ']') && (LA2_0 <= 0xFFFF))) ) 
++        	    {
++        	        alt2=1;
++        	    }
++        	    else if ( (LA2_0 == '\\') ) 
++        	    {
++        	        alt2=2;
++        	    }
++
++        	}
++        	switch (alt2) 
++        	{
++        	    case 1:
++        	        // DAAP.g:55:12: reg=~ ( '\\\\' | '\\'' )
++        	        {
++        	            reg= LA(1);
++        	            if ( ((LA(1) >= 0x0000) && (LA(1) <= '&')) || ((LA(1) >= '(') && (LA(1) <= '[')) || ((LA(1) >= ']') && (LA(1) <= 0xFFFF)) )
++        	            {
++        	                CONSUME();
++
++        	            }
++        	            else 
++        	            {
++        	                CONSTRUCTEX();
++        	                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++        	                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++
++        	                LRECOVER();    goto ruleSTREx;
++        	            }
++
++        	            {
++        	                 unesc->addc(unesc, reg); 
++        	            }
++
++        	        }
++        	        break;
++        	    case 2:
++        	        // DAAP.g:56:6: esc= ESCAPED
++        	        {
++        	            /* 56:6: esc= ESCAPED */
++        	            {
++        	                ANTLR3_MARKER escStart118 = GETCHARINDEX();
++        	            mESCAPED(ctx ); 
++        	                if  (HASEXCEPTION())
++        	                {
++        	                    goto ruleSTREx;
++        	                }
++
++        	                esc = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory);
++        	                esc->setType(esc, ANTLR3_TOKEN_INVALID);
++        	                esc->setStartIndex(esc, escStart118);
++        	                esc->setStopIndex(esc, GETCHARINDEX()-1);
++        	                esc->input = INPUT;
++        	            }
++        	            {
++        	                 unesc->appendS(unesc, GETTEXT()); 
++        	            }
++
++        	        }
++        	        break;
++
++        	    default:
++        	    
++        		if ( cnt2 >= 1 )
++        		{
++        		    goto loop2;
++        		}
++        		/* mismatchedSetEx()
++        		 */
++        		CONSTRUCTEX();
++        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
++        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;
++
++
++        		goto ruleSTREx;
++        	}
++        	cnt2++;
++            }
++            loop2: ;	/* Jump to here if this rule does not match */
++        }
++        /* 55:4: QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE */
++        mQUOTE(ctx ); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleSTREx;
++        }
++
++        {
++             SETTEXT(unesc); 
++        }
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleSTREx; /* Prevent compiler warnings */
++    ruleSTREx: ;
++
++    esc = NULL;
++
++}
++// $ANTLR end STR
++
++//   Comes from: 59:9: ( '\\\\' ( '\\\\' | '\\'' ) )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start ESCAPED
++ *
++ * Looks to match the characters the constitute the token ESCAPED
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mESCAPED(pDAAPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++        
++    // DAAP.g:59:9: ( '\\\\' ( '\\\\' | '\\'' ) )
++    // DAAP.g:59:11: '\\\\' ( '\\\\' | '\\'' )
++    {
++        MATCHC('\\'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleESCAPEDEx;
++        }
++
++
++        // DAAP.g:60:3: ( '\\\\' | '\\'' )
++        {
++            int alt3=2;
++            switch ( LA(1) ) 
++            {
++            case '\\':
++            	{
++            		alt3=1;
++            	}
++                break;
++            case '\'':
++            	{
++            		alt3=2;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 3;
++                EXCEPTION->state        = 0;
++
++
++                goto ruleESCAPEDEx;
++            }
++
++            switch (alt3) 
++            {
++        	case 1:
++        	    // DAAP.g:60:5: '\\\\'
++        	    {
++        	        MATCHC('\\'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleESCAPEDEx;
++        	        }
++
++        	        {
++        	             SETTEXT(GETTEXT()->factory->newStr8(GETTEXT()->factory, (pANTLR3_UINT8)"\\")); 
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // DAAP.g:61:5: '\\''
++        	    {
++        	        MATCHC('\''); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleESCAPEDEx;
++        	        }
++
++        	        {
++        	             SETTEXT(GETTEXT()->factory->newStr8(GETTEXT()->factory, (pANTLR3_UINT8)"\'")); 
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++
++    }
++
++
++
++    // This is where rules clean up and exit
++    //
++    goto ruleESCAPEDEx; /* Prevent compiler warnings */
++    ruleESCAPEDEx: ;
++
++}
++// $ANTLR end ESCAPED
++
++/** This is the entry point in to the lexer from an object that
++ *  wants to generate the next token, such as a pCOMMON_TOKEN_STREAM
++ */
++static void 
++mTokens(pDAAPLexer ctx)
++{
++    {
++        //  DAAP.g:1:8: ( QUOTE | LPAR | RPAR | OPAND | OPOR | NEWLINE | STR )
++        
++        ANTLR3_UINT32 alt4;
++
++        alt4=7;
++
++        switch ( LA(1) ) 
++        {
++        case '\'':
++        	{
++
++        		{
++        		    int LA4_1 = LA(2);
++        		    if ( (((LA4_1 >= 0x0000) && (LA4_1 <= '&')) || ((LA4_1 >= '(') && (LA4_1 <= 0xFFFF))) ) 
++        		    {
++        		        alt4=7;
++        		    }
++        		    else 
++        		    {
++        		        alt4=1;    }
++        		}
++        	}
++            break;
++        case '(':
++        	{
++        		alt4=2;
++        	}
++            break;
++        case ')':
++        	{
++        		alt4=3;
++        	}
++            break;
++        case ' ':
++        case '+':
++        	{
++        		alt4=4;
++        	}
++            break;
++        case ',':
++        	{
++        		alt4=5;
++        	}
++            break;
++        case '\n':
++        case '\r':
++        	{
++        		alt4=6;
++        	}
++            break;
++
++        default:
++            CONSTRUCTEX();
++            EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            EXCEPTION->message      = (void *)"";
++            EXCEPTION->decisionNum  = 4;
++            EXCEPTION->state        = 0;
++
++
++            goto ruleTokensEx;
++        }
++
++        switch (alt4) 
++        {
++    	case 1:
++    	    // DAAP.g:1:10: QUOTE
++    	    {
++    	        /* 1:10: QUOTE */
++    	        mQUOTE(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 2:
++    	    // DAAP.g:1:16: LPAR
++    	    {
++    	        /* 1:16: LPAR */
++    	        mLPAR(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 3:
++    	    // DAAP.g:1:21: RPAR
++    	    {
++    	        /* 1:21: RPAR */
++    	        mRPAR(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 4:
++    	    // DAAP.g:1:26: OPAND
++    	    {
++    	        /* 1:26: OPAND */
++    	        mOPAND(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 5:
++    	    // DAAP.g:1:32: OPOR
++    	    {
++    	        /* 1:32: OPOR */
++    	        mOPOR(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 6:
++    	    // DAAP.g:1:37: NEWLINE
++    	    {
++    	        /* 1:37: NEWLINE */
++    	        mNEWLINE(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 7:
++    	    // DAAP.g:1:45: STR
++    	    {
++    	        /* 1:45: STR */
++    	        mSTR(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++
++        }
++    }
++
++    
++    goto ruleTokensEx; /* Prevent compiler warnings */
++ruleTokensEx: ;
++}
++
++/* =========================================================================
++ * Lexer matching rules end.
++ * =========================================================================
++ */
++/* End of Lexer code
++ * ================================================
++ * ================================================
++ */ 
++
++
++/* End of code
++ * =============================================================================
++ */
+diff --git a/src/pregen/DAAPLexer.h b/src/pregen/DAAPLexer.h
+new file mode 100644
+index 0000000..ba8f58b
+--- /dev/null
++++ b/src/pregen/DAAPLexer.h
+@@ -0,0 +1,188 @@
++/** \file
++ *  This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : DAAP.g
++ *     -                            On : 2014-09-30 21:42:40
++ *     -                 for the lexer : DAAPLexerLexer *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++ * The lexer DAAPLexer has the callable functions (rules) shown below,
++ * which will invoke the code for the associated rule in the source grammar
++ * assuming that the input stream is pointing to a token/text stream that could begin
++ * this rule.
++ * 
++ * For instance if you call the first (topmost) rule in a parser grammar, you will
++ * get the results of a full parse, but calling a rule half way through the grammar will
++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
++ * in editors and so on.
++ *
++ * The parser entry points are called indirectly (by function pointer to function) via
++ * a parser context typedef pDAAPLexer, which is returned from a call to DAAPLexerNew().
++ *
++ * As this is a generated lexer, it is unlikely you will call it 'manually'. However
++ * the methods are provided anyway.
++ * * The methods in pDAAPLexer are  as follows:
++ *
++ *  -  void      pDAAPLexer->QUOTE(pDAAPLexer)
++ *  -  void      pDAAPLexer->LPAR(pDAAPLexer)
++ *  -  void      pDAAPLexer->RPAR(pDAAPLexer)
++ *  -  void      pDAAPLexer->OPAND(pDAAPLexer)
++ *  -  void      pDAAPLexer->OPOR(pDAAPLexer)
++ *  -  void      pDAAPLexer->NEWLINE(pDAAPLexer)
++ *  -  void      pDAAPLexer->STR(pDAAPLexer)
++ *  -  void      pDAAPLexer->ESCAPED(pDAAPLexer)
++ *  -  void      pDAAPLexer->Tokens(pDAAPLexer)
++ *
++ * The return type for any particular rule is of course determined by the source
++ * grammar file.
++ */
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++#ifndef	_DAAPLexer_H
++#define _DAAPLexer_H
++/* =============================================================================
++ * Standard antlr3 C runtime definitions
++ */
++#include    <antlr3.h>
++
++/* End of standard antlr 3 runtime definitions
++ * =============================================================================
++ */
++ 
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++// Forward declare the context typedef so that we can use it before it is
++// properly defined. Delegators and delegates (from import statements) are
++// interdependent and their context structures contain pointers to each other
++// C only allows such things to be declared if you pre-declare the typedef.
++//
++typedef struct DAAPLexer_Ctx_struct DAAPLexer, * pDAAPLexer;
++
++
++
++#ifdef	ANTLR3_WINDOWS
++// Disable: Unreferenced parameter,							- Rules with parameters that are not used
++//          constant conditional,							- ANTLR realizes that a prediction is always true (synpred usually)
++//          initialized but unused variable					- tree rewrite variables declared but not needed
++//          Unreferenced local variable						- lexer rule declares but does not always use _type
++//          potentially unitialized variable used			- retval always returned from a rule 
++//			unreferenced local function has been removed	- susually getTokenNames or freeScope, they can go without warnigns
++//
++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
++// this is a matter of orthogonality hence I disable that one.
++//
++#pragma warning( disable : 4100 )
++#pragma warning( disable : 4101 )
++#pragma warning( disable : 4127 )
++#pragma warning( disable : 4189 )
++#pragma warning( disable : 4505 )
++#pragma warning( disable : 4701 )
++#endif
++
++/** Context tracking structure for DAAPLexer
++ */
++struct DAAPLexer_Ctx_struct
++{
++    /** Built in ANTLR3 context tracker contains all the generic elements
++     *  required for context tracking.
++     */
++    pANTLR3_LEXER    pLexer;
++
++
++     void (*mQUOTE)	(struct DAAPLexer_Ctx_struct * ctx);
++     void (*mLPAR)	(struct DAAPLexer_Ctx_struct * ctx);
++     void (*mRPAR)	(struct DAAPLexer_Ctx_struct * ctx);
++     void (*mOPAND)	(struct DAAPLexer_Ctx_struct * ctx);
++     void (*mOPOR)	(struct DAAPLexer_Ctx_struct * ctx);
++     void (*mNEWLINE)	(struct DAAPLexer_Ctx_struct * ctx);
++     void (*mSTR)	(struct DAAPLexer_Ctx_struct * ctx);
++     void (*mESCAPED)	(struct DAAPLexer_Ctx_struct * ctx);
++     void (*mTokens)	(struct DAAPLexer_Ctx_struct * ctx);    const char * (*getGrammarFileName)();
++    void	    (*free)   (struct DAAPLexer_Ctx_struct * ctx);
++        
++};
++
++// Function protoypes for the constructor functions that external translation units
++// such as delegators and delegates may wish to call.
++//
++ANTLR3_API pDAAPLexer DAAPLexerNew         (pANTLR3_INPUT_STREAM instream);
++ANTLR3_API pDAAPLexer DAAPLexerNewSSD      (pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
++
++/** Symbolic definitions of all the tokens that the lexer will work with.
++ * \{
++ *
++ * Antlr will define EOF, but we can't use that as it it is too common in
++ * in C header files and that would be confusing. There is no way to filter this out at the moment
++ * so we just undef it here for now. That isn't the value we get back from C recognizers
++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
++ */
++#ifdef	EOF
++#undef	EOF
++#endif
++#ifdef	Tokens
++#undef	Tokens
++#endif 
++#define STR      9
++#define QUOTE      10
++#define NEWLINE      4
++#define LPAR      7
++#define OPOR      5
++#define RPAR      8
++#define ESCAPED      11
++#define OPAND      6
++#define EOF      -1
++#ifdef	EOF
++#undef	EOF
++#define	EOF	ANTLR3_TOKEN_EOF
++#endif
++
++#ifndef TOKENSOURCE
++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
++#endif
++
++/* End of token definitions for DAAPLexer
++ * =============================================================================
++ */
++/** \} */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
++
++/* END - Note:Keep extra line feed to satisfy UNIX systems */
+diff --git a/src/pregen/DAAPParser.c b/src/pregen/DAAPParser.c
+new file mode 100644
+index 0000000..6d0239d
+--- /dev/null
++++ b/src/pregen/DAAPParser.c
+@@ -0,0 +1,1014 @@
++/** \file
++ *  This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : DAAP.g
++ *     -                            On : 2014-09-30 21:42:39
++ *     -                for the parser : DAAPParserParser *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++*/
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++/* -----------------------------------------
++ * Include the ANTLR3 generated header file.
++ */
++#include    "DAAPParser.h"
++/* ----------------------------------------- */
++
++
++
++
++
++/* MACROS that hide the C interface implementations from the
++ * generated code, which makes it a little more understandable to the human eye.
++ * I am very much against using C pre-processor macros for function calls and bits
++ * of code as you cannot see what is happening when single stepping in debuggers
++ * and so on. The exception (in my book at least) is for generated code, where you are
++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
++ * hides some indirect calls, but is always referring to the input stream. This is
++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
++ * the runtime interfaces without changing the generated code too often, without
++ * confusing the reader of the generated output, who may not wish to know the gory
++ * details of the interface inheritance.
++ */
++ 
++#define		CTX	ctx
++
++/* Aids in accessing scopes for grammar programmers
++ */
++#undef	SCOPE_TYPE
++#undef	SCOPE_STACK
++#undef	SCOPE_TOP
++#define	SCOPE_TYPE(scope)   pDAAPParser_##scope##_SCOPE
++#define SCOPE_STACK(scope)  pDAAPParser_##scope##Stack
++#define	SCOPE_TOP(scope)    ctx->pDAAPParser_##scope##Top
++#define	SCOPE_SIZE(scope)		ctx->pDAAPParser_##scope##Stack_limit
++#define SCOPE_INSTANCE(scope, i)	(ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
++
++/* Macros for accessing things in the parser
++ */
++ 
++#undef	    PARSER		    
++#undef	    RECOGNIZER		    
++#undef	    HAVEPARSEDRULE
++#undef		MEMOIZE
++#undef	    INPUT
++#undef	    STRSTREAM
++#undef	    HASEXCEPTION
++#undef	    EXCEPTION
++#undef	    MATCHT
++#undef	    MATCHANYT
++#undef	    FOLLOWSTACK
++#undef	    FOLLOWPUSH
++#undef	    FOLLOWPOP
++#undef	    PRECOVER
++#undef	    PREPORTERROR
++#undef	    LA
++#undef	    LT
++#undef	    CONSTRUCTEX
++#undef	    CONSUME
++#undef	    MARK
++#undef	    REWIND
++#undef	    REWINDLAST
++#undef	    PERRORRECOVERY
++#undef	    HASFAILED
++#undef	    FAILEDFLAG
++#undef	    RECOVERFROMMISMATCHEDSET
++#undef	    RECOVERFROMMISMATCHEDELEMENT
++#undef		INDEX
++#undef      ADAPTOR
++#undef		SEEK
++#undef	    RULEMEMO		    
++#undef		DBG
++
++#define	    PARSER							ctx->pParser  
++#define	    RECOGNIZER						PARSER->rec
++#define		PSRSTATE						RECOGNIZER->state
++#define	    HAVEPARSEDRULE(r)				RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
++#define		MEMOIZE(ri,si)					RECOGNIZER->memoize(RECOGNIZER, ri, si)
++#define	    INPUT							PARSER->tstream
++#define	    STRSTREAM						INPUT
++#define		ISTREAM							INPUT->istream
++#define		INDEX()							ISTREAM->index(INPUT->istream)
++#define	    HASEXCEPTION()					(PSRSTATE->error == ANTLR3_TRUE)
++#define	    EXCEPTION						PSRSTATE->exception
++#define	    MATCHT(t, fs)					RECOGNIZER->match(RECOGNIZER, t, fs)
++#define	    MATCHANYT()						RECOGNIZER->matchAny(RECOGNIZER)
++#define	    FOLLOWSTACK					    PSRSTATE->following
++#define	    FOLLOWPUSH(x)					FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
++#define	    FOLLOWPOP()						FOLLOWSTACK->pop(FOLLOWSTACK)
++#define	    PRECOVER()						RECOGNIZER->recover(RECOGNIZER)
++#define	    PREPORTERROR()					RECOGNIZER->reportError(RECOGNIZER)
++#define	    LA(n)							INPUT->istream->_LA(ISTREAM, n)
++#define	    LT(n)							INPUT->_LT(INPUT, n)
++#define	    CONSTRUCTEX()					RECOGNIZER->exConstruct(RECOGNIZER)
++#define	    CONSUME()						ISTREAM->consume(ISTREAM)
++#define	    MARK()							ISTREAM->mark(ISTREAM)
++#define	    REWIND(m)						ISTREAM->rewind(ISTREAM, m)
++#define	    REWINDLAST()					ISTREAM->rewindLast(ISTREAM)
++#define		SEEK(n)							ISTREAM->seek(ISTREAM, n)
++#define	    PERRORRECOVERY					PSRSTATE->errorRecovery
++#define	    FAILEDFLAG						PSRSTATE->failed
++#define	    HASFAILED()						(FAILEDFLAG == ANTLR3_TRUE)
++#define	    BACKTRACKING					PSRSTATE->backtracking
++#define	    RECOVERFROMMISMATCHEDSET(s)		RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
++#define	    RECOVERFROMMISMATCHEDELEMENT(e)	RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
++#define     ADAPTOR                         ctx->adaptor
++#define		RULEMEMO						PSRSTATE->ruleMemo
++#define		DBG								RECOGNIZER->debugger
++
++#define		TOKTEXT(tok, txt)				tok, (pANTLR3_UINT8)txt
++
++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
++ * then for the present you must use different names for your defines as these are hard coded
++ * in the code generator. It would be better not to use such names internally, and maybe
++ * we can change this in a forthcoming release. I deliberately do not #undef these
++ * here as this will at least give you a redefined error somewhere if they clash.
++ */
++#define	    UP	    ANTLR3_TOKEN_UP
++#define	    DOWN    ANTLR3_TOKEN_DOWN
++#define	    EOR	    ANTLR3_TOKEN_EOR
++#define	    INVALID ANTLR3_TOKEN_INVALID
++
++
++/* =============================================================================
++ * Functions to create and destroy scopes. First come the rule scopes, followed
++ * by the global declared scopes.
++ */
++
++
++
++/* ============================================================================= */
++
++/* =============================================================================
++ * Start of recognizer
++ */
++
++
++
++/** \brief Table of all token names in symbolic order, mainly used for
++ *         error reporting.
++ */
++pANTLR3_UINT8   DAAPParserTokenNames[8+4]
++     = {
++        (pANTLR3_UINT8) "<invalid>",       /* String to print to indicate an invalid token */
++        (pANTLR3_UINT8) "<EOR>",
++        (pANTLR3_UINT8) "<DOWN>", 
++        (pANTLR3_UINT8) "<UP>", 
++        (pANTLR3_UINT8) "NEWLINE",
++        (pANTLR3_UINT8) "OPOR",
++        (pANTLR3_UINT8) "OPAND",
++        (pANTLR3_UINT8) "LPAR",
++        (pANTLR3_UINT8) "RPAR",
++        (pANTLR3_UINT8) "STR",
++        (pANTLR3_UINT8) "QUOTE",
++        (pANTLR3_UINT8) "ESCAPED"
++       };
++
++        
++
++// Forward declare the locally static matching functions we have generated.
++//
++static DAAPParser_query_return	query    (pDAAPParser ctx);
++static DAAPParser_expr_return	expr    (pDAAPParser ctx);
++static DAAPParser_aexpr_return	aexpr    (pDAAPParser ctx);
++static DAAPParser_crit_return	crit    (pDAAPParser ctx);
++static void	DAAPParserFree(pDAAPParser ctx);
++/* For use in tree output where we are accumulating rule labels via label += ruleRef
++ * we need a function that knows how to free a return scope when the list is destroyed. 
++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
++ */
++static	void ANTLR3_CDECL freeScope(void * scope)
++{
++    ANTLR3_FREE(scope);
++}
++
++/** \brief Name of the grammar file that generated this code
++ */
++static const char fileName[] = "DAAP.g";
++
++/** \brief Return the name of the grammar file that generated this code.
++ */
++static const char * getGrammarFileName()
++{
++	return fileName;
++}
++/** \brief Create a new DAAPParser parser and return a context for it.
++ *
++ * \param[in] instream Pointer to an input stream interface.
++ *
++ * \return Pointer to new parser context upon success.
++ */
++ANTLR3_API pDAAPParser
++DAAPParserNew   (pANTLR3_COMMON_TOKEN_STREAM instream)
++{
++	// See if we can create a new parser with the standard constructor
++	//
++	return DAAPParserNewSSD(instream, NULL);
++}
++
++/** \brief Create a new DAAPParser parser and return a context for it.
++ *
++ * \param[in] instream Pointer to an input stream interface.
++ *
++ * \return Pointer to new parser context upon success.
++ */
++ANTLR3_API pDAAPParser
++DAAPParserNewSSD   (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
++{
++    pDAAPParser ctx;	    /* Context structure we will build and return   */
++    
++    ctx	= (pDAAPParser) ANTLR3_CALLOC(1, sizeof(DAAPParser));
++    
++    if	(ctx == NULL)
++    {
++		// Failed to allocate memory for parser context
++		//
++        return  NULL;
++    }
++    
++    /* -------------------------------------------------------------------
++     * Memory for basic structure is allocated, now to fill in
++     * the base ANTLR3 structures. We initialize the function pointers
++     * for the standard ANTLR3 parser function set, but upon return
++     * from here, the programmer may set the pointers to provide custom
++     * implementations of each function. 
++     *
++     * We don't use the macros defined in DAAPParser.h here, in order that you can get a sense
++     * of what goes where.
++     */
++
++    /* Create a base parser/recognizer, using the supplied token stream
++     */
++    ctx->pParser	    = antlr3ParserNewStream(ANTLR3_SIZE_HINT, instream->tstream, state);
++    /* Install the implementation of our DAAPParser interface
++     */
++    ctx->query	= query;
++    ctx->expr	= expr;
++    ctx->aexpr	= aexpr;
++    ctx->crit	= crit;
++    ctx->free			= DAAPParserFree;
++    ctx->getGrammarFileName	= getGrammarFileName;
++    
++    /* Install the scope pushing methods.
++     */
++    ADAPTOR	= ANTLR3_TREE_ADAPTORNew(instream->tstream->tokenSource->strFactory);
++    ctx->vectors	= antlr3VectorFactoryNew(0);
++    
++
++	
++    /* Install the token table
++     */
++    PSRSTATE->tokenNames   = DAAPParserTokenNames;
++    
++    
++    /* Return the newly built parser to the caller
++     */
++    return  ctx;
++}
++
++/** Free the parser resources
++ */
++ static void
++ DAAPParserFree(pDAAPParser ctx)
++ {
++    /* Free any scope memory
++     */
++    
++    ctx->vectors->close(ctx->vectors);
++    /* We created the adaptor so we must free it
++     */
++    ADAPTOR->free(ADAPTOR);
++	// Free this parser
++	//
++    ctx->pParser->free(ctx->pParser);
++    ANTLR3_FREE(ctx);
++
++    /* Everything is released, so we can return
++     */
++    return;
++ }
++ 
++/** Return token names used by this parser
++ *
++ * The returned pointer is used as an index into the token names table (using the token 
++ * number as the index).
++ * 
++ * \return Pointer to first char * in the table.
++ */
++static pANTLR3_UINT8    *getTokenNames() 
++{
++        return DAAPParserTokenNames; 
++}
++
++    
++/* Declare the bitsets
++ */
++
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_query42  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_query42_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_query42	= { FOLLOW_expr_in_query42_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NEWLINE_in_query44  */
++static	ANTLR3_BITWORD FOLLOW_NEWLINE_in_query44_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000) };
++static  ANTLR3_BITSET_LIST FOLLOW_NEWLINE_in_query44	= { FOLLOW_NEWLINE_in_query44_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_EOF_in_query47  */
++static	ANTLR3_BITWORD FOLLOW_EOF_in_query47_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_EOF_in_query47	= { FOLLOW_EOF_in_query47_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expr62  */
++static	ANTLR3_BITWORD FOLLOW_aexpr_in_expr62_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000022) };
++static  ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expr62	= { FOLLOW_aexpr_in_expr62_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OPOR_in_expr65  */
++static	ANTLR3_BITWORD FOLLOW_OPOR_in_expr65_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000280) };
++static  ANTLR3_BITSET_LIST FOLLOW_OPOR_in_expr65	= { FOLLOW_OPOR_in_expr65_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expr68  */
++static	ANTLR3_BITWORD FOLLOW_aexpr_in_expr68_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000022) };
++static  ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expr68	= { FOLLOW_aexpr_in_expr68_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_aexpr80  */
++static	ANTLR3_BITWORD FOLLOW_crit_in_aexpr80_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000042) };
++static  ANTLR3_BITSET_LIST FOLLOW_crit_in_aexpr80	= { FOLLOW_crit_in_aexpr80_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OPAND_in_aexpr83  */
++static	ANTLR3_BITWORD FOLLOW_OPAND_in_aexpr83_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000280) };
++static  ANTLR3_BITSET_LIST FOLLOW_OPAND_in_aexpr83	= { FOLLOW_OPAND_in_aexpr83_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_aexpr86  */
++static	ANTLR3_BITWORD FOLLOW_crit_in_aexpr86_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000042) };
++static  ANTLR3_BITSET_LIST FOLLOW_crit_in_aexpr86	= { FOLLOW_crit_in_aexpr86_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAR_in_crit98  */
++static	ANTLR3_BITWORD FOLLOW_LPAR_in_crit98_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000280) };
++static  ANTLR3_BITSET_LIST FOLLOW_LPAR_in_crit98	= { FOLLOW_LPAR_in_crit98_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_crit100  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_crit100_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000100) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_crit100	= { FOLLOW_expr_in_crit100_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAR_in_crit102  */
++static	ANTLR3_BITWORD FOLLOW_RPAR_in_crit102_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_RPAR_in_crit102	= { FOLLOW_RPAR_in_crit102_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_crit112  */
++static	ANTLR3_BITWORD FOLLOW_STR_in_crit112_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_STR_in_crit112	= { FOLLOW_STR_in_crit112_bits, 1	};
++     
++
++ 
++ 
++/* ==============================================
++ * Parsing rules
++ */
++/** 
++ * $ANTLR start query
++ * DAAP.g:27:1: query : expr ( NEWLINE )? EOF -> expr ;
++ */
++static DAAPParser_query_return
++query(pDAAPParser ctx)
++{   
++    DAAPParser_query_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    NEWLINE2;
++    pANTLR3_COMMON_TOKEN    EOF3;
++    DAAPParser_expr_return expr1;
++    #undef	RETURN_TYPE_expr1
++    #define	RETURN_TYPE_expr1 DAAPParser_expr_return
++
++    pANTLR3_BASE_TREE NEWLINE2_tree;
++    pANTLR3_BASE_TREE EOF3_tree;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_NEWLINE;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_EOF;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_expr;
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    NEWLINE2       = NULL;
++    EOF3       = NULL;
++    expr1.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    NEWLINE2_tree   = NULL;
++    EOF3_tree   = NULL;
++
++    stream_NEWLINE   = NULL;
++    #define CREATE_stream_NEWLINE  if (stream_NEWLINE == NULL) {stream_NEWLINE = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token NEWLINE"); } 
++    stream_EOF   = NULL;
++    #define CREATE_stream_EOF  if (stream_EOF == NULL) {stream_EOF = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token EOF"); } 
++    stream_expr   = NULL;
++    #define CREATE_stream_expr  if (stream_expr == NULL) {stream_expr = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule expr"); }
++
++    retval.tree  = NULL;
++    {
++        // DAAP.g:27:7: ( expr ( NEWLINE )? EOF -> expr )
++        // DAAP.g:27:9: expr ( NEWLINE )? EOF
++        {
++            FOLLOWPUSH(FOLLOW_expr_in_query42);
++            expr1=expr(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto rulequeryEx;
++            }
++
++            CREATE_stream_expr; stream_expr->add(stream_expr, expr1.tree, NULL);
++
++            // DAAP.g:27:14: ( NEWLINE )?
++            {
++                int alt1=2;
++                switch ( LA(1) ) 
++                {
++                    case NEWLINE:
++                    	{
++                    		alt1=1;
++                    	}
++                        break;
++                }
++
++                switch (alt1) 
++                {
++            	case 1:
++            	    // DAAP.g:27:14: NEWLINE
++            	    {
++            	        NEWLINE2 = (pANTLR3_COMMON_TOKEN) MATCHT(NEWLINE, &FOLLOW_NEWLINE_in_query44); 
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto rulequeryEx;
++            	        }
++            	         
++            	        CREATE_stream_NEWLINE; stream_NEWLINE->add(stream_NEWLINE, NEWLINE2, NULL);
++
++
++            	    }
++            	    break;
++
++                }
++            }
++            EOF3 = (pANTLR3_COMMON_TOKEN) MATCHT(EOF, &FOLLOW_EOF_in_query47); 
++            if  (HASEXCEPTION())
++            {
++                goto rulequeryEx;
++            }
++             
++            CREATE_stream_EOF; stream_EOF->add(stream_EOF, EOF3, NULL);
++
++
++             
++            /* AST REWRITE
++             * elements          : expr
++             * token labels      : 
++             * rule labels       : retval
++             * token list labels : 
++             * rule list labels  : 
++             */
++            {
++            	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++            	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++            	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++            	retval.tree    = root_0;
++            	// 27:27: -> expr
++            	{
++            	    ADAPTOR->addChild(ADAPTOR, root_0, stream_expr == NULL ? NULL : stream_expr->nextTree(stream_expr));
++
++            	}
++
++            	retval.tree = root_0; // set result root
++            	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++            }
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulequeryEx; /* Prevent compiler warnings */
++    rulequeryEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++        if (stream_NEWLINE != NULL) stream_NEWLINE->free(stream_NEWLINE);
++        if (stream_EOF != NULL) stream_EOF->free(stream_EOF);
++        if (stream_expr != NULL) stream_expr->free(stream_expr);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end query */
++
++/** 
++ * $ANTLR start expr
++ * DAAP.g:30:1: expr : aexpr ( OPOR aexpr )* ;
++ */
++static DAAPParser_expr_return
++expr(pDAAPParser ctx)
++{   
++    DAAPParser_expr_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    OPOR5;
++    DAAPParser_aexpr_return aexpr4;
++    #undef	RETURN_TYPE_aexpr4
++    #define	RETURN_TYPE_aexpr4 DAAPParser_aexpr_return
++
++    DAAPParser_aexpr_return aexpr6;
++    #undef	RETURN_TYPE_aexpr6
++    #define	RETURN_TYPE_aexpr6 DAAPParser_aexpr_return
++
++    pANTLR3_BASE_TREE OPOR5_tree;
++
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    OPOR5       = NULL;
++    aexpr4.tree = NULL;
++
++    aexpr6.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    OPOR5_tree   = NULL;
++
++
++    retval.tree  = NULL;
++    {
++        // DAAP.g:30:6: ( aexpr ( OPOR aexpr )* )
++        // DAAP.g:30:8: aexpr ( OPOR aexpr )*
++        {
++            root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++            FOLLOWPUSH(FOLLOW_aexpr_in_expr62);
++            aexpr4=aexpr(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto ruleexprEx;
++            }
++
++            ADAPTOR->addChild(ADAPTOR, root_0, aexpr4.tree);
++
++            // DAAP.g:30:14: ( OPOR aexpr )*
++
++            for (;;)
++            {
++                int alt2=2;
++                switch ( LA(1) ) 
++                {
++                case OPOR:
++                	{
++                		alt2=1;
++                	}
++                    break;
++
++                }
++
++                switch (alt2) 
++                {
++            	case 1:
++            	    // DAAP.g:30:15: OPOR aexpr
++            	    {
++            	        OPOR5 = (pANTLR3_COMMON_TOKEN) MATCHT(OPOR, &FOLLOW_OPOR_in_expr65); 
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto ruleexprEx;
++            	        }
++
++            	        OPOR5_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, OPOR5));
++            	        root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, OPOR5_tree, root_0));
++
++            	        FOLLOWPUSH(FOLLOW_aexpr_in_expr68);
++            	        aexpr6=aexpr(ctx);
++
++            	        FOLLOWPOP();
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto ruleexprEx;
++            	        }
++
++            	        ADAPTOR->addChild(ADAPTOR, root_0, aexpr6.tree);
++
++            	    }
++            	    break;
++
++            	default:
++            	    goto loop2;	/* break out of the loop */
++            	    break;
++                }
++            }
++            loop2: ; /* Jump out to here if this rule does not match */
++
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleexprEx; /* Prevent compiler warnings */
++    ruleexprEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end expr */
++
++/** 
++ * $ANTLR start aexpr
++ * DAAP.g:33:1: aexpr : crit ( OPAND crit )* ;
++ */
++static DAAPParser_aexpr_return
++aexpr(pDAAPParser ctx)
++{   
++    DAAPParser_aexpr_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    OPAND8;
++    DAAPParser_crit_return crit7;
++    #undef	RETURN_TYPE_crit7
++    #define	RETURN_TYPE_crit7 DAAPParser_crit_return
++
++    DAAPParser_crit_return crit9;
++    #undef	RETURN_TYPE_crit9
++    #define	RETURN_TYPE_crit9 DAAPParser_crit_return
++
++    pANTLR3_BASE_TREE OPAND8_tree;
++
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    OPAND8       = NULL;
++    crit7.tree = NULL;
++
++    crit9.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    OPAND8_tree   = NULL;
++
++
++    retval.tree  = NULL;
++    {
++        // DAAP.g:33:7: ( crit ( OPAND crit )* )
++        // DAAP.g:33:9: crit ( OPAND crit )*
++        {
++            root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++            FOLLOWPUSH(FOLLOW_crit_in_aexpr80);
++            crit7=crit(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto ruleaexprEx;
++            }
++
++            ADAPTOR->addChild(ADAPTOR, root_0, crit7.tree);
++
++            // DAAP.g:33:14: ( OPAND crit )*
++
++            for (;;)
++            {
++                int alt3=2;
++                switch ( LA(1) ) 
++                {
++                case OPAND:
++                	{
++                		alt3=1;
++                	}
++                    break;
++
++                }
++
++                switch (alt3) 
++                {
++            	case 1:
++            	    // DAAP.g:33:15: OPAND crit
++            	    {
++            	        OPAND8 = (pANTLR3_COMMON_TOKEN) MATCHT(OPAND, &FOLLOW_OPAND_in_aexpr83); 
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto ruleaexprEx;
++            	        }
++
++            	        OPAND8_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, OPAND8));
++            	        root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, OPAND8_tree, root_0));
++
++            	        FOLLOWPUSH(FOLLOW_crit_in_aexpr86);
++            	        crit9=crit(ctx);
++
++            	        FOLLOWPOP();
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto ruleaexprEx;
++            	        }
++
++            	        ADAPTOR->addChild(ADAPTOR, root_0, crit9.tree);
++
++            	    }
++            	    break;
++
++            	default:
++            	    goto loop3;	/* break out of the loop */
++            	    break;
++                }
++            }
++            loop3: ; /* Jump out to here if this rule does not match */
++
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleaexprEx; /* Prevent compiler warnings */
++    ruleaexprEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end aexpr */
++
++/** 
++ * $ANTLR start crit
++ * DAAP.g:36:1: crit : ( LPAR expr RPAR -> expr | STR );
++ */
++static DAAPParser_crit_return
++crit(pDAAPParser ctx)
++{   
++    DAAPParser_crit_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    LPAR10;
++    pANTLR3_COMMON_TOKEN    RPAR12;
++    pANTLR3_COMMON_TOKEN    STR13;
++    DAAPParser_expr_return expr11;
++    #undef	RETURN_TYPE_expr11
++    #define	RETURN_TYPE_expr11 DAAPParser_expr_return
++
++    pANTLR3_BASE_TREE LPAR10_tree;
++    pANTLR3_BASE_TREE RPAR12_tree;
++    pANTLR3_BASE_TREE STR13_tree;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_RPAR;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_LPAR;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_expr;
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    LPAR10       = NULL;
++    RPAR12       = NULL;
++    STR13       = NULL;
++    expr11.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    LPAR10_tree   = NULL;
++    RPAR12_tree   = NULL;
++    STR13_tree   = NULL;
++
++    stream_RPAR   = NULL;
++    #define CREATE_stream_RPAR  if (stream_RPAR == NULL) {stream_RPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token RPAR"); } 
++    stream_LPAR   = NULL;
++    #define CREATE_stream_LPAR  if (stream_LPAR == NULL) {stream_LPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token LPAR"); } 
++    stream_expr   = NULL;
++    #define CREATE_stream_expr  if (stream_expr == NULL) {stream_expr = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule expr"); }
++
++    retval.tree  = NULL;
++    {
++        {
++            //  DAAP.g:36:6: ( LPAR expr RPAR -> expr | STR )
++            
++            ANTLR3_UINT32 alt4;
++
++            alt4=2;
++
++            switch ( LA(1) ) 
++            {
++            case LPAR:
++            	{
++            		alt4=1;
++            	}
++                break;
++            case STR:
++            	{
++            		alt4=2;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 4;
++                EXCEPTION->state        = 0;
++
++
++                goto rulecritEx;
++            }
++
++            switch (alt4) 
++            {
++        	case 1:
++        	    // DAAP.g:36:8: LPAR expr RPAR
++        	    {
++        	        LPAR10 = (pANTLR3_COMMON_TOKEN) MATCHT(LPAR, &FOLLOW_LPAR_in_crit98); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++        	         
++        	        CREATE_stream_LPAR; stream_LPAR->add(stream_LPAR, LPAR10, NULL);
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_crit100);
++        	        expr11=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++
++        	        CREATE_stream_expr; stream_expr->add(stream_expr, expr11.tree, NULL);
++        	        RPAR12 = (pANTLR3_COMMON_TOKEN) MATCHT(RPAR, &FOLLOW_RPAR_in_crit102); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++        	         
++        	        CREATE_stream_RPAR; stream_RPAR->add(stream_RPAR, RPAR12, NULL);
++
++
++        	         
++        	        /* AST REWRITE
++        	         * elements          : expr
++        	         * token labels      : 
++        	         * rule labels       : retval
++        	         * token list labels : 
++        	         * rule list labels  : 
++        	         */
++        	        {
++        	        	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++        	        	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++        	        	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	retval.tree    = root_0;
++        	        	// 36:24: -> expr
++        	        	{
++        	        	    ADAPTOR->addChild(ADAPTOR, root_0, stream_expr == NULL ? NULL : stream_expr->nextTree(stream_expr));
++
++        	        	}
++
++        	        	retval.tree = root_0; // set result root
++        	        	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++        	        }
++        	    }
++        	    break;
++        	case 2:
++        	    // DAAP.g:37:4: STR
++        	    {
++        	        root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++        	        STR13 = (pANTLR3_COMMON_TOKEN) MATCHT(STR, &FOLLOW_STR_in_crit112); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++
++        	        STR13_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, STR13));
++        	        ADAPTOR->addChild(ADAPTOR, root_0, STR13_tree);
++
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulecritEx; /* Prevent compiler warnings */
++    rulecritEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++        if (stream_RPAR != NULL) stream_RPAR->free(stream_RPAR);
++        if (stream_LPAR != NULL) stream_LPAR->free(stream_LPAR);
++        if (stream_expr != NULL) stream_expr->free(stream_expr);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end crit */
++/* End of parsing rules
++ * ==============================================
++ */
++
++/* ==============================================
++ * Syntactic predicates
++ */
++/* End of syntactic predicates
++ * ==============================================
++ */
++
++ 
++ 
++
++
++
++/* End of code
++ * =============================================================================
++ */
+diff --git a/src/pregen/DAAPParser.h b/src/pregen/DAAPParser.h
+new file mode 100644
+index 0000000..dcc664f
+--- /dev/null
++++ b/src/pregen/DAAPParser.h
+@@ -0,0 +1,226 @@
++/** \file
++ *  This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : DAAP.g
++ *     -                            On : 2014-09-30 21:42:39
++ *     -                for the parser : DAAPParserParser *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++ * The parser DAAPParser has the callable functions (rules) shown below,
++ * which will invoke the code for the associated rule in the source grammar
++ * assuming that the input stream is pointing to a token/text stream that could begin
++ * this rule.
++ * 
++ * For instance if you call the first (topmost) rule in a parser grammar, you will
++ * get the results of a full parse, but calling a rule half way through the grammar will
++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
++ * in editors and so on.
++ *
++ * The parser entry points are called indirectly (by function pointer to function) via
++ * a parser context typedef pDAAPParser, which is returned from a call to DAAPParserNew().
++ *
++ * The methods in pDAAPParser are  as follows:
++ *
++ *  - DAAPParser_query_return      pDAAPParser->query(pDAAPParser)
++ *  - DAAPParser_expr_return      pDAAPParser->expr(pDAAPParser)
++ *  - DAAPParser_aexpr_return      pDAAPParser->aexpr(pDAAPParser)
++ *  - DAAPParser_crit_return      pDAAPParser->crit(pDAAPParser)
++ *
++ * The return type for any particular rule is of course determined by the source
++ * grammar file.
++ */
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++#ifndef	_DAAPParser_H
++#define _DAAPParser_H
++/* =============================================================================
++ * Standard antlr3 C runtime definitions
++ */
++#include    <antlr3.h>
++
++/* End of standard antlr 3 runtime definitions
++ * =============================================================================
++ */
++ 
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++// Forward declare the context typedef so that we can use it before it is
++// properly defined. Delegators and delegates (from import statements) are
++// interdependent and their context structures contain pointers to each other
++// C only allows such things to be declared if you pre-declare the typedef.
++//
++typedef struct DAAPParser_Ctx_struct DAAPParser, * pDAAPParser;
++
++
++
++#ifdef	ANTLR3_WINDOWS
++// Disable: Unreferenced parameter,							- Rules with parameters that are not used
++//          constant conditional,							- ANTLR realizes that a prediction is always true (synpred usually)
++//          initialized but unused variable					- tree rewrite variables declared but not needed
++//          Unreferenced local variable						- lexer rule declares but does not always use _type
++//          potentially unitialized variable used			- retval always returned from a rule 
++//			unreferenced local function has been removed	- susually getTokenNames or freeScope, they can go without warnigns
++//
++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
++// this is a matter of orthogonality hence I disable that one.
++//
++#pragma warning( disable : 4100 )
++#pragma warning( disable : 4101 )
++#pragma warning( disable : 4127 )
++#pragma warning( disable : 4189 )
++#pragma warning( disable : 4505 )
++#pragma warning( disable : 4701 )
++#endif
++typedef struct DAAPParser_query_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    DAAPParser_query_return;
++
++typedef struct DAAPParser_expr_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    DAAPParser_expr_return;
++
++typedef struct DAAPParser_aexpr_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    DAAPParser_aexpr_return;
++
++typedef struct DAAPParser_crit_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    DAAPParser_crit_return;
++
++
++
++/** Context tracking structure for DAAPParser
++ */
++struct DAAPParser_Ctx_struct
++{
++    /** Built in ANTLR3 context tracker contains all the generic elements
++     *  required for context tracking.
++     */
++    pANTLR3_PARSER   pParser;
++
++
++     DAAPParser_query_return (*query)	(struct DAAPParser_Ctx_struct * ctx);
++     DAAPParser_expr_return (*expr)	(struct DAAPParser_Ctx_struct * ctx);
++     DAAPParser_aexpr_return (*aexpr)	(struct DAAPParser_Ctx_struct * ctx);
++     DAAPParser_crit_return (*crit)	(struct DAAPParser_Ctx_struct * ctx);
++    // Delegated rules
++    const char * (*getGrammarFileName)();
++    void	    (*free)   (struct DAAPParser_Ctx_struct * ctx);
++    /* @headerFile.members() */
++    pANTLR3_BASE_TREE_ADAPTOR	adaptor;
++    pANTLR3_VECTOR_FACTORY		vectors;
++    /* End @headerFile.members() */
++};
++
++// Function protoypes for the constructor functions that external translation units
++// such as delegators and delegates may wish to call.
++//
++ANTLR3_API pDAAPParser DAAPParserNew         (pANTLR3_COMMON_TOKEN_STREAM instream);
++ANTLR3_API pDAAPParser DAAPParserNewSSD      (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
++
++/** Symbolic definitions of all the tokens that the parser will work with.
++ * \{
++ *
++ * Antlr will define EOF, but we can't use that as it it is too common in
++ * in C header files and that would be confusing. There is no way to filter this out at the moment
++ * so we just undef it here for now. That isn't the value we get back from C recognizers
++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
++ */
++#ifdef	EOF
++#undef	EOF
++#endif
++#ifdef	Tokens
++#undef	Tokens
++#endif 
++#define STR      9
++#define QUOTE      10
++#define LPAR      7
++#define NEWLINE      4
++#define OPOR      5
++#define RPAR      8
++#define ESCAPED      11
++#define OPAND      6
++#define EOF      -1
++#ifdef	EOF
++#undef	EOF
++#define	EOF	ANTLR3_TOKEN_EOF
++#endif
++
++#ifndef TOKENSOURCE
++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
++#endif
++
++/* End of token definitions for DAAPParser
++ * =============================================================================
++ */
++/** \} */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
++
++/* END - Note:Keep extra line feed to satisfy UNIX systems */
+diff --git a/src/pregen/RSP.u b/src/pregen/RSP.u
+new file mode 100644
+index 0000000..89256ff
+--- /dev/null
++++ b/src/pregen/RSP.u
+@@ -0,0 +1,6 @@
++RSPParser.c : RSP.g
++./RSP.tokens : RSP.g
++RSPParser.h : RSP.g
++RSPLexer.c : RSP.g
++RSPLexer.h : RSP.g
++ANTLR_PRODUCTS += RSPParser.c ./RSP.tokens RSPParser.h RSPLexer.c RSPLexer.h 
+\ No newline at end of file
+diff --git a/src/pregen/RSP2SQL.c b/src/pregen/RSP2SQL.c
+new file mode 100644
+index 0000000..b5c9550
+--- /dev/null
++++ b/src/pregen/RSP2SQL.c
+@@ -0,0 +1,2546 @@
++/** \file
++ *  This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : RSP2SQL.g
++ *     -                            On : 2014-09-30 21:42:42
++ *     -           for the tree parser : RSP2SQLTreeParser *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++*/
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++
++/* =============================================================================
++ * This is what the grammar programmer asked us to put at the top of every file.
++ */
++
++	/* Needs #define _GNU_SOURCE for strptime() */
++
++	#include <stdio.h>
++	#include <string.h>
++	#include <time.h>
++	#include <stdint.h>
++
++	#include "logger.h"
++	#include "db.h"
++	#include "misc.h"
++	#include "rsp_query.h"
++
++/* End of Header action.
++ * =============================================================================
++ */
++/* -----------------------------------------
++ * Include the ANTLR3 generated header file.
++ */
++#include    "RSP2SQL.h"
++/* ----------------------------------------- */
++
++
++
++
++
++/* MACROS that hide the C interface implementations from the
++ * generated code, which makes it a little more understandable to the human eye.
++ * I am very much against using C pre-processor macros for function calls and bits
++ * of code as you cannot see what is happening when single stepping in debuggers
++ * and so on. The exception (in my book at least) is for generated code, where you are
++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
++ * hides some indirect calls, but is always referring to the input stream. This is
++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
++ * the runtime interfaces without changing the generated code too often, without
++ * confusing the reader of the generated output, who may not wish to know the gory
++ * details of the interface inheritance.
++ */
++ 
++#define		CTX	ctx
++
++/* Aids in accessing scopes for grammar programmers
++ */
++#undef	SCOPE_TYPE
++#undef	SCOPE_STACK
++#undef	SCOPE_TOP
++#define	SCOPE_TYPE(scope)   pRSP2SQL_##scope##_SCOPE
++#define SCOPE_STACK(scope)  pRSP2SQL_##scope##Stack
++#define	SCOPE_TOP(scope)    ctx->pRSP2SQL_##scope##Top
++#define	SCOPE_SIZE(scope)		ctx->pRSP2SQL_##scope##Stack_limit
++#define SCOPE_INSTANCE(scope, i)	(ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
++
++/* Macros for accessing things in the parser
++ */
++ 
++#undef	    PARSER
++#undef	    RECOGNIZER		    
++#undef	    HAVEPARSEDRULE
++#undef	    INPUT
++#undef	    STRSTREAM
++#undef	    HASEXCEPTION
++#undef	    EXCEPTION
++#undef	    MATCHT
++#undef	    MATCHANYT
++#undef	    FOLLOWSTACK
++#undef	    FOLLOWPUSH
++#undef	    FOLLOWPOP
++#undef	    PRECOVER
++#undef	    PREPORTERROR
++#undef	    LA
++#undef	    LT
++#undef	    CONSTRUCTEX
++#undef	    CONSUME
++#undef	    MARK
++#undef	    REWIND
++#undef	    REWINDLAST
++#undef	    PERRORRECOVERY
++#undef	    HASFAILED
++#undef	    FAILEDFLAG
++#undef	    RECOVERFROMMISMATCHEDSET
++#undef	    RECOVERFROMMISMATCHEDELEMENT
++#undef	    BACKTRACKING
++#undef      ADAPTOR
++#undef	    RULEMEMO		
++#undef		SEEK    
++#undef		INDEX
++#undef		DBG
++
++#define	    PARSER							ctx->pTreeParser  
++#define	    RECOGNIZER						PARSER->rec
++#define		PSRSTATE						RECOGNIZER->state
++#define	    HAVEPARSEDRULE(r)				RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
++#define	    INPUT							PARSER->ctnstream
++#define		ISTREAM							INPUT->tnstream->istream
++#define	    STRSTREAM						INPUT->tnstream
++#define	    HASEXCEPTION()					(PSRSTATE->error == ANTLR3_TRUE)
++#define	    EXCEPTION						PSRSTATE->exception
++#define	    MATCHT(t, fs)					RECOGNIZER->match(RECOGNIZER, t, fs)
++#define	    MATCHANYT()						RECOGNIZER->matchAny(RECOGNIZER)
++#define	    FOLLOWSTACK					    PSRSTATE->following
++#define	    FOLLOWPUSH(x)					FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
++#define	    FOLLOWPOP()						FOLLOWSTACK->pop(FOLLOWSTACK)
++#define	    PRECOVER()						RECOGNIZER->recover(RECOGNIZER)
++#define	    PREPORTERROR()					RECOGNIZER->reportError(RECOGNIZER)
++#define	    LA(n)							ISTREAM->_LA(ISTREAM, n)
++#define	    LT(n)							INPUT->tnstream->_LT(INPUT->tnstream, n)
++#define	    CONSTRUCTEX()					RECOGNIZER->exConstruct(RECOGNIZER)
++#define	    CONSUME()						ISTREAM->consume(ISTREAM)
++#define	    MARK()							ISTREAM->mark(ISTREAM)
++#define	    REWIND(m)						ISTREAM->rewind(ISTREAM, m)
++#define	    REWINDLAST()					ISTREAM->rewindLast(ISTREAM)
++#define	    PERRORRECOVERY					PSRSTATE->errorRecovery
++#define	    FAILEDFLAG						PSRSTATE->failed
++#define	    HASFAILED()						(FAILEDFLAG == ANTLR3_TRUE)
++#define	    BACKTRACKING					PSRSTATE->backtracking
++#define	    RECOVERFROMMISMATCHEDSET(s)		RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
++#define	    RECOVERFROMMISMATCHEDELEMENT(e)	RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
++#define     ADAPTOR                         INPUT->adaptor
++#define		RULEMEMO						PSRSTATE->ruleMemo
++#define		SEEK(n)							ISTREAM->seek(ISTREAM, n)
++#define		INDEX()							ISTREAM->index(ISTREAM)
++#define		DBG								RECOGNIZER->debugger
++
++
++#define		TOKTEXT(tok, txt)				tok, (pANTLR3_UINT8)txt
++
++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
++ * then for the present you must use different names for your defines as these are hard coded
++ * in the code generator. It would be better not to use such names internally, and maybe
++ * we can change this in a forthcoming release. I deliberately do not #undef these
++ * here as this will at least give you a redefined error somewhere if they clash.
++ */
++#define	    UP	    ANTLR3_TOKEN_UP
++#define	    DOWN    ANTLR3_TOKEN_DOWN
++#define	    EOR	    ANTLR3_TOKEN_EOR
++#define	    INVALID ANTLR3_TOKEN_INVALID
++
++
++/* =============================================================================
++ * Functions to create and destroy scopes. First come the rule scopes, followed
++ * by the global declared scopes.
++ */
++
++
++
++/* ============================================================================= */
++
++/* =============================================================================
++ * Start of recognizer
++ */
++
++
++
++/** \brief Table of all token names in symbolic order, mainly used for
++ *         error reporting.
++ */
++pANTLR3_UINT8   RSP2SQLTokenNames[30+4]
++     = {
++        (pANTLR3_UINT8) "<invalid>",       /* String to print to indicate an invalid token */
++        (pANTLR3_UINT8) "<EOR>",
++        (pANTLR3_UINT8) "<DOWN>", 
++        (pANTLR3_UINT8) "<UP>", 
++        (pANTLR3_UINT8) "NEWLINE",
++        (pANTLR3_UINT8) "OR",
++        (pANTLR3_UINT8) "AND",
++        (pANTLR3_UINT8) "LPAR",
++        (pANTLR3_UINT8) "RPAR",
++        (pANTLR3_UINT8) "FIELD",
++        (pANTLR3_UINT8) "STR",
++        (pANTLR3_UINT8) "NOT",
++        (pANTLR3_UINT8) "EQUAL",
++        (pANTLR3_UINT8) "INCLUDES",
++        (pANTLR3_UINT8) "STARTSW",
++        (pANTLR3_UINT8) "ENDSW",
++        (pANTLR3_UINT8) "INT",
++        (pANTLR3_UINT8) "LESS",
++        (pANTLR3_UINT8) "GREATER",
++        (pANTLR3_UINT8) "LTE",
++        (pANTLR3_UINT8) "GTE",
++        (pANTLR3_UINT8) "BEFORE",
++        (pANTLR3_UINT8) "AFTER",
++        (pANTLR3_UINT8) "DATE",
++        (pANTLR3_UINT8) "TODAY",
++        (pANTLR3_UINT8) "DAY",
++        (pANTLR3_UINT8) "WEEK",
++        (pANTLR3_UINT8) "MONTH",
++        (pANTLR3_UINT8) "YEAR",
++        (pANTLR3_UINT8) "QUOTE",
++        (pANTLR3_UINT8) "WS",
++        (pANTLR3_UINT8) "DIGIT19",
++        (pANTLR3_UINT8) "DIGIT09",
++        (pANTLR3_UINT8) "ESCAPED"
++       };
++
++        
++
++// Forward declare the locally static matching functions we have generated.
++//
++static pANTLR3_STRING	query    (pRSP2SQL ctx);
++static RSP2SQL_expr_return	expr    (pRSP2SQL ctx);
++static RSP2SQL_strcrit_return	strcrit    (pRSP2SQL ctx);
++static pANTLR3_COMMON_TOKEN	strop    (pRSP2SQL ctx);
++static RSP2SQL_intcrit_return	intcrit    (pRSP2SQL ctx);
++static pANTLR3_COMMON_TOKEN	intop    (pRSP2SQL ctx);
++static RSP2SQL_datecrit_return	datecrit    (pRSP2SQL ctx);
++static pANTLR3_COMMON_TOKEN	dateop    (pRSP2SQL ctx);
++static RSP2SQL_datespec_return	datespec    (pRSP2SQL ctx);
++static RSP2SQL_dateref_return	dateref    (pRSP2SQL ctx);
++static RSP2SQL_dateintval_return	dateintval    (pRSP2SQL ctx);
++static void	RSP2SQLFree(pRSP2SQL ctx);
++/* For use in tree output where we are accumulating rule labels via label += ruleRef
++ * we need a function that knows how to free a return scope when the list is destroyed. 
++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
++ */
++static	void ANTLR3_CDECL freeScope(void * scope)
++{
++    ANTLR3_FREE(scope);
++}
++
++/** \brief Name of the grammar file that generated this code
++ */
++static const char fileName[] = "RSP2SQL.g";
++
++/** \brief Return the name of the grammar file that generated this code.
++ */
++static const char * getGrammarFileName()
++{
++	return fileName;
++}
++/** \brief Create a new RSP2SQL parser and return a context for it.
++ *
++ * \param[in] instream Pointer to an input stream interface.
++ *
++ * \return Pointer to new parser context upon success.
++ */
++ANTLR3_API pRSP2SQL
++RSP2SQLNew   (pANTLR3_COMMON_TREE_NODE_STREAM instream)
++{
++	// See if we can create a new parser with the standard constructor
++	//
++	return RSP2SQLNewSSD(instream, NULL);
++}
++
++/** \brief Create a new RSP2SQL parser and return a context for it.
++ *
++ * \param[in] instream Pointer to an input stream interface.
++ *
++ * \return Pointer to new parser context upon success.
++ */
++ANTLR3_API pRSP2SQL
++RSP2SQLNewSSD   (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
++{
++    pRSP2SQL ctx;	    /* Context structure we will build and return   */
++    
++    ctx	= (pRSP2SQL) ANTLR3_CALLOC(1, sizeof(RSP2SQL));
++    
++    if	(ctx == NULL)
++    {
++		// Failed to allocate memory for parser context
++		//
++        return  NULL;
++    }
++    
++    /* -------------------------------------------------------------------
++     * Memory for basic structure is allocated, now to fill in
++     * the base ANTLR3 structures. We initialize the function pointers
++     * for the standard ANTLR3 parser function set, but upon return
++     * from here, the programmer may set the pointers to provide custom
++     * implementations of each function. 
++     *
++     * We don't use the macros defined in RSP2SQL.h here, in order that you can get a sense
++     * of what goes where.
++     */
++
++    /* Create a base Tree parser/recognizer, using the supplied tree node stream
++     */
++    ctx->pTreeParser		= antlr3TreeParserNewStream(ANTLR3_SIZE_HINT, instream, state);
++    /* Install the implementation of our RSP2SQL interface
++     */
++    ctx->query	= query;
++    ctx->expr	= expr;
++    ctx->strcrit	= strcrit;
++    ctx->strop	= strop;
++    ctx->intcrit	= intcrit;
++    ctx->intop	= intop;
++    ctx->datecrit	= datecrit;
++    ctx->dateop	= dateop;
++    ctx->datespec	= datespec;
++    ctx->dateref	= dateref;
++    ctx->dateintval	= dateintval;
++    ctx->free			= RSP2SQLFree;
++    ctx->getGrammarFileName	= getGrammarFileName;
++    
++    /* Install the scope pushing methods.
++     */
++
++        
++    
++
++	
++    /* Install the token table
++     */
++    PSRSTATE->tokenNames   = RSP2SQLTokenNames;
++    
++    
++    /* Return the newly built parser to the caller
++     */
++    return  ctx;
++}
++
++/** Free the parser resources
++ */
++ static void
++ RSP2SQLFree(pRSP2SQL ctx)
++ {
++    /* Free any scope memory
++     */
++    
++        
++	// Free this parser
++	//
++    ctx->pTreeParser->free(ctx->pTreeParser);
++    ANTLR3_FREE(ctx);
++
++    /* Everything is released, so we can return
++     */
++    return;
++ }
++ 
++/** Return token names used by this tree parser
++ *
++ * The returned pointer is used as an index into the token names table (using the token 
++ * number as the index).
++ * 
++ * \return Pointer to first char * in the table.
++ */
++static pANTLR3_UINT8    *getTokenNames() 
++{
++        return RSP2SQLTokenNames; 
++}
++
++
++    	#define RSP_TYPE_STRING 0
++    	#define RSP_TYPE_INT    1
++    	#define RSP_TYPE_DATE   2
++
++    	struct rsp_query_field_map {
++    	  char *rsp_field;
++    	  int field_type;
++    	  /* RSP fields are named after the DB columns - or vice versa */
++    	};
++
++    	/* gperf static hash, rsp_query.gperf */
++    	#include "rsp_query_hash.c"
++
++    
++/* Declare the bitsets
++ */
++
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_query70  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_query70_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_query70	= { FOLLOW_expr_in_query70_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AND_in_expr95  */
++static	ANTLR3_BITWORD FOLLOW_AND_in_expr95_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_AND_in_expr95	= { FOLLOW_AND_in_expr95_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr101  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_expr101_bits[]	= { ANTLR3_UINT64_LIT(0x00000000007EF860) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_expr101	= { FOLLOW_expr_in_expr101_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr107  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_expr107_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_expr107	= { FOLLOW_expr_in_expr107_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OR_in_expr118  */
++static	ANTLR3_BITWORD FOLLOW_OR_in_expr118_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_OR_in_expr118	= { FOLLOW_OR_in_expr118_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr124  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_expr124_bits[]	= { ANTLR3_UINT64_LIT(0x00000000007EF860) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_expr124	= { FOLLOW_expr_in_expr124_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr130  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_expr130_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_expr130	= { FOLLOW_expr_in_expr130_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strcrit_in_expr144  */
++static	ANTLR3_BITWORD FOLLOW_strcrit_in_expr144_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_strcrit_in_expr144	= { FOLLOW_strcrit_in_expr144_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_expr154  */
++static	ANTLR3_BITWORD FOLLOW_NOT_in_expr154_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_NOT_in_expr154	= { FOLLOW_NOT_in_expr154_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strcrit_in_expr160  */
++static	ANTLR3_BITWORD FOLLOW_strcrit_in_expr160_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_strcrit_in_expr160	= { FOLLOW_strcrit_in_expr160_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intcrit_in_expr174  */
++static	ANTLR3_BITWORD FOLLOW_intcrit_in_expr174_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_intcrit_in_expr174	= { FOLLOW_intcrit_in_expr174_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_expr184  */
++static	ANTLR3_BITWORD FOLLOW_NOT_in_expr184_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_NOT_in_expr184	= { FOLLOW_NOT_in_expr184_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intcrit_in_expr190  */
++static	ANTLR3_BITWORD FOLLOW_intcrit_in_expr190_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_intcrit_in_expr190	= { FOLLOW_intcrit_in_expr190_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_datecrit_in_expr204  */
++static	ANTLR3_BITWORD FOLLOW_datecrit_in_expr204_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_datecrit_in_expr204	= { FOLLOW_datecrit_in_expr204_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strop_in_strcrit233  */
++static	ANTLR3_BITWORD FOLLOW_strop_in_strcrit233_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_strop_in_strcrit233	= { FOLLOW_strop_in_strcrit233_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_strcrit239  */
++static	ANTLR3_BITWORD FOLLOW_FIELD_in_strcrit239_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000400) };
++static  ANTLR3_BITSET_LIST FOLLOW_FIELD_in_strcrit239	= { FOLLOW_FIELD_in_strcrit239_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_strcrit245  */
++static	ANTLR3_BITWORD FOLLOW_STR_in_strcrit245_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_STR_in_strcrit245	= { FOLLOW_STR_in_strcrit245_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_EQUAL_in_strop274  */
++static	ANTLR3_BITWORD FOLLOW_EQUAL_in_strop274_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_EQUAL_in_strop274	= { FOLLOW_EQUAL_in_strop274_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCLUDES_in_strop287  */
++static	ANTLR3_BITWORD FOLLOW_INCLUDES_in_strop287_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_INCLUDES_in_strop287	= { FOLLOW_INCLUDES_in_strop287_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STARTSW_in_strop300  */
++static	ANTLR3_BITWORD FOLLOW_STARTSW_in_strop300_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_STARTSW_in_strop300	= { FOLLOW_STARTSW_in_strop300_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_ENDSW_in_strop313  */
++static	ANTLR3_BITWORD FOLLOW_ENDSW_in_strop313_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_ENDSW_in_strop313	= { FOLLOW_ENDSW_in_strop313_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intop_in_intcrit342  */
++static	ANTLR3_BITWORD FOLLOW_intop_in_intcrit342_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_intop_in_intcrit342	= { FOLLOW_intop_in_intcrit342_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_intcrit348  */
++static	ANTLR3_BITWORD FOLLOW_FIELD_in_intcrit348_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000010000) };
++static  ANTLR3_BITSET_LIST FOLLOW_FIELD_in_intcrit348	= { FOLLOW_FIELD_in_intcrit348_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_intcrit354  */
++static	ANTLR3_BITWORD FOLLOW_INT_in_intcrit354_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_INT_in_intcrit354	= { FOLLOW_INT_in_intcrit354_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_EQUAL_in_intop383  */
++static	ANTLR3_BITWORD FOLLOW_EQUAL_in_intop383_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_EQUAL_in_intop383	= { FOLLOW_EQUAL_in_intop383_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_LESS_in_intop396  */
++static	ANTLR3_BITWORD FOLLOW_LESS_in_intop396_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_LESS_in_intop396	= { FOLLOW_LESS_in_intop396_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_GREATER_in_intop409  */
++static	ANTLR3_BITWORD FOLLOW_GREATER_in_intop409_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_GREATER_in_intop409	= { FOLLOW_GREATER_in_intop409_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_LTE_in_intop422  */
++static	ANTLR3_BITWORD FOLLOW_LTE_in_intop422_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_LTE_in_intop422	= { FOLLOW_LTE_in_intop422_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_GTE_in_intop435  */
++static	ANTLR3_BITWORD FOLLOW_GTE_in_intop435_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_GTE_in_intop435	= { FOLLOW_GTE_in_intop435_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateop_in_datecrit464  */
++static	ANTLR3_BITWORD FOLLOW_dateop_in_datecrit464_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateop_in_datecrit464	= { FOLLOW_dateop_in_datecrit464_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_datecrit470  */
++static	ANTLR3_BITWORD FOLLOW_FIELD_in_datecrit470_bits[]	= { ANTLR3_UINT64_LIT(0x0000000001FEF860) };
++static  ANTLR3_BITSET_LIST FOLLOW_FIELD_in_datecrit470	= { FOLLOW_FIELD_in_datecrit470_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_datespec_in_datecrit476  */
++static	ANTLR3_BITWORD FOLLOW_datespec_in_datecrit476_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_datespec_in_datecrit476	= { FOLLOW_datespec_in_datecrit476_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_BEFORE_in_dateop505  */
++static	ANTLR3_BITWORD FOLLOW_BEFORE_in_dateop505_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_BEFORE_in_dateop505	= { FOLLOW_BEFORE_in_dateop505_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AFTER_in_dateop518  */
++static	ANTLR3_BITWORD FOLLOW_AFTER_in_dateop518_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_AFTER_in_dateop518	= { FOLLOW_AFTER_in_dateop518_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateref_in_datespec546  */
++static	ANTLR3_BITWORD FOLLOW_dateref_in_datespec546_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateref_in_datespec546	= { FOLLOW_dateref_in_datespec546_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateop_in_datespec560  */
++static	ANTLR3_BITWORD FOLLOW_dateop_in_datespec560_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000004) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateop_in_datespec560	= { FOLLOW_dateop_in_datespec560_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateref_in_datespec566  */
++static	ANTLR3_BITWORD FOLLOW_dateref_in_datespec566_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000010000) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateref_in_datespec566	= { FOLLOW_dateref_in_datespec566_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_datespec572  */
++static	ANTLR3_BITWORD FOLLOW_INT_in_datespec572_bits[]	= { ANTLR3_UINT64_LIT(0x000000001E000000) };
++static  ANTLR3_BITSET_LIST FOLLOW_INT_in_datespec572	= { FOLLOW_INT_in_datespec572_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateintval_in_datespec578  */
++static	ANTLR3_BITWORD FOLLOW_dateintval_in_datespec578_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000008) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateintval_in_datespec578	= { FOLLOW_dateintval_in_datespec578_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATE_in_dateref607  */
++static	ANTLR3_BITWORD FOLLOW_DATE_in_dateref607_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_DATE_in_dateref607	= { FOLLOW_DATE_in_dateref607_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_TODAY_in_dateref616  */
++static	ANTLR3_BITWORD FOLLOW_TODAY_in_dateref616_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_TODAY_in_dateref616	= { FOLLOW_TODAY_in_dateref616_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DAY_in_dateintval640  */
++static	ANTLR3_BITWORD FOLLOW_DAY_in_dateintval640_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_DAY_in_dateintval640	= { FOLLOW_DAY_in_dateintval640_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_WEEK_in_dateintval649  */
++static	ANTLR3_BITWORD FOLLOW_WEEK_in_dateintval649_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_WEEK_in_dateintval649	= { FOLLOW_WEEK_in_dateintval649_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_MONTH_in_dateintval658  */
++static	ANTLR3_BITWORD FOLLOW_MONTH_in_dateintval658_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_MONTH_in_dateintval658	= { FOLLOW_MONTH_in_dateintval658_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_YEAR_in_dateintval667  */
++static	ANTLR3_BITWORD FOLLOW_YEAR_in_dateintval667_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_YEAR_in_dateintval667	= { FOLLOW_YEAR_in_dateintval667_bits, 1	};
++     
++
++ 
++ 
++/* ==============================================
++ * Parsing rules
++ */
++/** 
++ * $ANTLR start query
++ * RSP2SQL.g:56:1: query returns [ pANTLR3_STRING result ] : e= expr ;
++ */
++static pANTLR3_STRING
++query(pRSP2SQL ctx)
++{   
++    pANTLR3_STRING result = NULL;
++
++    RSP2SQL_expr_return e;
++    #undef	RETURN_TYPE_e
++    #define	RETURN_TYPE_e RSP2SQL_expr_return
++
++    /* Initialize rule variables
++     */
++
++
++     result= NULL; 
++    {
++        // RSP2SQL.g:58:2: (e= expr )
++        // RSP2SQL.g:58:4: e= expr
++        {
++            FOLLOWPUSH(FOLLOW_expr_in_query70);
++            e=expr(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto rulequeryEx;
++            }
++
++            {
++
++                			if (!e.valid)
++                			{
++                				result= NULL;
++                			}
++                			else
++                			{
++                				result= e.result->factory->newRaw(e.result->factory);
++                				result->append8(result, "(");
++                				result->appendS(result, e.result);
++                				result->append8(result, ")");
++                			}
++                		
++            }
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulequeryEx; /* Prevent compiler warnings */
++    rulequeryEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return result;
++}
++/* $ANTLR end query */
++
++/** 
++ * $ANTLR start expr
++ * RSP2SQL.g:74:1: expr returns [ pANTLR3_STRING result, int valid ] : ( ^( AND a= expr b= expr ) | ^( OR a= expr b= expr ) | c= strcrit | ^( NOT c= strcrit ) | i= intcrit | ^( NOT i= intcrit ) | d= datecrit );
++ */
++static RSP2SQL_expr_return
++expr(pRSP2SQL ctx)
++{   
++    RSP2SQL_expr_return retval;
++
++    RSP2SQL_expr_return a;
++    #undef	RETURN_TYPE_a
++    #define	RETURN_TYPE_a RSP2SQL_expr_return
++
++    RSP2SQL_expr_return b;
++    #undef	RETURN_TYPE_b
++    #define	RETURN_TYPE_b RSP2SQL_expr_return
++
++    RSP2SQL_strcrit_return c;
++    #undef	RETURN_TYPE_c
++    #define	RETURN_TYPE_c RSP2SQL_strcrit_return
++
++    RSP2SQL_intcrit_return i;
++    #undef	RETURN_TYPE_i
++    #define	RETURN_TYPE_i RSP2SQL_intcrit_return
++
++    RSP2SQL_datecrit_return d;
++    #undef	RETURN_TYPE_d
++    #define	RETURN_TYPE_d RSP2SQL_datecrit_return
++
++    /* Initialize rule variables
++     */
++
++
++     retval.result= NULL; retval.valid= 1; 
++    retval.start = LT(1); retval.stop = retval.start;
++
++    {
++        {
++            //  RSP2SQL.g:76:2: ( ^( AND a= expr b= expr ) | ^( OR a= expr b= expr ) | c= strcrit | ^( NOT c= strcrit ) | i= intcrit | ^( NOT i= intcrit ) | d= datecrit )
++            
++            ANTLR3_UINT32 alt1;
++
++            alt1=7;
++
++            switch ( LA(1) ) 
++            {
++            case AND:
++            	{
++            		alt1=1;
++            	}
++                break;
++            case OR:
++            	{
++            		alt1=2;
++            	}
++                break;
++            case EQUAL:
++            	{
++            		switch ( LA(2) ) 
++            		{
++            		case DOWN:
++            			{
++            				switch ( LA(3) ) 
++            				{
++            				case FIELD:
++            					{
++            						switch ( LA(4) ) 
++            						{
++            						case INT:
++            							{
++            								alt1=5;
++            							}
++            						    break;
++            						case STR:
++            							{
++            								alt1=3;
++            							}
++            						    break;
++
++            						default:
++            						    CONSTRUCTEX();
++            						    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            						    EXCEPTION->message      = (void *)"";
++            						    EXCEPTION->decisionNum  = 1;
++            						    EXCEPTION->state        = 10;
++
++
++            						    goto ruleexprEx;
++            						}
++
++            					}
++            				    break;
++
++            				default:
++            				    CONSTRUCTEX();
++            				    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            				    EXCEPTION->message      = (void *)"";
++            				    EXCEPTION->decisionNum  = 1;
++            				    EXCEPTION->state        = 8;
++
++
++            				    goto ruleexprEx;
++            				}
++
++            			}
++            		    break;
++
++            		default:
++            		    CONSTRUCTEX();
++            		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            		    EXCEPTION->message      = (void *)"";
++            		    EXCEPTION->decisionNum  = 1;
++            		    EXCEPTION->state        = 3;
++
++
++            		    goto ruleexprEx;
++            		}
++
++            	}
++                break;
++            case INCLUDES:
++            case STARTSW:
++            case ENDSW:
++            	{
++            		alt1=3;
++            	}
++                break;
++            case NOT:
++            	{
++            		switch ( LA(2) ) 
++            		{
++            		case DOWN:
++            			{
++            				switch ( LA(3) ) 
++            				{
++            				case EQUAL:
++            					{
++            						switch ( LA(4) ) 
++            						{
++            						case DOWN:
++            							{
++            								switch ( LA(5) ) 
++            								{
++            								case FIELD:
++            									{
++            										switch ( LA(6) ) 
++            										{
++            										case STR:
++            											{
++            												alt1=4;
++            											}
++            										    break;
++            										case INT:
++            											{
++            												alt1=6;
++            											}
++            										    break;
++
++            										default:
++            										    CONSTRUCTEX();
++            										    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            										    EXCEPTION->message      = (void *)"";
++            										    EXCEPTION->decisionNum  = 1;
++            										    EXCEPTION->state        = 15;
++
++
++            										    goto ruleexprEx;
++            										}
++
++            									}
++            								    break;
++
++            								default:
++            								    CONSTRUCTEX();
++            								    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            								    EXCEPTION->message      = (void *)"";
++            								    EXCEPTION->decisionNum  = 1;
++            								    EXCEPTION->state        = 14;
++
++
++            								    goto ruleexprEx;
++            								}
++
++            							}
++            						    break;
++
++            						default:
++            						    CONSTRUCTEX();
++            						    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            						    EXCEPTION->message      = (void *)"";
++            						    EXCEPTION->decisionNum  = 1;
++            						    EXCEPTION->state        = 11;
++
++
++            						    goto ruleexprEx;
++            						}
++
++            					}
++            				    break;
++            				case LESS:
++            				case GREATER:
++            				case LTE:
++            				case GTE:
++            					{
++            						alt1=6;
++            					}
++            				    break;
++            				case INCLUDES:
++            				case STARTSW:
++            				case ENDSW:
++            					{
++            						alt1=4;
++            					}
++            				    break;
++
++            				default:
++            				    CONSTRUCTEX();
++            				    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            				    EXCEPTION->message      = (void *)"";
++            				    EXCEPTION->decisionNum  = 1;
++            				    EXCEPTION->state        = 9;
++
++
++            				    goto ruleexprEx;
++            				}
++
++            			}
++            		    break;
++
++            		default:
++            		    CONSTRUCTEX();
++            		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            		    EXCEPTION->message      = (void *)"";
++            		    EXCEPTION->decisionNum  = 1;
++            		    EXCEPTION->state        = 5;
++
++
++            		    goto ruleexprEx;
++            		}
++
++            	}
++                break;
++            case LESS:
++            case GREATER:
++            case LTE:
++            case GTE:
++            	{
++            		alt1=5;
++            	}
++                break;
++            case BEFORE:
++            case AFTER:
++            	{
++            		alt1=7;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 1;
++                EXCEPTION->state        = 0;
++
++
++                goto ruleexprEx;
++            }
++
++            switch (alt1) 
++            {
++        	case 1:
++        	    // RSP2SQL.g:76:4: ^( AND a= expr b= expr )
++        	    {
++        	         MATCHT(AND, &FOLLOW_AND_in_expr95); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_expr101);
++        	        a=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_expr107);
++        	        b=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_UP, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			if (!a.valid || !b.valid)
++        	            			{
++        	            				retval.valid= 0;
++        	            			}
++        	            			else
++        	            			{
++        	            				retval.result= a.result->factory->newRaw(a.result->factory);
++        	            				retval.result->append8(retval.result, "(");
++        	            				retval.result->appendS(retval.result, a.result);
++        	            				retval.result->append8(retval.result, " AND ");
++        	            				retval.result->appendS(retval.result, b.result);
++        	            				retval.result->append8(retval.result, ")");
++        	            			}
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP2SQL.g:92:4: ^( OR a= expr b= expr )
++        	    {
++        	         MATCHT(OR, &FOLLOW_OR_in_expr118); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_expr124);
++        	        a=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_expr130);
++        	        b=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_UP, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			if (!a.valid || !b.valid)
++        	            			{
++        	            				retval.valid= 0;
++        	            			}
++        	            			else
++        	            			{
++        	            				retval.result= a.result->factory->newRaw(a.result->factory);
++        	            				retval.result->append8(retval.result, "(");
++        	            				retval.result->appendS(retval.result, a.result);
++        	            				retval.result->append8(retval.result, " OR ");
++        	            				retval.result->appendS(retval.result, b.result);
++        	            				retval.result->append8(retval.result, ")");
++        	            			}
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 3:
++        	    // RSP2SQL.g:108:4: c= strcrit
++        	    {
++        	        FOLLOWPUSH(FOLLOW_strcrit_in_expr144);
++        	        c=strcrit(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			retval.valid= c.valid;
++        	            			retval.result= c.result;
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 4:
++        	    // RSP2SQL.g:113:4: ^( NOT c= strcrit )
++        	    {
++        	         MATCHT(NOT, &FOLLOW_NOT_in_expr154); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_strcrit_in_expr160);
++        	        c=strcrit(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_UP, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			if (!c.valid)
++        	            			{
++        	            				retval.valid= 0;
++        	            			}
++        	            			else
++        	            			{
++        	            				retval.result= c.result->factory->newRaw(c.result->factory);
++        	            				retval.result->append8(retval.result, "(NOT ");
++        	            				retval.result->appendS(retval.result, c.result);
++        	            				retval.result->append8(retval.result, ")");
++        	            			}
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 5:
++        	    // RSP2SQL.g:127:4: i= intcrit
++        	    {
++        	        FOLLOWPUSH(FOLLOW_intcrit_in_expr174);
++        	        i=intcrit(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			retval.valid= i.valid;
++        	            			retval.result= i.result;
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 6:
++        	    // RSP2SQL.g:132:4: ^( NOT i= intcrit )
++        	    {
++        	         MATCHT(NOT, &FOLLOW_NOT_in_expr184); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_intcrit_in_expr190);
++        	        i=intcrit(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_UP, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			if (!i.valid)
++        	            			{
++        	            				retval.valid= 0;
++        	            			}
++        	            			else
++        	            			{
++        	            				retval.result= i.result->factory->newRaw(i.result->factory);
++        	            				retval.result->append8(retval.result, "(NOT ");
++        	            				retval.result->appendS(retval.result, i.result);
++        	            				retval.result->append8(retval.result, ")");
++        	            			}
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 7:
++        	    // RSP2SQL.g:146:4: d= datecrit
++        	    {
++        	        FOLLOWPUSH(FOLLOW_datecrit_in_expr204);
++        	        d=datecrit(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleexprEx;
++        	        }
++
++        	        {
++
++        	            			retval.valid= d.valid;
++        	            			retval.result= d.result;
++        	            		
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleexprEx; /* Prevent compiler warnings */
++    ruleexprEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return retval;
++}
++/* $ANTLR end expr */
++
++/** 
++ * $ANTLR start strcrit
++ * RSP2SQL.g:153:1: strcrit returns [ pANTLR3_STRING result, int valid ] : ^(o= strop f= FIELD s= STR ) ;
++ */
++static RSP2SQL_strcrit_return
++strcrit(pRSP2SQL ctx)
++{   
++    RSP2SQL_strcrit_return retval;
++
++    pANTLR3_BASE_TREE    f;
++    pANTLR3_BASE_TREE    s;
++    pANTLR3_COMMON_TOKEN o;
++    #undef	RETURN_TYPE_o
++    #define	RETURN_TYPE_o pANTLR3_COMMON_TOKEN
++
++    /* Initialize rule variables
++     */
++
++
++     retval.result= NULL; retval.valid= 1; 
++    f       = NULL;
++    s       = NULL;
++    o = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    {
++        // RSP2SQL.g:155:2: ( ^(o= strop f= FIELD s= STR ) )
++        // RSP2SQL.g:155:4: ^(o= strop f= FIELD s= STR )
++        {
++            FOLLOWPUSH(FOLLOW_strop_in_strcrit233);
++            o=strop(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto rulestrcritEx;
++            }
++
++
++            MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++            if  (HASEXCEPTION())
++            {
++                goto rulestrcritEx;
++            }
++
++            f = (pANTLR3_BASE_TREE) MATCHT(FIELD, &FOLLOW_FIELD_in_strcrit239); 
++            if  (HASEXCEPTION())
++            {
++                goto rulestrcritEx;
++            }
++
++            s = (pANTLR3_BASE_TREE) MATCHT(STR, &FOLLOW_STR_in_strcrit245); 
++            if  (HASEXCEPTION())
++            {
++                goto rulestrcritEx;
++            }
++
++
++            MATCHT(ANTLR3_TOKEN_UP, NULL); 
++            if  (HASEXCEPTION())
++            {
++                goto rulestrcritEx;
++            }
++
++            {
++
++                			char *op;
++                			const struct rsp_query_field_map *rqfp;
++                			pANTLR3_STRING field;
++                			char *escaped;
++                			ANTLR3_UINT32 optok;
++
++                			escaped = NULL;
++
++                			op = NULL;
++                			optok = o->getType(o);
++                			switch (optok)
++                			{
++                				case EQUAL:
++                					op = " = ";
++                					break;
++
++                				case INCLUDES:
++                				case STARTSW:
++                				case ENDSW:
++                					op = " LIKE ";
++                					break;
++                			}
++
++                			field = f->getText(f);
++
++                			/* Field lookup */
++                			rqfp = rsp_query_field_lookup((char *)field->chars, strlen((char *)field->chars));
++                			if (!rqfp)
++                			{
++                				DPRINTF(E_LOG, L_RSP, "Field '%s' is not a valid field in queries\n", field->chars);
++                				retval.valid= 0;
++                				goto strcrit_valid_0; /* ABORT */
++                			}
++
++                			/* Check field type */
++                			if (rqfp->field_type != RSP_TYPE_STRING)
++                			{
++                				DPRINTF(E_LOG, L_RSP, "Field '%s' is not a string field\n", field->chars);
++                				retval.valid= 0;
++                				goto strcrit_valid_0; /* ABORT */
++                			}
++
++                			escaped = db_escape_string((char *)s->getText(s)->chars);
++                			if (!escaped)
++                			{
++                				DPRINTF(E_LOG, L_RSP, "Could not escape value\n");
++                				retval.valid= 0;
++                				goto strcrit_valid_0; /* ABORT */
++                			}
++
++                			retval.result= field->factory->newRaw(field->factory);
++                			retval.result->append8(retval.result, "f.");
++                			retval.result->appendS(retval.result, field);
++                			retval.result->append8(retval.result, op);
++                			retval.result->append8(retval.result, "'");
++                			if ((optok == INCLUDES) || (optok == STARTSW))
++                				retval.result->append8(retval.result, "%");
++
++                			retval.result->append8(retval.result, escaped);
++
++                			if ((optok == INCLUDES) || (optok == ENDSW))
++                				retval.result->append8(retval.result, "%");
++                			retval.result->append8(retval.result, "'");
++
++                			strcrit_valid_0:
++                				;
++
++                			if (escaped)
++                				free(escaped);
++                		
++            }
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulestrcritEx; /* Prevent compiler warnings */
++    rulestrcritEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return retval;
++}
++/* $ANTLR end strcrit */
++
++/** 
++ * $ANTLR start strop
++ * RSP2SQL.g:229:1: strop returns [ pANTLR3_COMMON_TOKEN op ] : (n= EQUAL | n= INCLUDES | n= STARTSW | n= ENDSW );
++ */
++static pANTLR3_COMMON_TOKEN
++strop(pRSP2SQL ctx)
++{   
++    pANTLR3_COMMON_TOKEN op = NULL;
++
++    pANTLR3_BASE_TREE    n;
++
++    /* Initialize rule variables
++     */
++
++
++     op= NULL; 
++    n       = NULL;
++
++    {
++        {
++            //  RSP2SQL.g:231:2: (n= EQUAL | n= INCLUDES | n= STARTSW | n= ENDSW )
++            
++            ANTLR3_UINT32 alt2;
++
++            alt2=4;
++
++            switch ( LA(1) ) 
++            {
++            case EQUAL:
++            	{
++            		alt2=1;
++            	}
++                break;
++            case INCLUDES:
++            	{
++            		alt2=2;
++            	}
++                break;
++            case STARTSW:
++            	{
++            		alt2=3;
++            	}
++                break;
++            case ENDSW:
++            	{
++            		alt2=4;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 2;
++                EXCEPTION->state        = 0;
++
++
++                goto rulestropEx;
++            }
++
++            switch (alt2) 
++            {
++        	case 1:
++        	    // RSP2SQL.g:231:4: n= EQUAL
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(EQUAL, &FOLLOW_EQUAL_in_strop274); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestropEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP2SQL.g:233:4: n= INCLUDES
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(INCLUDES, &FOLLOW_INCLUDES_in_strop287); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestropEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++        	case 3:
++        	    // RSP2SQL.g:235:4: n= STARTSW
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(STARTSW, &FOLLOW_STARTSW_in_strop300); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestropEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++        	case 4:
++        	    // RSP2SQL.g:237:4: n= ENDSW
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(ENDSW, &FOLLOW_ENDSW_in_strop313); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestropEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulestropEx; /* Prevent compiler warnings */
++    rulestropEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return op;
++}
++/* $ANTLR end strop */
++
++/** 
++ * $ANTLR start intcrit
++ * RSP2SQL.g:241:1: intcrit returns [ pANTLR3_STRING result, int valid ] : ^(o= intop f= FIELD i= INT ) ;
++ */
++static RSP2SQL_intcrit_return
++intcrit(pRSP2SQL ctx)
++{   
++    RSP2SQL_intcrit_return retval;
++
++    pANTLR3_BASE_TREE    f;
++    pANTLR3_BASE_TREE    i;
++    pANTLR3_COMMON_TOKEN o;
++    #undef	RETURN_TYPE_o
++    #define	RETURN_TYPE_o pANTLR3_COMMON_TOKEN
++
++    /* Initialize rule variables
++     */
++
++
++     retval.result= NULL; retval.valid= 1; 
++    f       = NULL;
++    i       = NULL;
++    o = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    {
++        // RSP2SQL.g:243:2: ( ^(o= intop f= FIELD i= INT ) )
++        // RSP2SQL.g:243:4: ^(o= intop f= FIELD i= INT )
++        {
++            FOLLOWPUSH(FOLLOW_intop_in_intcrit342);
++            o=intop(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto ruleintcritEx;
++            }
++
++
++            MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++            if  (HASEXCEPTION())
++            {
++                goto ruleintcritEx;
++            }
++
++            f = (pANTLR3_BASE_TREE) MATCHT(FIELD, &FOLLOW_FIELD_in_intcrit348); 
++            if  (HASEXCEPTION())
++            {
++                goto ruleintcritEx;
++            }
++
++            i = (pANTLR3_BASE_TREE) MATCHT(INT, &FOLLOW_INT_in_intcrit354); 
++            if  (HASEXCEPTION())
++            {
++                goto ruleintcritEx;
++            }
++
++
++            MATCHT(ANTLR3_TOKEN_UP, NULL); 
++            if  (HASEXCEPTION())
++            {
++                goto ruleintcritEx;
++            }
++
++            {
++
++                			char *op;
++                			const struct rsp_query_field_map *rqfp;
++                			pANTLR3_STRING field;
++
++                			op = NULL;
++                			switch (o->getType(o))
++                			{
++                				case EQUAL:
++                					op = " = ";
++                					break;
++
++                				case LESS:
++                					op = " < ";
++                					break;
++
++                				case GREATER:
++                					op = " > ";
++                					break;
++
++                				case LTE:
++                					op = " <= ";
++                					break;
++
++                				case GTE:
++                					op = " >= ";
++                					break;
++                			}
++
++                			field = f->getText(f);
++
++                			/* Field lookup */
++                			rqfp = rsp_query_field_lookup((char *)field->chars, strlen((char *)field->chars));
++                			if (!rqfp)
++                			{
++                				DPRINTF(E_LOG, L_RSP, "Field '%s' is not a valid field in queries\n", field->chars);
++                				retval.valid= 0;
++                				goto intcrit_valid_0; /* ABORT */
++                			}
++
++                			/* Check field type */
++                			if (rqfp->field_type != RSP_TYPE_INT)
++                			{
++                				DPRINTF(E_LOG, L_RSP, "Field '%s' is not an integer field\n", field->chars);
++                				retval.valid= 0;
++                				goto intcrit_valid_0; /* ABORT */
++                			}
++
++                			retval.result= field->factory->newRaw(field->factory);
++                			retval.result->append8(retval.result, "f.");
++                			retval.result->appendS(retval.result, field);
++                			retval.result->append8(retval.result, op);
++                			retval.result->appendS(retval.result, i->getText(i));
++
++                			intcrit_valid_0:
++                				;
++                		
++            }
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleintcritEx; /* Prevent compiler warnings */
++    ruleintcritEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return retval;
++}
++/* $ANTLR end intcrit */
++
++/** 
++ * $ANTLR start intop
++ * RSP2SQL.g:303:1: intop returns [ pANTLR3_COMMON_TOKEN op ] : (n= EQUAL | n= LESS | n= GREATER | n= LTE | n= GTE );
++ */
++static pANTLR3_COMMON_TOKEN
++intop(pRSP2SQL ctx)
++{   
++    pANTLR3_COMMON_TOKEN op = NULL;
++
++    pANTLR3_BASE_TREE    n;
++
++    /* Initialize rule variables
++     */
++
++
++     op= NULL; 
++    n       = NULL;
++
++    {
++        {
++            //  RSP2SQL.g:305:2: (n= EQUAL | n= LESS | n= GREATER | n= LTE | n= GTE )
++            
++            ANTLR3_UINT32 alt3;
++
++            alt3=5;
++
++            switch ( LA(1) ) 
++            {
++            case EQUAL:
++            	{
++            		alt3=1;
++            	}
++                break;
++            case LESS:
++            	{
++            		alt3=2;
++            	}
++                break;
++            case GREATER:
++            	{
++            		alt3=3;
++            	}
++                break;
++            case LTE:
++            	{
++            		alt3=4;
++            	}
++                break;
++            case GTE:
++            	{
++            		alt3=5;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 3;
++                EXCEPTION->state        = 0;
++
++
++                goto ruleintopEx;
++            }
++
++            switch (alt3) 
++            {
++        	case 1:
++        	    // RSP2SQL.g:305:4: n= EQUAL
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(EQUAL, &FOLLOW_EQUAL_in_intop383); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintopEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP2SQL.g:307:4: n= LESS
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(LESS, &FOLLOW_LESS_in_intop396); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintopEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++        	case 3:
++        	    // RSP2SQL.g:309:4: n= GREATER
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(GREATER, &FOLLOW_GREATER_in_intop409); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintopEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++        	case 4:
++        	    // RSP2SQL.g:311:4: n= LTE
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(LTE, &FOLLOW_LTE_in_intop422); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintopEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++        	case 5:
++        	    // RSP2SQL.g:313:4: n= GTE
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(GTE, &FOLLOW_GTE_in_intop435); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintopEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleintopEx; /* Prevent compiler warnings */
++    ruleintopEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return op;
++}
++/* $ANTLR end intop */
++
++/** 
++ * $ANTLR start datecrit
++ * RSP2SQL.g:317:1: datecrit returns [ pANTLR3_STRING result, int valid ] : ^(o= dateop f= FIELD d= datespec ) ;
++ */
++static RSP2SQL_datecrit_return
++datecrit(pRSP2SQL ctx)
++{   
++    RSP2SQL_datecrit_return retval;
++
++    pANTLR3_BASE_TREE    f;
++    pANTLR3_COMMON_TOKEN o;
++    #undef	RETURN_TYPE_o
++    #define	RETURN_TYPE_o pANTLR3_COMMON_TOKEN
++
++    RSP2SQL_datespec_return d;
++    #undef	RETURN_TYPE_d
++    #define	RETURN_TYPE_d RSP2SQL_datespec_return
++
++    /* Initialize rule variables
++     */
++
++
++     retval.result= NULL; retval.valid= 1; 
++    f       = NULL;
++    o = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    {
++        // RSP2SQL.g:319:2: ( ^(o= dateop f= FIELD d= datespec ) )
++        // RSP2SQL.g:319:4: ^(o= dateop f= FIELD d= datespec )
++        {
++            FOLLOWPUSH(FOLLOW_dateop_in_datecrit464);
++            o=dateop(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto ruledatecritEx;
++            }
++
++
++            MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++            if  (HASEXCEPTION())
++            {
++                goto ruledatecritEx;
++            }
++
++            f = (pANTLR3_BASE_TREE) MATCHT(FIELD, &FOLLOW_FIELD_in_datecrit470); 
++            if  (HASEXCEPTION())
++            {
++                goto ruledatecritEx;
++            }
++
++            FOLLOWPUSH(FOLLOW_datespec_in_datecrit476);
++            d=datespec(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto ruledatecritEx;
++            }
++
++
++            MATCHT(ANTLR3_TOKEN_UP, NULL); 
++            if  (HASEXCEPTION())
++            {
++                goto ruledatecritEx;
++            }
++
++            {
++
++                			char *op;
++                			const struct rsp_query_field_map *rqfp;
++                			pANTLR3_STRING field;
++                			char buf[32];
++                			int ret;
++
++                			op = NULL;
++                			switch (o->getType(o))
++                			{
++                				case BEFORE:
++                					op = " < ";
++                					break;
++
++                				case AFTER:
++                					op = " > ";
++                					break;
++                			}
++
++                			field = f->getText(f);
++
++                			/* Field lookup */
++                			rqfp = rsp_query_field_lookup((char *)field->chars, strlen((char *)field->chars));
++                			if (!rqfp)
++                			{
++                				DPRINTF(E_LOG, L_RSP, "Field '%s' is not a valid field in queries\n", field->chars);
++                				retval.valid= 0;
++                				goto datecrit_valid_0; /* ABORT */
++                			}
++
++                			/* Check field type */
++                			if (rqfp->field_type != RSP_TYPE_DATE)
++                			{
++                				DPRINTF(E_LOG, L_RSP, "Field '%s' is not a date field\n", field->chars);
++                				retval.valid= 0;
++                				goto datecrit_valid_0; /* ABORT */
++                			}
++
++                			ret = snprintf(buf, sizeof(buf), "%ld", d.date);
++                			if ((ret < 0) || (ret >= sizeof(buf)))
++                			{
++                				DPRINTF(E_LOG, L_RSP, "Date %ld too large for buffer, oops!\n", d.date);
++                				retval.valid= 0;
++                				goto datecrit_valid_0; /* ABORT */
++                			}
++
++                			retval.result= field->factory->newRaw(field->factory);
++                			retval.result->append8(retval.result, "f.");
++                			retval.result->appendS(retval.result, field);
++                			retval.result->append8(retval.result, op);
++                			retval.result->append8(retval.result, buf);
++
++                			datecrit_valid_0:
++                				;
++                		
++            }
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledatecritEx; /* Prevent compiler warnings */
++    ruledatecritEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return retval;
++}
++/* $ANTLR end datecrit */
++
++/** 
++ * $ANTLR start dateop
++ * RSP2SQL.g:377:1: dateop returns [ pANTLR3_COMMON_TOKEN op ] : (n= BEFORE | n= AFTER );
++ */
++static pANTLR3_COMMON_TOKEN
++dateop(pRSP2SQL ctx)
++{   
++    pANTLR3_COMMON_TOKEN op = NULL;
++
++    pANTLR3_BASE_TREE    n;
++
++    /* Initialize rule variables
++     */
++
++
++     op= NULL; 
++    n       = NULL;
++
++    {
++        {
++            //  RSP2SQL.g:379:2: (n= BEFORE | n= AFTER )
++            
++            ANTLR3_UINT32 alt4;
++
++            alt4=2;
++
++            switch ( LA(1) ) 
++            {
++            case BEFORE:
++            	{
++            		alt4=1;
++            	}
++                break;
++            case AFTER:
++            	{
++            		alt4=2;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 4;
++                EXCEPTION->state        = 0;
++
++
++                goto ruledateopEx;
++            }
++
++            switch (alt4) 
++            {
++        	case 1:
++        	    // RSP2SQL.g:379:4: n= BEFORE
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(BEFORE, &FOLLOW_BEFORE_in_dateop505); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledateopEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP2SQL.g:381:4: n= AFTER
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(AFTER, &FOLLOW_AFTER_in_dateop518); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledateopEx;
++        	        }
++
++        	        {
++        	             op= n->getToken(n); 
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledateopEx; /* Prevent compiler warnings */
++    ruledateopEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return op;
++}
++/* $ANTLR end dateop */
++
++/** 
++ * $ANTLR start datespec
++ * RSP2SQL.g:385:1: datespec returns [ time_t date, int valid ] : (r= dateref | ^(o= dateop r= dateref m= INT i= dateintval ) );
++ */
++static RSP2SQL_datespec_return
++datespec(pRSP2SQL ctx)
++{   
++    RSP2SQL_datespec_return retval;
++
++    pANTLR3_BASE_TREE    m;
++    RSP2SQL_dateref_return r;
++    #undef	RETURN_TYPE_r
++    #define	RETURN_TYPE_r RSP2SQL_dateref_return
++
++    pANTLR3_COMMON_TOKEN o;
++    #undef	RETURN_TYPE_o
++    #define	RETURN_TYPE_o pANTLR3_COMMON_TOKEN
++
++    RSP2SQL_dateintval_return i;
++    #undef	RETURN_TYPE_i
++    #define	RETURN_TYPE_i RSP2SQL_dateintval_return
++
++    /* Initialize rule variables
++     */
++
++
++     retval.date= 0; retval.valid= 1; 
++    m       = NULL;
++    o = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    {
++        {
++            //  RSP2SQL.g:387:2: (r= dateref | ^(o= dateop r= dateref m= INT i= dateintval ) )
++            
++            ANTLR3_UINT32 alt5;
++
++            alt5=2;
++
++            switch ( LA(1) ) 
++            {
++            case DATE:
++            case TODAY:
++            	{
++            		alt5=1;
++            	}
++                break;
++            case BEFORE:
++            case AFTER:
++            	{
++            		alt5=2;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 5;
++                EXCEPTION->state        = 0;
++
++
++                goto ruledatespecEx;
++            }
++
++            switch (alt5) 
++            {
++        	case 1:
++        	    // RSP2SQL.g:387:4: r= dateref
++        	    {
++        	        FOLLOWPUSH(FOLLOW_dateref_in_datespec546);
++        	        r=dateref(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++        	        {
++
++        	            			if (!r.valid)
++        	            				retval.valid= 0;
++        	            			else
++        	            				retval.date= r.date;
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP2SQL.g:394:4: ^(o= dateop r= dateref m= INT i= dateintval )
++        	    {
++        	        FOLLOWPUSH(FOLLOW_dateop_in_datespec560);
++        	        o=dateop(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_DOWN, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_dateref_in_datespec566);
++        	        r=dateref(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++        	        m = (pANTLR3_BASE_TREE) MATCHT(INT, &FOLLOW_INT_in_datespec572); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++        	        FOLLOWPUSH(FOLLOW_dateintval_in_datespec578);
++        	        i=dateintval(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++
++        	        MATCHT(ANTLR3_TOKEN_UP, NULL); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++        	        {
++
++        	            			int32_t val;
++        	            			int ret;
++
++        	            			if (!r.valid || !i.valid)
++        	            			{
++        	            				retval.valid= 0;
++        	            				goto datespec_valid_0; /* ABORT */
++        	            			}
++
++        	            			ret = safe_atoi32((char *)m->getText(m)->chars, &val);
++        	            			if (ret < 0)
++        	            			{
++        	            				DPRINTF(E_LOG, L_RSP, "Could not convert '%s' to integer\n", (char *)m->getText(m));
++        	            				retval.valid= 0;
++        	            				goto datespec_valid_0; /* ABORT */
++        	            			}
++
++        	            			switch (o->getType(o))
++        	            			{
++        	            				case BEFORE:
++        	            					retval.date= r.date - (val * i.period);
++        	            					break;
++
++        	            				case AFTER:
++        	            					retval.date= r.date + (val * i.period);
++        	            					break;
++        	            			}
++
++        	            			datespec_valid_0:
++        	            				;
++        	            		
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledatespecEx; /* Prevent compiler warnings */
++    ruledatespecEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return retval;
++}
++/* $ANTLR end datespec */
++
++/** 
++ * $ANTLR start dateref
++ * RSP2SQL.g:429:1: dateref returns [ time_t date, int valid ] : (n= DATE | TODAY );
++ */
++static RSP2SQL_dateref_return
++dateref(pRSP2SQL ctx)
++{   
++    RSP2SQL_dateref_return retval;
++
++    pANTLR3_BASE_TREE    n;
++
++    /* Initialize rule variables
++     */
++
++
++     retval.date= 0; retval.valid= 1; 
++    n       = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    {
++        {
++            //  RSP2SQL.g:431:2: (n= DATE | TODAY )
++            
++            ANTLR3_UINT32 alt6;
++
++            alt6=2;
++
++            switch ( LA(1) ) 
++            {
++            case DATE:
++            	{
++            		alt6=1;
++            	}
++                break;
++            case TODAY:
++            	{
++            		alt6=2;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 6;
++                EXCEPTION->state        = 0;
++
++
++                goto ruledaterefEx;
++            }
++
++            switch (alt6) 
++            {
++        	case 1:
++        	    // RSP2SQL.g:431:4: n= DATE
++        	    {
++        	        n = (pANTLR3_BASE_TREE) MATCHT(DATE, &FOLLOW_DATE_in_dateref607); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledaterefEx;
++        	        }
++
++        	        {
++
++        	            			struct tm tm;
++        	            			char *ret;
++
++        	            			ret = strptime((char *)n->getText(n), "%Y-%m-%d", &tm);
++        	            			if (!ret)
++        	            			{
++        	            				DPRINTF(E_LOG, L_RSP, "Date '%s' could not be interpreted\n", (char *)n->getText(n));
++        	            				retval.valid= 0;
++        	            				goto dateref_valid_0; /* ABORT */
++        	            			}
++        	            			else
++        	            			{
++        	            				if (*ret != '\0')
++        	            					DPRINTF(E_LOG, L_RSP, "Garbage at end of date '%s' ?!\n", (char *)n->getText(n));
++
++        	            				retval.date= mktime(&tm);
++        	            				if (retval.date == (time_t) -1)
++        	            				{
++        	            					DPRINTF(E_LOG, L_RSP, "Date '%s' could not be converted to an epoch\n", (char *)n->getText(n));
++        	            					retval.valid= 0;
++        	            					goto dateref_valid_0; /* ABORT */
++        	            				}
++        	            			}
++
++        	            			dateref_valid_0:
++        	            				;
++        	            		
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP2SQL.g:460:4: TODAY
++        	    {
++        	         MATCHT(TODAY, &FOLLOW_TODAY_in_dateref616); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledaterefEx;
++        	        }
++
++        	        {
++        	             retval.date= time(NULL); 
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledaterefEx; /* Prevent compiler warnings */
++    ruledaterefEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return retval;
++}
++/* $ANTLR end dateref */
++
++/** 
++ * $ANTLR start dateintval
++ * RSP2SQL.g:464:1: dateintval returns [ time_t period, int valid ] : ( DAY | WEEK | MONTH | YEAR );
++ */
++static RSP2SQL_dateintval_return
++dateintval(pRSP2SQL ctx)
++{   
++    RSP2SQL_dateintval_return retval;
++
++    /* Initialize rule variables
++     */
++
++
++     retval.period= 0; retval.valid= 1; 
++    retval.start = LT(1); retval.stop = retval.start;
++
++    {
++        {
++            //  RSP2SQL.g:466:2: ( DAY | WEEK | MONTH | YEAR )
++            
++            ANTLR3_UINT32 alt7;
++
++            alt7=4;
++
++            switch ( LA(1) ) 
++            {
++            case DAY:
++            	{
++            		alt7=1;
++            	}
++                break;
++            case WEEK:
++            	{
++            		alt7=2;
++            	}
++                break;
++            case MONTH:
++            	{
++            		alt7=3;
++            	}
++                break;
++            case YEAR:
++            	{
++            		alt7=4;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 7;
++                EXCEPTION->state        = 0;
++
++
++                goto ruledateintvalEx;
++            }
++
++            switch (alt7) 
++            {
++        	case 1:
++        	    // RSP2SQL.g:466:4: DAY
++        	    {
++        	         MATCHT(DAY, &FOLLOW_DAY_in_dateintval640); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledateintvalEx;
++        	        }
++
++        	        {
++        	             retval.period= 24 * 60 * 60; 
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP2SQL.g:468:4: WEEK
++        	    {
++        	         MATCHT(WEEK, &FOLLOW_WEEK_in_dateintval649); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledateintvalEx;
++        	        }
++
++        	        {
++        	             retval.period= 7 * 24 * 60 * 60; 
++        	        }
++
++        	    }
++        	    break;
++        	case 3:
++        	    // RSP2SQL.g:470:4: MONTH
++        	    {
++        	         MATCHT(MONTH, &FOLLOW_MONTH_in_dateintval658); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledateintvalEx;
++        	        }
++
++        	        {
++        	             retval.period= 30 * 24 * 60 * 60; 
++        	        }
++
++        	    }
++        	    break;
++        	case 4:
++        	    // RSP2SQL.g:472:4: YEAR
++        	    {
++        	         MATCHT(YEAR, &FOLLOW_YEAR_in_dateintval667); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledateintvalEx;
++        	        }
++
++        	        {
++        	             retval.period= 365 * 24 * 60 * 60; 
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledateintvalEx; /* Prevent compiler warnings */
++    ruledateintvalEx: ;
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++            }
++
++
++    return retval;
++}
++/* $ANTLR end dateintval */
++/* End of parsing rules
++ * ==============================================
++ */
++
++/* ==============================================
++ * Syntactic predicates
++ */
++/* End of syntactic predicates
++ * ==============================================
++ */
++
++ 
++ 
++
++
++
++/* End of code
++ * =============================================================================
++ */
+diff --git a/src/pregen/RSP2SQL.h b/src/pregen/RSP2SQL.h
+new file mode 100644
+index 0000000..2789fc7
+--- /dev/null
++++ b/src/pregen/RSP2SQL.h
+@@ -0,0 +1,291 @@
++/** \file
++ *  This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : RSP2SQL.g
++ *     -                            On : 2014-09-30 21:42:42
++ *     -           for the tree parser : RSP2SQLTreeParser *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++ * The tree parser RSP2SQL has the callable functions (rules) shown below,
++ * which will invoke the code for the associated rule in the source grammar
++ * assuming that the input stream is pointing to a token/text stream that could begin
++ * this rule.
++ * 
++ * For instance if you call the first (topmost) rule in a parser grammar, you will
++ * get the results of a full parse, but calling a rule half way through the grammar will
++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
++ * in editors and so on.
++ *
++ * The parser entry points are called indirectly (by function pointer to function) via
++ * a parser context typedef pRSP2SQL, which is returned from a call to RSP2SQLNew().
++ *
++ * The methods in pRSP2SQL are  as follows:
++ *
++ *  - pANTLR3_STRING      pRSP2SQL->query(pRSP2SQL)
++ *  - RSP2SQL_expr_return      pRSP2SQL->expr(pRSP2SQL)
++ *  - RSP2SQL_strcrit_return      pRSP2SQL->strcrit(pRSP2SQL)
++ *  - pANTLR3_COMMON_TOKEN      pRSP2SQL->strop(pRSP2SQL)
++ *  - RSP2SQL_intcrit_return      pRSP2SQL->intcrit(pRSP2SQL)
++ *  - pANTLR3_COMMON_TOKEN      pRSP2SQL->intop(pRSP2SQL)
++ *  - RSP2SQL_datecrit_return      pRSP2SQL->datecrit(pRSP2SQL)
++ *  - pANTLR3_COMMON_TOKEN      pRSP2SQL->dateop(pRSP2SQL)
++ *  - RSP2SQL_datespec_return      pRSP2SQL->datespec(pRSP2SQL)
++ *  - RSP2SQL_dateref_return      pRSP2SQL->dateref(pRSP2SQL)
++ *  - RSP2SQL_dateintval_return      pRSP2SQL->dateintval(pRSP2SQL)
++ *
++ * The return type for any particular rule is of course determined by the source
++ * grammar file.
++ */
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++#ifndef	_RSP2SQL_H
++#define _RSP2SQL_H
++/* =============================================================================
++ * Standard antlr3 C runtime definitions
++ */
++#include    <antlr3.h>
++
++/* End of standard antlr 3 runtime definitions
++ * =============================================================================
++ */
++ 
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++// Forward declare the context typedef so that we can use it before it is
++// properly defined. Delegators and delegates (from import statements) are
++// interdependent and their context structures contain pointers to each other
++// C only allows such things to be declared if you pre-declare the typedef.
++//
++typedef struct RSP2SQL_Ctx_struct RSP2SQL, * pRSP2SQL;
++
++
++
++	/* Needs #define _GNU_SOURCE for strptime() */
++
++	#include <stdio.h>
++	#include <string.h>
++	#include <time.h>
++	#include <stdint.h>
++
++	#include "logger.h"
++	#include "db.h"
++	#include "misc.h"
++	#include "rsp_query.h"
++
++
++#ifdef	ANTLR3_WINDOWS
++// Disable: Unreferenced parameter,							- Rules with parameters that are not used
++//          constant conditional,							- ANTLR realizes that a prediction is always true (synpred usually)
++//          initialized but unused variable					- tree rewrite variables declared but not needed
++//          Unreferenced local variable						- lexer rule declares but does not always use _type
++//          potentially unitialized variable used			- retval always returned from a rule 
++//			unreferenced local function has been removed	- susually getTokenNames or freeScope, they can go without warnigns
++//
++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
++// this is a matter of orthogonality hence I disable that one.
++//
++#pragma warning( disable : 4100 )
++#pragma warning( disable : 4101 )
++#pragma warning( disable : 4127 )
++#pragma warning( disable : 4189 )
++#pragma warning( disable : 4505 )
++#pragma warning( disable : 4701 )
++#endif
++typedef struct RSP2SQL_expr_return_struct
++{
++    pANTLR3_BASE_TREE       start;
++    pANTLR3_BASE_TREE       stop;   
++    pANTLR3_STRING result;
++    int valid;
++}
++    RSP2SQL_expr_return;
++
++typedef struct RSP2SQL_strcrit_return_struct
++{
++    pANTLR3_BASE_TREE       start;
++    pANTLR3_BASE_TREE       stop;   
++    pANTLR3_STRING result;
++    int valid;
++}
++    RSP2SQL_strcrit_return;
++
++typedef struct RSP2SQL_intcrit_return_struct
++{
++    pANTLR3_BASE_TREE       start;
++    pANTLR3_BASE_TREE       stop;   
++    pANTLR3_STRING result;
++    int valid;
++}
++    RSP2SQL_intcrit_return;
++
++typedef struct RSP2SQL_datecrit_return_struct
++{
++    pANTLR3_BASE_TREE       start;
++    pANTLR3_BASE_TREE       stop;   
++    pANTLR3_STRING result;
++    int valid;
++}
++    RSP2SQL_datecrit_return;
++
++typedef struct RSP2SQL_datespec_return_struct
++{
++    pANTLR3_BASE_TREE       start;
++    pANTLR3_BASE_TREE       stop;   
++    time_t date;
++    int valid;
++}
++    RSP2SQL_datespec_return;
++
++typedef struct RSP2SQL_dateref_return_struct
++{
++    pANTLR3_BASE_TREE       start;
++    pANTLR3_BASE_TREE       stop;   
++    time_t date;
++    int valid;
++}
++    RSP2SQL_dateref_return;
++
++typedef struct RSP2SQL_dateintval_return_struct
++{
++    pANTLR3_BASE_TREE       start;
++    pANTLR3_BASE_TREE       stop;   
++    time_t period;
++    int valid;
++}
++    RSP2SQL_dateintval_return;
++
++
++
++/** Context tracking structure for RSP2SQL
++ */
++struct RSP2SQL_Ctx_struct
++{
++    /** Built in ANTLR3 context tracker contains all the generic elements
++     *  required for context tracking.
++     */
++    pANTLR3_TREE_PARSER	    pTreeParser;
++
++
++     pANTLR3_STRING (*query)	(struct RSP2SQL_Ctx_struct * ctx);
++     RSP2SQL_expr_return (*expr)	(struct RSP2SQL_Ctx_struct * ctx);
++     RSP2SQL_strcrit_return (*strcrit)	(struct RSP2SQL_Ctx_struct * ctx);
++     pANTLR3_COMMON_TOKEN (*strop)	(struct RSP2SQL_Ctx_struct * ctx);
++     RSP2SQL_intcrit_return (*intcrit)	(struct RSP2SQL_Ctx_struct * ctx);
++     pANTLR3_COMMON_TOKEN (*intop)	(struct RSP2SQL_Ctx_struct * ctx);
++     RSP2SQL_datecrit_return (*datecrit)	(struct RSP2SQL_Ctx_struct * ctx);
++     pANTLR3_COMMON_TOKEN (*dateop)	(struct RSP2SQL_Ctx_struct * ctx);
++     RSP2SQL_datespec_return (*datespec)	(struct RSP2SQL_Ctx_struct * ctx);
++     RSP2SQL_dateref_return (*dateref)	(struct RSP2SQL_Ctx_struct * ctx);
++     RSP2SQL_dateintval_return (*dateintval)	(struct RSP2SQL_Ctx_struct * ctx);
++    // Delegated rules
++    const char * (*getGrammarFileName)();
++    void	    (*free)   (struct RSP2SQL_Ctx_struct * ctx);
++        
++};
++
++// Function protoypes for the constructor functions that external translation units
++// such as delegators and delegates may wish to call.
++//
++ANTLR3_API pRSP2SQL RSP2SQLNew         (pANTLR3_COMMON_TREE_NODE_STREAM instream);
++ANTLR3_API pRSP2SQL RSP2SQLNewSSD      (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
++
++/** Symbolic definitions of all the tokens that the tree parser will work with.
++ * \{
++ *
++ * Antlr will define EOF, but we can't use that as it it is too common in
++ * in C header files and that would be confusing. There is no way to filter this out at the moment
++ * so we just undef it here for now. That isn't the value we get back from C recognizers
++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
++ */
++#ifdef	EOF
++#undef	EOF
++#endif
++#ifdef	Tokens
++#undef	Tokens
++#endif 
++#define STARTSW      14
++#define WEEK      26
++#define TODAY      24
++#define YEAR      28
++#define ENDSW      15
++#define GTE      20
++#define BEFORE      21
++#define DAY      25
++#define INT      16
++#define NOT      11
++#define AFTER      22
++#define AND      6
++#define EOF      -1
++#define LTE      19
++#define MONTH      27
++#define DIGIT19      31
++#define INCLUDES      13
++#define STR      10
++#define QUOTE      29
++#define GREATER      18
++#define WS      30
++#define LPAR      7
++#define NEWLINE      4
++#define EQUAL      12
++#define OR      5
++#define LESS      17
++#define FIELD      9
++#define RPAR      8
++#define ESCAPED      33
++#define DATE      23
++#define DIGIT09      32
++#ifdef	EOF
++#undef	EOF
++#define	EOF	ANTLR3_TOKEN_EOF
++#endif
++
++#ifndef TOKENSOURCE
++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
++#endif
++
++/* End of token definitions for RSP2SQL
++ * =============================================================================
++ */
++/** \} */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
++
++/* END - Note:Keep extra line feed to satisfy UNIX systems */
+diff --git a/src/pregen/RSP2SQL.u b/src/pregen/RSP2SQL.u
+new file mode 100644
+index 0000000..53d8cda
+--- /dev/null
++++ b/src/pregen/RSP2SQL.u
+@@ -0,0 +1,5 @@
++RSP2SQL.g: RSP.tokens
++RSP2SQL.c : RSP2SQL.g
++./RSP2SQL.tokens : RSP2SQL.g
++RSP2SQL.h : RSP2SQL.g
++ANTLR_PRODUCTS += RSP2SQL.c ./RSP2SQL.tokens RSP2SQL.h 
+\ No newline at end of file
+diff --git a/src/pregen/RSPLexer.c b/src/pregen/RSPLexer.c
+new file mode 100644
+index 0000000..ee23c08
+--- /dev/null
++++ b/src/pregen/RSPLexer.c
+@@ -0,0 +1,4867 @@
++/** \file
++ *  This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : RSP.g
++ *     -                            On : 2014-09-30 21:42:41
++ *     -                 for the lexer : RSPLexerLexer *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++*/
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++/* -----------------------------------------
++ * Include the ANTLR3 generated header file.
++ */
++#include    "RSPLexer.h"
++/* ----------------------------------------- */
++
++
++/** String literals used by RSPLexer that we must do things like MATCHS() with.
++ *  C will normally just lay down 8 bit characters, and you can use L"xxx" to
++ *  get wchar_t, but wchar_t is 16 bits on Windows, which is not UTF32 and so
++ *  we perform this little trick of defining the literals as arrays of UINT32
++ *  and passing in the address of these.
++ */
++static ANTLR3_UCHAR	lit_1[]  = { 0x61, 0x6E, 0x64,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_2[]  = { 0x6F, 0x72,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_3[]  = { 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x73,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_4[]  = { 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x77, 0x69, 0x74, 0x68,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_5[]  = { 0x65, 0x6E, 0x64, 0x73, 0x77, 0x69, 0x74, 0x68,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_6[]  = { 0x3E, 0x3D,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_7[]  = { 0x3C, 0x3D,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_8[]  = { 0x62, 0x65, 0x66, 0x6F, 0x72, 0x65,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_9[]  = { 0x61, 0x66, 0x74, 0x65, 0x72,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_10[]  = { 0x64, 0x61, 0x79,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_11[]  = { 0x64, 0x61, 0x79, 0x73,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_12[]  = { 0x77, 0x65, 0x65, 0x6B,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_13[]  = { 0x77, 0x65, 0x65, 0x6B, 0x73,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_14[]  = { 0x6D, 0x6F, 0x6E, 0x74, 0x68,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_15[]  = { 0x6D, 0x6F, 0x6E, 0x74, 0x68, 0x73,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_16[]  = { 0x79, 0x65, 0x61, 0x72,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_17[]  = { 0x79, 0x65, 0x61, 0x72, 0x73,  ANTLR3_STRING_TERMINATOR};
++static ANTLR3_UCHAR	lit_18[]  = { 0x74, 0x6F, 0x64, 0x61, 0x79,  ANTLR3_STRING_TERMINATOR};
++
++
++
++
++/* MACROS that hide the C interface implementations from the
++ * generated code, which makes it a little more understandable to the human eye.
++ * I am very much against using C pre-processor macros for function calls and bits
++ * of code as you cannot see what is happening when single stepping in debuggers
++ * and so on. The exception (in my book at least) is for generated code, where you are
++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
++ * hides some indirect calls, but is always referring to the input stream. This is
++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
++ * the runtime interfaces without changing the generated code too often, without
++ * confusing the reader of the generated output, who may not wish to know the gory
++ * details of the interface inheritance.
++ */
++ 
++#define		CTX	ctx
++
++/* Aids in accessing scopes for grammar programmers
++ */
++#undef	SCOPE_TYPE
++#undef	SCOPE_STACK
++#undef	SCOPE_TOP
++#define	SCOPE_TYPE(scope)   pRSPLexer_##scope##_SCOPE
++#define SCOPE_STACK(scope)  pRSPLexer_##scope##Stack
++#define	SCOPE_TOP(scope)    ctx->pRSPLexer_##scope##Top
++#define	SCOPE_SIZE(scope)		ctx->pRSPLexer_##scope##Stack_limit
++#define SCOPE_INSTANCE(scope, i)	(ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
++
++ 
++/* Macros for accessing things in a lexer
++ */
++#undef	    LEXER
++#undef	    RECOGNIZER		    
++#undef	    RULEMEMO		    
++#undef	    GETCHARINDEX
++#undef	    GETLINE
++#undef	    GETCHARPOSITIONINLINE
++#undef	    EMIT
++#undef	    EMITNEW
++#undef	    MATCHC
++#undef	    MATCHS
++#undef	    MATCHRANGE
++#undef	    LTOKEN
++#undef	    HASFAILED
++#undef	    FAILEDFLAG
++#undef	    INPUT
++#undef	    STRSTREAM
++#undef	    LA
++#undef	    HASEXCEPTION
++#undef	    EXCEPTION
++#undef	    CONSTRUCTEX
++#undef	    CONSUME
++#undef	    LRECOVER
++#undef	    MARK
++#undef	    REWIND
++#undef	    REWINDLAST
++#undef	    BACKTRACKING
++#undef		MATCHANY
++#undef		MEMOIZE
++#undef		HAVEPARSEDRULE
++#undef		GETTEXT
++#undef		INDEX
++#undef		SEEK
++#undef		PUSHSTREAM
++#undef		POPSTREAM
++#undef		SETTEXT
++#undef		SETTEXT8
++
++#define	    LEXER					ctx->pLexer
++#define	    RECOGNIZER			    LEXER->rec
++#define		LEXSTATE				RECOGNIZER->state
++#define		TOKSOURCE				LEXSTATE->tokSource
++#define	    GETCHARINDEX()			LEXER->getCharIndex(LEXER)
++#define	    GETLINE()				LEXER->getLine(LEXER)
++#define	    GETTEXT()				LEXER->getText(LEXER)
++#define	    GETCHARPOSITIONINLINE() LEXER->getCharPositionInLine(LEXER)
++#define	    EMIT()					LEXSTATE->type = _type; LEXER->emit(LEXER)
++#define	    EMITNEW(t)				LEXER->emitNew(LEXER, t)
++#define	    MATCHC(c)				LEXER->matchc(LEXER, c)
++#define	    MATCHS(s)				LEXER->matchs(LEXER, s)
++#define	    MATCHRANGE(c1,c2)	    LEXER->matchRange(LEXER, c1, c2)
++#define	    MATCHANY()				LEXER->matchAny(LEXER)
++#define	    LTOKEN  				LEXSTATE->token
++#define	    HASFAILED()				(LEXSTATE->failed == ANTLR3_TRUE)
++#define	    BACKTRACKING			LEXSTATE->backtracking
++#define	    FAILEDFLAG				LEXSTATE->failed
++#define	    INPUT					LEXER->input
++#define	    STRSTREAM				INPUT
++#define		ISTREAM					INPUT->istream
++#define		INDEX()					ISTREAM->index(ISTREAM)
++#define		SEEK(n)					ISTREAM->seek(ISTREAM, n)
++#define	    EOF_TOKEN				&(LEXSTATE->tokSource->eofToken)
++#define	    HASEXCEPTION()			(LEXSTATE->error == ANTLR3_TRUE)
++#define	    EXCEPTION				LEXSTATE->exception
++#define	    CONSTRUCTEX()			RECOGNIZER->exConstruct(RECOGNIZER)
++#define	    LRECOVER()				LEXER->recover(LEXER)
++#define	    MARK()					ISTREAM->mark(ISTREAM)
++#define	    REWIND(m)				ISTREAM->rewind(ISTREAM, m)
++#define	    REWINDLAST()			ISTREAM->rewindLast(ISTREAM)
++#define		MEMOIZE(ri,si)			RECOGNIZER->memoize(RECOGNIZER, ri, si)
++#define		HAVEPARSEDRULE(r)		RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
++#define		PUSHSTREAM(str)			LEXER->pushCharStream(LEXER, str)
++#define		POPSTREAM()				LEXER->popCharStream(LEXER)
++#define		SETTEXT(str)			LEXSTATE->text = str
++#define		SKIP()					LEXSTATE->token = &(TOKSOURCE->skipToken)
++#define		USER1					LEXSTATE->user1
++#define		USER2					LEXSTATE->user2
++#define		USER3					LEXSTATE->user3
++#define		CUSTOM					LEXSTATE->custom
++#define		RULEMEMO				LEXSTATE->ruleMemo
++#define		DBG						RECOGNIZER->debugger
++
++/* If we have been told we can rely on the standard 8 bit or 16 bit input
++ * stream, then we can define our macros to use the direct pointers
++ * in the input object, which is much faster than indirect calls. This
++ * is really only significant to lexers with a lot of fragment rules (which
++ * do not place LA(1) in a temporary at the moment) and even then
++ * only if there is a lot of input (order of say 1M or so).
++ */
++#if	defined(ANTLR3_INLINE_INPUT_ASCII) || defined(ANTLR3_INLINE_INPUT_UTF16)
++
++# ifdef	ANTLR3_INLINE_INPUT_ASCII
++
++/* 8 bit "ASCII" (actually any 8 bit character set) */
++
++#  define	    NEXTCHAR			((pANTLR3_UINT8)(INPUT->nextChar))
++#  define	    DATAP				((pANTLR3_UINT8)(INPUT->data))
++
++# else
++
++#  define	    NEXTCHAR			((pANTLR3_UINT16)(INPUT->nextChar)) 
++#  define	    DATAP				((pANTLR3_UINT16)(INPUT->data))
++
++# endif
++
++# define	    LA(n) ((NEXTCHAR + n) > (DATAP + INPUT->sizeBuf) ? ANTLR3_CHARSTREAM_EOF : (ANTLR3_UCHAR)(*(NEXTCHAR + n - 1)))
++# define	    CONSUME()											\
++{																	\
++    if	(NEXTCHAR < (DATAP + INPUT->sizeBuf))						\
++    {																\
++		INPUT->charPositionInLine++;								\
++		if  ((ANTLR3_UCHAR)(*NEXTCHAR) == INPUT->newlineChar)		\
++		{															\
++			INPUT->line++;											\
++			INPUT->charPositionInLine	= 0;						\
++			INPUT->currentLine		= (void *)(NEXTCHAR + 1);		\
++		}															\
++		INPUT->nextChar = (void *)(NEXTCHAR + 1);					\
++    }																\
++}
++
++#else
++
++// Pick up the input character by calling the input stream implementation.
++//
++#define	    CONSUME()				INPUT->istream->consume(INPUT->istream)
++#define	    LA(n)					INPUT->istream->_LA(INPUT->istream, n)
++
++#endif
++#define		TOKTEXT(tok, txt)				tok, (pANTLR3_UINT8)txt
++
++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
++ * then for the present you must use different names for your defines as these are hard coded
++ * in the code generator. It would be better not to use such names internally, and maybe
++ * we can change this in a forthcoming release. I deliberately do not #undef these
++ * here as this will at least give you a redefined error somewhere if they clash.
++ */
++#define	    UP	    ANTLR3_TOKEN_UP
++#define	    DOWN    ANTLR3_TOKEN_DOWN
++#define	    EOR	    ANTLR3_TOKEN_EOR
++#define	    INVALID ANTLR3_TOKEN_INVALID
++
++
++/* =============================================================================
++ * Functions to create and destroy scopes. First come the rule scopes, followed
++ * by the global declared scopes.
++ */
++
++
++
++/* ============================================================================= */
++
++/* =============================================================================
++ * Start of recognizer
++ */
++
++
++/* Forward declare the locally static matching functions we have generated and any predicate functions.
++ */
++static ANTLR3_INLINE  void	mQUOTE    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mLPAR    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mRPAR    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mAND    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mOR    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mNOT    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mEQUAL    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mINCLUDES    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mSTARTSW    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mENDSW    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mGREATER    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mLESS    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mGTE    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mLTE    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mBEFORE    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mAFTER    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mDAY    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mWEEK    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mMONTH    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mYEAR    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mTODAY    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mNEWLINE    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mWS    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mFIELD    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mINT    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mDATE    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mSTR    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mESCAPED    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mDIGIT09    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mDIGIT19    (pRSPLexer ctx);
++static ANTLR3_INLINE  void	mTokens    (pRSPLexer ctx);
++static void	RSPLexerFree(pRSPLexer ctx);
++
++/* =========================================================================
++ * Lexer matching rules end.
++ * =========================================================================
++ */
++
++
++
++static void
++RSPLexerFree  (pRSPLexer ctx)
++{
++    LEXER->free(LEXER);
++    
++    ANTLR3_FREE(ctx);
++}
++
++/** \brief Name of the grammar file that generated this code
++ */
++static const char fileName[] = "RSP.g";
++
++/** \brief Return the name of the grammar file that generated this code.
++ */
++static const char * getGrammarFileName()
++{
++	return fileName;
++}
++
++/** \brief Create a new lexer called RSPLexer
++ *
++ * \param[in]    instream Pointer to an initialized input stream
++ * \return 
++ *     - Success pRSPLexer initialized for the lex start
++ *     - Fail NULL
++ */
++ANTLR3_API pRSPLexer RSPLexerNew         
++(pANTLR3_INPUT_STREAM instream)
++{
++	// See if we can create a new lexer with the standard constructor
++	//
++	return RSPLexerNewSSD(instream, NULL);
++}
++
++/** \brief Create a new lexer called RSPLexer
++ *
++ * \param[in]    instream Pointer to an initialized input stream
++ * \param[state] state Previously created shared recognizer stat
++ * \return 
++ *     - Success pRSPLexer initialized for the lex start
++ *     - Fail NULL
++ */
++ANTLR3_API pRSPLexer RSPLexerNewSSD         
++(pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
++{
++    pRSPLexer ctx; // Context structure we will build and return
++
++    ctx = (pRSPLexer) ANTLR3_CALLOC(1, sizeof(RSPLexer));
++
++    if  (ctx == NULL)
++    {
++        // Failed to allocate memory for lexer context
++        return  NULL;
++    }
++
++    /* -------------------------------------------------------------------
++     * Memory for basic structure is allocated, now to fill in
++     * in base ANTLR3 structures. We initialize the function pointers
++     * for the standard ANTLR3 lexer function set, but upon return
++     * from here, the programmer may set the pointers to provide custom
++     * implementations of each function. 
++     *
++     * We don't use the macros defined in RSPLexer.h here so you can get a sense
++     * of what goes where.
++     */
++    
++    /* Create a base lexer, using the supplied input stream
++     */
++    ctx->pLexer	= antlr3LexerNewStream(ANTLR3_SIZE_HINT, instream, state);
++    
++    /* Check that we allocated the memory correctly
++     */
++    if	(ctx->pLexer == NULL)
++    {
++		ANTLR3_FREE(ctx);
++		return  NULL;
++    }
++    /* Install the implementation of our RSPLexer interface
++     */
++    ctx->mQUOTE	= mQUOTE;
++    ctx->mLPAR	= mLPAR;
++    ctx->mRPAR	= mRPAR;
++    ctx->mAND	= mAND;
++    ctx->mOR	= mOR;
++    ctx->mNOT	= mNOT;
++    ctx->mEQUAL	= mEQUAL;
++    ctx->mINCLUDES	= mINCLUDES;
++    ctx->mSTARTSW	= mSTARTSW;
++    ctx->mENDSW	= mENDSW;
++    ctx->mGREATER	= mGREATER;
++    ctx->mLESS	= mLESS;
++    ctx->mGTE	= mGTE;
++    ctx->mLTE	= mLTE;
++    ctx->mBEFORE	= mBEFORE;
++    ctx->mAFTER	= mAFTER;
++    ctx->mDAY	= mDAY;
++    ctx->mWEEK	= mWEEK;
++    ctx->mMONTH	= mMONTH;
++    ctx->mYEAR	= mYEAR;
++    ctx->mTODAY	= mTODAY;
++    ctx->mNEWLINE	= mNEWLINE;
++    ctx->mWS	= mWS;
++    ctx->mFIELD	= mFIELD;
++    ctx->mINT	= mINT;
++    ctx->mDATE	= mDATE;
++    ctx->mSTR	= mSTR;
++    ctx->mESCAPED	= mESCAPED;
++    ctx->mDIGIT09	= mDIGIT09;
++    ctx->mDIGIT19	= mDIGIT19;
++    ctx->mTokens	= mTokens;
++    
++    /** When the nextToken() call is made to this lexer's pANTLR3_TOKEN_SOURCE
++     *  it will call mTokens() in this generated code, and will pass it the ctx
++     * pointer of this lexer, not the context of the base lexer, so store that now.
++     */
++    ctx->pLexer->ctx	    = ctx;
++    
++    /**Install the token matching function
++     */
++    ctx->pLexer->mTokens = (void (*) (void *))(mTokens);
++    
++    ctx->getGrammarFileName	= getGrammarFileName;
++    ctx->free		= RSPLexerFree;
++
++    
++    
++
++
++    /* Return the newly built lexer to the caller
++     */
++    return  ctx;
++}
++ 
++
++/* =========================================================================
++ * Functions to match the lexer grammar defined tokens from the input stream
++ */
++
++//   Comes from: 85:7: ( '\"' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start QUOTE
++ *
++ * Looks to match the characters the constitute the token QUOTE
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mQUOTE(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = QUOTE;
++       
++    
++    // RSP.g:85:7: ( '\"' )
++    // RSP.g:85:9: '\"'
++    {
++        MATCHC('"'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleQUOTEEx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleQUOTEEx; /* Prevent compiler warnings */
++    ruleQUOTEEx: ;
++
++}
++// $ANTLR end QUOTE
++
++//   Comes from: 86:6: ( '(' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start LPAR
++ *
++ * Looks to match the characters the constitute the token LPAR
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mLPAR(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = LPAR;
++       
++    
++    // RSP.g:86:6: ( '(' )
++    // RSP.g:86:8: '('
++    {
++        MATCHC('('); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleLPAREx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleLPAREx; /* Prevent compiler warnings */
++    ruleLPAREx: ;
++
++}
++// $ANTLR end LPAR
++
++//   Comes from: 87:6: ( ')' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start RPAR
++ *
++ * Looks to match the characters the constitute the token RPAR
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mRPAR(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = RPAR;
++       
++    
++    // RSP.g:87:6: ( ')' )
++    // RSP.g:87:8: ')'
++    {
++        MATCHC(')'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleRPAREx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleRPAREx; /* Prevent compiler warnings */
++    ruleRPAREx: ;
++
++}
++// $ANTLR end RPAR
++
++//   Comes from: 89:5: ( 'and' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start AND
++ *
++ * Looks to match the characters the constitute the token AND
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mAND(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = AND;
++       
++    
++    // RSP.g:89:5: ( 'and' )
++    // RSP.g:89:7: 'and'
++    {
++        MATCHS(lit_1); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleANDEx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleANDEx; /* Prevent compiler warnings */
++    ruleANDEx: ;
++
++}
++// $ANTLR end AND
++
++//   Comes from: 90:4: ( 'or' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start OR
++ *
++ * Looks to match the characters the constitute the token OR
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mOR(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = OR;
++       
++    
++    // RSP.g:90:4: ( 'or' )
++    // RSP.g:90:6: 'or'
++    {
++        MATCHS(lit_2); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleOREx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleOREx; /* Prevent compiler warnings */
++    ruleOREx: ;
++
++}
++// $ANTLR end OR
++
++//   Comes from: 91:5: ( '!' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start NOT
++ *
++ * Looks to match the characters the constitute the token NOT
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mNOT(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = NOT;
++       
++    
++    // RSP.g:91:5: ( '!' )
++    // RSP.g:91:7: '!'
++    {
++        MATCHC('!'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleNOTEx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleNOTEx; /* Prevent compiler warnings */
++    ruleNOTEx: ;
++
++}
++// $ANTLR end NOT
++
++//   Comes from: 94:7: ( '=' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start EQUAL
++ *
++ * Looks to match the characters the constitute the token EQUAL
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mEQUAL(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = EQUAL;
++       
++    
++    // RSP.g:94:7: ( '=' )
++    // RSP.g:94:9: '='
++    {
++        MATCHC('='); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleEQUALEx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleEQUALEx; /* Prevent compiler warnings */
++    ruleEQUALEx: ;
++
++}
++// $ANTLR end EQUAL
++
++//   Comes from: 97:9: ( 'includes' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start INCLUDES
++ *
++ * Looks to match the characters the constitute the token INCLUDES
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mINCLUDES(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = INCLUDES;
++       
++    
++    // RSP.g:97:9: ( 'includes' )
++    // RSP.g:97:11: 'includes'
++    {
++        MATCHS(lit_3); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleINCLUDESEx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleINCLUDESEx; /* Prevent compiler warnings */
++    ruleINCLUDESEx: ;
++
++}
++// $ANTLR end INCLUDES
++
++//   Comes from: 98:9: ( 'startswith' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start STARTSW
++ *
++ * Looks to match the characters the constitute the token STARTSW
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mSTARTSW(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = STARTSW;
++       
++    
++    // RSP.g:98:9: ( 'startswith' )
++    // RSP.g:98:11: 'startswith'
++    {
++        MATCHS(lit_4); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleSTARTSWEx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleSTARTSWEx; /* Prevent compiler warnings */
++    ruleSTARTSWEx: ;
++
++}
++// $ANTLR end STARTSW
++
++//   Comes from: 99:7: ( 'endswith' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start ENDSW
++ *
++ * Looks to match the characters the constitute the token ENDSW
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mENDSW(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = ENDSW;
++       
++    
++    // RSP.g:99:7: ( 'endswith' )
++    // RSP.g:99:9: 'endswith'
++    {
++        MATCHS(lit_5); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleENDSWEx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleENDSWEx; /* Prevent compiler warnings */
++    ruleENDSWEx: ;
++
++}
++// $ANTLR end ENDSW
++
++//   Comes from: 102:9: ( '>' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start GREATER
++ *
++ * Looks to match the characters the constitute the token GREATER
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mGREATER(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = GREATER;
++       
++    
++    // RSP.g:102:9: ( '>' )
++    // RSP.g:102:11: '>'
++    {
++        MATCHC('>'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleGREATEREx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleGREATEREx; /* Prevent compiler warnings */
++    ruleGREATEREx: ;
++
++}
++// $ANTLR end GREATER
++
++//   Comes from: 103:6: ( '<' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start LESS
++ *
++ * Looks to match the characters the constitute the token LESS
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mLESS(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = LESS;
++       
++    
++    // RSP.g:103:6: ( '<' )
++    // RSP.g:103:8: '<'
++    {
++        MATCHC('<'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleLESSEx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleLESSEx; /* Prevent compiler warnings */
++    ruleLESSEx: ;
++
++}
++// $ANTLR end LESS
++
++//   Comes from: 104:5: ( '>=' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start GTE
++ *
++ * Looks to match the characters the constitute the token GTE
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mGTE(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = GTE;
++       
++    
++    // RSP.g:104:5: ( '>=' )
++    // RSP.g:104:7: '>='
++    {
++        MATCHS(lit_6); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleGTEEx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleGTEEx; /* Prevent compiler warnings */
++    ruleGTEEx: ;
++
++}
++// $ANTLR end GTE
++
++//   Comes from: 105:5: ( '<=' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start LTE
++ *
++ * Looks to match the characters the constitute the token LTE
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mLTE(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = LTE;
++       
++    
++    // RSP.g:105:5: ( '<=' )
++    // RSP.g:105:7: '<='
++    {
++        MATCHS(lit_7); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleLTEEx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleLTEEx; /* Prevent compiler warnings */
++    ruleLTEEx: ;
++
++}
++// $ANTLR end LTE
++
++//   Comes from: 108:8: ( 'before' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start BEFORE
++ *
++ * Looks to match the characters the constitute the token BEFORE
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mBEFORE(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = BEFORE;
++       
++    
++    // RSP.g:108:8: ( 'before' )
++    // RSP.g:108:10: 'before'
++    {
++        MATCHS(lit_8); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleBEFOREEx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleBEFOREEx; /* Prevent compiler warnings */
++    ruleBEFOREEx: ;
++
++}
++// $ANTLR end BEFORE
++
++//   Comes from: 109:7: ( 'after' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start AFTER
++ *
++ * Looks to match the characters the constitute the token AFTER
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mAFTER(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = AFTER;
++       
++    
++    // RSP.g:109:7: ( 'after' )
++    // RSP.g:109:9: 'after'
++    {
++        MATCHS(lit_9); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleAFTEREx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleAFTEREx; /* Prevent compiler warnings */
++    ruleAFTEREx: ;
++
++}
++// $ANTLR end AFTER
++
++//   Comes from: 110:5: ( 'day' | 'days' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start DAY
++ *
++ * Looks to match the characters the constitute the token DAY
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mDAY(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = DAY;
++       
++    
++    {
++        //  RSP.g:110:5: ( 'day' | 'days' )
++        
++        ANTLR3_UINT32 alt1;
++
++        alt1=2;
++
++        switch ( LA(1) ) 
++        {
++        case 'd':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'a':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'y':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 's':
++        							{
++        								alt1=2;
++        							}
++        						    break;
++
++        						default:
++        						    alt1=1;}
++
++        					}
++        				    break;
++
++        				default:
++        				    CONSTRUCTEX();
++        				    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        				    EXCEPTION->message      = (void *)"";
++        				    EXCEPTION->decisionNum  = 1;
++        				    EXCEPTION->state        = 2;
++
++
++        				    goto ruleDAYEx;
++        				}
++
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 1;
++        		    EXCEPTION->state        = 1;
++
++
++        		    goto ruleDAYEx;
++        		}
++
++        	}
++            break;
++
++        default:
++            CONSTRUCTEX();
++            EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            EXCEPTION->message      = (void *)"";
++            EXCEPTION->decisionNum  = 1;
++            EXCEPTION->state        = 0;
++
++
++            goto ruleDAYEx;
++        }
++
++        switch (alt1) 
++        {
++    	case 1:
++    	    // RSP.g:110:7: 'day'
++    	    {
++    	        MATCHS(lit_10); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleDAYEx;
++    	        }
++
++
++
++    	    }
++    	    break;
++    	case 2:
++    	    // RSP.g:110:15: 'days'
++    	    {
++    	        MATCHS(lit_11); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleDAYEx;
++    	        }
++
++
++
++    	    }
++    	    break;
++
++        }
++    }
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleDAYEx; /* Prevent compiler warnings */
++    ruleDAYEx: ;
++
++}
++// $ANTLR end DAY
++
++//   Comes from: 111:6: ( 'week' | 'weeks' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start WEEK
++ *
++ * Looks to match the characters the constitute the token WEEK
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mWEEK(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = WEEK;
++       
++    
++    {
++        //  RSP.g:111:6: ( 'week' | 'weeks' )
++        
++        ANTLR3_UINT32 alt2;
++
++        alt2=2;
++
++        switch ( LA(1) ) 
++        {
++        case 'w':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'e':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'e':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 'k':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 's':
++        									{
++        										alt2=2;
++        									}
++        								    break;
++
++        								default:
++        								    alt2=1;}
++
++        							}
++        						    break;
++
++        						default:
++        						    CONSTRUCTEX();
++        						    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        						    EXCEPTION->message      = (void *)"";
++        						    EXCEPTION->decisionNum  = 2;
++        						    EXCEPTION->state        = 3;
++
++
++        						    goto ruleWEEKEx;
++        						}
++
++        					}
++        				    break;
++
++        				default:
++        				    CONSTRUCTEX();
++        				    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        				    EXCEPTION->message      = (void *)"";
++        				    EXCEPTION->decisionNum  = 2;
++        				    EXCEPTION->state        = 2;
++
++
++        				    goto ruleWEEKEx;
++        				}
++
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 2;
++        		    EXCEPTION->state        = 1;
++
++
++        		    goto ruleWEEKEx;
++        		}
++
++        	}
++            break;
++
++        default:
++            CONSTRUCTEX();
++            EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            EXCEPTION->message      = (void *)"";
++            EXCEPTION->decisionNum  = 2;
++            EXCEPTION->state        = 0;
++
++
++            goto ruleWEEKEx;
++        }
++
++        switch (alt2) 
++        {
++    	case 1:
++    	    // RSP.g:111:8: 'week'
++    	    {
++    	        MATCHS(lit_12); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleWEEKEx;
++    	        }
++
++
++
++    	    }
++    	    break;
++    	case 2:
++    	    // RSP.g:111:17: 'weeks'
++    	    {
++    	        MATCHS(lit_13); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleWEEKEx;
++    	        }
++
++
++
++    	    }
++    	    break;
++
++        }
++    }
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleWEEKEx; /* Prevent compiler warnings */
++    ruleWEEKEx: ;
++
++}
++// $ANTLR end WEEK
++
++//   Comes from: 112:7: ( 'month' | 'months' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start MONTH
++ *
++ * Looks to match the characters the constitute the token MONTH
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mMONTH(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = MONTH;
++       
++    
++    {
++        //  RSP.g:112:7: ( 'month' | 'months' )
++        
++        ANTLR3_UINT32 alt3;
++
++        alt3=2;
++
++        switch ( LA(1) ) 
++        {
++        case 'm':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'o':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'n':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 't':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 'h':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case 's':
++        											{
++        												alt3=2;
++        											}
++        										    break;
++
++        										default:
++        										    alt3=1;}
++
++        									}
++        								    break;
++
++        								default:
++        								    CONSTRUCTEX();
++        								    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        								    EXCEPTION->message      = (void *)"";
++        								    EXCEPTION->decisionNum  = 3;
++        								    EXCEPTION->state        = 4;
++
++
++        								    goto ruleMONTHEx;
++        								}
++
++        							}
++        						    break;
++
++        						default:
++        						    CONSTRUCTEX();
++        						    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        						    EXCEPTION->message      = (void *)"";
++        						    EXCEPTION->decisionNum  = 3;
++        						    EXCEPTION->state        = 3;
++
++
++        						    goto ruleMONTHEx;
++        						}
++
++        					}
++        				    break;
++
++        				default:
++        				    CONSTRUCTEX();
++        				    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        				    EXCEPTION->message      = (void *)"";
++        				    EXCEPTION->decisionNum  = 3;
++        				    EXCEPTION->state        = 2;
++
++
++        				    goto ruleMONTHEx;
++        				}
++
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 3;
++        		    EXCEPTION->state        = 1;
++
++
++        		    goto ruleMONTHEx;
++        		}
++
++        	}
++            break;
++
++        default:
++            CONSTRUCTEX();
++            EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            EXCEPTION->message      = (void *)"";
++            EXCEPTION->decisionNum  = 3;
++            EXCEPTION->state        = 0;
++
++
++            goto ruleMONTHEx;
++        }
++
++        switch (alt3) 
++        {
++    	case 1:
++    	    // RSP.g:112:9: 'month'
++    	    {
++    	        MATCHS(lit_14); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleMONTHEx;
++    	        }
++
++
++
++    	    }
++    	    break;
++    	case 2:
++    	    // RSP.g:112:19: 'months'
++    	    {
++    	        MATCHS(lit_15); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleMONTHEx;
++    	        }
++
++
++
++    	    }
++    	    break;
++
++        }
++    }
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleMONTHEx; /* Prevent compiler warnings */
++    ruleMONTHEx: ;
++
++}
++// $ANTLR end MONTH
++
++//   Comes from: 113:6: ( 'year' | 'years' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start YEAR
++ *
++ * Looks to match the characters the constitute the token YEAR
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mYEAR(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = YEAR;
++       
++    
++    {
++        //  RSP.g:113:6: ( 'year' | 'years' )
++        
++        ANTLR3_UINT32 alt4;
++
++        alt4=2;
++
++        switch ( LA(1) ) 
++        {
++        case 'y':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'e':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'a':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 'r':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 's':
++        									{
++        										alt4=2;
++        									}
++        								    break;
++
++        								default:
++        								    alt4=1;}
++
++        							}
++        						    break;
++
++        						default:
++        						    CONSTRUCTEX();
++        						    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        						    EXCEPTION->message      = (void *)"";
++        						    EXCEPTION->decisionNum  = 4;
++        						    EXCEPTION->state        = 3;
++
++
++        						    goto ruleYEAREx;
++        						}
++
++        					}
++        				    break;
++
++        				default:
++        				    CONSTRUCTEX();
++        				    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        				    EXCEPTION->message      = (void *)"";
++        				    EXCEPTION->decisionNum  = 4;
++        				    EXCEPTION->state        = 2;
++
++
++        				    goto ruleYEAREx;
++        				}
++
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 4;
++        		    EXCEPTION->state        = 1;
++
++
++        		    goto ruleYEAREx;
++        		}
++
++        	}
++            break;
++
++        default:
++            CONSTRUCTEX();
++            EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            EXCEPTION->message      = (void *)"";
++            EXCEPTION->decisionNum  = 4;
++            EXCEPTION->state        = 0;
++
++
++            goto ruleYEAREx;
++        }
++
++        switch (alt4) 
++        {
++    	case 1:
++    	    // RSP.g:113:8: 'year'
++    	    {
++    	        MATCHS(lit_16); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleYEAREx;
++    	        }
++
++
++
++    	    }
++    	    break;
++    	case 2:
++    	    // RSP.g:113:17: 'years'
++    	    {
++    	        MATCHS(lit_17); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleYEAREx;
++    	        }
++
++
++
++    	    }
++    	    break;
++
++        }
++    }
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleYEAREx; /* Prevent compiler warnings */
++    ruleYEAREx: ;
++
++}
++// $ANTLR end YEAR
++
++//   Comes from: 114:7: ( 'today' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start TODAY
++ *
++ * Looks to match the characters the constitute the token TODAY
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mTODAY(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = TODAY;
++       
++    
++    // RSP.g:114:7: ( 'today' )
++    // RSP.g:114:9: 'today'
++    {
++        MATCHS(lit_18); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleTODAYEx;
++        }
++
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleTODAYEx; /* Prevent compiler warnings */
++    ruleTODAYEx: ;
++
++}
++// $ANTLR end TODAY
++
++//   Comes from: 116:9: ( ( '\\r' )? '\\n' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start NEWLINE
++ *
++ * Looks to match the characters the constitute the token NEWLINE
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mNEWLINE(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = NEWLINE;
++       
++    
++    // RSP.g:116:9: ( ( '\\r' )? '\\n' )
++    // RSP.g:116:11: ( '\\r' )? '\\n'
++    {
++
++        // RSP.g:116:11: ( '\\r' )?
++        {
++            int alt5=2;
++            switch ( LA(1) ) 
++            {
++                case '\r':
++                	{
++                		alt5=1;
++                	}
++                    break;
++            }
++
++            switch (alt5) 
++            {
++        	case 1:
++        	    // RSP.g:116:11: '\\r'
++        	    {
++        	        MATCHC('\r'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleNEWLINEEx;
++        	        }
++
++
++        	    }
++        	    break;
++
++            }
++        }
++        MATCHC('\n'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleNEWLINEEx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleNEWLINEEx; /* Prevent compiler warnings */
++    ruleNEWLINEEx: ;
++
++}
++// $ANTLR end NEWLINE
++
++//   Comes from: 118:4: ( ( ' ' | '\\t' ) )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start WS
++ *
++ * Looks to match the characters the constitute the token WS
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mWS(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = WS;
++       
++    
++    // RSP.g:118:4: ( ( ' ' | '\\t' ) )
++    // RSP.g:118:6: ( ' ' | '\\t' )
++    {
++        if ( LA(1) == '\t' || LA(1) == ' ' )
++        {
++            CONSUME();
++
++        }
++        else 
++        {
++            CONSTRUCTEX();
++            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++
++            LRECOVER();    goto ruleWSEx;
++        }
++
++        {
++             LEXSTATE->channel = HIDDEN; 
++        }
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleWSEx; /* Prevent compiler warnings */
++    ruleWSEx: ;
++
++}
++// $ANTLR end WS
++
++//   Comes from: 120:7: ( 'a' .. 'z' ( 'a' .. 'z' | '_' )* 'a' .. 'z' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start FIELD
++ *
++ * Looks to match the characters the constitute the token FIELD
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mFIELD(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = FIELD;
++       
++    
++    // RSP.g:120:7: ( 'a' .. 'z' ( 'a' .. 'z' | '_' )* 'a' .. 'z' )
++    // RSP.g:120:9: 'a' .. 'z' ( 'a' .. 'z' | '_' )* 'a' .. 'z'
++    {
++        MATCHRANGE('a', 'z'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleFIELDEx;
++        }
++
++
++        // RSP.g:120:18: ( 'a' .. 'z' | '_' )*
++
++        for (;;)
++        {
++            int alt6=2;
++            switch ( LA(1) ) 
++            {
++            case 'a':
++            case 'b':
++            case 'c':
++            case 'd':
++            case 'e':
++            case 'f':
++            case 'g':
++            case 'h':
++            case 'i':
++            case 'j':
++            case 'k':
++            case 'l':
++            case 'm':
++            case 'n':
++            case 'o':
++            case 'p':
++            case 'q':
++            case 'r':
++            case 's':
++            case 't':
++            case 'u':
++            case 'v':
++            case 'w':
++            case 'x':
++            case 'y':
++            case 'z':
++            	{
++            		switch ( LA(2) ) 
++            		{
++            		case '_':
++            		case 'a':
++            		case 'b':
++            		case 'c':
++            		case 'd':
++            		case 'e':
++            		case 'f':
++            		case 'g':
++            		case 'h':
++            		case 'i':
++            		case 'j':
++            		case 'k':
++            		case 'l':
++            		case 'm':
++            		case 'n':
++            		case 'o':
++            		case 'p':
++            		case 'q':
++            		case 'r':
++            		case 's':
++            		case 't':
++            		case 'u':
++            		case 'v':
++            		case 'w':
++            		case 'x':
++            		case 'y':
++            		case 'z':
++            			{
++            				alt6=1;
++            			}
++            		    break;
++
++            		}
++
++            	}
++                break;
++            case '_':
++            	{
++            		alt6=1;
++            	}
++                break;
++
++            }
++
++            switch (alt6) 
++            {
++        	case 1:
++        	    // RSP.g:
++        	    {
++        	        if ( LA(1) == '_' || ((LA(1) >= 'a') && (LA(1) <= 'z')) )
++        	        {
++        	            CONSUME();
++
++        	        }
++        	        else 
++        	        {
++        	            CONSTRUCTEX();
++        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++
++        	            LRECOVER();    goto ruleFIELDEx;
++        	        }
++
++
++        	    }
++        	    break;
++
++        	default:
++        	    goto loop6;	/* break out of the loop */
++        	    break;
++            }
++        }
++        loop6: ; /* Jump out to here if this rule does not match */
++
++        MATCHRANGE('a', 'z'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleFIELDEx;
++        }
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleFIELDEx; /* Prevent compiler warnings */
++    ruleFIELDEx: ;
++
++}
++// $ANTLR end FIELD
++
++//   Comes from: 122:5: ( DIGIT19 ( DIGIT09 )* )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start INT
++ *
++ * Looks to match the characters the constitute the token INT
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mINT(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = INT;
++       
++    
++    // RSP.g:122:5: ( DIGIT19 ( DIGIT09 )* )
++    // RSP.g:122:7: DIGIT19 ( DIGIT09 )*
++    {
++        /* 122:7: DIGIT19 ( DIGIT09 )* */
++        mDIGIT19(ctx ); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleINTEx;
++        }
++
++
++        // RSP.g:122:15: ( DIGIT09 )*
++
++        for (;;)
++        {
++            int alt7=2;
++            switch ( LA(1) ) 
++            {
++            case '0':
++            case '1':
++            case '2':
++            case '3':
++            case '4':
++            case '5':
++            case '6':
++            case '7':
++            case '8':
++            case '9':
++            	{
++            		alt7=1;
++            	}
++                break;
++
++            }
++
++            switch (alt7) 
++            {
++        	case 1:
++        	    // RSP.g:122:15: DIGIT09
++        	    {
++        	        /* 122:15: DIGIT09 */
++        	        mDIGIT09(ctx ); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleINTEx;
++        	        }
++
++
++        	    }
++        	    break;
++
++        	default:
++        	    goto loop7;	/* break out of the loop */
++        	    break;
++            }
++        }
++        loop7: ; /* Jump out to here if this rule does not match */
++
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleINTEx; /* Prevent compiler warnings */
++    ruleINTEx: ;
++
++}
++// $ANTLR end INT
++
++//   Comes from: 125:6: ( DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start DATE
++ *
++ * Looks to match the characters the constitute the token DATE
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mDATE(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++    _type	    = DATE;
++       
++    
++    // RSP.g:125:6: ( DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) )
++    // RSP.g:125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' )
++    {
++        /* 125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) */
++        mDIGIT19(ctx ); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleDATEEx;
++        }
++
++        /* 125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) */
++        mDIGIT09(ctx ); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleDATEEx;
++        }
++
++        /* 125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) */
++        mDIGIT09(ctx ); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleDATEEx;
++        }
++
++        /* 125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) */
++        mDIGIT09(ctx ); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleDATEEx;
++        }
++
++        MATCHC('-'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleDATEEx;
++        }
++
++
++        // RSP.g:125:44: ( '0' DIGIT19 | '1' '0' .. '2' )
++        {
++            int alt8=2;
++            switch ( LA(1) ) 
++            {
++            case '0':
++            	{
++            		alt8=1;
++            	}
++                break;
++            case '1':
++            	{
++            		alt8=2;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 8;
++                EXCEPTION->state        = 0;
++
++
++                goto ruleDATEEx;
++            }
++
++            switch (alt8) 
++            {
++        	case 1:
++        	    // RSP.g:125:45: '0' DIGIT19
++        	    {
++        	        MATCHC('0'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++        	        /* 125:45: '0' DIGIT19 */
++        	        mDIGIT19(ctx ); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP.g:125:59: '1' '0' .. '2'
++        	    {
++        	        MATCHC('1'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++        	        MATCHRANGE('0', '2'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++
++        	    }
++        	    break;
++
++            }
++        }
++        MATCHC('-'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleDATEEx;
++        }
++
++
++        // RSP.g:125:77: ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' )
++        {
++            int alt9=3;
++            switch ( LA(1) ) 
++            {
++            case '0':
++            	{
++            		alt9=1;
++            	}
++                break;
++            case '1':
++            case '2':
++            	{
++            		alt9=2;
++            	}
++                break;
++            case '3':
++            	{
++            		alt9=3;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 9;
++                EXCEPTION->state        = 0;
++
++
++                goto ruleDATEEx;
++            }
++
++            switch (alt9) 
++            {
++        	case 1:
++        	    // RSP.g:125:78: '0' DIGIT19
++        	    {
++        	        MATCHC('0'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++        	        /* 125:78: '0' DIGIT19 */
++        	        mDIGIT19(ctx ); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP.g:125:92: '1' .. '2' DIGIT09
++        	    {
++        	        MATCHRANGE('1', '2'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++        	        /* 125:92: '1' .. '2' DIGIT09 */
++        	        mDIGIT09(ctx ); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++
++        	    }
++        	    break;
++        	case 3:
++        	    // RSP.g:125:111: '3' '0' .. '1'
++        	    {
++        	        MATCHC('3'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++        	        MATCHRANGE('0', '1'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleDATEEx;
++        	        }
++
++
++        	    }
++        	    break;
++
++            }
++        }
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleDATEEx; /* Prevent compiler warnings */
++    ruleDATEEx: ;
++
++}
++// $ANTLR end DATE
++
++//   Comes from: 133:2: ( QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start STR
++ *
++ * Looks to match the characters the constitute the token STR
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mSTR(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++    pANTLR3_COMMON_TOKEN esc;
++    ANTLR3_UINT32 reg;
++
++
++    esc = NULL;
++
++    _type	    = STR;
++       
++     pANTLR3_STRING unesc = GETTEXT()->factory->newRaw(GETTEXT()->factory); 
++    
++    // RSP.g:133:2: ( QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE )
++    // RSP.g:133:4: QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE
++    {
++        /* 133:4: QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE */
++        mQUOTE(ctx ); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleSTREx;
++        }
++
++        // RSP.g:133:10: (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+
++        {
++            int cnt10=0;
++
++            for (;;)
++            {
++                int alt10=3;
++        	{
++        	   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
++        	    */
++        	    int LA10_0 = LA(1);
++        	    if ( (((LA10_0 >= 0x0000) && (LA10_0 <= '!')) || ((LA10_0 >= '#') && (LA10_0 <= '[')) || ((LA10_0 >= ']') && (LA10_0 <= 0xFFFF))) ) 
++        	    {
++        	        alt10=1;
++        	    }
++        	    else if ( (LA10_0 == '\\') ) 
++        	    {
++        	        alt10=2;
++        	    }
++
++        	}
++        	switch (alt10) 
++        	{
++        	    case 1:
++        	        // RSP.g:133:12: reg=~ ( '\\\\' | '\"' )
++        	        {
++        	            reg= LA(1);
++        	            if ( ((LA(1) >= 0x0000) && (LA(1) <= '!')) || ((LA(1) >= '#') && (LA(1) <= '[')) || ((LA(1) >= ']') && (LA(1) <= 0xFFFF)) )
++        	            {
++        	                CONSUME();
++
++        	            }
++        	            else 
++        	            {
++        	                CONSTRUCTEX();
++        	                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++        	                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++
++        	                LRECOVER();    goto ruleSTREx;
++        	            }
++
++        	            {
++        	                 unesc->addc(unesc, reg); 
++        	            }
++
++        	        }
++        	        break;
++        	    case 2:
++        	        // RSP.g:134:6: esc= ESCAPED
++        	        {
++        	            /* 134:6: esc= ESCAPED */
++        	            {
++        	                ANTLR3_MARKER escStart381 = GETCHARINDEX();
++        	            mESCAPED(ctx ); 
++        	                if  (HASEXCEPTION())
++        	                {
++        	                    goto ruleSTREx;
++        	                }
++
++        	                esc = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory);
++        	                esc->setType(esc, ANTLR3_TOKEN_INVALID);
++        	                esc->setStartIndex(esc, escStart381);
++        	                esc->setStopIndex(esc, GETCHARINDEX()-1);
++        	                esc->input = INPUT;
++        	            }
++        	            {
++        	                 unesc->appendS(unesc, GETTEXT()); 
++        	            }
++
++        	        }
++        	        break;
++
++        	    default:
++        	    
++        		if ( cnt10 >= 1 )
++        		{
++        		    goto loop10;
++        		}
++        		/* mismatchedSetEx()
++        		 */
++        		CONSTRUCTEX();
++        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
++        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;
++
++
++        		goto ruleSTREx;
++        	}
++        	cnt10++;
++            }
++            loop10: ;	/* Jump to here if this rule does not match */
++        }
++        /* 133:4: QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE */
++        mQUOTE(ctx ); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleSTREx;
++        }
++
++        {
++             SETTEXT(unesc); 
++        }
++
++    }
++
++	LEXSTATE->type = _type;
++
++    // This is where rules clean up and exit
++    //
++    goto ruleSTREx; /* Prevent compiler warnings */
++    ruleSTREx: ;
++
++    esc = NULL;
++
++}
++// $ANTLR end STR
++
++//   Comes from: 138:9: ( '\\\\' ( '\\\\' | '\"' ) )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start ESCAPED
++ *
++ * Looks to match the characters the constitute the token ESCAPED
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mESCAPED(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++        
++    // RSP.g:138:9: ( '\\\\' ( '\\\\' | '\"' ) )
++    // RSP.g:138:11: '\\\\' ( '\\\\' | '\"' )
++    {
++        MATCHC('\\'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleESCAPEDEx;
++        }
++
++
++        // RSP.g:139:3: ( '\\\\' | '\"' )
++        {
++            int alt11=2;
++            switch ( LA(1) ) 
++            {
++            case '\\':
++            	{
++            		alt11=1;
++            	}
++                break;
++            case '"':
++            	{
++            		alt11=2;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 11;
++                EXCEPTION->state        = 0;
++
++
++                goto ruleESCAPEDEx;
++            }
++
++            switch (alt11) 
++            {
++        	case 1:
++        	    // RSP.g:139:5: '\\\\'
++        	    {
++        	        MATCHC('\\'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleESCAPEDEx;
++        	        }
++
++        	        {
++        	             SETTEXT(GETTEXT()->factory->newStr8(GETTEXT()->factory, (pANTLR3_UINT8)"\\")); 
++        	        }
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP.g:140:5: '\"'
++        	    {
++        	        MATCHC('"'); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleESCAPEDEx;
++        	        }
++
++        	        {
++        	             SETTEXT(GETTEXT()->factory->newStr8(GETTEXT()->factory, (pANTLR3_UINT8)"\"")); 
++        	        }
++
++        	    }
++        	    break;
++
++            }
++        }
++
++    }
++
++
++
++    // This is where rules clean up and exit
++    //
++    goto ruleESCAPEDEx; /* Prevent compiler warnings */
++    ruleESCAPEDEx: ;
++
++}
++// $ANTLR end ESCAPED
++
++//   Comes from: 145:9: ( '0' .. '9' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start DIGIT09
++ *
++ * Looks to match the characters the constitute the token DIGIT09
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mDIGIT09(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++        
++    // RSP.g:145:9: ( '0' .. '9' )
++    // RSP.g:145:11: '0' .. '9'
++    {
++        MATCHRANGE('0', '9'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleDIGIT09Ex;
++        }
++
++
++    }
++
++
++
++    // This is where rules clean up and exit
++    //
++    goto ruleDIGIT09Ex; /* Prevent compiler warnings */
++    ruleDIGIT09Ex: ;
++
++}
++// $ANTLR end DIGIT09
++
++//   Comes from: 148:9: ( '1' .. '9' )
++/** \brief Lexer rule generated by ANTLR3
++ *
++ * $ANTLR start DIGIT19
++ *
++ * Looks to match the characters the constitute the token DIGIT19
++ * from the attached input stream.
++ *
++ *
++ * \remark
++ *  - lexer->error == ANTLR3_TRUE if an exception was thrown.
++ */
++static ANTLR3_INLINE
++void mDIGIT19(pRSPLexer ctx)
++{
++	ANTLR3_UINT32	_type;
++
++        
++    // RSP.g:148:9: ( '1' .. '9' )
++    // RSP.g:148:11: '1' .. '9'
++    {
++        MATCHRANGE('1', '9'); 
++        if  (HASEXCEPTION())
++        {
++            goto ruleDIGIT19Ex;
++        }
++
++
++    }
++
++
++
++    // This is where rules clean up and exit
++    //
++    goto ruleDIGIT19Ex; /* Prevent compiler warnings */
++    ruleDIGIT19Ex: ;
++
++}
++// $ANTLR end DIGIT19
++
++/** This is the entry point in to the lexer from an object that
++ *  wants to generate the next token, such as a pCOMMON_TOKEN_STREAM
++ */
++static void 
++mTokens(pRSPLexer ctx)
++{
++    {
++        //  RSP.g:1:8: ( QUOTE | LPAR | RPAR | AND | OR | NOT | EQUAL | INCLUDES | STARTSW | ENDSW | GREATER | LESS | GTE | LTE | BEFORE | AFTER | DAY | WEEK | MONTH | YEAR | TODAY | NEWLINE | WS | FIELD | INT | DATE | STR )
++        
++        ANTLR3_UINT32 alt12;
++
++        alt12=27;
++
++        switch ( LA(1) ) 
++        {
++        case '"':
++        	{
++
++        		{
++        		    int LA12_1 = LA(2);
++        		    if ( (((LA12_1 >= 0x0000) && (LA12_1 <= '!')) || ((LA12_1 >= '#') && (LA12_1 <= 0xFFFF))) ) 
++        		    {
++        		        alt12=27;
++        		    }
++        		    else 
++        		    {
++        		        alt12=1;    }
++        		}
++        	}
++            break;
++        case '(':
++        	{
++        		alt12=2;
++        	}
++            break;
++        case ')':
++        	{
++        		alt12=3;
++        	}
++            break;
++        case 'a':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'n':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'd':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case '_':
++        						case 'a':
++        						case 'b':
++        						case 'c':
++        						case 'd':
++        						case 'e':
++        						case 'f':
++        						case 'g':
++        						case 'h':
++        						case 'i':
++        						case 'j':
++        						case 'k':
++        						case 'l':
++        						case 'm':
++        						case 'n':
++        						case 'o':
++        						case 'p':
++        						case 'q':
++        						case 'r':
++        						case 's':
++        						case 't':
++        						case 'u':
++        						case 'v':
++        						case 'w':
++        						case 'x':
++        						case 'y':
++        						case 'z':
++        							{
++        								alt12=24;
++        							}
++        						    break;
++
++        						default:
++        						    alt12=4;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case 'f':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 't':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 'e':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 'r':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case '_':
++        										case 'a':
++        										case 'b':
++        										case 'c':
++        										case 'd':
++        										case 'e':
++        										case 'f':
++        										case 'g':
++        										case 'h':
++        										case 'i':
++        										case 'j':
++        										case 'k':
++        										case 'l':
++        										case 'm':
++        										case 'n':
++        										case 'o':
++        										case 'p':
++        										case 'q':
++        										case 'r':
++        										case 's':
++        										case 't':
++        										case 'u':
++        										case 'v':
++        										case 'w':
++        										case 'x':
++        										case 'y':
++        										case 'z':
++        											{
++        												alt12=24;
++        											}
++        										    break;
++
++        										default:
++        										    alt12=16;}
++
++        									}
++        								    break;
++
++        								default:
++        								    alt12=24;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=24;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'e':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'o':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 4;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case 'o':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'r':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case '_':
++        				case 'a':
++        				case 'b':
++        				case 'c':
++        				case 'd':
++        				case 'e':
++        				case 'f':
++        				case 'g':
++        				case 'h':
++        				case 'i':
++        				case 'j':
++        				case 'k':
++        				case 'l':
++        				case 'm':
++        				case 'n':
++        				case 'o':
++        				case 'p':
++        				case 'q':
++        				case 'r':
++        				case 's':
++        				case 't':
++        				case 'u':
++        				case 'v':
++        				case 'w':
++        				case 'x':
++        				case 'y':
++        				case 'z':
++        					{
++        						alt12=24;
++        					}
++        				    break;
++
++        				default:
++        				    alt12=5;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'e':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'n':
++        		case 'o':
++        		case 'p':
++        		case 'q':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 5;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case '!':
++        	{
++        		alt12=6;
++        	}
++            break;
++        case '=':
++        	{
++        		alt12=7;
++        	}
++            break;
++        case 'i':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'n':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'c':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 'l':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 'u':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case 'd':
++        											{
++        												switch ( LA(7) ) 
++        												{
++        												case 'e':
++        													{
++        														switch ( LA(8) ) 
++        														{
++        														case 's':
++        															{
++        																switch ( LA(9) ) 
++        																{
++        																case '_':
++        																case 'a':
++        																case 'b':
++        																case 'c':
++        																case 'd':
++        																case 'e':
++        																case 'f':
++        																case 'g':
++        																case 'h':
++        																case 'i':
++        																case 'j':
++        																case 'k':
++        																case 'l':
++        																case 'm':
++        																case 'n':
++        																case 'o':
++        																case 'p':
++        																case 'q':
++        																case 'r':
++        																case 's':
++        																case 't':
++        																case 'u':
++        																case 'v':
++        																case 'w':
++        																case 'x':
++        																case 'y':
++        																case 'z':
++        																	{
++        																		alt12=24;
++        																	}
++        																    break;
++
++        																default:
++        																    alt12=8;}
++
++        															}
++        														    break;
++
++        														default:
++        														    alt12=24;}
++
++        													}
++        												    break;
++
++        												default:
++        												    alt12=24;}
++
++        											}
++        										    break;
++
++        										default:
++        										    alt12=24;}
++
++        									}
++        								    break;
++
++        								default:
++        								    alt12=24;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=24;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'e':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'o':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 8;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case 's':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 't':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'a':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 'r':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 't':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case 's':
++        											{
++        												switch ( LA(7) ) 
++        												{
++        												case 'w':
++        													{
++        														switch ( LA(8) ) 
++        														{
++        														case 'i':
++        															{
++        																switch ( LA(9) ) 
++        																{
++        																case 't':
++        																	{
++        																		switch ( LA(10) ) 
++        																		{
++        																		case 'h':
++        																			{
++        																				switch ( LA(11) ) 
++        																				{
++        																				case '_':
++        																				case 'a':
++        																				case 'b':
++        																				case 'c':
++        																				case 'd':
++        																				case 'e':
++        																				case 'f':
++        																				case 'g':
++        																				case 'h':
++        																				case 'i':
++        																				case 'j':
++        																				case 'k':
++        																				case 'l':
++        																				case 'm':
++        																				case 'n':
++        																				case 'o':
++        																				case 'p':
++        																				case 'q':
++        																				case 'r':
++        																				case 's':
++        																				case 't':
++        																				case 'u':
++        																				case 'v':
++        																				case 'w':
++        																				case 'x':
++        																				case 'y':
++        																				case 'z':
++        																					{
++        																						alt12=24;
++        																					}
++        																				    break;
++
++        																				default:
++        																				    alt12=9;}
++
++        																			}
++        																		    break;
++
++        																		default:
++        																		    alt12=24;}
++
++        																	}
++        																    break;
++
++        																default:
++        																    alt12=24;}
++
++        															}
++        														    break;
++
++        														default:
++        														    alt12=24;}
++
++        													}
++        												    break;
++
++        												default:
++        												    alt12=24;}
++
++        											}
++        										    break;
++
++        										default:
++        										    alt12=24;}
++
++        									}
++        								    break;
++
++        								default:
++        								    alt12=24;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=24;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'e':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'n':
++        		case 'o':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 9;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case 'e':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'n':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'd':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 's':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 'w':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case 'i':
++        											{
++        												switch ( LA(7) ) 
++        												{
++        												case 't':
++        													{
++        														switch ( LA(8) ) 
++        														{
++        														case 'h':
++        															{
++        																switch ( LA(9) ) 
++        																{
++        																case '_':
++        																case 'a':
++        																case 'b':
++        																case 'c':
++        																case 'd':
++        																case 'e':
++        																case 'f':
++        																case 'g':
++        																case 'h':
++        																case 'i':
++        																case 'j':
++        																case 'k':
++        																case 'l':
++        																case 'm':
++        																case 'n':
++        																case 'o':
++        																case 'p':
++        																case 'q':
++        																case 'r':
++        																case 's':
++        																case 't':
++        																case 'u':
++        																case 'v':
++        																case 'w':
++        																case 'x':
++        																case 'y':
++        																case 'z':
++        																	{
++        																		alt12=24;
++        																	}
++        																    break;
++
++        																default:
++        																    alt12=10;}
++
++        															}
++        														    break;
++
++        														default:
++        														    alt12=24;}
++
++        													}
++        												    break;
++
++        												default:
++        												    alt12=24;}
++
++        											}
++        										    break;
++
++        										default:
++        										    alt12=24;}
++
++        									}
++        								    break;
++
++        								default:
++        								    alt12=24;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=24;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'e':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'o':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 10;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case '>':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case '=':
++        			{
++        				alt12=13;
++        			}
++        		    break;
++
++        		default:
++        		    alt12=11;}
++
++        	}
++            break;
++        case '<':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case '=':
++        			{
++        				alt12=14;
++        			}
++        		    break;
++
++        		default:
++        		    alt12=12;}
++
++        	}
++            break;
++        case 'b':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'e':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'f':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 'o':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 'r':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case 'e':
++        											{
++        												switch ( LA(7) ) 
++        												{
++        												case '_':
++        												case 'a':
++        												case 'b':
++        												case 'c':
++        												case 'd':
++        												case 'e':
++        												case 'f':
++        												case 'g':
++        												case 'h':
++        												case 'i':
++        												case 'j':
++        												case 'k':
++        												case 'l':
++        												case 'm':
++        												case 'n':
++        												case 'o':
++        												case 'p':
++        												case 'q':
++        												case 'r':
++        												case 's':
++        												case 't':
++        												case 'u':
++        												case 'v':
++        												case 'w':
++        												case 'x':
++        												case 'y':
++        												case 'z':
++        													{
++        														alt12=24;
++        													}
++        												    break;
++
++        												default:
++        												    alt12=15;}
++
++        											}
++        										    break;
++
++        										default:
++        										    alt12=24;}
++
++        									}
++        								    break;
++
++        								default:
++        								    alt12=24;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=24;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'n':
++        		case 'o':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 13;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case 'd':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'a':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'y':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 's':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case '_':
++        								case 'a':
++        								case 'b':
++        								case 'c':
++        								case 'd':
++        								case 'e':
++        								case 'f':
++        								case 'g':
++        								case 'h':
++        								case 'i':
++        								case 'j':
++        								case 'k':
++        								case 'l':
++        								case 'm':
++        								case 'n':
++        								case 'o':
++        								case 'p':
++        								case 'q':
++        								case 'r':
++        								case 's':
++        								case 't':
++        								case 'u':
++        								case 'v':
++        								case 'w':
++        								case 'x':
++        								case 'y':
++        								case 'z':
++        									{
++        										alt12=24;
++        									}
++        								    break;
++
++        								default:
++        								    alt12=17;}
++
++        							}
++        						    break;
++        						case '_':
++        						case 'a':
++        						case 'b':
++        						case 'c':
++        						case 'd':
++        						case 'e':
++        						case 'f':
++        						case 'g':
++        						case 'h':
++        						case 'i':
++        						case 'j':
++        						case 'k':
++        						case 'l':
++        						case 'm':
++        						case 'n':
++        						case 'o':
++        						case 'p':
++        						case 'q':
++        						case 'r':
++        						case 't':
++        						case 'u':
++        						case 'v':
++        						case 'w':
++        						case 'x':
++        						case 'y':
++        						case 'z':
++        							{
++        								alt12=24;
++        							}
++        						    break;
++
++        						default:
++        						    alt12=17;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'e':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'n':
++        		case 'o':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 14;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case 'w':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'e':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'e':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 'k':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 's':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case '_':
++        										case 'a':
++        										case 'b':
++        										case 'c':
++        										case 'd':
++        										case 'e':
++        										case 'f':
++        										case 'g':
++        										case 'h':
++        										case 'i':
++        										case 'j':
++        										case 'k':
++        										case 'l':
++        										case 'm':
++        										case 'n':
++        										case 'o':
++        										case 'p':
++        										case 'q':
++        										case 'r':
++        										case 's':
++        										case 't':
++        										case 'u':
++        										case 'v':
++        										case 'w':
++        										case 'x':
++        										case 'y':
++        										case 'z':
++        											{
++        												alt12=24;
++        											}
++        										    break;
++
++        										default:
++        										    alt12=18;}
++
++        									}
++        								    break;
++        								case '_':
++        								case 'a':
++        								case 'b':
++        								case 'c':
++        								case 'd':
++        								case 'e':
++        								case 'f':
++        								case 'g':
++        								case 'h':
++        								case 'i':
++        								case 'j':
++        								case 'k':
++        								case 'l':
++        								case 'm':
++        								case 'n':
++        								case 'o':
++        								case 'p':
++        								case 'q':
++        								case 'r':
++        								case 't':
++        								case 'u':
++        								case 'v':
++        								case 'w':
++        								case 'x':
++        								case 'y':
++        								case 'z':
++        									{
++        										alt12=24;
++        									}
++        								    break;
++
++        								default:
++        								    alt12=18;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=24;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'n':
++        		case 'o':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 15;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case 'm':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'o':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'n':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 't':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 'h':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case 's':
++        											{
++        												switch ( LA(7) ) 
++        												{
++        												case '_':
++        												case 'a':
++        												case 'b':
++        												case 'c':
++        												case 'd':
++        												case 'e':
++        												case 'f':
++        												case 'g':
++        												case 'h':
++        												case 'i':
++        												case 'j':
++        												case 'k':
++        												case 'l':
++        												case 'm':
++        												case 'n':
++        												case 'o':
++        												case 'p':
++        												case 'q':
++        												case 'r':
++        												case 's':
++        												case 't':
++        												case 'u':
++        												case 'v':
++        												case 'w':
++        												case 'x':
++        												case 'y':
++        												case 'z':
++        													{
++        														alt12=24;
++        													}
++        												    break;
++
++        												default:
++        												    alt12=19;}
++
++        											}
++        										    break;
++        										case '_':
++        										case 'a':
++        										case 'b':
++        										case 'c':
++        										case 'd':
++        										case 'e':
++        										case 'f':
++        										case 'g':
++        										case 'h':
++        										case 'i':
++        										case 'j':
++        										case 'k':
++        										case 'l':
++        										case 'm':
++        										case 'n':
++        										case 'o':
++        										case 'p':
++        										case 'q':
++        										case 'r':
++        										case 't':
++        										case 'u':
++        										case 'v':
++        										case 'w':
++        										case 'x':
++        										case 'y':
++        										case 'z':
++        											{
++        												alt12=24;
++        											}
++        										    break;
++
++        										default:
++        										    alt12=19;}
++
++        									}
++        								    break;
++
++        								default:
++        								    alt12=24;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=24;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'e':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'n':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 16;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case 'y':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'e':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'a':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 'r':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 's':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case '_':
++        										case 'a':
++        										case 'b':
++        										case 'c':
++        										case 'd':
++        										case 'e':
++        										case 'f':
++        										case 'g':
++        										case 'h':
++        										case 'i':
++        										case 'j':
++        										case 'k':
++        										case 'l':
++        										case 'm':
++        										case 'n':
++        										case 'o':
++        										case 'p':
++        										case 'q':
++        										case 'r':
++        										case 's':
++        										case 't':
++        										case 'u':
++        										case 'v':
++        										case 'w':
++        										case 'x':
++        										case 'y':
++        										case 'z':
++        											{
++        												alt12=24;
++        											}
++        										    break;
++
++        										default:
++        										    alt12=20;}
++
++        									}
++        								    break;
++        								case '_':
++        								case 'a':
++        								case 'b':
++        								case 'c':
++        								case 'd':
++        								case 'e':
++        								case 'f':
++        								case 'g':
++        								case 'h':
++        								case 'i':
++        								case 'j':
++        								case 'k':
++        								case 'l':
++        								case 'm':
++        								case 'n':
++        								case 'o':
++        								case 'p':
++        								case 'q':
++        								case 'r':
++        								case 't':
++        								case 'u':
++        								case 'v':
++        								case 'w':
++        								case 'x':
++        								case 'y':
++        								case 'z':
++        									{
++        										alt12=24;
++        									}
++        								    break;
++
++        								default:
++        								    alt12=20;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=24;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'n':
++        		case 'o':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 17;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case 't':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case 'o':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case 'd':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case 'a':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case 'y':
++        									{
++        										switch ( LA(6) ) 
++        										{
++        										case '_':
++        										case 'a':
++        										case 'b':
++        										case 'c':
++        										case 'd':
++        										case 'e':
++        										case 'f':
++        										case 'g':
++        										case 'h':
++        										case 'i':
++        										case 'j':
++        										case 'k':
++        										case 'l':
++        										case 'm':
++        										case 'n':
++        										case 'o':
++        										case 'p':
++        										case 'q':
++        										case 'r':
++        										case 's':
++        										case 't':
++        										case 'u':
++        										case 'v':
++        										case 'w':
++        										case 'x':
++        										case 'y':
++        										case 'z':
++        											{
++        												alt12=24;
++        											}
++        										    break;
++
++        										default:
++        										    alt12=21;}
++
++        									}
++        								    break;
++
++        								default:
++        								    alt12=24;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=24;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=24;}
++
++        			}
++        		    break;
++        		case '_':
++        		case 'a':
++        		case 'b':
++        		case 'c':
++        		case 'd':
++        		case 'e':
++        		case 'f':
++        		case 'g':
++        		case 'h':
++        		case 'i':
++        		case 'j':
++        		case 'k':
++        		case 'l':
++        		case 'm':
++        		case 'n':
++        		case 'p':
++        		case 'q':
++        		case 'r':
++        		case 's':
++        		case 't':
++        		case 'u':
++        		case 'v':
++        		case 'w':
++        		case 'x':
++        		case 'y':
++        		case 'z':
++        			{
++        				alt12=24;
++        			}
++        		    break;
++
++        		default:
++        		    CONSTRUCTEX();
++        		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++        		    EXCEPTION->message      = (void *)"";
++        		    EXCEPTION->decisionNum  = 12;
++        		    EXCEPTION->state        = 18;
++
++
++        		    goto ruleTokensEx;
++        		}
++
++        	}
++            break;
++        case '\n':
++        case '\r':
++        	{
++        		alt12=22;
++        	}
++            break;
++        case '\t':
++        case ' ':
++        	{
++        		alt12=23;
++        	}
++            break;
++        case 'c':
++        case 'f':
++        case 'g':
++        case 'h':
++        case 'j':
++        case 'k':
++        case 'l':
++        case 'n':
++        case 'p':
++        case 'q':
++        case 'r':
++        case 'u':
++        case 'v':
++        case 'x':
++        case 'z':
++        	{
++        		alt12=24;
++        	}
++            break;
++        case '1':
++        case '2':
++        case '3':
++        case '4':
++        case '5':
++        case '6':
++        case '7':
++        case '8':
++        case '9':
++        	{
++        		switch ( LA(2) ) 
++        		{
++        		case '0':
++        		case '1':
++        		case '2':
++        		case '3':
++        		case '4':
++        		case '5':
++        		case '6':
++        		case '7':
++        		case '8':
++        		case '9':
++        			{
++        				switch ( LA(3) ) 
++        				{
++        				case '0':
++        				case '1':
++        				case '2':
++        				case '3':
++        				case '4':
++        				case '5':
++        				case '6':
++        				case '7':
++        				case '8':
++        				case '9':
++        					{
++        						switch ( LA(4) ) 
++        						{
++        						case '0':
++        						case '1':
++        						case '2':
++        						case '3':
++        						case '4':
++        						case '5':
++        						case '6':
++        						case '7':
++        						case '8':
++        						case '9':
++        							{
++        								switch ( LA(5) ) 
++        								{
++        								case '-':
++        									{
++        										alt12=26;
++        									}
++        								    break;
++
++        								default:
++        								    alt12=25;}
++
++        							}
++        						    break;
++
++        						default:
++        						    alt12=25;}
++
++        					}
++        				    break;
++
++        				default:
++        				    alt12=25;}
++
++        			}
++        		    break;
++
++        		default:
++        		    alt12=25;}
++
++        	}
++            break;
++
++        default:
++            CONSTRUCTEX();
++            EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            EXCEPTION->message      = (void *)"";
++            EXCEPTION->decisionNum  = 12;
++            EXCEPTION->state        = 0;
++
++
++            goto ruleTokensEx;
++        }
++
++        switch (alt12) 
++        {
++    	case 1:
++    	    // RSP.g:1:10: QUOTE
++    	    {
++    	        /* 1:10: QUOTE */
++    	        mQUOTE(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 2:
++    	    // RSP.g:1:16: LPAR
++    	    {
++    	        /* 1:16: LPAR */
++    	        mLPAR(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 3:
++    	    // RSP.g:1:21: RPAR
++    	    {
++    	        /* 1:21: RPAR */
++    	        mRPAR(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 4:
++    	    // RSP.g:1:26: AND
++    	    {
++    	        /* 1:26: AND */
++    	        mAND(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 5:
++    	    // RSP.g:1:30: OR
++    	    {
++    	        /* 1:30: OR */
++    	        mOR(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 6:
++    	    // RSP.g:1:33: NOT
++    	    {
++    	        /* 1:33: NOT */
++    	        mNOT(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 7:
++    	    // RSP.g:1:37: EQUAL
++    	    {
++    	        /* 1:37: EQUAL */
++    	        mEQUAL(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 8:
++    	    // RSP.g:1:43: INCLUDES
++    	    {
++    	        /* 1:43: INCLUDES */
++    	        mINCLUDES(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 9:
++    	    // RSP.g:1:52: STARTSW
++    	    {
++    	        /* 1:52: STARTSW */
++    	        mSTARTSW(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 10:
++    	    // RSP.g:1:60: ENDSW
++    	    {
++    	        /* 1:60: ENDSW */
++    	        mENDSW(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 11:
++    	    // RSP.g:1:66: GREATER
++    	    {
++    	        /* 1:66: GREATER */
++    	        mGREATER(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 12:
++    	    // RSP.g:1:74: LESS
++    	    {
++    	        /* 1:74: LESS */
++    	        mLESS(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 13:
++    	    // RSP.g:1:79: GTE
++    	    {
++    	        /* 1:79: GTE */
++    	        mGTE(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 14:
++    	    // RSP.g:1:83: LTE
++    	    {
++    	        /* 1:83: LTE */
++    	        mLTE(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 15:
++    	    // RSP.g:1:87: BEFORE
++    	    {
++    	        /* 1:87: BEFORE */
++    	        mBEFORE(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 16:
++    	    // RSP.g:1:94: AFTER
++    	    {
++    	        /* 1:94: AFTER */
++    	        mAFTER(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 17:
++    	    // RSP.g:1:100: DAY
++    	    {
++    	        /* 1:100: DAY */
++    	        mDAY(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 18:
++    	    // RSP.g:1:104: WEEK
++    	    {
++    	        /* 1:104: WEEK */
++    	        mWEEK(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 19:
++    	    // RSP.g:1:109: MONTH
++    	    {
++    	        /* 1:109: MONTH */
++    	        mMONTH(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 20:
++    	    // RSP.g:1:115: YEAR
++    	    {
++    	        /* 1:115: YEAR */
++    	        mYEAR(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 21:
++    	    // RSP.g:1:120: TODAY
++    	    {
++    	        /* 1:120: TODAY */
++    	        mTODAY(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 22:
++    	    // RSP.g:1:126: NEWLINE
++    	    {
++    	        /* 1:126: NEWLINE */
++    	        mNEWLINE(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 23:
++    	    // RSP.g:1:134: WS
++    	    {
++    	        /* 1:134: WS */
++    	        mWS(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 24:
++    	    // RSP.g:1:137: FIELD
++    	    {
++    	        /* 1:137: FIELD */
++    	        mFIELD(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 25:
++    	    // RSP.g:1:143: INT
++    	    {
++    	        /* 1:143: INT */
++    	        mINT(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 26:
++    	    // RSP.g:1:147: DATE
++    	    {
++    	        /* 1:147: DATE */
++    	        mDATE(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++    	case 27:
++    	    // RSP.g:1:152: STR
++    	    {
++    	        /* 1:152: STR */
++    	        mSTR(ctx ); 
++    	        if  (HASEXCEPTION())
++    	        {
++    	            goto ruleTokensEx;
++    	        }
++
++
++    	    }
++    	    break;
++
++        }
++    }
++
++    
++    goto ruleTokensEx; /* Prevent compiler warnings */
++ruleTokensEx: ;
++}
++
++/* =========================================================================
++ * Lexer matching rules end.
++ * =========================================================================
++ */
++/* End of Lexer code
++ * ================================================
++ * ================================================
++ */ 
++
++
++/* End of code
++ * =============================================================================
++ */
+diff --git a/src/pregen/RSPLexer.h b/src/pregen/RSPLexer.h
+new file mode 100644
+index 0000000..4f4d06b
+--- /dev/null
++++ b/src/pregen/RSPLexer.h
+@@ -0,0 +1,254 @@
++/** \file
++ *  This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : RSP.g
++ *     -                            On : 2014-09-30 21:42:41
++ *     -                 for the lexer : RSPLexerLexer *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++ * The lexer RSPLexer has the callable functions (rules) shown below,
++ * which will invoke the code for the associated rule in the source grammar
++ * assuming that the input stream is pointing to a token/text stream that could begin
++ * this rule.
++ * 
++ * For instance if you call the first (topmost) rule in a parser grammar, you will
++ * get the results of a full parse, but calling a rule half way through the grammar will
++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
++ * in editors and so on.
++ *
++ * The parser entry points are called indirectly (by function pointer to function) via
++ * a parser context typedef pRSPLexer, which is returned from a call to RSPLexerNew().
++ *
++ * As this is a generated lexer, it is unlikely you will call it 'manually'. However
++ * the methods are provided anyway.
++ * * The methods in pRSPLexer are  as follows:
++ *
++ *  -  void      pRSPLexer->QUOTE(pRSPLexer)
++ *  -  void      pRSPLexer->LPAR(pRSPLexer)
++ *  -  void      pRSPLexer->RPAR(pRSPLexer)
++ *  -  void      pRSPLexer->AND(pRSPLexer)
++ *  -  void      pRSPLexer->OR(pRSPLexer)
++ *  -  void      pRSPLexer->NOT(pRSPLexer)
++ *  -  void      pRSPLexer->EQUAL(pRSPLexer)
++ *  -  void      pRSPLexer->INCLUDES(pRSPLexer)
++ *  -  void      pRSPLexer->STARTSW(pRSPLexer)
++ *  -  void      pRSPLexer->ENDSW(pRSPLexer)
++ *  -  void      pRSPLexer->GREATER(pRSPLexer)
++ *  -  void      pRSPLexer->LESS(pRSPLexer)
++ *  -  void      pRSPLexer->GTE(pRSPLexer)
++ *  -  void      pRSPLexer->LTE(pRSPLexer)
++ *  -  void      pRSPLexer->BEFORE(pRSPLexer)
++ *  -  void      pRSPLexer->AFTER(pRSPLexer)
++ *  -  void      pRSPLexer->DAY(pRSPLexer)
++ *  -  void      pRSPLexer->WEEK(pRSPLexer)
++ *  -  void      pRSPLexer->MONTH(pRSPLexer)
++ *  -  void      pRSPLexer->YEAR(pRSPLexer)
++ *  -  void      pRSPLexer->TODAY(pRSPLexer)
++ *  -  void      pRSPLexer->NEWLINE(pRSPLexer)
++ *  -  void      pRSPLexer->WS(pRSPLexer)
++ *  -  void      pRSPLexer->FIELD(pRSPLexer)
++ *  -  void      pRSPLexer->INT(pRSPLexer)
++ *  -  void      pRSPLexer->DATE(pRSPLexer)
++ *  -  void      pRSPLexer->STR(pRSPLexer)
++ *  -  void      pRSPLexer->ESCAPED(pRSPLexer)
++ *  -  void      pRSPLexer->DIGIT09(pRSPLexer)
++ *  -  void      pRSPLexer->DIGIT19(pRSPLexer)
++ *  -  void      pRSPLexer->Tokens(pRSPLexer)
++ *
++ * The return type for any particular rule is of course determined by the source
++ * grammar file.
++ */
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++#ifndef	_RSPLexer_H
++#define _RSPLexer_H
++/* =============================================================================
++ * Standard antlr3 C runtime definitions
++ */
++#include    <antlr3.h>
++
++/* End of standard antlr 3 runtime definitions
++ * =============================================================================
++ */
++ 
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++// Forward declare the context typedef so that we can use it before it is
++// properly defined. Delegators and delegates (from import statements) are
++// interdependent and their context structures contain pointers to each other
++// C only allows such things to be declared if you pre-declare the typedef.
++//
++typedef struct RSPLexer_Ctx_struct RSPLexer, * pRSPLexer;
++
++
++
++#ifdef	ANTLR3_WINDOWS
++// Disable: Unreferenced parameter,							- Rules with parameters that are not used
++//          constant conditional,							- ANTLR realizes that a prediction is always true (synpred usually)
++//          initialized but unused variable					- tree rewrite variables declared but not needed
++//          Unreferenced local variable						- lexer rule declares but does not always use _type
++//          potentially unitialized variable used			- retval always returned from a rule 
++//			unreferenced local function has been removed	- susually getTokenNames or freeScope, they can go without warnigns
++//
++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
++// this is a matter of orthogonality hence I disable that one.
++//
++#pragma warning( disable : 4100 )
++#pragma warning( disable : 4101 )
++#pragma warning( disable : 4127 )
++#pragma warning( disable : 4189 )
++#pragma warning( disable : 4505 )
++#pragma warning( disable : 4701 )
++#endif
++
++/** Context tracking structure for RSPLexer
++ */
++struct RSPLexer_Ctx_struct
++{
++    /** Built in ANTLR3 context tracker contains all the generic elements
++     *  required for context tracking.
++     */
++    pANTLR3_LEXER    pLexer;
++
++
++     void (*mQUOTE)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mLPAR)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mRPAR)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mAND)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mOR)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mNOT)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mEQUAL)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mINCLUDES)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mSTARTSW)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mENDSW)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mGREATER)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mLESS)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mGTE)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mLTE)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mBEFORE)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mAFTER)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mDAY)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mWEEK)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mMONTH)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mYEAR)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mTODAY)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mNEWLINE)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mWS)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mFIELD)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mINT)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mDATE)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mSTR)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mESCAPED)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mDIGIT09)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mDIGIT19)	(struct RSPLexer_Ctx_struct * ctx);
++     void (*mTokens)	(struct RSPLexer_Ctx_struct * ctx);    const char * (*getGrammarFileName)();
++    void	    (*free)   (struct RSPLexer_Ctx_struct * ctx);
++        
++};
++
++// Function protoypes for the constructor functions that external translation units
++// such as delegators and delegates may wish to call.
++//
++ANTLR3_API pRSPLexer RSPLexerNew         (pANTLR3_INPUT_STREAM instream);
++ANTLR3_API pRSPLexer RSPLexerNewSSD      (pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
++
++/** Symbolic definitions of all the tokens that the lexer will work with.
++ * \{
++ *
++ * Antlr will define EOF, but we can't use that as it it is too common in
++ * in C header files and that would be confusing. There is no way to filter this out at the moment
++ * so we just undef it here for now. That isn't the value we get back from C recognizers
++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
++ */
++#ifdef	EOF
++#undef	EOF
++#endif
++#ifdef	Tokens
++#undef	Tokens
++#endif 
++#define STARTSW      14
++#define WEEK      26
++#define TODAY      24
++#define YEAR      28
++#define ENDSW      15
++#define GTE      20
++#define BEFORE      21
++#define DAY      25
++#define INT      16
++#define NOT      11
++#define AFTER      22
++#define AND      6
++#define EOF      -1
++#define LTE      19
++#define MONTH      27
++#define DIGIT19      31
++#define INCLUDES      13
++#define STR      10
++#define QUOTE      29
++#define GREATER      18
++#define WS      30
++#define LPAR      7
++#define NEWLINE      4
++#define EQUAL      12
++#define OR      5
++#define LESS      17
++#define FIELD      9
++#define RPAR      8
++#define ESCAPED      33
++#define DATE      23
++#define DIGIT09      32
++#ifdef	EOF
++#undef	EOF
++#define	EOF	ANTLR3_TOKEN_EOF
++#endif
++
++#ifndef TOKENSOURCE
++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
++#endif
++
++/* End of token definitions for RSPLexer
++ * =============================================================================
++ */
++/** \} */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
++
++/* END - Note:Keep extra line feed to satisfy UNIX systems */
+diff --git a/src/pregen/RSPParser.c b/src/pregen/RSPParser.c
+new file mode 100644
+index 0000000..c538e49
+--- /dev/null
++++ b/src/pregen/RSPParser.c
+@@ -0,0 +1,2684 @@
++/** \file
++ *  This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : RSP.g
++ *     -                            On : 2014-09-30 21:42:40
++ *     -                for the parser : RSPParserParser *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++*/
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++/* -----------------------------------------
++ * Include the ANTLR3 generated header file.
++ */
++#include    "RSPParser.h"
++/* ----------------------------------------- */
++
++
++
++
++
++/* MACROS that hide the C interface implementations from the
++ * generated code, which makes it a little more understandable to the human eye.
++ * I am very much against using C pre-processor macros for function calls and bits
++ * of code as you cannot see what is happening when single stepping in debuggers
++ * and so on. The exception (in my book at least) is for generated code, where you are
++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
++ * hides some indirect calls, but is always referring to the input stream. This is
++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
++ * the runtime interfaces without changing the generated code too often, without
++ * confusing the reader of the generated output, who may not wish to know the gory
++ * details of the interface inheritance.
++ */
++ 
++#define		CTX	ctx
++
++/* Aids in accessing scopes for grammar programmers
++ */
++#undef	SCOPE_TYPE
++#undef	SCOPE_STACK
++#undef	SCOPE_TOP
++#define	SCOPE_TYPE(scope)   pRSPParser_##scope##_SCOPE
++#define SCOPE_STACK(scope)  pRSPParser_##scope##Stack
++#define	SCOPE_TOP(scope)    ctx->pRSPParser_##scope##Top
++#define	SCOPE_SIZE(scope)		ctx->pRSPParser_##scope##Stack_limit
++#define SCOPE_INSTANCE(scope, i)	(ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
++
++/* Macros for accessing things in the parser
++ */
++ 
++#undef	    PARSER		    
++#undef	    RECOGNIZER		    
++#undef	    HAVEPARSEDRULE
++#undef		MEMOIZE
++#undef	    INPUT
++#undef	    STRSTREAM
++#undef	    HASEXCEPTION
++#undef	    EXCEPTION
++#undef	    MATCHT
++#undef	    MATCHANYT
++#undef	    FOLLOWSTACK
++#undef	    FOLLOWPUSH
++#undef	    FOLLOWPOP
++#undef	    PRECOVER
++#undef	    PREPORTERROR
++#undef	    LA
++#undef	    LT
++#undef	    CONSTRUCTEX
++#undef	    CONSUME
++#undef	    MARK
++#undef	    REWIND
++#undef	    REWINDLAST
++#undef	    PERRORRECOVERY
++#undef	    HASFAILED
++#undef	    FAILEDFLAG
++#undef	    RECOVERFROMMISMATCHEDSET
++#undef	    RECOVERFROMMISMATCHEDELEMENT
++#undef		INDEX
++#undef      ADAPTOR
++#undef		SEEK
++#undef	    RULEMEMO		    
++#undef		DBG
++
++#define	    PARSER							ctx->pParser  
++#define	    RECOGNIZER						PARSER->rec
++#define		PSRSTATE						RECOGNIZER->state
++#define	    HAVEPARSEDRULE(r)				RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
++#define		MEMOIZE(ri,si)					RECOGNIZER->memoize(RECOGNIZER, ri, si)
++#define	    INPUT							PARSER->tstream
++#define	    STRSTREAM						INPUT
++#define		ISTREAM							INPUT->istream
++#define		INDEX()							ISTREAM->index(INPUT->istream)
++#define	    HASEXCEPTION()					(PSRSTATE->error == ANTLR3_TRUE)
++#define	    EXCEPTION						PSRSTATE->exception
++#define	    MATCHT(t, fs)					RECOGNIZER->match(RECOGNIZER, t, fs)
++#define	    MATCHANYT()						RECOGNIZER->matchAny(RECOGNIZER)
++#define	    FOLLOWSTACK					    PSRSTATE->following
++#define	    FOLLOWPUSH(x)					FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
++#define	    FOLLOWPOP()						FOLLOWSTACK->pop(FOLLOWSTACK)
++#define	    PRECOVER()						RECOGNIZER->recover(RECOGNIZER)
++#define	    PREPORTERROR()					RECOGNIZER->reportError(RECOGNIZER)
++#define	    LA(n)							INPUT->istream->_LA(ISTREAM, n)
++#define	    LT(n)							INPUT->_LT(INPUT, n)
++#define	    CONSTRUCTEX()					RECOGNIZER->exConstruct(RECOGNIZER)
++#define	    CONSUME()						ISTREAM->consume(ISTREAM)
++#define	    MARK()							ISTREAM->mark(ISTREAM)
++#define	    REWIND(m)						ISTREAM->rewind(ISTREAM, m)
++#define	    REWINDLAST()					ISTREAM->rewindLast(ISTREAM)
++#define		SEEK(n)							ISTREAM->seek(ISTREAM, n)
++#define	    PERRORRECOVERY					PSRSTATE->errorRecovery
++#define	    FAILEDFLAG						PSRSTATE->failed
++#define	    HASFAILED()						(FAILEDFLAG == ANTLR3_TRUE)
++#define	    BACKTRACKING					PSRSTATE->backtracking
++#define	    RECOVERFROMMISMATCHEDSET(s)		RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
++#define	    RECOVERFROMMISMATCHEDELEMENT(e)	RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
++#define     ADAPTOR                         ctx->adaptor
++#define		RULEMEMO						PSRSTATE->ruleMemo
++#define		DBG								RECOGNIZER->debugger
++
++#define		TOKTEXT(tok, txt)				tok, (pANTLR3_UINT8)txt
++
++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
++ * then for the present you must use different names for your defines as these are hard coded
++ * in the code generator. It would be better not to use such names internally, and maybe
++ * we can change this in a forthcoming release. I deliberately do not #undef these
++ * here as this will at least give you a redefined error somewhere if they clash.
++ */
++#define	    UP	    ANTLR3_TOKEN_UP
++#define	    DOWN    ANTLR3_TOKEN_DOWN
++#define	    EOR	    ANTLR3_TOKEN_EOR
++#define	    INVALID ANTLR3_TOKEN_INVALID
++
++
++/* =============================================================================
++ * Functions to create and destroy scopes. First come the rule scopes, followed
++ * by the global declared scopes.
++ */
++
++
++
++/* ============================================================================= */
++
++/* =============================================================================
++ * Start of recognizer
++ */
++
++
++
++/** \brief Table of all token names in symbolic order, mainly used for
++ *         error reporting.
++ */
++pANTLR3_UINT8   RSPParserTokenNames[30+4]
++     = {
++        (pANTLR3_UINT8) "<invalid>",       /* String to print to indicate an invalid token */
++        (pANTLR3_UINT8) "<EOR>",
++        (pANTLR3_UINT8) "<DOWN>", 
++        (pANTLR3_UINT8) "<UP>", 
++        (pANTLR3_UINT8) "NEWLINE",
++        (pANTLR3_UINT8) "OR",
++        (pANTLR3_UINT8) "AND",
++        (pANTLR3_UINT8) "LPAR",
++        (pANTLR3_UINT8) "RPAR",
++        (pANTLR3_UINT8) "FIELD",
++        (pANTLR3_UINT8) "STR",
++        (pANTLR3_UINT8) "NOT",
++        (pANTLR3_UINT8) "EQUAL",
++        (pANTLR3_UINT8) "INCLUDES",
++        (pANTLR3_UINT8) "STARTSW",
++        (pANTLR3_UINT8) "ENDSW",
++        (pANTLR3_UINT8) "INT",
++        (pANTLR3_UINT8) "LESS",
++        (pANTLR3_UINT8) "GREATER",
++        (pANTLR3_UINT8) "LTE",
++        (pANTLR3_UINT8) "GTE",
++        (pANTLR3_UINT8) "BEFORE",
++        (pANTLR3_UINT8) "AFTER",
++        (pANTLR3_UINT8) "DATE",
++        (pANTLR3_UINT8) "TODAY",
++        (pANTLR3_UINT8) "DAY",
++        (pANTLR3_UINT8) "WEEK",
++        (pANTLR3_UINT8) "MONTH",
++        (pANTLR3_UINT8) "YEAR",
++        (pANTLR3_UINT8) "QUOTE",
++        (pANTLR3_UINT8) "WS",
++        (pANTLR3_UINT8) "DIGIT19",
++        (pANTLR3_UINT8) "DIGIT09",
++        (pANTLR3_UINT8) "ESCAPED"
++       };
++
++        
++
++// Forward declare the locally static matching functions we have generated.
++//
++static RSPParser_query_return	query    (pRSPParser ctx);
++static RSPParser_expr_return	expr    (pRSPParser ctx);
++static RSPParser_aexpr_return	aexpr    (pRSPParser ctx);
++static RSPParser_crit_return	crit    (pRSPParser ctx);
++static RSPParser_strcrit_return	strcrit    (pRSPParser ctx);
++static RSPParser_strop_return	strop    (pRSPParser ctx);
++static RSPParser_intcrit_return	intcrit    (pRSPParser ctx);
++static RSPParser_intop_return	intop    (pRSPParser ctx);
++static RSPParser_datecrit_return	datecrit    (pRSPParser ctx);
++static RSPParser_dateop_return	dateop    (pRSPParser ctx);
++static RSPParser_datespec_return	datespec    (pRSPParser ctx);
++static RSPParser_dateref_return	dateref    (pRSPParser ctx);
++static RSPParser_dateintval_return	dateintval    (pRSPParser ctx);
++static void	RSPParserFree(pRSPParser ctx);
++/* For use in tree output where we are accumulating rule labels via label += ruleRef
++ * we need a function that knows how to free a return scope when the list is destroyed. 
++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
++ */
++static	void ANTLR3_CDECL freeScope(void * scope)
++{
++    ANTLR3_FREE(scope);
++}
++
++/** \brief Name of the grammar file that generated this code
++ */
++static const char fileName[] = "RSP.g";
++
++/** \brief Return the name of the grammar file that generated this code.
++ */
++static const char * getGrammarFileName()
++{
++	return fileName;
++}
++/** \brief Create a new RSPParser parser and return a context for it.
++ *
++ * \param[in] instream Pointer to an input stream interface.
++ *
++ * \return Pointer to new parser context upon success.
++ */
++ANTLR3_API pRSPParser
++RSPParserNew   (pANTLR3_COMMON_TOKEN_STREAM instream)
++{
++	// See if we can create a new parser with the standard constructor
++	//
++	return RSPParserNewSSD(instream, NULL);
++}
++
++/** \brief Create a new RSPParser parser and return a context for it.
++ *
++ * \param[in] instream Pointer to an input stream interface.
++ *
++ * \return Pointer to new parser context upon success.
++ */
++ANTLR3_API pRSPParser
++RSPParserNewSSD   (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
++{
++    pRSPParser ctx;	    /* Context structure we will build and return   */
++    
++    ctx	= (pRSPParser) ANTLR3_CALLOC(1, sizeof(RSPParser));
++    
++    if	(ctx == NULL)
++    {
++		// Failed to allocate memory for parser context
++		//
++        return  NULL;
++    }
++    
++    /* -------------------------------------------------------------------
++     * Memory for basic structure is allocated, now to fill in
++     * the base ANTLR3 structures. We initialize the function pointers
++     * for the standard ANTLR3 parser function set, but upon return
++     * from here, the programmer may set the pointers to provide custom
++     * implementations of each function. 
++     *
++     * We don't use the macros defined in RSPParser.h here, in order that you can get a sense
++     * of what goes where.
++     */
++
++    /* Create a base parser/recognizer, using the supplied token stream
++     */
++    ctx->pParser	    = antlr3ParserNewStream(ANTLR3_SIZE_HINT, instream->tstream, state);
++    /* Install the implementation of our RSPParser interface
++     */
++    ctx->query	= query;
++    ctx->expr	= expr;
++    ctx->aexpr	= aexpr;
++    ctx->crit	= crit;
++    ctx->strcrit	= strcrit;
++    ctx->strop	= strop;
++    ctx->intcrit	= intcrit;
++    ctx->intop	= intop;
++    ctx->datecrit	= datecrit;
++    ctx->dateop	= dateop;
++    ctx->datespec	= datespec;
++    ctx->dateref	= dateref;
++    ctx->dateintval	= dateintval;
++    ctx->free			= RSPParserFree;
++    ctx->getGrammarFileName	= getGrammarFileName;
++    
++    /* Install the scope pushing methods.
++     */
++    ADAPTOR	= ANTLR3_TREE_ADAPTORNew(instream->tstream->tokenSource->strFactory);
++    ctx->vectors	= antlr3VectorFactoryNew(0);
++    
++
++	
++    /* Install the token table
++     */
++    PSRSTATE->tokenNames   = RSPParserTokenNames;
++    
++    
++    /* Return the newly built parser to the caller
++     */
++    return  ctx;
++}
++
++/** Free the parser resources
++ */
++ static void
++ RSPParserFree(pRSPParser ctx)
++ {
++    /* Free any scope memory
++     */
++    
++    ctx->vectors->close(ctx->vectors);
++    /* We created the adaptor so we must free it
++     */
++    ADAPTOR->free(ADAPTOR);
++	// Free this parser
++	//
++    ctx->pParser->free(ctx->pParser);
++    ANTLR3_FREE(ctx);
++
++    /* Everything is released, so we can return
++     */
++    return;
++ }
++ 
++/** Return token names used by this parser
++ *
++ * The returned pointer is used as an index into the token names table (using the token 
++ * number as the index).
++ * 
++ * \return Pointer to first char * in the table.
++ */
++static pANTLR3_UINT8    *getTokenNames() 
++{
++        return RSPParserTokenNames; 
++}
++
++    
++/* Declare the bitsets
++ */
++
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_query42  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_query42_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_query42	= { FOLLOW_expr_in_query42_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NEWLINE_in_query44  */
++static	ANTLR3_BITWORD FOLLOW_NEWLINE_in_query44_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000) };
++static  ANTLR3_BITSET_LIST FOLLOW_NEWLINE_in_query44	= { FOLLOW_NEWLINE_in_query44_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_EOF_in_query47  */
++static	ANTLR3_BITWORD FOLLOW_EOF_in_query47_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_EOF_in_query47	= { FOLLOW_EOF_in_query47_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expr63  */
++static	ANTLR3_BITWORD FOLLOW_aexpr_in_expr63_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000022) };
++static  ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expr63	= { FOLLOW_aexpr_in_expr63_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OR_in_expr66  */
++static	ANTLR3_BITWORD FOLLOW_OR_in_expr66_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000280) };
++static  ANTLR3_BITSET_LIST FOLLOW_OR_in_expr66	= { FOLLOW_OR_in_expr66_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expr69  */
++static	ANTLR3_BITWORD FOLLOW_aexpr_in_expr69_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000022) };
++static  ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expr69	= { FOLLOW_aexpr_in_expr69_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_aexpr81  */
++static	ANTLR3_BITWORD FOLLOW_crit_in_aexpr81_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000042) };
++static  ANTLR3_BITSET_LIST FOLLOW_crit_in_aexpr81	= { FOLLOW_crit_in_aexpr81_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AND_in_aexpr84  */
++static	ANTLR3_BITWORD FOLLOW_AND_in_aexpr84_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000280) };
++static  ANTLR3_BITSET_LIST FOLLOW_AND_in_aexpr84	= { FOLLOW_AND_in_aexpr84_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_aexpr87  */
++static	ANTLR3_BITWORD FOLLOW_crit_in_aexpr87_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000042) };
++static  ANTLR3_BITSET_LIST FOLLOW_crit_in_aexpr87	= { FOLLOW_crit_in_aexpr87_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAR_in_crit99  */
++static	ANTLR3_BITWORD FOLLOW_LPAR_in_crit99_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000280) };
++static  ANTLR3_BITSET_LIST FOLLOW_LPAR_in_crit99	= { FOLLOW_LPAR_in_crit99_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_crit101  */
++static	ANTLR3_BITWORD FOLLOW_expr_in_crit101_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000100) };
++static  ANTLR3_BITSET_LIST FOLLOW_expr_in_crit101	= { FOLLOW_expr_in_crit101_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAR_in_crit103  */
++static	ANTLR3_BITWORD FOLLOW_RPAR_in_crit103_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_RPAR_in_crit103	= { FOLLOW_RPAR_in_crit103_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strcrit_in_crit114  */
++static	ANTLR3_BITWORD FOLLOW_strcrit_in_crit114_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_strcrit_in_crit114	= { FOLLOW_strcrit_in_crit114_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intcrit_in_crit119  */
++static	ANTLR3_BITWORD FOLLOW_intcrit_in_crit119_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_intcrit_in_crit119	= { FOLLOW_intcrit_in_crit119_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_datecrit_in_crit124  */
++static	ANTLR3_BITWORD FOLLOW_datecrit_in_crit124_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_datecrit_in_crit124	= { FOLLOW_datecrit_in_crit124_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_strcrit134  */
++static	ANTLR3_BITWORD FOLLOW_FIELD_in_strcrit134_bits[]	= { ANTLR3_UINT64_LIT(0x000000000000F000) };
++static  ANTLR3_BITSET_LIST FOLLOW_FIELD_in_strcrit134	= { FOLLOW_FIELD_in_strcrit134_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strop_in_strcrit136  */
++static	ANTLR3_BITWORD FOLLOW_strop_in_strcrit136_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000400) };
++static  ANTLR3_BITSET_LIST FOLLOW_strop_in_strcrit136	= { FOLLOW_strop_in_strcrit136_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_strcrit138  */
++static	ANTLR3_BITWORD FOLLOW_STR_in_strcrit138_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_STR_in_strcrit138	= { FOLLOW_STR_in_strcrit138_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_strcrit155  */
++static	ANTLR3_BITWORD FOLLOW_FIELD_in_strcrit155_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000800) };
++static  ANTLR3_BITSET_LIST FOLLOW_FIELD_in_strcrit155	= { FOLLOW_FIELD_in_strcrit155_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_strcrit157  */
++static	ANTLR3_BITWORD FOLLOW_NOT_in_strcrit157_bits[]	= { ANTLR3_UINT64_LIT(0x000000000000F000) };
++static  ANTLR3_BITSET_LIST FOLLOW_NOT_in_strcrit157	= { FOLLOW_NOT_in_strcrit157_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strop_in_strcrit159  */
++static	ANTLR3_BITWORD FOLLOW_strop_in_strcrit159_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000400) };
++static  ANTLR3_BITSET_LIST FOLLOW_strop_in_strcrit159	= { FOLLOW_strop_in_strcrit159_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_strcrit161  */
++static	ANTLR3_BITWORD FOLLOW_STR_in_strcrit161_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_STR_in_strcrit161	= { FOLLOW_STR_in_strcrit161_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_strop0  */
++static	ANTLR3_BITWORD FOLLOW_set_in_strop0_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_set_in_strop0	= { FOLLOW_set_in_strop0_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_intcrit211  */
++static	ANTLR3_BITWORD FOLLOW_FIELD_in_intcrit211_bits[]	= { ANTLR3_UINT64_LIT(0x00000000001E1000) };
++static  ANTLR3_BITSET_LIST FOLLOW_FIELD_in_intcrit211	= { FOLLOW_FIELD_in_intcrit211_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intop_in_intcrit213  */
++static	ANTLR3_BITWORD FOLLOW_intop_in_intcrit213_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000010000) };
++static  ANTLR3_BITSET_LIST FOLLOW_intop_in_intcrit213	= { FOLLOW_intop_in_intcrit213_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_intcrit215  */
++static	ANTLR3_BITWORD FOLLOW_INT_in_intcrit215_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_INT_in_intcrit215	= { FOLLOW_INT_in_intcrit215_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_intcrit232  */
++static	ANTLR3_BITWORD FOLLOW_FIELD_in_intcrit232_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000800) };
++static  ANTLR3_BITSET_LIST FOLLOW_FIELD_in_intcrit232	= { FOLLOW_FIELD_in_intcrit232_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_intcrit234  */
++static	ANTLR3_BITWORD FOLLOW_NOT_in_intcrit234_bits[]	= { ANTLR3_UINT64_LIT(0x00000000001E1000) };
++static  ANTLR3_BITSET_LIST FOLLOW_NOT_in_intcrit234	= { FOLLOW_NOT_in_intcrit234_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intop_in_intcrit236  */
++static	ANTLR3_BITWORD FOLLOW_intop_in_intcrit236_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000010000) };
++static  ANTLR3_BITSET_LIST FOLLOW_intop_in_intcrit236	= { FOLLOW_intop_in_intcrit236_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_intcrit238  */
++static	ANTLR3_BITWORD FOLLOW_INT_in_intcrit238_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_INT_in_intcrit238	= { FOLLOW_INT_in_intcrit238_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_intop0  */
++static	ANTLR3_BITWORD FOLLOW_set_in_intop0_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_set_in_intop0	= { FOLLOW_set_in_intop0_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_datecrit292  */
++static	ANTLR3_BITWORD FOLLOW_FIELD_in_datecrit292_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000600000) };
++static  ANTLR3_BITSET_LIST FOLLOW_FIELD_in_datecrit292	= { FOLLOW_FIELD_in_datecrit292_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateop_in_datecrit294  */
++static	ANTLR3_BITWORD FOLLOW_dateop_in_datecrit294_bits[]	= { ANTLR3_UINT64_LIT(0x0000000001810000) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateop_in_datecrit294	= { FOLLOW_dateop_in_datecrit294_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_datespec_in_datecrit296  */
++static	ANTLR3_BITWORD FOLLOW_datespec_in_datecrit296_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_datespec_in_datecrit296	= { FOLLOW_datespec_in_datecrit296_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_dateop0  */
++static	ANTLR3_BITWORD FOLLOW_set_in_dateop0_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_set_in_dateop0	= { FOLLOW_set_in_dateop0_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateref_in_datespec331  */
++static	ANTLR3_BITWORD FOLLOW_dateref_in_datespec331_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateref_in_datespec331	= { FOLLOW_dateref_in_datespec331_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_datespec336  */
++static	ANTLR3_BITWORD FOLLOW_INT_in_datespec336_bits[]	= { ANTLR3_UINT64_LIT(0x000000001E000000) };
++static  ANTLR3_BITSET_LIST FOLLOW_INT_in_datespec336	= { FOLLOW_INT_in_datespec336_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateintval_in_datespec338  */
++static	ANTLR3_BITWORD FOLLOW_dateintval_in_datespec338_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000600000) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateintval_in_datespec338	= { FOLLOW_dateintval_in_datespec338_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateop_in_datespec340  */
++static	ANTLR3_BITWORD FOLLOW_dateop_in_datespec340_bits[]	= { ANTLR3_UINT64_LIT(0x0000000001800000) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateop_in_datespec340	= { FOLLOW_dateop_in_datespec340_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateref_in_datespec342  */
++static	ANTLR3_BITWORD FOLLOW_dateref_in_datespec342_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_dateref_in_datespec342	= { FOLLOW_dateref_in_datespec342_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_dateref0  */
++static	ANTLR3_BITWORD FOLLOW_set_in_dateref0_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_set_in_dateref0	= { FOLLOW_set_in_dateref0_bits, 1	};
++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_dateintval0  */
++static	ANTLR3_BITWORD FOLLOW_set_in_dateintval0_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
++static  ANTLR3_BITSET_LIST FOLLOW_set_in_dateintval0	= { FOLLOW_set_in_dateintval0_bits, 1	};
++     
++
++ 
++ 
++/* ==============================================
++ * Parsing rules
++ */
++/** 
++ * $ANTLR start query
++ * RSP.g:27:1: query : expr ( NEWLINE )? EOF -> expr ;
++ */
++static RSPParser_query_return
++query(pRSPParser ctx)
++{   
++    RSPParser_query_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    NEWLINE2;
++    pANTLR3_COMMON_TOKEN    EOF3;
++    RSPParser_expr_return expr1;
++    #undef	RETURN_TYPE_expr1
++    #define	RETURN_TYPE_expr1 RSPParser_expr_return
++
++    pANTLR3_BASE_TREE NEWLINE2_tree;
++    pANTLR3_BASE_TREE EOF3_tree;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_NEWLINE;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_EOF;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_expr;
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    NEWLINE2       = NULL;
++    EOF3       = NULL;
++    expr1.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    NEWLINE2_tree   = NULL;
++    EOF3_tree   = NULL;
++
++    stream_NEWLINE   = NULL;
++    #define CREATE_stream_NEWLINE  if (stream_NEWLINE == NULL) {stream_NEWLINE = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token NEWLINE"); } 
++    stream_EOF   = NULL;
++    #define CREATE_stream_EOF  if (stream_EOF == NULL) {stream_EOF = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token EOF"); } 
++    stream_expr   = NULL;
++    #define CREATE_stream_expr  if (stream_expr == NULL) {stream_expr = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule expr"); }
++
++    retval.tree  = NULL;
++    {
++        // RSP.g:27:7: ( expr ( NEWLINE )? EOF -> expr )
++        // RSP.g:27:9: expr ( NEWLINE )? EOF
++        {
++            FOLLOWPUSH(FOLLOW_expr_in_query42);
++            expr1=expr(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto rulequeryEx;
++            }
++
++            CREATE_stream_expr; stream_expr->add(stream_expr, expr1.tree, NULL);
++
++            // RSP.g:27:14: ( NEWLINE )?
++            {
++                int alt1=2;
++                switch ( LA(1) ) 
++                {
++                    case NEWLINE:
++                    	{
++                    		alt1=1;
++                    	}
++                        break;
++                }
++
++                switch (alt1) 
++                {
++            	case 1:
++            	    // RSP.g:27:14: NEWLINE
++            	    {
++            	        NEWLINE2 = (pANTLR3_COMMON_TOKEN) MATCHT(NEWLINE, &FOLLOW_NEWLINE_in_query44); 
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto rulequeryEx;
++            	        }
++            	         
++            	        CREATE_stream_NEWLINE; stream_NEWLINE->add(stream_NEWLINE, NEWLINE2, NULL);
++
++
++            	    }
++            	    break;
++
++                }
++            }
++            EOF3 = (pANTLR3_COMMON_TOKEN) MATCHT(EOF, &FOLLOW_EOF_in_query47); 
++            if  (HASEXCEPTION())
++            {
++                goto rulequeryEx;
++            }
++             
++            CREATE_stream_EOF; stream_EOF->add(stream_EOF, EOF3, NULL);
++
++
++             
++            /* AST REWRITE
++             * elements          : expr
++             * token labels      : 
++             * rule labels       : retval
++             * token list labels : 
++             * rule list labels  : 
++             */
++            {
++            	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++            	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++            	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++            	retval.tree    = root_0;
++            	// 27:28: -> expr
++            	{
++            	    ADAPTOR->addChild(ADAPTOR, root_0, stream_expr == NULL ? NULL : stream_expr->nextTree(stream_expr));
++
++            	}
++
++            	retval.tree = root_0; // set result root
++            	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++            }
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulequeryEx; /* Prevent compiler warnings */
++    rulequeryEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++        if (stream_NEWLINE != NULL) stream_NEWLINE->free(stream_NEWLINE);
++        if (stream_EOF != NULL) stream_EOF->free(stream_EOF);
++        if (stream_expr != NULL) stream_expr->free(stream_expr);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end query */
++
++/** 
++ * $ANTLR start expr
++ * RSP.g:30:1: expr : aexpr ( OR aexpr )* ;
++ */
++static RSPParser_expr_return
++expr(pRSPParser ctx)
++{   
++    RSPParser_expr_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    OR5;
++    RSPParser_aexpr_return aexpr4;
++    #undef	RETURN_TYPE_aexpr4
++    #define	RETURN_TYPE_aexpr4 RSPParser_aexpr_return
++
++    RSPParser_aexpr_return aexpr6;
++    #undef	RETURN_TYPE_aexpr6
++    #define	RETURN_TYPE_aexpr6 RSPParser_aexpr_return
++
++    pANTLR3_BASE_TREE OR5_tree;
++
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    OR5       = NULL;
++    aexpr4.tree = NULL;
++
++    aexpr6.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    OR5_tree   = NULL;
++
++
++    retval.tree  = NULL;
++    {
++        // RSP.g:30:6: ( aexpr ( OR aexpr )* )
++        // RSP.g:30:8: aexpr ( OR aexpr )*
++        {
++            root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++            FOLLOWPUSH(FOLLOW_aexpr_in_expr63);
++            aexpr4=aexpr(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto ruleexprEx;
++            }
++
++            ADAPTOR->addChild(ADAPTOR, root_0, aexpr4.tree);
++
++            // RSP.g:30:14: ( OR aexpr )*
++
++            for (;;)
++            {
++                int alt2=2;
++                switch ( LA(1) ) 
++                {
++                case OR:
++                	{
++                		alt2=1;
++                	}
++                    break;
++
++                }
++
++                switch (alt2) 
++                {
++            	case 1:
++            	    // RSP.g:30:15: OR aexpr
++            	    {
++            	        OR5 = (pANTLR3_COMMON_TOKEN) MATCHT(OR, &FOLLOW_OR_in_expr66); 
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto ruleexprEx;
++            	        }
++
++            	        OR5_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, OR5));
++            	        root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, OR5_tree, root_0));
++
++            	        FOLLOWPUSH(FOLLOW_aexpr_in_expr69);
++            	        aexpr6=aexpr(ctx);
++
++            	        FOLLOWPOP();
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto ruleexprEx;
++            	        }
++
++            	        ADAPTOR->addChild(ADAPTOR, root_0, aexpr6.tree);
++
++            	    }
++            	    break;
++
++            	default:
++            	    goto loop2;	/* break out of the loop */
++            	    break;
++                }
++            }
++            loop2: ; /* Jump out to here if this rule does not match */
++
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleexprEx; /* Prevent compiler warnings */
++    ruleexprEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end expr */
++
++/** 
++ * $ANTLR start aexpr
++ * RSP.g:33:1: aexpr : crit ( AND crit )* ;
++ */
++static RSPParser_aexpr_return
++aexpr(pRSPParser ctx)
++{   
++    RSPParser_aexpr_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    AND8;
++    RSPParser_crit_return crit7;
++    #undef	RETURN_TYPE_crit7
++    #define	RETURN_TYPE_crit7 RSPParser_crit_return
++
++    RSPParser_crit_return crit9;
++    #undef	RETURN_TYPE_crit9
++    #define	RETURN_TYPE_crit9 RSPParser_crit_return
++
++    pANTLR3_BASE_TREE AND8_tree;
++
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    AND8       = NULL;
++    crit7.tree = NULL;
++
++    crit9.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    AND8_tree   = NULL;
++
++
++    retval.tree  = NULL;
++    {
++        // RSP.g:33:7: ( crit ( AND crit )* )
++        // RSP.g:33:9: crit ( AND crit )*
++        {
++            root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++            FOLLOWPUSH(FOLLOW_crit_in_aexpr81);
++            crit7=crit(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto ruleaexprEx;
++            }
++
++            ADAPTOR->addChild(ADAPTOR, root_0, crit7.tree);
++
++            // RSP.g:33:14: ( AND crit )*
++
++            for (;;)
++            {
++                int alt3=2;
++                switch ( LA(1) ) 
++                {
++                case AND:
++                	{
++                		alt3=1;
++                	}
++                    break;
++
++                }
++
++                switch (alt3) 
++                {
++            	case 1:
++            	    // RSP.g:33:15: AND crit
++            	    {
++            	        AND8 = (pANTLR3_COMMON_TOKEN) MATCHT(AND, &FOLLOW_AND_in_aexpr84); 
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto ruleaexprEx;
++            	        }
++
++            	        AND8_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, AND8));
++            	        root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, AND8_tree, root_0));
++
++            	        FOLLOWPUSH(FOLLOW_crit_in_aexpr87);
++            	        crit9=crit(ctx);
++
++            	        FOLLOWPOP();
++            	        if  (HASEXCEPTION())
++            	        {
++            	            goto ruleaexprEx;
++            	        }
++
++            	        ADAPTOR->addChild(ADAPTOR, root_0, crit9.tree);
++
++            	    }
++            	    break;
++
++            	default:
++            	    goto loop3;	/* break out of the loop */
++            	    break;
++                }
++            }
++            loop3: ; /* Jump out to here if this rule does not match */
++
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleaexprEx; /* Prevent compiler warnings */
++    ruleaexprEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end aexpr */
++
++/** 
++ * $ANTLR start crit
++ * RSP.g:36:1: crit : ( LPAR expr RPAR -> expr | strcrit | intcrit | datecrit );
++ */
++static RSPParser_crit_return
++crit(pRSPParser ctx)
++{   
++    RSPParser_crit_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    LPAR10;
++    pANTLR3_COMMON_TOKEN    RPAR12;
++    RSPParser_expr_return expr11;
++    #undef	RETURN_TYPE_expr11
++    #define	RETURN_TYPE_expr11 RSPParser_expr_return
++
++    RSPParser_strcrit_return strcrit13;
++    #undef	RETURN_TYPE_strcrit13
++    #define	RETURN_TYPE_strcrit13 RSPParser_strcrit_return
++
++    RSPParser_intcrit_return intcrit14;
++    #undef	RETURN_TYPE_intcrit14
++    #define	RETURN_TYPE_intcrit14 RSPParser_intcrit_return
++
++    RSPParser_datecrit_return datecrit15;
++    #undef	RETURN_TYPE_datecrit15
++    #define	RETURN_TYPE_datecrit15 RSPParser_datecrit_return
++
++    pANTLR3_BASE_TREE LPAR10_tree;
++    pANTLR3_BASE_TREE RPAR12_tree;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_RPAR;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_LPAR;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_expr;
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    LPAR10       = NULL;
++    RPAR12       = NULL;
++    expr11.tree = NULL;
++
++    strcrit13.tree = NULL;
++
++    intcrit14.tree = NULL;
++
++    datecrit15.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    LPAR10_tree   = NULL;
++    RPAR12_tree   = NULL;
++
++    stream_RPAR   = NULL;
++    #define CREATE_stream_RPAR  if (stream_RPAR == NULL) {stream_RPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token RPAR"); } 
++    stream_LPAR   = NULL;
++    #define CREATE_stream_LPAR  if (stream_LPAR == NULL) {stream_LPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token LPAR"); } 
++    stream_expr   = NULL;
++    #define CREATE_stream_expr  if (stream_expr == NULL) {stream_expr = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule expr"); }
++
++    retval.tree  = NULL;
++    {
++        {
++            //  RSP.g:36:6: ( LPAR expr RPAR -> expr | strcrit | intcrit | datecrit )
++            
++            ANTLR3_UINT32 alt4;
++
++            alt4=4;
++
++            switch ( LA(1) ) 
++            {
++            case LPAR:
++            	{
++            		alt4=1;
++            	}
++                break;
++            case FIELD:
++            	{
++            		switch ( LA(2) ) 
++            		{
++            		case NOT:
++            			{
++            				switch ( LA(3) ) 
++            				{
++            				case EQUAL:
++            					{
++            						switch ( LA(4) ) 
++            						{
++            						case STR:
++            							{
++            								alt4=2;
++            							}
++            						    break;
++            						case INT:
++            							{
++            								alt4=3;
++            							}
++            						    break;
++
++            						default:
++            						    CONSTRUCTEX();
++            						    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            						    EXCEPTION->message      = (void *)"";
++            						    EXCEPTION->decisionNum  = 4;
++            						    EXCEPTION->state        = 8;
++
++
++            						    goto rulecritEx;
++            						}
++
++            					}
++            				    break;
++            				case INCLUDES:
++            				case STARTSW:
++            				case ENDSW:
++            					{
++            						alt4=2;
++            					}
++            				    break;
++            				case LESS:
++            				case GREATER:
++            				case LTE:
++            				case GTE:
++            					{
++            						alt4=3;
++            					}
++            				    break;
++
++            				default:
++            				    CONSTRUCTEX();
++            				    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            				    EXCEPTION->message      = (void *)"";
++            				    EXCEPTION->decisionNum  = 4;
++            				    EXCEPTION->state        = 3;
++
++
++            				    goto rulecritEx;
++            				}
++
++            			}
++            		    break;
++            		case EQUAL:
++            			{
++            				switch ( LA(3) ) 
++            				{
++            				case INT:
++            					{
++            						alt4=3;
++            					}
++            				    break;
++            				case STR:
++            					{
++            						alt4=2;
++            					}
++            				    break;
++
++            				default:
++            				    CONSTRUCTEX();
++            				    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            				    EXCEPTION->message      = (void *)"";
++            				    EXCEPTION->decisionNum  = 4;
++            				    EXCEPTION->state        = 4;
++
++
++            				    goto rulecritEx;
++            				}
++
++            			}
++            		    break;
++            		case BEFORE:
++            		case AFTER:
++            			{
++            				alt4=4;
++            			}
++            		    break;
++            		case LESS:
++            		case GREATER:
++            		case LTE:
++            		case GTE:
++            			{
++            				alt4=3;
++            			}
++            		    break;
++            		case INCLUDES:
++            		case STARTSW:
++            		case ENDSW:
++            			{
++            				alt4=2;
++            			}
++            		    break;
++
++            		default:
++            		    CONSTRUCTEX();
++            		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            		    EXCEPTION->message      = (void *)"";
++            		    EXCEPTION->decisionNum  = 4;
++            		    EXCEPTION->state        = 2;
++
++
++            		    goto rulecritEx;
++            		}
++
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 4;
++                EXCEPTION->state        = 0;
++
++
++                goto rulecritEx;
++            }
++
++            switch (alt4) 
++            {
++        	case 1:
++        	    // RSP.g:36:8: LPAR expr RPAR
++        	    {
++        	        LPAR10 = (pANTLR3_COMMON_TOKEN) MATCHT(LPAR, &FOLLOW_LPAR_in_crit99); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++        	         
++        	        CREATE_stream_LPAR; stream_LPAR->add(stream_LPAR, LPAR10, NULL);
++
++        	        FOLLOWPUSH(FOLLOW_expr_in_crit101);
++        	        expr11=expr(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++
++        	        CREATE_stream_expr; stream_expr->add(stream_expr, expr11.tree, NULL);
++        	        RPAR12 = (pANTLR3_COMMON_TOKEN) MATCHT(RPAR, &FOLLOW_RPAR_in_crit103); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++        	         
++        	        CREATE_stream_RPAR; stream_RPAR->add(stream_RPAR, RPAR12, NULL);
++
++
++        	         
++        	        /* AST REWRITE
++        	         * elements          : expr
++        	         * token labels      : 
++        	         * rule labels       : retval
++        	         * token list labels : 
++        	         * rule list labels  : 
++        	         */
++        	        {
++        	        	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++        	        	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++        	        	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	retval.tree    = root_0;
++        	        	// 36:25: -> expr
++        	        	{
++        	        	    ADAPTOR->addChild(ADAPTOR, root_0, stream_expr == NULL ? NULL : stream_expr->nextTree(stream_expr));
++
++        	        	}
++
++        	        	retval.tree = root_0; // set result root
++        	        	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++        	        }
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP.g:37:4: strcrit
++        	    {
++        	        root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++        	        FOLLOWPUSH(FOLLOW_strcrit_in_crit114);
++        	        strcrit13=strcrit(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++
++        	        ADAPTOR->addChild(ADAPTOR, root_0, strcrit13.tree);
++
++        	    }
++        	    break;
++        	case 3:
++        	    // RSP.g:38:4: intcrit
++        	    {
++        	        root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++        	        FOLLOWPUSH(FOLLOW_intcrit_in_crit119);
++        	        intcrit14=intcrit(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++
++        	        ADAPTOR->addChild(ADAPTOR, root_0, intcrit14.tree);
++
++        	    }
++        	    break;
++        	case 4:
++        	    // RSP.g:39:4: datecrit
++        	    {
++        	        root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++        	        FOLLOWPUSH(FOLLOW_datecrit_in_crit124);
++        	        datecrit15=datecrit(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulecritEx;
++        	        }
++
++        	        ADAPTOR->addChild(ADAPTOR, root_0, datecrit15.tree);
++
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulecritEx; /* Prevent compiler warnings */
++    rulecritEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++        if (stream_RPAR != NULL) stream_RPAR->free(stream_RPAR);
++        if (stream_LPAR != NULL) stream_LPAR->free(stream_LPAR);
++        if (stream_expr != NULL) stream_expr->free(stream_expr);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end crit */
++
++/** 
++ * $ANTLR start strcrit
++ * RSP.g:42:1: strcrit : ( FIELD strop STR -> ^( strop FIELD STR ) | FIELD NOT strop STR -> ^( NOT ^( strop FIELD STR ) ) );
++ */
++static RSPParser_strcrit_return
++strcrit(pRSPParser ctx)
++{   
++    RSPParser_strcrit_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    FIELD16;
++    pANTLR3_COMMON_TOKEN    STR18;
++    pANTLR3_COMMON_TOKEN    FIELD19;
++    pANTLR3_COMMON_TOKEN    NOT20;
++    pANTLR3_COMMON_TOKEN    STR22;
++    RSPParser_strop_return strop17;
++    #undef	RETURN_TYPE_strop17
++    #define	RETURN_TYPE_strop17 RSPParser_strop_return
++
++    RSPParser_strop_return strop21;
++    #undef	RETURN_TYPE_strop21
++    #define	RETURN_TYPE_strop21 RSPParser_strop_return
++
++    pANTLR3_BASE_TREE FIELD16_tree;
++    pANTLR3_BASE_TREE STR18_tree;
++    pANTLR3_BASE_TREE FIELD19_tree;
++    pANTLR3_BASE_TREE NOT20_tree;
++    pANTLR3_BASE_TREE STR22_tree;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_STR;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_FIELD;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_NOT;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_strop;
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    FIELD16       = NULL;
++    STR18       = NULL;
++    FIELD19       = NULL;
++    NOT20       = NULL;
++    STR22       = NULL;
++    strop17.tree = NULL;
++
++    strop21.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    FIELD16_tree   = NULL;
++    STR18_tree   = NULL;
++    FIELD19_tree   = NULL;
++    NOT20_tree   = NULL;
++    STR22_tree   = NULL;
++
++    stream_STR   = NULL;
++    #define CREATE_stream_STR  if (stream_STR == NULL) {stream_STR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token STR"); } 
++    stream_FIELD   = NULL;
++    #define CREATE_stream_FIELD  if (stream_FIELD == NULL) {stream_FIELD = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token FIELD"); } 
++    stream_NOT   = NULL;
++    #define CREATE_stream_NOT  if (stream_NOT == NULL) {stream_NOT = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token NOT"); } 
++    stream_strop   = NULL;
++    #define CREATE_stream_strop  if (stream_strop == NULL) {stream_strop = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule strop"); }
++
++    retval.tree  = NULL;
++    {
++        {
++            //  RSP.g:42:9: ( FIELD strop STR -> ^( strop FIELD STR ) | FIELD NOT strop STR -> ^( NOT ^( strop FIELD STR ) ) )
++            
++            ANTLR3_UINT32 alt5;
++
++            alt5=2;
++
++            switch ( LA(1) ) 
++            {
++            case FIELD:
++            	{
++            		switch ( LA(2) ) 
++            		{
++            		case NOT:
++            			{
++            				alt5=2;
++            			}
++            		    break;
++            		case EQUAL:
++            		case INCLUDES:
++            		case STARTSW:
++            		case ENDSW:
++            			{
++            				alt5=1;
++            			}
++            		    break;
++
++            		default:
++            		    CONSTRUCTEX();
++            		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            		    EXCEPTION->message      = (void *)"";
++            		    EXCEPTION->decisionNum  = 5;
++            		    EXCEPTION->state        = 1;
++
++
++            		    goto rulestrcritEx;
++            		}
++
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 5;
++                EXCEPTION->state        = 0;
++
++
++                goto rulestrcritEx;
++            }
++
++            switch (alt5) 
++            {
++        	case 1:
++        	    // RSP.g:42:11: FIELD strop STR
++        	    {
++        	        FIELD16 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_strcrit134); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestrcritEx;
++        	        }
++        	         
++        	        CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD16, NULL);
++
++        	        FOLLOWPUSH(FOLLOW_strop_in_strcrit136);
++        	        strop17=strop(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestrcritEx;
++        	        }
++
++        	        CREATE_stream_strop; stream_strop->add(stream_strop, strop17.tree, NULL);
++        	        STR18 = (pANTLR3_COMMON_TOKEN) MATCHT(STR, &FOLLOW_STR_in_strcrit138); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestrcritEx;
++        	        }
++        	         
++        	        CREATE_stream_STR; stream_STR->add(stream_STR, STR18, NULL);
++
++
++        	         
++        	        /* AST REWRITE
++        	         * elements          : strop, STR, FIELD
++        	         * token labels      : 
++        	         * rule labels       : retval
++        	         * token list labels : 
++        	         * rule list labels  : 
++        	         */
++        	        {
++        	        	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++        	        	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++        	        	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	retval.tree    = root_0;
++        	        	// 42:29: -> ^( strop FIELD STR )
++        	        	{
++        	        	    // RSP.g:42:32: ^( strop FIELD STR )
++        	        	    {
++        	        	        pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	        root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_strop == NULL ? NULL : stream_strop->nextNode(stream_strop), root_1));
++
++        	        	        ADAPTOR->addChild(ADAPTOR, root_1, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
++        	        	        ADAPTOR->addChild(ADAPTOR, root_1, stream_STR == NULL ? NULL : stream_STR->nextNode(stream_STR));
++
++        	        	        ADAPTOR->addChild(ADAPTOR, root_0, root_1);
++        	        	    }
++
++        	        	}
++
++        	        	retval.tree = root_0; // set result root
++        	        	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++        	        }
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP.g:43:4: FIELD NOT strop STR
++        	    {
++        	        FIELD19 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_strcrit155); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestrcritEx;
++        	        }
++        	         
++        	        CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD19, NULL);
++
++        	        NOT20 = (pANTLR3_COMMON_TOKEN) MATCHT(NOT, &FOLLOW_NOT_in_strcrit157); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestrcritEx;
++        	        }
++        	         
++        	        CREATE_stream_NOT; stream_NOT->add(stream_NOT, NOT20, NULL);
++
++        	        FOLLOWPUSH(FOLLOW_strop_in_strcrit159);
++        	        strop21=strop(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestrcritEx;
++        	        }
++
++        	        CREATE_stream_strop; stream_strop->add(stream_strop, strop21.tree, NULL);
++        	        STR22 = (pANTLR3_COMMON_TOKEN) MATCHT(STR, &FOLLOW_STR_in_strcrit161); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto rulestrcritEx;
++        	        }
++        	         
++        	        CREATE_stream_STR; stream_STR->add(stream_STR, STR22, NULL);
++
++
++        	         
++        	        /* AST REWRITE
++        	         * elements          : NOT, FIELD, strop, STR
++        	         * token labels      : 
++        	         * rule labels       : retval
++        	         * token list labels : 
++        	         * rule list labels  : 
++        	         */
++        	        {
++        	        	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++        	        	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++        	        	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	retval.tree    = root_0;
++        	        	// 43:25: -> ^( NOT ^( strop FIELD STR ) )
++        	        	{
++        	        	    // RSP.g:43:28: ^( NOT ^( strop FIELD STR ) )
++        	        	    {
++        	        	        pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	        root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_NOT == NULL ? NULL : stream_NOT->nextNode(stream_NOT), root_1));
++
++        	        	        // RSP.g:43:34: ^( strop FIELD STR )
++        	        	        {
++        	        	            pANTLR3_BASE_TREE root_2 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	            root_2 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_strop == NULL ? NULL : stream_strop->nextNode(stream_strop), root_2));
++
++        	        	            ADAPTOR->addChild(ADAPTOR, root_2, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
++        	        	            ADAPTOR->addChild(ADAPTOR, root_2, stream_STR == NULL ? NULL : stream_STR->nextNode(stream_STR));
++
++        	        	            ADAPTOR->addChild(ADAPTOR, root_1, root_2);
++        	        	        }
++
++        	        	        ADAPTOR->addChild(ADAPTOR, root_0, root_1);
++        	        	    }
++
++        	        	}
++
++        	        	retval.tree = root_0; // set result root
++        	        	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++        	        }
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulestrcritEx; /* Prevent compiler warnings */
++    rulestrcritEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++        if (stream_STR != NULL) stream_STR->free(stream_STR);
++        if (stream_FIELD != NULL) stream_FIELD->free(stream_FIELD);
++        if (stream_NOT != NULL) stream_NOT->free(stream_NOT);
++        if (stream_strop != NULL) stream_strop->free(stream_strop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end strcrit */
++
++/** 
++ * $ANTLR start strop
++ * RSP.g:46:1: strop : ( EQUAL | INCLUDES | STARTSW | ENDSW );
++ */
++static RSPParser_strop_return
++strop(pRSPParser ctx)
++{   
++    RSPParser_strop_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    set23;
++
++    pANTLR3_BASE_TREE set23_tree;
++
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    set23       = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    set23_tree   = NULL;
++
++
++    retval.tree  = NULL;
++    {
++        // RSP.g:46:7: ( EQUAL | INCLUDES | STARTSW | ENDSW )
++        // RSP.g:
++        {
++            root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++            set23=(pANTLR3_COMMON_TOKEN)LT(1);
++            if ( ((LA(1) >= EQUAL) && (LA(1) <= ENDSW)) )
++            {
++                CONSUME();
++                ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set23)));
++                PERRORRECOVERY=ANTLR3_FALSE;
++            }
++            else 
++            {
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++                EXCEPTION->expectingSet = &FOLLOW_set_in_strop0;
++                RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_strop0);    goto rulestropEx;
++            }
++
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto rulestropEx; /* Prevent compiler warnings */
++    rulestropEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end strop */
++
++/** 
++ * $ANTLR start intcrit
++ * RSP.g:52:1: intcrit : ( FIELD intop INT -> ^( intop FIELD INT ) | FIELD NOT intop INT -> ^( NOT ^( intop FIELD INT ) ) );
++ */
++static RSPParser_intcrit_return
++intcrit(pRSPParser ctx)
++{   
++    RSPParser_intcrit_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    FIELD24;
++    pANTLR3_COMMON_TOKEN    INT26;
++    pANTLR3_COMMON_TOKEN    FIELD27;
++    pANTLR3_COMMON_TOKEN    NOT28;
++    pANTLR3_COMMON_TOKEN    INT30;
++    RSPParser_intop_return intop25;
++    #undef	RETURN_TYPE_intop25
++    #define	RETURN_TYPE_intop25 RSPParser_intop_return
++
++    RSPParser_intop_return intop29;
++    #undef	RETURN_TYPE_intop29
++    #define	RETURN_TYPE_intop29 RSPParser_intop_return
++
++    pANTLR3_BASE_TREE FIELD24_tree;
++    pANTLR3_BASE_TREE INT26_tree;
++    pANTLR3_BASE_TREE FIELD27_tree;
++    pANTLR3_BASE_TREE NOT28_tree;
++    pANTLR3_BASE_TREE INT30_tree;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_FIELD;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_INT;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_NOT;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_intop;
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    FIELD24       = NULL;
++    INT26       = NULL;
++    FIELD27       = NULL;
++    NOT28       = NULL;
++    INT30       = NULL;
++    intop25.tree = NULL;
++
++    intop29.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    FIELD24_tree   = NULL;
++    INT26_tree   = NULL;
++    FIELD27_tree   = NULL;
++    NOT28_tree   = NULL;
++    INT30_tree   = NULL;
++
++    stream_FIELD   = NULL;
++    #define CREATE_stream_FIELD  if (stream_FIELD == NULL) {stream_FIELD = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token FIELD"); } 
++    stream_INT   = NULL;
++    #define CREATE_stream_INT  if (stream_INT == NULL) {stream_INT = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token INT"); } 
++    stream_NOT   = NULL;
++    #define CREATE_stream_NOT  if (stream_NOT == NULL) {stream_NOT = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token NOT"); } 
++    stream_intop   = NULL;
++    #define CREATE_stream_intop  if (stream_intop == NULL) {stream_intop = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule intop"); }
++
++    retval.tree  = NULL;
++    {
++        {
++            //  RSP.g:52:9: ( FIELD intop INT -> ^( intop FIELD INT ) | FIELD NOT intop INT -> ^( NOT ^( intop FIELD INT ) ) )
++            
++            ANTLR3_UINT32 alt6;
++
++            alt6=2;
++
++            switch ( LA(1) ) 
++            {
++            case FIELD:
++            	{
++            		switch ( LA(2) ) 
++            		{
++            		case NOT:
++            			{
++            				alt6=2;
++            			}
++            		    break;
++            		case EQUAL:
++            		case LESS:
++            		case GREATER:
++            		case LTE:
++            		case GTE:
++            			{
++            				alt6=1;
++            			}
++            		    break;
++
++            		default:
++            		    CONSTRUCTEX();
++            		    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++            		    EXCEPTION->message      = (void *)"";
++            		    EXCEPTION->decisionNum  = 6;
++            		    EXCEPTION->state        = 1;
++
++
++            		    goto ruleintcritEx;
++            		}
++
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 6;
++                EXCEPTION->state        = 0;
++
++
++                goto ruleintcritEx;
++            }
++
++            switch (alt6) 
++            {
++        	case 1:
++        	    // RSP.g:52:11: FIELD intop INT
++        	    {
++        	        FIELD24 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_intcrit211); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintcritEx;
++        	        }
++        	         
++        	        CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD24, NULL);
++
++        	        FOLLOWPUSH(FOLLOW_intop_in_intcrit213);
++        	        intop25=intop(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintcritEx;
++        	        }
++
++        	        CREATE_stream_intop; stream_intop->add(stream_intop, intop25.tree, NULL);
++        	        INT26 = (pANTLR3_COMMON_TOKEN) MATCHT(INT, &FOLLOW_INT_in_intcrit215); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintcritEx;
++        	        }
++        	         
++        	        CREATE_stream_INT; stream_INT->add(stream_INT, INT26, NULL);
++
++
++        	         
++        	        /* AST REWRITE
++        	         * elements          : FIELD, intop, INT
++        	         * token labels      : 
++        	         * rule labels       : retval
++        	         * token list labels : 
++        	         * rule list labels  : 
++        	         */
++        	        {
++        	        	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++        	        	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++        	        	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	retval.tree    = root_0;
++        	        	// 52:29: -> ^( intop FIELD INT )
++        	        	{
++        	        	    // RSP.g:52:32: ^( intop FIELD INT )
++        	        	    {
++        	        	        pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	        root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_intop == NULL ? NULL : stream_intop->nextNode(stream_intop), root_1));
++
++        	        	        ADAPTOR->addChild(ADAPTOR, root_1, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
++        	        	        ADAPTOR->addChild(ADAPTOR, root_1, stream_INT == NULL ? NULL : stream_INT->nextNode(stream_INT));
++
++        	        	        ADAPTOR->addChild(ADAPTOR, root_0, root_1);
++        	        	    }
++
++        	        	}
++
++        	        	retval.tree = root_0; // set result root
++        	        	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++        	        }
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP.g:53:4: FIELD NOT intop INT
++        	    {
++        	        FIELD27 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_intcrit232); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintcritEx;
++        	        }
++        	         
++        	        CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD27, NULL);
++
++        	        NOT28 = (pANTLR3_COMMON_TOKEN) MATCHT(NOT, &FOLLOW_NOT_in_intcrit234); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintcritEx;
++        	        }
++        	         
++        	        CREATE_stream_NOT; stream_NOT->add(stream_NOT, NOT28, NULL);
++
++        	        FOLLOWPUSH(FOLLOW_intop_in_intcrit236);
++        	        intop29=intop(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintcritEx;
++        	        }
++
++        	        CREATE_stream_intop; stream_intop->add(stream_intop, intop29.tree, NULL);
++        	        INT30 = (pANTLR3_COMMON_TOKEN) MATCHT(INT, &FOLLOW_INT_in_intcrit238); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruleintcritEx;
++        	        }
++        	         
++        	        CREATE_stream_INT; stream_INT->add(stream_INT, INT30, NULL);
++
++
++        	         
++        	        /* AST REWRITE
++        	         * elements          : NOT, INT, FIELD, intop
++        	         * token labels      : 
++        	         * rule labels       : retval
++        	         * token list labels : 
++        	         * rule list labels  : 
++        	         */
++        	        {
++        	        	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++        	        	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++        	        	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	retval.tree    = root_0;
++        	        	// 53:25: -> ^( NOT ^( intop FIELD INT ) )
++        	        	{
++        	        	    // RSP.g:53:28: ^( NOT ^( intop FIELD INT ) )
++        	        	    {
++        	        	        pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	        root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_NOT == NULL ? NULL : stream_NOT->nextNode(stream_NOT), root_1));
++
++        	        	        // RSP.g:53:34: ^( intop FIELD INT )
++        	        	        {
++        	        	            pANTLR3_BASE_TREE root_2 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	            root_2 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_intop == NULL ? NULL : stream_intop->nextNode(stream_intop), root_2));
++
++        	        	            ADAPTOR->addChild(ADAPTOR, root_2, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
++        	        	            ADAPTOR->addChild(ADAPTOR, root_2, stream_INT == NULL ? NULL : stream_INT->nextNode(stream_INT));
++
++        	        	            ADAPTOR->addChild(ADAPTOR, root_1, root_2);
++        	        	        }
++
++        	        	        ADAPTOR->addChild(ADAPTOR, root_0, root_1);
++        	        	    }
++
++        	        	}
++
++        	        	retval.tree = root_0; // set result root
++        	        	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++        	        }
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleintcritEx; /* Prevent compiler warnings */
++    ruleintcritEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++        if (stream_FIELD != NULL) stream_FIELD->free(stream_FIELD);
++        if (stream_INT != NULL) stream_INT->free(stream_INT);
++        if (stream_NOT != NULL) stream_NOT->free(stream_NOT);
++        if (stream_intop != NULL) stream_intop->free(stream_intop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end intcrit */
++
++/** 
++ * $ANTLR start intop
++ * RSP.g:56:1: intop : ( EQUAL | LESS | GREATER | LTE | GTE );
++ */
++static RSPParser_intop_return
++intop(pRSPParser ctx)
++{   
++    RSPParser_intop_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    set31;
++
++    pANTLR3_BASE_TREE set31_tree;
++
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    set31       = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    set31_tree   = NULL;
++
++
++    retval.tree  = NULL;
++    {
++        // RSP.g:56:7: ( EQUAL | LESS | GREATER | LTE | GTE )
++        // RSP.g:
++        {
++            root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++            set31=(pANTLR3_COMMON_TOKEN)LT(1);
++            if ( LA(1) == EQUAL || ((LA(1) >= LESS) && (LA(1) <= GTE)) )
++            {
++                CONSUME();
++                ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set31)));
++                PERRORRECOVERY=ANTLR3_FALSE;
++            }
++            else 
++            {
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++                EXCEPTION->expectingSet = &FOLLOW_set_in_intop0;
++                RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_intop0);    goto ruleintopEx;
++            }
++
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruleintopEx; /* Prevent compiler warnings */
++    ruleintopEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end intop */
++
++/** 
++ * $ANTLR start datecrit
++ * RSP.g:63:1: datecrit : FIELD dateop datespec -> ^( dateop FIELD datespec ) ;
++ */
++static RSPParser_datecrit_return
++datecrit(pRSPParser ctx)
++{   
++    RSPParser_datecrit_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    FIELD32;
++    RSPParser_dateop_return dateop33;
++    #undef	RETURN_TYPE_dateop33
++    #define	RETURN_TYPE_dateop33 RSPParser_dateop_return
++
++    RSPParser_datespec_return datespec34;
++    #undef	RETURN_TYPE_datespec34
++    #define	RETURN_TYPE_datespec34 RSPParser_datespec_return
++
++    pANTLR3_BASE_TREE FIELD32_tree;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_FIELD;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_datespec;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_dateop;
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    FIELD32       = NULL;
++    dateop33.tree = NULL;
++
++    datespec34.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    FIELD32_tree   = NULL;
++
++    stream_FIELD   = NULL;
++    #define CREATE_stream_FIELD  if (stream_FIELD == NULL) {stream_FIELD = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token FIELD"); } 
++    stream_datespec   = NULL;
++    #define CREATE_stream_datespec  if (stream_datespec == NULL) {stream_datespec = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule datespec"); }
++    stream_dateop   = NULL;
++    #define CREATE_stream_dateop  if (stream_dateop == NULL) {stream_dateop = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule dateop"); }
++
++    retval.tree  = NULL;
++    {
++        // RSP.g:63:9: ( FIELD dateop datespec -> ^( dateop FIELD datespec ) )
++        // RSP.g:63:11: FIELD dateop datespec
++        {
++            FIELD32 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_datecrit292); 
++            if  (HASEXCEPTION())
++            {
++                goto ruledatecritEx;
++            }
++             
++            CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD32, NULL);
++
++            FOLLOWPUSH(FOLLOW_dateop_in_datecrit294);
++            dateop33=dateop(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto ruledatecritEx;
++            }
++
++            CREATE_stream_dateop; stream_dateop->add(stream_dateop, dateop33.tree, NULL);
++            FOLLOWPUSH(FOLLOW_datespec_in_datecrit296);
++            datespec34=datespec(ctx);
++
++            FOLLOWPOP();
++            if  (HASEXCEPTION())
++            {
++                goto ruledatecritEx;
++            }
++
++            CREATE_stream_datespec; stream_datespec->add(stream_datespec, datespec34.tree, NULL);
++
++             
++            /* AST REWRITE
++             * elements          : FIELD, datespec, dateop
++             * token labels      : 
++             * rule labels       : retval
++             * token list labels : 
++             * rule list labels  : 
++             */
++            {
++            	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++            	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++            	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++            	retval.tree    = root_0;
++            	// 63:34: -> ^( dateop FIELD datespec )
++            	{
++            	    // RSP.g:63:37: ^( dateop FIELD datespec )
++            	    {
++            	        pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++            	        root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_dateop == NULL ? NULL : stream_dateop->nextNode(stream_dateop), root_1));
++
++            	        ADAPTOR->addChild(ADAPTOR, root_1, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
++            	        ADAPTOR->addChild(ADAPTOR, root_1, stream_datespec == NULL ? NULL : stream_datespec->nextTree(stream_datespec));
++
++            	        ADAPTOR->addChild(ADAPTOR, root_0, root_1);
++            	    }
++
++            	}
++
++            	retval.tree = root_0; // set result root
++            	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++            }
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledatecritEx; /* Prevent compiler warnings */
++    ruledatecritEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++        if (stream_FIELD != NULL) stream_FIELD->free(stream_FIELD);
++        if (stream_datespec != NULL) stream_datespec->free(stream_datespec);
++        if (stream_dateop != NULL) stream_dateop->free(stream_dateop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end datecrit */
++
++/** 
++ * $ANTLR start dateop
++ * RSP.g:66:1: dateop : ( BEFORE | AFTER );
++ */
++static RSPParser_dateop_return
++dateop(pRSPParser ctx)
++{   
++    RSPParser_dateop_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    set35;
++
++    pANTLR3_BASE_TREE set35_tree;
++
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    set35       = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    set35_tree   = NULL;
++
++
++    retval.tree  = NULL;
++    {
++        // RSP.g:66:8: ( BEFORE | AFTER )
++        // RSP.g:
++        {
++            root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++            set35=(pANTLR3_COMMON_TOKEN)LT(1);
++            if ( ((LA(1) >= BEFORE) && (LA(1) <= AFTER)) )
++            {
++                CONSUME();
++                ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set35)));
++                PERRORRECOVERY=ANTLR3_FALSE;
++            }
++            else 
++            {
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++                EXCEPTION->expectingSet = &FOLLOW_set_in_dateop0;
++                RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_dateop0);    goto ruledateopEx;
++            }
++
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledateopEx; /* Prevent compiler warnings */
++    ruledateopEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end dateop */
++
++/** 
++ * $ANTLR start datespec
++ * RSP.g:70:1: datespec : ( dateref | INT dateintval dateop dateref -> ^( dateop dateref INT dateintval ) );
++ */
++static RSPParser_datespec_return
++datespec(pRSPParser ctx)
++{   
++    RSPParser_datespec_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    INT37;
++    RSPParser_dateref_return dateref36;
++    #undef	RETURN_TYPE_dateref36
++    #define	RETURN_TYPE_dateref36 RSPParser_dateref_return
++
++    RSPParser_dateintval_return dateintval38;
++    #undef	RETURN_TYPE_dateintval38
++    #define	RETURN_TYPE_dateintval38 RSPParser_dateintval_return
++
++    RSPParser_dateop_return dateop39;
++    #undef	RETURN_TYPE_dateop39
++    #define	RETURN_TYPE_dateop39 RSPParser_dateop_return
++
++    RSPParser_dateref_return dateref40;
++    #undef	RETURN_TYPE_dateref40
++    #define	RETURN_TYPE_dateref40 RSPParser_dateref_return
++
++    pANTLR3_BASE_TREE INT37_tree;
++    pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_INT;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_dateintval;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_dateref;
++    pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_dateop;
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    INT37       = NULL;
++    dateref36.tree = NULL;
++
++    dateintval38.tree = NULL;
++
++    dateop39.tree = NULL;
++
++    dateref40.tree = NULL;
++
++    retval.start = LT(1); retval.stop = retval.start;
++
++    INT37_tree   = NULL;
++
++    stream_INT   = NULL;
++    #define CREATE_stream_INT  if (stream_INT == NULL) {stream_INT = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token INT"); } 
++    stream_dateintval   = NULL;
++    #define CREATE_stream_dateintval  if (stream_dateintval == NULL) {stream_dateintval = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule dateintval"); }
++    stream_dateref   = NULL;
++    #define CREATE_stream_dateref  if (stream_dateref == NULL) {stream_dateref = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule dateref"); }
++    stream_dateop   = NULL;
++    #define CREATE_stream_dateop  if (stream_dateop == NULL) {stream_dateop = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule dateop"); }
++
++    retval.tree  = NULL;
++    {
++        {
++            //  RSP.g:70:9: ( dateref | INT dateintval dateop dateref -> ^( dateop dateref INT dateintval ) )
++            
++            ANTLR3_UINT32 alt7;
++
++            alt7=2;
++
++            switch ( LA(1) ) 
++            {
++            case DATE:
++            case TODAY:
++            	{
++            		alt7=1;
++            	}
++                break;
++            case INT:
++            	{
++            		alt7=2;
++            	}
++                break;
++
++            default:
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
++                EXCEPTION->message      = (void *)"";
++                EXCEPTION->decisionNum  = 7;
++                EXCEPTION->state        = 0;
++
++
++                goto ruledatespecEx;
++            }
++
++            switch (alt7) 
++            {
++        	case 1:
++        	    // RSP.g:70:11: dateref
++        	    {
++        	        root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++        	        FOLLOWPUSH(FOLLOW_dateref_in_datespec331);
++        	        dateref36=dateref(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++        	        ADAPTOR->addChild(ADAPTOR, root_0, dateref36.tree);
++
++        	    }
++        	    break;
++        	case 2:
++        	    // RSP.g:71:4: INT dateintval dateop dateref
++        	    {
++        	        INT37 = (pANTLR3_COMMON_TOKEN) MATCHT(INT, &FOLLOW_INT_in_datespec336); 
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++        	         
++        	        CREATE_stream_INT; stream_INT->add(stream_INT, INT37, NULL);
++
++        	        FOLLOWPUSH(FOLLOW_dateintval_in_datespec338);
++        	        dateintval38=dateintval(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++        	        CREATE_stream_dateintval; stream_dateintval->add(stream_dateintval, dateintval38.tree, NULL);
++        	        FOLLOWPUSH(FOLLOW_dateop_in_datespec340);
++        	        dateop39=dateop(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++        	        CREATE_stream_dateop; stream_dateop->add(stream_dateop, dateop39.tree, NULL);
++        	        FOLLOWPUSH(FOLLOW_dateref_in_datespec342);
++        	        dateref40=dateref(ctx);
++
++        	        FOLLOWPOP();
++        	        if  (HASEXCEPTION())
++        	        {
++        	            goto ruledatespecEx;
++        	        }
++
++        	        CREATE_stream_dateref; stream_dateref->add(stream_dateref, dateref40.tree, NULL);
++
++        	         
++        	        /* AST REWRITE
++        	         * elements          : dateintval, INT, dateref, dateop
++        	         * token labels      : 
++        	         * rule labels       : retval
++        	         * token list labels : 
++        	         * rule list labels  : 
++        	         */
++        	        {
++        	        	pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
++
++        	        	stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR,  RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
++
++        	        	root_0			    = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	retval.tree    = root_0;
++        	        	// 71:34: -> ^( dateop dateref INT dateintval )
++        	        	{
++        	        	    // RSP.g:71:37: ^( dateop dateref INT dateintval )
++        	        	    {
++        	        	        pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++        	        	        root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_dateop == NULL ? NULL : stream_dateop->nextNode(stream_dateop), root_1));
++
++        	        	        ADAPTOR->addChild(ADAPTOR, root_1, stream_dateref == NULL ? NULL : stream_dateref->nextTree(stream_dateref));
++        	        	        ADAPTOR->addChild(ADAPTOR, root_1, stream_INT == NULL ? NULL : stream_INT->nextNode(stream_INT));
++        	        	        ADAPTOR->addChild(ADAPTOR, root_1, stream_dateintval == NULL ? NULL : stream_dateintval->nextTree(stream_dateintval));
++
++        	        	        ADAPTOR->addChild(ADAPTOR, root_0, root_1);
++        	        	    }
++
++        	        	}
++
++        	        	retval.tree = root_0; // set result root
++        	        	if (stream_retval != NULL) stream_retval->free(stream_retval);
++
++
++        	        }
++        	    }
++        	    break;
++
++            }
++        }
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledatespecEx; /* Prevent compiler warnings */
++    ruledatespecEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++        if (stream_INT != NULL) stream_INT->free(stream_INT);
++        if (stream_dateintval != NULL) stream_dateintval->free(stream_dateintval);
++        if (stream_dateref != NULL) stream_dateref->free(stream_dateref);
++        if (stream_dateop != NULL) stream_dateop->free(stream_dateop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end datespec */
++
++/** 
++ * $ANTLR start dateref
++ * RSP.g:74:1: dateref : ( DATE | TODAY );
++ */
++static RSPParser_dateref_return
++dateref(pRSPParser ctx)
++{   
++    RSPParser_dateref_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    set41;
++
++    pANTLR3_BASE_TREE set41_tree;
++
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    set41       = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    set41_tree   = NULL;
++
++
++    retval.tree  = NULL;
++    {
++        // RSP.g:74:9: ( DATE | TODAY )
++        // RSP.g:
++        {
++            root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++            set41=(pANTLR3_COMMON_TOKEN)LT(1);
++            if ( ((LA(1) >= DATE) && (LA(1) <= TODAY)) )
++            {
++                CONSUME();
++                ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set41)));
++                PERRORRECOVERY=ANTLR3_FALSE;
++            }
++            else 
++            {
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++                EXCEPTION->expectingSet = &FOLLOW_set_in_dateref0;
++                RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_dateref0);    goto ruledaterefEx;
++            }
++
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledaterefEx; /* Prevent compiler warnings */
++    ruledaterefEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end dateref */
++
++/** 
++ * $ANTLR start dateintval
++ * RSP.g:78:1: dateintval : ( DAY | WEEK | MONTH | YEAR );
++ */
++static RSPParser_dateintval_return
++dateintval(pRSPParser ctx)
++{   
++    RSPParser_dateintval_return retval;
++
++    pANTLR3_BASE_TREE root_0;
++
++    pANTLR3_COMMON_TOKEN    set42;
++
++    pANTLR3_BASE_TREE set42_tree;
++
++    /* Initialize rule variables
++     */
++
++
++    root_0 = NULL;
++
++    set42       = NULL;
++    retval.start = LT(1); retval.stop = retval.start;
++
++    set42_tree   = NULL;
++
++
++    retval.tree  = NULL;
++    {
++        // RSP.g:79:2: ( DAY | WEEK | MONTH | YEAR )
++        // RSP.g:
++        {
++            root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
++
++            set42=(pANTLR3_COMMON_TOKEN)LT(1);
++            if ( ((LA(1) >= DAY) && (LA(1) <= YEAR)) )
++            {
++                CONSUME();
++                ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set42)));
++                PERRORRECOVERY=ANTLR3_FALSE;
++            }
++            else 
++            {
++                CONSTRUCTEX();
++                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
++                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
++                EXCEPTION->expectingSet = &FOLLOW_set_in_dateintval0;
++                RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_dateintval0);    goto ruledateintvalEx;
++            }
++
++
++        }
++
++    }
++    
++
++    // This is where rules clean up and exit
++    //
++    goto ruledateintvalEx; /* Prevent compiler warnings */
++    ruledateintvalEx: ;
++    retval.stop = LT(-1);
++
++    	retval.stop = LT(-1);
++    	retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
++    	ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
++
++            if (HASEXCEPTION())
++            {
++                PREPORTERROR();
++                PRECOVER();
++                retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
++            }
++
++
++    return retval;
++}
++/* $ANTLR end dateintval */
++/* End of parsing rules
++ * ==============================================
++ */
++
++/* ==============================================
++ * Syntactic predicates
++ */
++/* End of syntactic predicates
++ * ==============================================
++ */
++
++ 
++ 
++
++
++
++/* End of code
++ * =============================================================================
++ */
+diff --git a/src/pregen/RSPParser.h b/src/pregen/RSPParser.h
+new file mode 100644
+index 0000000..d0744a2
+--- /dev/null
++++ b/src/pregen/RSPParser.h
+@@ -0,0 +1,365 @@
++/** \file
++ *  This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
++ *
++ *     -  From the grammar source file : RSP.g
++ *     -                            On : 2014-09-30 21:42:40
++ *     -                for the parser : RSPParserParser *
++ * Editing it, at least manually, is not wise. 
++ *
++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
++ *
++ *
++ * The parser RSPParser has the callable functions (rules) shown below,
++ * which will invoke the code for the associated rule in the source grammar
++ * assuming that the input stream is pointing to a token/text stream that could begin
++ * this rule.
++ * 
++ * For instance if you call the first (topmost) rule in a parser grammar, you will
++ * get the results of a full parse, but calling a rule half way through the grammar will
++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
++ * in editors and so on.
++ *
++ * The parser entry points are called indirectly (by function pointer to function) via
++ * a parser context typedef pRSPParser, which is returned from a call to RSPParserNew().
++ *
++ * The methods in pRSPParser are  as follows:
++ *
++ *  - RSPParser_query_return      pRSPParser->query(pRSPParser)
++ *  - RSPParser_expr_return      pRSPParser->expr(pRSPParser)
++ *  - RSPParser_aexpr_return      pRSPParser->aexpr(pRSPParser)
++ *  - RSPParser_crit_return      pRSPParser->crit(pRSPParser)
++ *  - RSPParser_strcrit_return      pRSPParser->strcrit(pRSPParser)
++ *  - RSPParser_strop_return      pRSPParser->strop(pRSPParser)
++ *  - RSPParser_intcrit_return      pRSPParser->intcrit(pRSPParser)
++ *  - RSPParser_intop_return      pRSPParser->intop(pRSPParser)
++ *  - RSPParser_datecrit_return      pRSPParser->datecrit(pRSPParser)
++ *  - RSPParser_dateop_return      pRSPParser->dateop(pRSPParser)
++ *  - RSPParser_datespec_return      pRSPParser->datespec(pRSPParser)
++ *  - RSPParser_dateref_return      pRSPParser->dateref(pRSPParser)
++ *  - RSPParser_dateintval_return      pRSPParser->dateintval(pRSPParser)
++ *
++ * The return type for any particular rule is of course determined by the source
++ * grammar file.
++ */
++// [The "BSD licence"]
++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
++// http://www.temporal-wave.com
++// http://www.linkedin.com/in/jimidle
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions
++// are met:
++// 1. Redistributions of source code must retain the above copyright
++//    notice, this list of conditions and the following disclaimer.
++// 2. Redistributions in binary form must reproduce the above copyright
++//    notice, this list of conditions and the following disclaimer in the
++//    documentation and/or other materials provided with the distribution.
++// 3. The name of the author may not be used to endorse or promote products
++//    derived from this software without specific prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++#ifndef	_RSPParser_H
++#define _RSPParser_H
++/* =============================================================================
++ * Standard antlr3 C runtime definitions
++ */
++#include    <antlr3.h>
++
++/* End of standard antlr 3 runtime definitions
++ * =============================================================================
++ */
++ 
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++// Forward declare the context typedef so that we can use it before it is
++// properly defined. Delegators and delegates (from import statements) are
++// interdependent and their context structures contain pointers to each other
++// C only allows such things to be declared if you pre-declare the typedef.
++//
++typedef struct RSPParser_Ctx_struct RSPParser, * pRSPParser;
++
++
++
++#ifdef	ANTLR3_WINDOWS
++// Disable: Unreferenced parameter,							- Rules with parameters that are not used
++//          constant conditional,							- ANTLR realizes that a prediction is always true (synpred usually)
++//          initialized but unused variable					- tree rewrite variables declared but not needed
++//          Unreferenced local variable						- lexer rule declares but does not always use _type
++//          potentially unitialized variable used			- retval always returned from a rule 
++//			unreferenced local function has been removed	- susually getTokenNames or freeScope, they can go without warnigns
++//
++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
++// this is a matter of orthogonality hence I disable that one.
++//
++#pragma warning( disable : 4100 )
++#pragma warning( disable : 4101 )
++#pragma warning( disable : 4127 )
++#pragma warning( disable : 4189 )
++#pragma warning( disable : 4505 )
++#pragma warning( disable : 4701 )
++#endif
++typedef struct RSPParser_query_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_query_return;
++
++typedef struct RSPParser_expr_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_expr_return;
++
++typedef struct RSPParser_aexpr_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_aexpr_return;
++
++typedef struct RSPParser_crit_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_crit_return;
++
++typedef struct RSPParser_strcrit_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_strcrit_return;
++
++typedef struct RSPParser_strop_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_strop_return;
++
++typedef struct RSPParser_intcrit_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_intcrit_return;
++
++typedef struct RSPParser_intop_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_intop_return;
++
++typedef struct RSPParser_datecrit_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_datecrit_return;
++
++typedef struct RSPParser_dateop_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_dateop_return;
++
++typedef struct RSPParser_datespec_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_datespec_return;
++
++typedef struct RSPParser_dateref_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_dateref_return;
++
++typedef struct RSPParser_dateintval_return_struct
++{
++    /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
++     */
++    pANTLR3_COMMON_TOKEN    start;
++    pANTLR3_COMMON_TOKEN    stop;
++    pANTLR3_BASE_TREE	tree;
++   
++}
++    RSPParser_dateintval_return;
++
++
++
++/** Context tracking structure for RSPParser
++ */
++struct RSPParser_Ctx_struct
++{
++    /** Built in ANTLR3 context tracker contains all the generic elements
++     *  required for context tracking.
++     */
++    pANTLR3_PARSER   pParser;
++
++
++     RSPParser_query_return (*query)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_expr_return (*expr)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_aexpr_return (*aexpr)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_crit_return (*crit)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_strcrit_return (*strcrit)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_strop_return (*strop)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_intcrit_return (*intcrit)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_intop_return (*intop)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_datecrit_return (*datecrit)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_dateop_return (*dateop)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_datespec_return (*datespec)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_dateref_return (*dateref)	(struct RSPParser_Ctx_struct * ctx);
++     RSPParser_dateintval_return (*dateintval)	(struct RSPParser_Ctx_struct * ctx);
++    // Delegated rules
++    const char * (*getGrammarFileName)();
++    void	    (*free)   (struct RSPParser_Ctx_struct * ctx);
++    /* @headerFile.members() */
++    pANTLR3_BASE_TREE_ADAPTOR	adaptor;
++    pANTLR3_VECTOR_FACTORY		vectors;
++    /* End @headerFile.members() */
++};
++
++// Function protoypes for the constructor functions that external translation units
++// such as delegators and delegates may wish to call.
++//
++ANTLR3_API pRSPParser RSPParserNew         (pANTLR3_COMMON_TOKEN_STREAM instream);
++ANTLR3_API pRSPParser RSPParserNewSSD      (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
++
++/** Symbolic definitions of all the tokens that the parser will work with.
++ * \{
++ *
++ * Antlr will define EOF, but we can't use that as it it is too common in
++ * in C header files and that would be confusing. There is no way to filter this out at the moment
++ * so we just undef it here for now. That isn't the value we get back from C recognizers
++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
++ */
++#ifdef	EOF
++#undef	EOF
++#endif
++#ifdef	Tokens
++#undef	Tokens
++#endif 
++#define STARTSW      14
++#define WEEK      26
++#define TODAY      24
++#define YEAR      28
++#define ENDSW      15
++#define GTE      20
++#define BEFORE      21
++#define DAY      25
++#define INT      16
++#define NOT      11
++#define AFTER      22
++#define AND      6
++#define EOF      -1
++#define LTE      19
++#define MONTH      27
++#define DIGIT19      31
++#define INCLUDES      13
++#define STR      10
++#define QUOTE      29
++#define WS      30
++#define GREATER      18
++#define NEWLINE      4
++#define LPAR      7
++#define EQUAL      12
++#define OR      5
++#define LESS      17
++#define RPAR      8
++#define FIELD      9
++#define ESCAPED      33
++#define DATE      23
++#define DIGIT09      32
++#ifdef	EOF
++#undef	EOF
++#define	EOF	ANTLR3_TOKEN_EOF
++#endif
++
++#ifndef TOKENSOURCE
++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
++#endif
++
++/* End of token definitions for RSPParser
++ * =============================================================================
++ */
++/** \} */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
++
++/* END - Note:Keep extra line feed to satisfy UNIX systems */