--  C -> Haskell Compiler: Lexer for C Header Files
--
--  Author : Manuel M T Chakravarty, Duncan Coutts
--  Created: 24 May 2005
--
--  Version $Revision: 1.1.2.1 $ from $Date: 2005/06/14 00:16:14 $
--
--  Copyright (c) [1999..2004] Manuel M T Chakravarty
--  Copyright (c) 2005 Duncan Coutts
--
--  This file 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 2 of the License, or
--  (at your option) any later version.
--
--  This file 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.
--
--- DESCRIPTION ---------------------------------------------------------------
--
--  C Tokens for the C lexer.
--

module CTokens (CToken(..), GnuCTok(..)) where 

import Position  (Position(..), Pos(posOf))
import Idents    (Ident, identToLexeme)


-- token definition
-- ----------------

-- possible tokens (EXPORTED)
--
data CToken = CTokLParen   !Position            -- `('
            | CTokRParen   !Position            -- `)'
            | CTokLBracket !Position            -- `['
            | CTokRBracket !Position            -- `]'
            | CTokArrow    !Position            -- `->'
            | CTokDot      !Position            -- `.'
            | CTokExclam   !Position            -- `!'
            | CTokTilde    !Position            -- `~'
            | CTokInc      !Position            -- `++'
            | CTokDec      !Position            -- `--'
            | CTokPlus     !Position            -- `+'
            | CTokMinus    !Position            -- `-'
            | CTokStar     !Position            -- `*'
            | CTokSlash    !Position            -- `/'
            | CTokPercent  !Position            -- `%'
            | CTokAmper    !Position            -- `&'
            | CTokShiftL   !Position            -- `<<'
            | CTokShiftR   !Position            -- `>>'
            | CTokLess     !Position            -- `<'
            | CTokLessEq   !Position            -- `<='
            | CTokHigh     !Position            -- `>'
            | CTokHighEq   !Position            -- `>='
            | CTokEqual    !Position            -- `=='
            | CTokUnequal  !Position            -- `!='
            | CTokHat      !Position            -- `^'
            | CTokBar      !Position            -- `|'
            | CTokAnd      !Position            -- `&&'
            | CTokOr       !Position            -- `||'
            | CTokQuest    !Position            -- `?'
            | CTokColon    !Position            -- `:'
            | CTokAssign   !Position            -- `='
            | CTokPlusAss  !Position            -- `+='
            | CTokMinusAss !Position            -- `-='
            | CTokStarAss  !Position            -- `*='
            | CTokSlashAss !Position            -- `/='
            | CTokPercAss  !Position            -- `%='
            | CTokAmpAss   !Position            -- `&='
            | CTokHatAss   !Position            -- `^='
            | CTokBarAss   !Position            -- `|='
            | CTokSLAss    !Position            -- `<<='
            | CTokSRAss    !Position            -- `>>='
            | CTokComma    !Position            -- `,'
            | CTokSemic    !Position            -- `;'
            | CTokLBrace   !Position            -- `{'
            | CTokRBrace   !Position            --
            | CTokEllipsis !Position            -- `...'
            | CTokAlignof  !Position            -- `alignof' 
                                                -- (or `__alignof', 
                                                -- `__alignof__')
            | CTokAsm      !Position            -- `asm'
                                                -- (or `__asm',
                                                -- `__asm__')
            | CTokAuto     !Position            -- `auto'
            | CTokBreak    !Position            -- `break'
            | CTokBool     !Position            -- `_Bool'
            | CTokCase     !Position            -- `case'
            | CTokChar     !Position            -- `char'
            | CTokConst    !Position            -- `const' 
                                                -- (or `__const', `__const__')
            | CTokContinue !Position            -- `continue' 
            | CTokComplex  !Position            -- `_Complex' 
            | CTokDefault  !Position            -- `default'
            | CTokDo       !Position            -- `do'
            | CTokDouble   !Position            -- `double'
            | CTokElse     !Position            -- `else'
            | CTokEnum     !Position            -- `enum'
            | CTokExtern   !Position            -- `extern'
            | CTokFloat    !Position            -- `float'
            | CTokFloat128 !Position            -- `__float128'
            | CTokFor      !Position            -- `for'
            | CTokGoto     !Position            -- `goto'
            | CTokIf       !Position            -- `if'
            | CTokInline   !Position            -- `inline'
                                                -- (or `__inline', 
                                                -- `__inline__')
            | CTokInt      !Position            -- `int'
            | CTokLong     !Position            -- `long'
            | CTokLabel    !Position            -- `__label__'
            | CTokRegister !Position            -- `register'
            | CTokRestrict !Position            -- `restrict'
                                                -- (or `__restrict', 
                                                -- `__restrict__')
            | CTokReturn   !Position            -- `return'
            | CTokShort    !Position            -- `short'
            | CTokSigned   !Position            -- `signed'
                                                -- (or `__signed', 
                                                -- `__signed__')
            | CTokSizeof   !Position            -- `sizeof'
            | CTokStatic   !Position            -- `static'
            | CTokStruct   !Position            -- `struct'
            | CTokSwitch   !Position            -- `switch'
            | CTokTypedef  !Position            -- `typedef'
            | CTokTypeof   !Position            -- `typeof'
            | CTokThread   !Position            -- `__thread'
            | CTokUnion    !Position            -- `union'
            | CTokUnsigned !Position            -- `unsigned'
            | CTokVoid     !Position            -- `void'
            | CTokVolatile !Position            -- `volatile'
                                                -- (or `__volatile', 
                                                -- `__volatile__')
            | CTokWhile    !Position            -- `while'
            | CTokCLit     !Position !Char      -- character constant
            | CTokILit     !Position !Integer   -- integer constant
            | CTokFLit     !Position String     -- float constant
            | CTokSLit     !Position String     -- string constant (no escapes)
            | CTokIdent    !Position !Ident     -- identifier

              -- not generated here, but in `CParser.parseCHeader'
            | CTokTyIdent  !Position !Ident     -- `typedef-name' identifier
            | CTokGnuC !GnuCTok !Position       -- special GNU C tokens
            | CTokEof                           -- end of file

-- special tokens used in GNU C extensions to ANSI C
--
data GnuCTok = GnuCAttrTok              -- `__attribute__'
             | GnuCExtTok               -- `__extension__'
             | GnuCVaArg                -- `__builtin_va_arg'
             | GnuCOffsetof             -- `__builtin_offsetof'
             | GnuCTyCompat             -- `__builtin_types_compatible_p'

instance Pos CToken where
  posOf :: CToken -> Position
posOf (CTokLParen   Position
pos  ) = Position
pos
  posOf (CTokRParen   Position
pos  ) = Position
pos
  posOf (CTokLBracket Position
pos  ) = Position
pos
  posOf (CTokRBracket Position
pos  ) = Position
pos
  posOf (CTokArrow    Position
pos  ) = Position
pos
  posOf (CTokDot      Position
pos  ) = Position
pos
  posOf (CTokExclam   Position
pos  ) = Position
pos
  posOf (CTokTilde    Position
pos  ) = Position
pos
  posOf (CTokInc      Position
pos  ) = Position
pos
  posOf (CTokDec      Position
pos  ) = Position
pos
  posOf (CTokPlus     Position
pos  ) = Position
pos
  posOf (CTokMinus    Position
pos  ) = Position
pos
  posOf (CTokStar     Position
pos  ) = Position
pos
  posOf (CTokSlash    Position
pos  ) = Position
pos
  posOf (CTokPercent  Position
pos  ) = Position
pos
  posOf (CTokAmper    Position
pos  ) = Position
pos
  posOf (CTokShiftL   Position
pos  ) = Position
pos
  posOf (CTokShiftR   Position
pos  ) = Position
pos
  posOf (CTokLess     Position
pos  ) = Position
pos
  posOf (CTokLessEq   Position
pos  ) = Position
pos
  posOf (CTokHigh     Position
pos  ) = Position
pos
  posOf (CTokHighEq   Position
pos  ) = Position
pos
  posOf (CTokEqual    Position
pos  ) = Position
pos
  posOf (CTokUnequal  Position
pos  ) = Position
pos
  posOf (CTokHat      Position
pos  ) = Position
pos
  posOf (CTokBar      Position
pos  ) = Position
pos
  posOf (CTokAnd      Position
pos  ) = Position
pos
  posOf (CTokOr       Position
pos  ) = Position
pos
  posOf (CTokQuest    Position
pos  ) = Position
pos
  posOf (CTokColon    Position
pos  ) = Position
pos
  posOf (CTokAssign   Position
pos  ) = Position
pos
  posOf (CTokPlusAss  Position
pos  ) = Position
pos
  posOf (CTokMinusAss Position
pos  ) = Position
pos
  posOf (CTokStarAss  Position
pos  ) = Position
pos
  posOf (CTokSlashAss Position
pos  ) = Position
pos
  posOf (CTokPercAss  Position
pos  ) = Position
pos
  posOf (CTokAmpAss   Position
pos  ) = Position
pos
  posOf (CTokHatAss   Position
pos  ) = Position
pos
  posOf (CTokBarAss   Position
pos  ) = Position
pos
  posOf (CTokSLAss    Position
pos  ) = Position
pos
  posOf (CTokSRAss    Position
pos  ) = Position
pos
  posOf (CTokComma    Position
pos  ) = Position
pos
  posOf (CTokSemic    Position
pos  ) = Position
pos
  posOf (CTokLBrace   Position
pos  ) = Position
pos
  posOf (CTokRBrace   Position
pos  ) = Position
pos
  posOf (CTokEllipsis Position
pos  ) = Position
pos
  posOf (CTokAlignof  Position
pos  ) = Position
pos
  posOf (CTokAsm      Position
pos  ) = Position
pos
  posOf (CTokAuto     Position
pos  ) = Position
pos
  posOf (CTokBreak    Position
pos  ) = Position
pos
  posOf (CTokBool     Position
pos  ) = Position
pos
  posOf (CTokCase     Position
pos  ) = Position
pos
  posOf (CTokChar     Position
pos  ) = Position
pos
  posOf (CTokConst    Position
pos  ) = Position
pos
  posOf (CTokContinue Position
pos  ) = Position
pos
  posOf (CTokComplex  Position
pos  ) = Position
pos
  posOf (CTokDefault  Position
pos  ) = Position
pos
  posOf (CTokDo       Position
pos  ) = Position
pos
  posOf (CTokDouble   Position
pos  ) = Position
pos
  posOf (CTokElse     Position
pos  ) = Position
pos
  posOf (CTokEnum     Position
pos  ) = Position
pos
  posOf (CTokExtern   Position
pos  ) = Position
pos
  posOf (CTokFloat    Position
pos  ) = Position
pos
  posOf (CTokFloat128 Position
pos  ) = Position
pos
  posOf (CTokFor      Position
pos  ) = Position
pos
  posOf (CTokGoto     Position
pos  ) = Position
pos
  posOf (CTokInt      Position
pos  ) = Position
pos
  posOf (CTokInline   Position
pos  ) = Position
pos
  posOf (CTokIf       Position
pos  ) = Position
pos
  posOf (CTokLong     Position
pos  ) = Position
pos
  posOf (CTokLabel    Position
pos  ) = Position
pos
  posOf (CTokRegister Position
pos  ) = Position
pos
  posOf (CTokRestrict Position
pos  ) = Position
pos
  posOf (CTokReturn   Position
pos  ) = Position
pos
  posOf (CTokShort    Position
pos  ) = Position
pos
  posOf (CTokSigned   Position
pos  ) = Position
pos
  posOf (CTokSizeof   Position
pos  ) = Position
pos
  posOf (CTokStatic   Position
pos  ) = Position
pos
  posOf (CTokStruct   Position
pos  ) = Position
pos
  posOf (CTokSwitch   Position
pos  ) = Position
pos
  posOf (CTokTypedef  Position
pos  ) = Position
pos
  posOf (CTokTypeof   Position
pos  ) = Position
pos
  posOf (CTokThread   Position
pos  ) = Position
pos
  posOf (CTokUnion    Position
pos  ) = Position
pos
  posOf (CTokUnsigned Position
pos  ) = Position
pos
  posOf (CTokVoid     Position
pos  ) = Position
pos
  posOf (CTokVolatile Position
pos  ) = Position
pos
  posOf (CTokWhile    Position
pos  ) = Position
pos
  posOf (CTokCLit     Position
pos Char
_) = Position
pos
  posOf (CTokILit     Position
pos Integer
_) = Position
pos
  posOf (CTokFLit     Position
pos String
_) = Position
pos
  posOf (CTokSLit     Position
pos String
_) = Position
pos
  posOf (CTokIdent    Position
pos Ident
_) = Position
pos
  posOf (CTokTyIdent  Position
pos Ident
_) = Position
pos
  posOf (CTokGnuC   GnuCTok
_ Position
pos  ) = Position
pos

instance Show CToken where
  showsPrec :: Int -> CToken -> ShowS
showsPrec Int
_ (CTokLParen   Position
_  ) = String -> ShowS
showString String
"("
  showsPrec Int
_ (CTokRParen   Position
_  ) = String -> ShowS
showString String
")"
  showsPrec Int
_ (CTokLBracket Position
_  ) = String -> ShowS
showString String
"["
  showsPrec Int
_ (CTokRBracket Position
_  ) = String -> ShowS
showString String
"]"
  showsPrec Int
_ (CTokArrow    Position
_  ) = String -> ShowS
showString String
"->"
  showsPrec Int
_ (CTokDot      Position
_  ) = String -> ShowS
showString String
"."
  showsPrec Int
_ (CTokExclam   Position
_  ) = String -> ShowS
showString String
"!"
  showsPrec Int
_ (CTokTilde    Position
_  ) = String -> ShowS
showString String
"~"
  showsPrec Int
_ (CTokInc      Position
_  ) = String -> ShowS
showString String
"++"
  showsPrec Int
_ (CTokDec      Position
_  ) = String -> ShowS
showString String
"--"
  showsPrec Int
_ (CTokPlus     Position
_  ) = String -> ShowS
showString String
"+"
  showsPrec Int
_ (CTokMinus    Position
_  ) = String -> ShowS
showString String
"-"
  showsPrec Int
_ (CTokStar     Position
_  ) = String -> ShowS
showString String
"*"
  showsPrec Int
_ (CTokSlash    Position
_  ) = String -> ShowS
showString String
"/"
  showsPrec Int
_ (CTokPercent  Position
_  ) = String -> ShowS
showString String
"%"
  showsPrec Int
_ (CTokAmper    Position
_  ) = String -> ShowS
showString String
"&"
  showsPrec Int
_ (CTokShiftL   Position
_  ) = String -> ShowS
showString String
"<<"
  showsPrec Int
_ (CTokShiftR   Position
_  ) = String -> ShowS
showString String
">>"
  showsPrec Int
_ (CTokLess     Position
_  ) = String -> ShowS
showString String
"<"
  showsPrec Int
_ (CTokLessEq   Position
_  ) = String -> ShowS
showString String
"<="
  showsPrec Int
_ (CTokHigh     Position
_  ) = String -> ShowS
showString String
">"
  showsPrec Int
_ (CTokHighEq   Position
_  ) = String -> ShowS
showString String
">="
  showsPrec Int
_ (CTokEqual    Position
_  ) = String -> ShowS
showString String
"=="
  showsPrec Int
_ (CTokUnequal  Position
_  ) = String -> ShowS
showString String
"!="
  showsPrec Int
_ (CTokHat      Position
_  ) = String -> ShowS
showString String
"^"
  showsPrec Int
_ (CTokBar      Position
_  ) = String -> ShowS
showString String
"|"
  showsPrec Int
_ (CTokAnd      Position
_  ) = String -> ShowS
showString String
"&&"
  showsPrec Int
_ (CTokOr       Position
_  ) = String -> ShowS
showString String
"||"
  showsPrec Int
_ (CTokQuest    Position
_  ) = String -> ShowS
showString String
"?"
  showsPrec Int
_ (CTokColon    Position
_  ) = String -> ShowS
showString String
":"
  showsPrec Int
_ (CTokAssign   Position
_  ) = String -> ShowS
showString String
"="
  showsPrec Int
_ (CTokPlusAss  Position
_  ) = String -> ShowS
showString String
"+="
  showsPrec Int
_ (CTokMinusAss Position
_  ) = String -> ShowS
showString String
"-="
  showsPrec Int
_ (CTokStarAss  Position
_  ) = String -> ShowS
showString String
"*="
  showsPrec Int
_ (CTokSlashAss Position
_  ) = String -> ShowS
showString String
"/="
  showsPrec Int
_ (CTokPercAss  Position
_  ) = String -> ShowS
showString String
"%="
  showsPrec Int
_ (CTokAmpAss   Position
_  ) = String -> ShowS
showString String
"&="
  showsPrec Int
_ (CTokHatAss   Position
_  ) = String -> ShowS
showString String
"^="
  showsPrec Int
_ (CTokBarAss   Position
_  ) = String -> ShowS
showString String
"|="
  showsPrec Int
_ (CTokSLAss    Position
_  ) = String -> ShowS
showString String
"<<="
  showsPrec Int
_ (CTokSRAss    Position
_  ) = String -> ShowS
showString String
">>="
  showsPrec Int
_ (CTokComma    Position
_  ) = String -> ShowS
showString String
","
  showsPrec Int
_ (CTokSemic    Position
_  ) = String -> ShowS
showString String
";"
  showsPrec Int
_ (CTokLBrace   Position
_  ) = String -> ShowS
showString String
"{"
  showsPrec Int
_ (CTokRBrace   Position
_  ) = String -> ShowS
showString String
"}"
  showsPrec Int
_ (CTokEllipsis Position
_  ) = String -> ShowS
showString String
"..."
  showsPrec Int
_ (CTokAlignof  Position
_  ) = String -> ShowS
showString String
"alignof"
  showsPrec Int
_ (CTokAsm      Position
_  ) = String -> ShowS
showString String
"asm"
  showsPrec Int
_ (CTokAuto     Position
_  ) = String -> ShowS
showString String
"auto"
  showsPrec Int
_ (CTokBreak    Position
_  ) = String -> ShowS
showString String
"break"
  showsPrec Int
_ (CTokCase     Position
_  ) = String -> ShowS
showString String
"case"
  showsPrec Int
_ (CTokChar     Position
_  ) = String -> ShowS
showString String
"char"
  showsPrec Int
_ (CTokConst    Position
_  ) = String -> ShowS
showString String
"const"
  showsPrec Int
_ (CTokContinue Position
_  ) = String -> ShowS
showString String
"continue"
  showsPrec Int
_ (CTokDefault  Position
_  ) = String -> ShowS
showString String
"default"
  showsPrec Int
_ (CTokDouble   Position
_  ) = String -> ShowS
showString String
"double"
  showsPrec Int
_ (CTokDo       Position
_  ) = String -> ShowS
showString String
"do"
  showsPrec Int
_ (CTokElse     Position
_  ) = String -> ShowS
showString String
"else"
  showsPrec Int
_ (CTokEnum     Position
_  ) = String -> ShowS
showString String
"enum"
  showsPrec Int
_ (CTokExtern   Position
_  ) = String -> ShowS
showString String
"extern"
  showsPrec Int
_ (CTokFloat    Position
_  ) = String -> ShowS
showString String
"float"
  showsPrec Int
_ (CTokFloat128 Position
_  ) = String -> ShowS
showString String
"__float128"
  showsPrec Int
_ (CTokFor      Position
_  ) = String -> ShowS
showString String
"for"
  showsPrec Int
_ (CTokGoto     Position
_  ) = String -> ShowS
showString String
"goto"
  showsPrec Int
_ (CTokIf       Position
_  ) = String -> ShowS
showString String
"if"
  showsPrec Int
_ (CTokInline   Position
_  ) = String -> ShowS
showString String
"inline"
  showsPrec Int
_ (CTokInt      Position
_  ) = String -> ShowS
showString String
"int"
  showsPrec Int
_ (CTokLong     Position
_  ) = String -> ShowS
showString String
"long"
  showsPrec Int
_ (CTokLabel    Position
_  ) = String -> ShowS
showString String
"__label__"
  showsPrec Int
_ (CTokRegister Position
_  ) = String -> ShowS
showString String
"register"
  showsPrec Int
_ (CTokRestrict Position
_  ) = String -> ShowS
showString String
"restrict"
  showsPrec Int
_ (CTokReturn   Position
_  ) = String -> ShowS
showString String
"return"
  showsPrec Int
_ (CTokShort    Position
_  ) = String -> ShowS
showString String
"short"
  showsPrec Int
_ (CTokSigned   Position
_  ) = String -> ShowS
showString String
"signed"
  showsPrec Int
_ (CTokSizeof   Position
_  ) = String -> ShowS
showString String
"sizeof"
  showsPrec Int
_ (CTokStatic   Position
_  ) = String -> ShowS
showString String
"static"
  showsPrec Int
_ (CTokStruct   Position
_  ) = String -> ShowS
showString String
"struct"
  showsPrec Int
_ (CTokSwitch   Position
_  ) = String -> ShowS
showString String
"switch"
  showsPrec Int
_ (CTokTypedef  Position
_  ) = String -> ShowS
showString String
"typedef"
  showsPrec Int
_ (CTokTypeof   Position
_  ) = String -> ShowS
showString String
"typeof"
  showsPrec Int
_ (CTokThread   Position
_  ) = String -> ShowS
showString String
"__thread"
  showsPrec Int
_ (CTokUnion    Position
_  ) = String -> ShowS
showString String
"union"
  showsPrec Int
_ (CTokUnsigned Position
_  ) = String -> ShowS
showString String
"unsigned"
  showsPrec Int
_ (CTokVoid     Position
_  ) = String -> ShowS
showString String
"void"
  showsPrec Int
_ (CTokVolatile Position
_  ) = String -> ShowS
showString String
"volatile"
  showsPrec Int
_ (CTokWhile    Position
_  ) = String -> ShowS
showString String
"while"
  showsPrec Int
_ (CTokCLit     Position
_ Char
c) = Char -> ShowS
showChar Char
c
  showsPrec Int
_ (CTokILit     Position
_ Integer
i) = (String -> ShowS
showString (String -> ShowS) -> (Integer -> String) -> Integer -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> String
forall a. Show a => a -> String
show) Integer
i
  showsPrec Int
_ (CTokFLit     Position
_ String
s) = String -> ShowS
showString String
s
  showsPrec Int
_ (CTokSLit     Position
_ String
s) = String -> ShowS
showString String
s
  showsPrec Int
_ (CTokIdent    Position
_ Ident
i) = (String -> ShowS
showString (String -> ShowS) -> (Ident -> String) -> Ident -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ident -> String
identToLexeme) Ident
i
  showsPrec Int
_ (CTokTyIdent  Position
_ Ident
i) = (String -> ShowS
showString (String -> ShowS) -> (Ident -> String) -> Ident -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ident -> String
identToLexeme) Ident
i
  showsPrec Int
_ (CTokGnuC GnuCTok
GnuCAttrTok Position
_) = String -> ShowS
showString String
"__attribute__"
  showsPrec Int
_ (CTokGnuC GnuCTok
GnuCExtTok  Position
_) = String -> ShowS
showString String
"__extension__"
  showsPrec Int
_ (CTokGnuC GnuCTok
GnuCVaArg    Position
_) = String -> ShowS
showString String
"__builtin_va_arg"
  showsPrec Int
_ (CTokGnuC GnuCTok
GnuCOffsetof Position
_) = String -> ShowS
showString String
"__builtin_offsetof"
  showsPrec Int
_ (CTokGnuC GnuCTok
GnuCTyCompat Position
_) = String -> ShowS
showString String
"__builtin_types_compatible_p"