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