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