module Language.Lua.Token where

import Data.Data
import GHC.Generics (Generic)

data Token
    = TkAnd         -- ^ @and@
    | TkBreak       -- ^ @break@
    | TkDo          -- ^ @do@
    | TkElse        -- ^ @else@
    | TkElseif      -- ^ @elseif@
    | TkEnd         -- ^ @end@
    | TkFalse       -- ^ @false@
    | TkFor         -- ^ @for@
    | TkFunction    -- ^ @function@
    | TkGoto        -- ^ @goto@
    | TkIf          -- ^ @if@
    | TkIn          -- ^ @in@
    | TkLocal       -- ^ @local@
    | TkNil         -- ^ @nil@
    | TkNot         -- ^ @not@
    | TkOr          -- ^ @or@
    | TkRepeat      -- ^ @repeat@
    | TkReturn      -- ^ @return@
    | TkThen        -- ^ @then@
    | TkTrue        -- ^ @true@
    | TkUntil       -- ^ @until@
    | TkWhile       -- ^ @while@
    | TkPlus        -- ^ @+@
    | TkDash        -- ^ @\-@
    | TkMult        -- ^ @\*@
    | TkFloatDiv    -- ^ @/@
    | TkModulo      -- ^ @%@
    | TkExponent    -- ^ @^@
    | TkLength      -- ^ @#@
    | TkBitwiseAnd  -- ^ @&@
    | TkTilde       -- ^ @~@
    | TkBitwiseOr   -- ^ @|@
    | TkLShift      -- ^ @<<@
    | TkRShift      -- ^ @\>\>@
    | TkFloorDiv    -- ^ @//@
    | TkEq          -- ^ @==@
    | TkNeq         -- ^ @~=@
    | TkLeq         -- ^ @<=@
    | TkGeq         -- ^ @\>=@
    | TkLt          -- ^ @<@
    | TkGt          -- ^ @\>@
    | TkAssign      -- ^ @=@
    | TkLParen      -- ^ @(@
    | TkRParen      -- ^ @)@
    | TkLBrace      -- ^ @{@
    | TkRBrace      -- ^ @}@
    | TkLBracket    -- ^ @[@
    | TkRBracket    -- ^ @]@
    | TkLabel       -- ^ @::@
    | TkSemi        -- ^ @;@
    | TkColon       -- ^ @:@
    | TkComma       -- ^ @,@
    | TkDot         -- ^ @.@
    | TkConcat      -- ^ @..@
    | TkVararg      -- ^ @...@
    | TkQuote       -- ^ @'@
    | TkDoubleQuote -- ^ @"@
    | TkIdent String
    | TkStringLit String
    | TkIntLit String
    | TkFloatLit String
    deriving (Data, Eq, Generic, Show, Typeable)

showToken :: Token -> String
showToken TkAnd           = "and"
showToken TkBreak         = "break"
showToken TkDo            = "do"
showToken TkElse          = "else"
showToken TkElseif        = "elseif"
showToken TkEnd           = "end"
showToken TkFalse         = "false"
showToken TkFor           = "for"
showToken TkFunction      = "function"
showToken TkGoto          = "goto"
showToken TkIf            = "if"
showToken TkIn            = "in"
showToken TkLocal         = "local"
showToken TkNil           = "nil"
showToken TkNot           = "not"
showToken TkOr            = "or"
showToken TkRepeat        = "repeat"
showToken TkReturn        = "return"
showToken TkThen          = "then"
showToken TkTrue          = "true"
showToken TkUntil         = "until"
showToken TkWhile         = "while"
showToken TkPlus          = "+"
showToken TkDash          = "-"
showToken TkMult          = "*"
showToken TkFloatDiv      = "/"
showToken TkModulo        = "%"
showToken TkExponent      = "^"
showToken TkLength        = "#"
showToken TkBitwiseAnd    = "&"
showToken TkTilde         = "~"
showToken TkBitwiseOr     = "|"
showToken TkLShift        = "<<"
showToken TkRShift        = ">>"
showToken TkFloorDiv      = "//"
showToken TkEq            = "=="
showToken TkNeq           = "~="
showToken TkLeq           = "<="
showToken TkGeq           = ">="
showToken TkLt            = "<"
showToken TkGt            = ">"
showToken TkAssign        = "="
showToken TkLParen        = "("
showToken TkRParen        = ")"
showToken TkLBrace        = "{"
showToken TkRBrace        = "}"
showToken TkLBracket      = "["
showToken TkRBracket      = "]"
showToken TkLabel         = "::"
showToken TkSemi          = ";"
showToken TkColon         = ":"
showToken TkComma         = ","
showToken TkDot           = "."
showToken TkConcat        = ".."
showToken TkVararg        = "..."
showToken TkQuote         = "'"
showToken TkDoubleQuote   = "\""
showToken (TkIdent s)     = s
showToken (TkStringLit s) = s
showToken (TkIntLit s)    = s
showToken (TkFloatLit s)  = s