/*
 * $Header$
 * $Revision: 1334 $
 * $Date: 2008-11-29 09:58:48 -0800 (Sat, 29 Nov 2008) $
 *
 * ====================================================================
 *
 * Copyright 2000-2004 bob mcwhirter & James Strachan.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 * 
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 
 *   * 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.
 * 
 *   * Neither the name of the Jaxen Project nor the names of its
 *     contributors may be used to endorse or promote products derived 
 *     from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER
 * OR CONTRIBUTORS 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 software consists of voluntary contributions made by many
 * individuals on behalf of the Jaxen Project and was originally
 * created by bob mcwhirter <bob@werken.com> and
 * James Strachan <jstrachan@apache.org>.  For more information on the
 * Jaxen Project, please see <http://www.jaxen.org/>.
 *
 * $Id: TokenTypes.java 1334 2008-11-29 17:58:48Z elharo $
 */

package org.jaxen.saxpath.base;


class TokenTypes
{
    static final int EOF   = -1;
    static final int SKIP  = -2;
    static final int ERROR = -3;

    static final int EQUALS = 1;
    static final int NOT_EQUALS = 2;
    
    static final int LESS_THAN_SIGN = 3;
    static final int LESS_THAN_OR_EQUALS_SIGN = 4;
    static final int GREATER_THAN_SIGN = 5;
    static final int GREATER_THAN_OR_EQUALS_SIGN = 6;  
    
    static final int PLUS  = 7;
    static final int MINUS = 8;
    static final int STAR  = 9;
    static final int MOD   = 10;
    static final int DIV   = 11;
    
    static final int SLASH = 12;
    static final int DOUBLE_SLASH = 13;
    static final int DOT = 14;
    static final int DOT_DOT = 15;

    static final int IDENTIFIER = 16;

    static final int AT = 17;
    static final int PIPE = 18;
    static final int COLON = 19;
    static final int DOUBLE_COLON = 20;
    
    static final int LEFT_BRACKET = 21;
    static final int RIGHT_BRACKET = 22;    
    static final int LEFT_PAREN = 23;
    static final int RIGHT_PAREN = 24;

    // 25 was NOT but there is no such token in XPath
    static final int DOLLAR = 25;
    static final int LITERAL = 26;
    static final int AND = 27;
    static final int OR = 28;

    // No need for an integer token type. All numbers
    // in XPath are doubles.
    static final int DOUBLE = 29;
    static final int COMMA = 30;
    // split star into two token types
    static final int STAR_OPERATOR = 31;

    static String getTokenText( int tokenType )
    {
        switch( tokenType )
        {
            case ERROR:
                return "(error)";
            case SKIP:
                return "(skip)";
            case EOF:
                return "(eof)";
            case 0:
                return "Unrecognized token type: 0";
            case EQUALS:
                return "=";
            case NOT_EQUALS:
                return "!=";
            case LESS_THAN_SIGN:
                return "<";
            case LESS_THAN_OR_EQUALS_SIGN:
                return "<=";
            case GREATER_THAN_SIGN:
                return ">";
            case GREATER_THAN_OR_EQUALS_SIGN:
                return ">=";
            case PLUS:
                return "+";
            case MINUS:
                return "-";
            case STAR:
                return "*";
            case STAR_OPERATOR:
                    return "*";
            case DIV:
                return "div";
            case MOD:
                return "mod";
            case SLASH:
                return "/";
            case DOUBLE_SLASH:
                return "//";
            case DOT:
                return ".";
            case DOT_DOT:
                return "..";
            case IDENTIFIER:
                return "(identifier)";
            case AT:
                return "@";
            case PIPE:
                return "|";
            case COLON:
                return ":";
            case DOUBLE_COLON:
                return "::";
            case LEFT_BRACKET:
                return "[";
            case RIGHT_BRACKET:
                return "]";
            case LEFT_PAREN:
                return "(";
            case RIGHT_PAREN:
                return ")";
            case DOLLAR:
                return "$";
            case LITERAL:
                return "(literal)";
            case AND:
                return "and";
            case OR:
                return "or";
            case DOUBLE:
                return "(double)";
            case COMMA:
                return ",";
            default:
                // This method is only called from an error handler, and only
                // to provide an exception message. In other words, the string
                // returned by this method is only used in an exception message.
                // Something has already gone wrong, and is being reported.
                // Thus there's no real reason to throw another exception here.
                // Just return a string and this message will be reported in an
                // exception anyway.
                return("Unrecognized token type: " + tokenType);
        }
    }
}
