module Language.Lua.Token where

-- | Lua tokens
data Token
  = TokPlus               -- ^+
  | TokMinus              -- ^\-
  | TokStar               -- ^\*
  | TokSlash              -- ^/
  | TokPercent            -- ^%
  | TokExp                -- ^^
  | TokSh                 -- ^#
  | TokEqual              -- ^==
  | TokNotequal           -- ^~=
  | TokLEq                -- ^<=
  | TokGEq                -- ^\>=
  | TokLT                 -- ^<
  | TokGT                 -- ^\>
  | TokAssign             -- ^=
  | TokLParen             -- ^(
  | TokRParen             -- ^)
  | TokLBrace             -- ^{
  | TokRBrace             -- ^}
  | TokLBracket           -- ^\[
  | TokRBracket           -- ^]
  | TokDColon             -- ^::
  | TokSemic              -- ^;
  | TokColon              -- ^:
  | TokComma              -- ^,
  | TokDot                -- ^.
  | TokDDot               -- ^..
  | TokEllipsis           -- ^...
  | TokDLT                -- ^<<
  | TokDGT                -- ^\>\>
  | TokAmpersand          -- ^&
  | TokPipe               -- ^|
  | TokDSlash             -- ^//
  | TokTilde              -- ^~

  | TokAnd                -- ^and
  | TokBreak              -- ^break
  | TokDo                 -- ^do
  | TokElse               -- ^else
  | TokElseIf             -- ^elseif
  | TokEnd                -- ^end
  | TokFalse              -- ^false
  | TokFor                -- ^for
  | TokFunction           -- ^function
  | TokGoto               -- ^goto
  | TokIf                 -- ^if
  | TokIn                 -- ^in
  | TokLocal              -- ^local
  | TokNil                -- ^nil
  | TokNot                -- ^not
  | TokOr                 -- ^or
  | TokRepeat             -- ^repeat
  | TokReturn             -- ^return
  | TokThen               -- ^then
  | TokTrue               -- ^true
  | TokUntil              -- ^until
  | TokWhile              -- ^while

  | TokNum                -- ^number constant
  | TokSLit               -- ^string constant
  | TokIdent              -- ^identifier

  | TokWhiteSpace         -- ^white space
  | TokComment            -- ^comment

  | TokUntermString       -- ^ unterminated string
  | TokUntermComment      -- ^ unterminated comment
  | TokUnexpected         -- ^ unexpected character
    deriving Eq

instance Show Token where
    show TokPlus          = "`+`"
    show TokMinus         = "`-`"
    show TokStar          = "`*`"
    show TokSlash         = "`/`"
    show TokPercent       = "`%`"
    show TokExp           = "`^`"
    show TokSh            = "`#`"
    show TokEqual         = "`==`"
    show TokNotequal      = "`~=`"
    show TokLEq           = "`<=`"
    show TokGEq           = "`>=`"
    show TokLT            = "`<`"
    show TokGT            = "`>`"
    show TokAssign        = "`=`"
    show TokLParen        = "`(`"
    show TokRParen        = "`)`"
    show TokLBrace        = "`{`"
    show TokRBrace        = "`}`"
    show TokLBracket      = "`[`"
    show TokRBracket      = "`]`"
    show TokDColon        = "`::`"
    show TokSemic         = "`;`"
    show TokColon         = "`:`"
    show TokComma         = "`,`"
    show TokDot           = "`.`"
    show TokDDot          = "`..`"
    show TokEllipsis      = "`...`"
    show TokDLT           = "`<<`"
    show TokDGT           = "`>>`"
    show TokAmpersand     = "`&`"
    show TokPipe          = "`|`"
    show TokDSlash        = "`//`"
    show TokTilde         = "`~`"

    show TokAnd           = "`and`"
    show TokBreak         = "`break`"
    show TokDo            = "`do`"
    show TokElse          = "`else`"
    show TokElseIf        = "`elseif`"
    show TokEnd           = "`end`"
    show TokFalse         = "`false`"
    show TokFor           = "`for`"
    show TokFunction      = "`function`"
    show TokGoto          = "`goto`"
    show TokIf            = "`if`"
    show TokIn            = "`in`"
    show TokLocal         = "`local`"
    show TokNil           = "`nil`"
    show TokNot           = "`not`"
    show TokOr            = "`or`"
    show TokRepeat        = "`repeat`"
    show TokReturn        = "`return`"
    show TokThen          = "`then`"
    show TokTrue          = "`true`"
    show TokUntil         = "`until`"
    show TokWhile         = "`while`"

    show TokWhiteSpace    = "white_space"
    show TokComment       = "comment"

    show TokNum           = "number"
    show TokSLit          = "string"
    show TokIdent         = "identifier"

    show TokUntermString  = "unterminated_string"
    show TokUntermComment = "unterminated_comment"
    show TokUnexpected    = "unexpected_character"