1{-# OPTIONS #-} 2----------------------------------------------------------------------------- 3-- | 4-- Module : Language.C.Parser.Tokens 5-- Copyright : [1999..2004] Manuel M T Chakravarty 6-- 2005 Duncan Coutts 7-- License : BSD-style 8-- Maintainer : benedikt.huber@gmail.com 9-- Portability : portable 10-- 11-- C Tokens for the C lexer. 12-- 13----------------------------------------------------------------------------- 14module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..), ClangCTok(..)) where 15 16import Language.C.Data.Position (Position, Pos(..), PosLength) 17import Language.C.Data.Ident (Ident, identToString) 18import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString, ClangCVersion) 19 20-- token definition 21-- ---------------- 22 23-- possible tokens (EXPORTED) 24-- 25data CToken = CTokLParen !PosLength -- `(' 26 | CTokRParen !PosLength -- `)' 27 | CTokLBracket !PosLength -- `[' 28 | CTokRBracket !PosLength -- `]' 29 | CTokArrow !PosLength -- `->' 30 | CTokDot !PosLength -- `.' 31 | CTokExclam !PosLength -- `!' 32 | CTokTilde !PosLength -- `~' 33 | CTokInc !PosLength -- `++' 34 | CTokDec !PosLength -- `--' 35 | CTokPlus !PosLength -- `+' 36 | CTokMinus !PosLength -- `-' 37 | CTokStar !PosLength -- `*' 38 | CTokSlash !PosLength -- `/' 39 | CTokPercent !PosLength -- `%' 40 | CTokAmper !PosLength -- `&' 41 | CTokShiftL !PosLength -- `<<' 42 | CTokShiftR !PosLength -- `>>' 43 | CTokLess !PosLength -- `<' 44 | CTokLessEq !PosLength -- `<=' 45 | CTokHigh !PosLength -- `>' 46 | CTokHighEq !PosLength -- `>=' 47 | CTokEqual !PosLength -- `==' 48 | CTokUnequal !PosLength -- `!=' 49 | CTokHat !PosLength -- `^' 50 | CTokBar !PosLength -- `|' 51 | CTokAnd !PosLength -- `&&' 52 | CTokOr !PosLength -- `||' 53 | CTokQuest !PosLength -- `?' 54 | CTokColon !PosLength -- `:' 55 | CTokAssign !PosLength -- `=' 56 | CTokPlusAss !PosLength -- `+=' 57 | CTokMinusAss !PosLength -- `-=' 58 | CTokStarAss !PosLength -- `*=' 59 | CTokSlashAss !PosLength -- `/=' 60 | CTokPercAss !PosLength -- `%=' 61 | CTokAmpAss !PosLength -- `&=' 62 | CTokHatAss !PosLength -- `^=' 63 | CTokBarAss !PosLength -- `|=' 64 | CTokSLAss !PosLength -- `<<=' 65 | CTokSRAss !PosLength -- `>>=' 66 | CTokComma !PosLength -- `,' 67 | CTokSemic !PosLength -- `;' 68 | CTokLBrace !PosLength -- `{' 69 | CTokRBrace !PosLength -- `}' 70 | CTokEllipsis !PosLength -- `...' 71 | CTokAlignof !PosLength -- `alignof' 72 -- (or `__alignof', 73 -- `__alignof__') 74 | CTokAlignas !PosLength -- `_Alignas' 75 | CTokAsm !PosLength -- `asm' 76 -- (or `__asm', 77 -- `__asm__') 78 | CTokAtomic !PosLength -- `_Atomic' 79 | CTokAuto !PosLength -- `auto' 80 | CTokBreak !PosLength -- `break' 81 | CTokBool !PosLength -- `_Bool' 82 | CTokCase !PosLength -- `case' 83 | CTokChar !PosLength -- `char' 84 | CTokConst !PosLength -- `const' 85 -- (or `__const', `__const__') 86 | CTokContinue !PosLength -- `continue' 87 | CTokComplex !PosLength -- `_Complex' 88 | CTokDefault !PosLength -- `default' 89 | CTokDo !PosLength -- `do' 90 | CTokDouble !PosLength -- `double' 91 | CTokElse !PosLength -- `else' 92 | CTokEnum !PosLength -- `enum' 93 | CTokExtern !PosLength -- `extern' 94 | CTokFloat !PosLength -- `float' 95 | CTokFloatN !Int !Bool !PosLength -- `__float128' or `_Float{32,64,128}{,x}` 96 | CTokFor !PosLength -- `for' 97 | CTokGeneric !PosLength -- `_Generic' 98 | CTokGoto !PosLength -- `goto' 99 | CTokIf !PosLength -- `if' 100 | CTokInline !PosLength -- `inline' 101 -- (or `__inline', 102 -- `__inline__') 103 | CTokInt !PosLength -- `int' 104 | CTokInt128 !PosLength -- `__int128` 105 | CTokLong !PosLength -- `long' 106 | CTokLabel !PosLength -- `__label__ 107 | CTokNoreturn !PosLength -- `_Noreturn' 108 | CTokNullable !PosLength -- `_Nullable' 109 | CTokNonnull !PosLength -- `_Nonnull' 110 | CTokRegister !PosLength -- `register' 111 | CTokRestrict !PosLength -- `restrict' 112 -- (or `__restrict', 113 -- `__restrict__') 114 | CTokReturn !PosLength -- `return' 115 | CTokShort !PosLength -- `short' 116 | CTokSigned !PosLength -- `signed' 117 -- (or `__signed', 118 -- `__signed__') 119 | CTokSizeof !PosLength -- `sizeof' 120 | CTokStatic !PosLength -- `static' 121 | CTokStaticAssert !PosLength -- `_Static_assert' 122 | CTokStruct !PosLength -- `struct' 123 | CTokSwitch !PosLength -- `switch' 124 | CTokTypedef !PosLength -- `typedef' 125 | CTokTypeof !PosLength -- `typeof' 126 | CTokThread !PosLength -- `__thread' 127 | CTokUnion !PosLength -- `union' 128 | CTokUnsigned !PosLength -- `unsigned' 129 | CTokVoid !PosLength -- `void' 130 | CTokVolatile !PosLength -- `volatile' 131 -- (or `__volatile', 132 -- `__volatile__') 133 | CTokWhile !PosLength -- `while' 134 | CTokCLit !PosLength !CChar -- character constant 135 | CTokILit !PosLength !CInteger -- integer constant 136 | CTokFLit !PosLength CFloat -- float constant 137 | CTokSLit !PosLength CString -- string constant 138 | CTokIdent !PosLength !Ident -- identifier 139 140 -- not generated here, but in `CParser.parseCHeader' 141 | CTokTyIdent !PosLength !Ident -- `typedef-name' identifier 142 | CTokGnuC !GnuCTok !PosLength -- special GNU C tokens 143 | CTokClangC !PosLength !ClangCTok -- special Clang C tokens 144 | CTokClKernel !PosLength -- OpenCL `__kernel' 145 | CTokClRdOnly !PosLength -- OpenCL `__read_only' 146 | CTokClWrOnly !PosLength -- OpenCL `__write_only' 147 | CTokClGlobal !PosLength -- OpenCL `__Global' 148 | CTokClLocal !PosLength -- OpenCL `__Local' 149 | CTokEof -- end of file 150 151-- special tokens used in GNU C extensions to ANSI C 152-- 153data GnuCTok = GnuCAttrTok -- `__attribute__' 154 | GnuCExtTok -- `__extension__' 155 | GnuCVaArg -- `__builtin_va_arg' 156 | GnuCOffsetof -- `__builtin_offsetof' 157 | GnuCTyCompat -- `__builtin_types_compatible_p' 158 | GnuCComplexReal -- `__real__' 159 | GnuCComplexImag -- `__imag__' 160 161data ClangCTok = ClangCVersionTok !ClangCVersion -- version constant from 'availability' attribute 162 | ClangBuiltinConvertVector 163 164instance Pos CToken where 165 posOf = fst . posLenOfTok 166 167-- token position and length 168posLenOfTok :: CToken -> (Position,Int) 169posLenOfTok (CTokLParen pos ) = pos 170posLenOfTok (CTokRParen pos ) = pos 171posLenOfTok (CTokLBracket pos ) = pos 172posLenOfTok (CTokRBracket pos ) = pos 173posLenOfTok (CTokArrow pos ) = pos 174posLenOfTok (CTokDot pos ) = pos 175posLenOfTok (CTokExclam pos ) = pos 176posLenOfTok (CTokTilde pos ) = pos 177posLenOfTok (CTokInc pos ) = pos 178posLenOfTok (CTokDec pos ) = pos 179posLenOfTok (CTokPlus pos ) = pos 180posLenOfTok (CTokMinus pos ) = pos 181posLenOfTok (CTokStar pos ) = pos 182posLenOfTok (CTokSlash pos ) = pos 183posLenOfTok (CTokPercent pos ) = pos 184posLenOfTok (CTokAmper pos ) = pos 185posLenOfTok (CTokShiftL pos ) = pos 186posLenOfTok (CTokShiftR pos ) = pos 187posLenOfTok (CTokLess pos ) = pos 188posLenOfTok (CTokLessEq pos ) = pos 189posLenOfTok (CTokHigh pos ) = pos 190posLenOfTok (CTokHighEq pos ) = pos 191posLenOfTok (CTokEqual pos ) = pos 192posLenOfTok (CTokUnequal pos ) = pos 193posLenOfTok (CTokHat pos ) = pos 194posLenOfTok (CTokBar pos ) = pos 195posLenOfTok (CTokAnd pos ) = pos 196posLenOfTok (CTokOr pos ) = pos 197posLenOfTok (CTokQuest pos ) = pos 198posLenOfTok (CTokColon pos ) = pos 199posLenOfTok (CTokAssign pos ) = pos 200posLenOfTok (CTokPlusAss pos ) = pos 201posLenOfTok (CTokMinusAss pos ) = pos 202posLenOfTok (CTokStarAss pos ) = pos 203posLenOfTok (CTokSlashAss pos ) = pos 204posLenOfTok (CTokPercAss pos ) = pos 205posLenOfTok (CTokAmpAss pos ) = pos 206posLenOfTok (CTokHatAss pos ) = pos 207posLenOfTok (CTokBarAss pos ) = pos 208posLenOfTok (CTokSLAss pos ) = pos 209posLenOfTok (CTokSRAss pos ) = pos 210posLenOfTok (CTokComma pos ) = pos 211posLenOfTok (CTokSemic pos ) = pos 212posLenOfTok (CTokLBrace pos ) = pos 213posLenOfTok (CTokRBrace pos ) = pos 214posLenOfTok (CTokEllipsis pos ) = pos 215posLenOfTok (CTokAlignof pos ) = pos 216posLenOfTok (CTokAlignas pos ) = pos 217posLenOfTok (CTokAsm pos ) = pos 218posLenOfTok (CTokAtomic pos ) = pos 219posLenOfTok (CTokAuto pos ) = pos 220posLenOfTok (CTokBreak pos ) = pos 221posLenOfTok (CTokBool pos ) = pos 222posLenOfTok (CTokCase pos ) = pos 223posLenOfTok (CTokChar pos ) = pos 224posLenOfTok (CTokConst pos ) = pos 225posLenOfTok (CTokContinue pos ) = pos 226posLenOfTok (CTokComplex pos ) = pos 227posLenOfTok (CTokDefault pos ) = pos 228posLenOfTok (CTokDo pos ) = pos 229posLenOfTok (CTokDouble pos ) = pos 230posLenOfTok (CTokElse pos ) = pos 231posLenOfTok (CTokEnum pos ) = pos 232posLenOfTok (CTokExtern pos ) = pos 233posLenOfTok (CTokFloat pos ) = pos 234posLenOfTok (CTokFloatN _ _ pos) = pos 235posLenOfTok (CTokFor pos ) = pos 236posLenOfTok (CTokGeneric pos ) = pos 237posLenOfTok (CTokGoto pos ) = pos 238posLenOfTok (CTokInt pos ) = pos 239posLenOfTok (CTokInt128 pos ) = pos 240posLenOfTok (CTokInline pos ) = pos 241posLenOfTok (CTokIf pos ) = pos 242posLenOfTok (CTokLong pos ) = pos 243posLenOfTok (CTokLabel pos ) = pos 244posLenOfTok (CTokNoreturn pos ) = pos 245posLenOfTok (CTokNullable pos ) = pos 246posLenOfTok (CTokNonnull pos ) = pos 247posLenOfTok (CTokRegister pos ) = pos 248posLenOfTok (CTokRestrict pos ) = pos 249posLenOfTok (CTokReturn pos ) = pos 250posLenOfTok (CTokShort pos ) = pos 251posLenOfTok (CTokSigned pos ) = pos 252posLenOfTok (CTokSizeof pos ) = pos 253posLenOfTok (CTokStatic pos ) = pos 254posLenOfTok (CTokStaticAssert pos) = pos 255posLenOfTok (CTokStruct pos ) = pos 256posLenOfTok (CTokSwitch pos ) = pos 257posLenOfTok (CTokTypedef pos ) = pos 258posLenOfTok (CTokTypeof pos ) = pos 259posLenOfTok (CTokThread pos ) = pos 260posLenOfTok (CTokUnion pos ) = pos 261posLenOfTok (CTokUnsigned pos ) = pos 262posLenOfTok (CTokVoid pos ) = pos 263posLenOfTok (CTokVolatile pos ) = pos 264posLenOfTok (CTokWhile pos ) = pos 265posLenOfTok (CTokCLit pos _) = pos 266posLenOfTok (CTokILit pos _) = pos 267posLenOfTok (CTokFLit pos _) = pos 268posLenOfTok (CTokSLit pos _) = pos 269posLenOfTok (CTokIdent pos _) = pos 270posLenOfTok (CTokTyIdent pos _) = pos 271posLenOfTok (CTokGnuC _ pos ) = pos 272posLenOfTok (CTokClangC pos _) = pos 273posLenOfTok (CTokClKernel pos ) = pos 274posLenOfTok (CTokClRdOnly pos ) = pos 275posLenOfTok (CTokClWrOnly pos ) = pos 276posLenOfTok (CTokClGlobal pos ) = pos 277posLenOfTok (CTokClLocal pos ) = pos 278posLenOfTok CTokEof = error "tokenPos: Eof" 279 280instance Show CToken where 281 showsPrec _ (CTokLParen _ ) = showString "(" 282 showsPrec _ (CTokRParen _ ) = showString ")" 283 showsPrec _ (CTokLBracket _ ) = showString "[" 284 showsPrec _ (CTokRBracket _ ) = showString "]" 285 showsPrec _ (CTokArrow _ ) = showString "->" 286 showsPrec _ (CTokDot _ ) = showString "." 287 showsPrec _ (CTokExclam _ ) = showString "!" 288 showsPrec _ (CTokTilde _ ) = showString "~" 289 showsPrec _ (CTokInc _ ) = showString "++" 290 showsPrec _ (CTokDec _ ) = showString "--" 291 showsPrec _ (CTokPlus _ ) = showString "+" 292 showsPrec _ (CTokMinus _ ) = showString "-" 293 showsPrec _ (CTokStar _ ) = showString "*" 294 showsPrec _ (CTokSlash _ ) = showString "/" 295 showsPrec _ (CTokPercent _ ) = showString "%" 296 showsPrec _ (CTokAmper _ ) = showString "&" 297 showsPrec _ (CTokShiftL _ ) = showString "<<" 298 showsPrec _ (CTokShiftR _ ) = showString ">>" 299 showsPrec _ (CTokLess _ ) = showString "<" 300 showsPrec _ (CTokLessEq _ ) = showString "<=" 301 showsPrec _ (CTokHigh _ ) = showString ">" 302 showsPrec _ (CTokHighEq _ ) = showString ">=" 303 showsPrec _ (CTokEqual _ ) = showString "==" 304 showsPrec _ (CTokUnequal _ ) = showString "!=" 305 showsPrec _ (CTokHat _ ) = showString "^" 306 showsPrec _ (CTokBar _ ) = showString "|" 307 showsPrec _ (CTokAnd _ ) = showString "&&" 308 showsPrec _ (CTokOr _ ) = showString "||" 309 showsPrec _ (CTokQuest _ ) = showString "?" 310 showsPrec _ (CTokColon _ ) = showString ":" 311 showsPrec _ (CTokAssign _ ) = showString "=" 312 showsPrec _ (CTokPlusAss _ ) = showString "+=" 313 showsPrec _ (CTokMinusAss _ ) = showString "-=" 314 showsPrec _ (CTokStarAss _ ) = showString "*=" 315 showsPrec _ (CTokSlashAss _ ) = showString "/=" 316 showsPrec _ (CTokPercAss _ ) = showString "%=" 317 showsPrec _ (CTokAmpAss _ ) = showString "&=" 318 showsPrec _ (CTokHatAss _ ) = showString "^=" 319 showsPrec _ (CTokBarAss _ ) = showString "|=" 320 showsPrec _ (CTokSLAss _ ) = showString "<<=" 321 showsPrec _ (CTokSRAss _ ) = showString ">>=" 322 showsPrec _ (CTokComma _ ) = showString "," 323 showsPrec _ (CTokSemic _ ) = showString ";" 324 showsPrec _ (CTokLBrace _ ) = showString "{" 325 showsPrec _ (CTokRBrace _ ) = showString "}" 326 showsPrec _ (CTokEllipsis _ ) = showString "..." 327 showsPrec _ (CTokAlignof _ ) = showString "alignof" 328 showsPrec _ (CTokAlignas _ ) = showString "_Alignas" 329 showsPrec _ (CTokAsm _ ) = showString "asm" 330 showsPrec _ (CTokAtomic _ ) = showString "_Atomic" 331 showsPrec _ (CTokAuto _ ) = showString "auto" 332 showsPrec _ (CTokBool _) = showString "_Bool" 333 showsPrec _ (CTokBreak _ ) = showString "break" 334 showsPrec _ (CTokCase _ ) = showString "case" 335 showsPrec _ (CTokChar _ ) = showString "char" 336 showsPrec _ (CTokComplex _) = showString "_Complex" 337 showsPrec _ (CTokConst _ ) = showString "const" 338 showsPrec _ (CTokContinue _ ) = showString "continue" 339 showsPrec _ (CTokDefault _ ) = showString "default" 340 showsPrec _ (CTokDouble _ ) = showString "double" 341 showsPrec _ (CTokDo _ ) = showString "do" 342 showsPrec _ (CTokElse _ ) = showString "else" 343 showsPrec _ (CTokEnum _ ) = showString "enum" 344 showsPrec _ (CTokExtern _ ) = showString "extern" 345 showsPrec _ (CTokFloat _ ) = showString "float" 346 showsPrec _ (CTokFloatN n x _) = showString "_Float" . shows n . 347 showString (if x then "x" else "") 348 showsPrec _ (CTokFor _ ) = showString "for" 349 showsPrec _ (CTokGeneric _ ) = showString "_Generic" 350 showsPrec _ (CTokGoto _ ) = showString "goto" 351 showsPrec _ (CTokIf _ ) = showString "if" 352 showsPrec _ (CTokInline _ ) = showString "inline" 353 showsPrec _ (CTokInt _ ) = showString "int" 354 showsPrec _ (CTokInt128 _ ) = showString "__int128" 355 showsPrec _ (CTokLong _ ) = showString "long" 356 showsPrec _ (CTokLabel _ ) = showString "__label__" 357 showsPrec _ (CTokNoreturn _ ) = showString "_Noreturn" 358 showsPrec _ (CTokNullable _ ) = showString "_Nullable" 359 showsPrec _ (CTokNonnull _ ) = showString "_Nonnull" 360 showsPrec _ (CTokRegister _ ) = showString "register" 361 showsPrec _ (CTokRestrict _ ) = showString "restrict" 362 showsPrec _ (CTokReturn _ ) = showString "return" 363 showsPrec _ (CTokShort _ ) = showString "short" 364 showsPrec _ (CTokSigned _ ) = showString "signed" 365 showsPrec _ (CTokSizeof _ ) = showString "sizeof" 366 showsPrec _ (CTokStatic _ ) = showString "static" 367 showsPrec _ (CTokStaticAssert _ ) = showString "_Static_assert" 368 showsPrec _ (CTokStruct _ ) = showString "struct" 369 showsPrec _ (CTokSwitch _ ) = showString "switch" 370 showsPrec _ (CTokTypedef _ ) = showString "typedef" 371 showsPrec _ (CTokTypeof _ ) = showString "typeof" 372 showsPrec _ (CTokThread _ ) = showString "_Thread_local" 373 showsPrec _ (CTokUnion _ ) = showString "union" 374 showsPrec _ (CTokUnsigned _ ) = showString "unsigned" 375 showsPrec _ (CTokVoid _ ) = showString "void" 376 showsPrec _ (CTokVolatile _ ) = showString "volatile" 377 showsPrec _ (CTokWhile _ ) = showString "while" 378 showsPrec _ (CTokCLit _ c) = shows c 379 showsPrec _ (CTokILit _ i) = shows i 380 showsPrec _ (CTokFLit _ f) = shows f 381 showsPrec _ (CTokSLit _ s) = shows s 382 showsPrec _ (CTokIdent _ i) = (showString . identToString) i 383 showsPrec _ (CTokTyIdent _ i) = (showString . identToString) i 384 showsPrec _ (CTokGnuC GnuCAttrTok _) = showString "__attribute__" 385 showsPrec _ (CTokGnuC GnuCExtTok _) = showString "__extension__" 386 showsPrec _ (CTokGnuC GnuCComplexReal _) = showString "__real__" 387 showsPrec _ (CTokGnuC GnuCComplexImag _) = showString "__imag__" 388 showsPrec _ (CTokGnuC GnuCVaArg _) = showString "__builtin_va_arg" 389 showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof" 390 showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p" 391 showsPrec _ (CTokClangC _ (ClangCVersionTok v)) = shows v 392 showsPrec _ (CTokClangC _ ClangBuiltinConvertVector) = showString "__builtin_convertvector" 393 showsPrec _ (CTokClKernel _ ) = showString "__kernel" 394 showsPrec _ (CTokClRdOnly _ ) = showString "__read_only" 395 showsPrec _ (CTokClWrOnly _ ) = showString "__write_only" 396 showsPrec _ (CTokClGlobal _ ) = showString "__global" 397 showsPrec _ (CTokClLocal _ ) = showString "__Local" 398 showsPrec _ CTokEof = error "show CToken : CTokEof" 399