/*
 * Copyright (C) 2012 David Anderson
 *
 * This file is part of JITCraft.
 *
 * JITCraft is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free
 * Software Foundation, either version 3 of the License, or (at your option)
 * any later version.
 * 
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * JITCraft. If not, see http://www.gnu.org/licenses/.
 */
#ifndef _include_jitcraft_token_h_
#define _include_jitcraft_token_h_

namespace ke {

struct SourcePosition
{
    int line;
    int col;

    SourcePosition()
      : line(-1),
        col(-1)
    {
    }
};

// List of tokens the scanner can recognize.
//
// Some restrictions:
//   * (ASSIGN_ADD - TOK_PLUS) must be the delta between an operator and its
//     op-and-assign equivalent.
#define TOKENMAP(_)                                     \
    _(ERROR,              "<error>")                    \
    _(NEW,                "'new'")                      \
    _(FOR,                "'for'")                      \
    _(RETURN,             "'return'")                   \
    _(NAME,               "<name>")                     \
    _(INTEGER_LITERAL,    "<integer>")                  \
    _(FLOAT_LITERAL,      "<float>")                    \
    _(STRING_LITERAL,     "<string>")                   \
    _(IF,                 "<if>")                       \
    _(ELSE,               "<else>")                     \
    _(ENUM,               "<enum>")                     \
    _(LABEL,              "<label>")                    \
    _(WHILE,              "<while>")                    \
    _(DO,                 "<do>")                       \
    _(BREAK,              "<break>")                    \
    _(CONTINUE,           "<continue>")                 \
    _(FORWARD,            "<forward>")                  \
    _(PUBLIC,             "<public>")                   \
    _(CONST,              "<const>")                    \
    _(NATIVE,             "<native>")                   \
    _(ELLIPSES,           "...")                        \
    _(PLUS,               "+")                          \
    _(MINUS,              "-")                          \
    _(STAR,               "*")                          \
    _(SLASH,              "/")                          \
    _(AMPERSAND,          "&")                          \
    _(BITOR,              "|")                          \
    _(BITXOR,             "^")                          \
    _(SHR,                ">>")                         \
    _(USHR,               ">>>")                        \
    _(SHL,                "<<")                         \
    _(ASSIGN,             "=")                          \
    _(SEMICOLON,          ";")                          \
    _(LBRACE,             "{")                          \
    _(RBRACE,             "}")                          \
    _(LPAREN,             "(")                          \
    _(RPAREN,             ")")                          \
    _(LBRACKET,           "[")                          \
    _(RBRACKET,           "]")                          \
    _(ASSIGN_ADD,         "+=")                         \
    _(ASSIGN_SUB,         "-=")                         \
    _(ASSIGN_MUL,         "*=")                         \
    _(ASSIGN_DIV,         "/=")                         \
    _(ASSIGN_BITAND,      "&=")                         \
    _(ASSIGN_BITOR,       "|=")                         \
    _(ASSIGN_BITXOR,      "^=")                         \
    _(ASSIGN_SHR,         ">>=")                        \
    _(ASSIGN_USHR,        ">>>=")                       \
    _(ASSIGN_SHL,         "<<=")                        \
    _(INCREMENT,          "++")                         \
    _(DECREMENT,          "--")                         \
    _(EQUALS,             "==")                         \
    _(NOTEQUALS,          "!=")                         \
    _(LT,                 "<")                          \
    _(LE,                 "<=")                         \
    _(GT,                 ">")                          \
    _(GE,                 ">=")                         \
    _(COMMA,              ",")                          \
    _(EOF,                "<end-of-file>")

enum TokenKind
{
#   define _(name, str) TOK_##name,
    TOKENMAP(_)
#   undef _
    TOK_BITAND = TOK_AMPERSAND,
    TOKENS_TOTAL
};

extern const char *TokenNames[];

} // namespace ke

#endif //_include_jitcraft_token_h_
