language-c 0.7.1 → 0.7.2
raw patch · 49 files changed
+12408/−19785 lines, 49 filesdep ~basedep ~containersdep ~prettysetup-changedPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base, containers, pretty
API changes (from Hackage documentation)
+ Language.C.Analysis.DeclAnalysis: BaseFloat128 :: NumBaseType
+ Language.C.Analysis.SemRep: TyFloat128 :: FloatType
- Language.C.Data.Error: class (Typeable e, Show e) => Error e where fromError (CError e) = cast e toError = CError changeErrorLevel e lvl = if errorLevel e == lvl then e else error $ "changeErrorLevel: not possible for " ++ show e
+ Language.C.Data.Error: class (Typeable e, Show e) => Error e
- Language.C.Pretty: class Pretty p where pretty = prettyPrec 0 prettyPrec _ = pretty
+ Language.C.Pretty: class Pretty p
Files
- AUTHORS +19/−19
- AUTHORS.c2hs +25/−25
- ChangeLog +117/−117
- LICENSE +29/−29
- README +56/−56
- Setup.hs +5/−5
- dist/build/Language/C/Parser/Lexer.hs +0/−675
- dist/build/Language/C/Parser/Parser.hs +0/−6710
- language-c.cabal +120/−120
- src/Language/C.hs +53/−53
- src/Language/C/Analysis.hs +69/−69
- src/Language/C/Analysis/AstAnalysis.hs +777/−777
- src/Language/C/Analysis/AstAnalysis.hs-boot +13/−13
- src/Language/C/Analysis/Builtins.hs +226/−226
- src/Language/C/Analysis/ConstEval.hs +209/−209
- src/Language/C/Analysis/Debug.hs +192/−191
- src/Language/C/Analysis/DeclAnalysis.hs +589/−586
- src/Language/C/Analysis/DefTable.hs +331/−331
- src/Language/C/Analysis/Export.hs +233/−232
- src/Language/C/Analysis/NameSpaceMap.hs +159/−159
- src/Language/C/Analysis/SemError.hs +109/−109
- src/Language/C/Analysis/SemRep.hs +682/−680
- src/Language/C/Analysis/TravMonad.hs +513/−513
- src/Language/C/Analysis/TypeCheck.hs +446/−446
- src/Language/C/Analysis/TypeConversions.hs +39/−39
- src/Language/C/Analysis/TypeUtils.hs +343/−343
- src/Language/C/Data.hs +40/−40
- src/Language/C/Data/Error.hs +171/−171
- src/Language/C/Data/Ident.hs +134/−134
- src/Language/C/Data/InputStream.hs +99/−99
- src/Language/C/Data/Name.hs +31/−31
- src/Language/C/Data/Node.hs +124/−124
- src/Language/C/Data/Position.hs +129/−129
- src/Language/C/Data/RList.hs +52/−52
- src/Language/C/Parser.hs +36/−36
- src/Language/C/Parser/Builtin.hs +21/−21
- src/Language/C/Parser/Lexer.x +566/−566
- src/Language/C/Parser/Parser.y +2345/−2345
- src/Language/C/Parser/ParserMonad.hs +181/−181
- src/Language/C/Parser/Tokens.hs +382/−382
- src/Language/C/Pretty.hs +546/−545
- src/Language/C/Syntax.hs +20/−20
- src/Language/C/Syntax/AST.hs +1393/−1393
- src/Language/C/Syntax/Constants.hs +296/−296
- src/Language/C/Syntax/Ops.hs +105/−105
- src/Language/C/Syntax/Utils.hs +76/−76
- src/Language/C/System/GCC.hs +114/−114
- src/Language/C/System/Preprocess.hs +123/−123
- test/harness/run-harness.hs +70/−70
AUTHORS view
@@ -1,19 +1,19 @@-Benedikt Huber <benedikt.huber@gmail.com>-Manuel M T Chakravarty <chak@cse.unsw.edu.au>-Duncan Coutts <duncan@haskell.org>-Bertram Felgenhauer <int-e@gmx.de>--with code contributions and patches from--Iavor Diatchki <iavor.diatchki@gmail.com>-Kevin Charter <kcharter@gmail.com>-Aleksey Kliger--This project originated from the C parser component of c2hs,-for many additional contributors see AUTHORS.c2hs.--Special thanks for their great support, comments and suggestions to:--Duncan Coutts <duncan@haskell.org>-Iavor Diatchki <iavor.diatchki@gmail.com>-Don Steward <dons@galois.com>+Benedikt Huber <benedikt.huber@gmail.com> +Manuel M T Chakravarty <chak@cse.unsw.edu.au> +Duncan Coutts <duncan@haskell.org> +Bertram Felgenhauer <int-e@gmx.de> + +with code contributions and patches from + +Iavor Diatchki <iavor.diatchki@gmail.com> +Kevin Charter <kcharter@gmail.com> +Aleksey Kliger + +This project originated from the C parser component of c2hs, +for many additional contributors see AUTHORS.c2hs. + +Special thanks for their great support, comments and suggestions to: + +Duncan Coutts <duncan@haskell.org> +Iavor Diatchki <iavor.diatchki@gmail.com> +Don Steward <dons@galois.com>
AUTHORS.c2hs view
@@ -1,25 +1,25 @@-Manuel M T Chakravarty <chak@cse.unsw.edu.au>-Duncan Coutts <duncan@haskell.org>--with contributions from (alphabetical order)--Bertram Felgenhauer <int-e@gmx.de>-Ian Lynagh <igloo@earth.li>-André Pang <ozone@algorithm.com.au>-Jens-Ulrik Petersen <petersen@haskell.org>-Armin Sander <armin@mindwalker.org>-Sean Seefried <sseefried@cse.unsw.edu.au>-Udo Stenzel <u.stenzel@web.de>-Axel Simon <A.Simon@ukc.ac.uk>-Michael Weber <michaelw@debian.org>--Thanks for comments and suggestions to --Roman Leshchinskiy <rl@cs.tu-berlin.de>-Jan Kort <kort@science.uva.nl>-Seth Kurtzberg <seth@cql.com>-Simon Marlow <simonmar@microsoft.com>-Matthias Neubauer <neubauer@informatik.uni-freiburg.de>-Sven Panne <sven.panne@aedion.de>-Simon L. Peyton Jones <simonpj@microsoft.com>-Volker Wysk <post@volker-wysk.de>+Manuel M T Chakravarty <chak@cse.unsw.edu.au> +Duncan Coutts <duncan@haskell.org> + +with contributions from (alphabetical order) + +Bertram Felgenhauer <int-e@gmx.de> +Ian Lynagh <igloo@earth.li> +André Pang <ozone@algorithm.com.au> +Jens-Ulrik Petersen <petersen@haskell.org> +Armin Sander <armin@mindwalker.org> +Sean Seefried <sseefried@cse.unsw.edu.au> +Udo Stenzel <u.stenzel@web.de> +Axel Simon <A.Simon@ukc.ac.uk> +Michael Weber <michaelw@debian.org> + +Thanks for comments and suggestions to + +Roman Leshchinskiy <rl@cs.tu-berlin.de> +Jan Kort <kort@science.uva.nl> +Seth Kurtzberg <seth@cql.com> +Simon Marlow <simonmar@microsoft.com> +Matthias Neubauer <neubauer@informatik.uni-freiburg.de> +Sven Panne <sven.panne@aedion.de> +Simon L. Peyton Jones <simonpj@microsoft.com> +Volker Wysk <post@volker-wysk.de>
ChangeLog view
@@ -1,117 +1,117 @@-Changes since 0.7.0-==========================================================================--Sat Nov 25 00:46:33 2017 -0600- add support for _Float128 (#41)--Changes since 0.6.0-==========================================================================-Mon Jul 31 2017- Improve TypeCheck output (#31)--Sun Jul 30 2017- * Add `__float128` (fixes #33)--Mon Maz 22 2017- * Support clang’s __builtin_convertvector (Fixes #34)--Wed Mar 8 2017- * Move file and parent information to new datatype FilePosition for performance reasons--Changes since 0.5.0-==========================================================================-Thu Feb 23 2017- * Make gccParseCPPArgs grab the arg to -MF -MT and -MQ-Wed Feb 15 2017- * In enums, allow multiple attribute specifiers per enumerator-Tue Feb 21 2017- * Allow typedef redefinition if it denotes the same type-Tue Feb 21 2017- * Change TypeDefRef to store Type, not Maybe Type-Tue Feb 14 2017- * Parse (and ignore) Clang __attribute__((availability(id=major.minor.rev)))-Sun Sep 11 2016- * Add __builtin_bswap32/64.-Wed Jun 22 2016- * Add '_Alignof' to Lexer.x (fixes #7)-Mon Jun 27 2016- * Updates for C11 (part 1)- * _Nullable and _Nonnull support as well as Warnings/lint fixes provided by Anthony Cowley (https://github.com/acowley)-Wed Mar 16 2016- * Consider storage specifier "ThreadSpec" for global and local declarations-Tue Mar 15 2016- * Support C11 _NoReturn, genearlize is_inline to FunSpecs (Syntax) / FunAttrs (SemRep)--Changes since 0.4.3-==========================================================================-Wed Mar 2 2016- * Add direct base type BaseInt128 (complements previous __int128 patch)- ryan.gl.scott@gmail.com-Sun Feb 28 2016- * Parse gcc-specific __int128 type-Thu Dec 4 2014- * Scott Kovach <dskovach@gmail.com>: added derived Eq,Ord instances to NodeInfo--Changes since 0.4.2-==========================================================================-Sat Jan 11 2014- * Allow unicode characters in string/char literals and filenames-Mon Oct 27 2014- * macos-attributes-Tue Aug 13 2013- * Do not derive Error instances for newtypes (type parameter has non-parametric role)-Mon Aug 12 2013- * Fix bug caused by applying posFile to nopos (reported by Mikhail Sosonkin)--Changes since 0.4.1-==========================================================================-Tue Mar 19 2013- * TypeCheck: Return Left str instead of fail str (do not rely on MonadError instance of Either)- * Improve printing of SUERefs and Ident-Thu Feb 28 2013- * Fix parsing and printing of octal character escapes.-Tue Jun 12 2012- * Export Annotated type class from AST module-Wed Aug 24 2012- * Patch for alex-3.0--Changes 0.3.1 - 0.4.1-==========================================================================-Tue Aug 16 2011:- * Port to ghc-7.2-Fr April 15 2011: Alexander Bernauer <bernauer@inf.ethz.ch>- * Show instances (popular request) for AST types, DumpAst demo--Changes 0.3 - 0.3.1-==========================================================================-Thu Aug 21 benedikt.huber@gmail.com- * add aliases for exposed parsers, in order to document them--Fri Aug 15 benedikt.huber@gmail.com- * Remove NameMap from Data.Name. We will do this right when neccessary.- * Parser public API: expose parsers and the Parser Monad- * ParserMonad: Return updated name supply when executing parser- * Parser: Expose expression, statement, declaration and file parsers- * Data: Add newNameSupply ~ (namesStartingFrom 0)--Thu Aug 14 17:13:29 CEST 2008 iavor.diatchki@gmail.com- * Add a utility function to create a "blank" set of cpp arguments.- * Make that analysis traversal monad abstract.- * Export the type synonym "Register" (and bump version)--Wed Aug 13 12:00:57 CEST 2008 benedikt.huber@gmail.com- * add Data.Position: internalIdentAt---Old Changes-==========================================================================--Mon Jun 9 23:12:46 CEST 2008 benedikt.huber@gmail.com- * License switched to 3-clause BSD- $-- In accordance with the original authors, Language.C is now licensed as BSD-3.- See:- http://haskell.org/pipermail/c2hs/2008-June/000833.html- http://haskell.org/pipermail/c2hs/2008-June/000834.html- http://haskell.org/pipermail/c2hs/2008-June/000835.html-+Changes since 0.7.0 +========================================================================== + +Sat Nov 25 00:46:33 2017 -0600 + add support for _Float128 (#41) + +Changes since 0.6.0 +========================================================================== +Mon Jul 31 2017 + Improve TypeCheck output (#31) + +Sun Jul 30 2017 + * Add `__float128` (fixes #33) + +Mon Maz 22 2017 + * Support clang’s __builtin_convertvector (Fixes #34) + +Wed Mar 8 2017 + * Move file and parent information to new datatype FilePosition for performance reasons + +Changes since 0.5.0 +========================================================================== +Thu Feb 23 2017 + * Make gccParseCPPArgs grab the arg to -MF -MT and -MQ +Wed Feb 15 2017 + * In enums, allow multiple attribute specifiers per enumerator +Tue Feb 21 2017 + * Allow typedef redefinition if it denotes the same type +Tue Feb 21 2017 + * Change TypeDefRef to store Type, not Maybe Type +Tue Feb 14 2017 + * Parse (and ignore) Clang __attribute__((availability(id=major.minor.rev))) +Sun Sep 11 2016 + * Add __builtin_bswap32/64. +Wed Jun 22 2016 + * Add '_Alignof' to Lexer.x (fixes #7) +Mon Jun 27 2016 + * Updates for C11 (part 1) + * _Nullable and _Nonnull support as well as Warnings/lint fixes provided by Anthony Cowley (https://github.com/acowley) +Wed Mar 16 2016 + * Consider storage specifier "ThreadSpec" for global and local declarations +Tue Mar 15 2016 + * Support C11 _NoReturn, genearlize is_inline to FunSpecs (Syntax) / FunAttrs (SemRep) + +Changes since 0.4.3 +========================================================================== +Wed Mar 2 2016 + * Add direct base type BaseInt128 (complements previous __int128 patch) + ryan.gl.scott@gmail.com +Sun Feb 28 2016 + * Parse gcc-specific __int128 type +Thu Dec 4 2014 + * Scott Kovach <dskovach@gmail.com>: added derived Eq,Ord instances to NodeInfo + +Changes since 0.4.2 +========================================================================== +Sat Jan 11 2014 + * Allow unicode characters in string/char literals and filenames +Mon Oct 27 2014 + * macos-attributes +Tue Aug 13 2013 + * Do not derive Error instances for newtypes (type parameter has non-parametric role) +Mon Aug 12 2013 + * Fix bug caused by applying posFile to nopos (reported by Mikhail Sosonkin) + +Changes since 0.4.1 +========================================================================== +Tue Mar 19 2013 + * TypeCheck: Return Left str instead of fail str (do not rely on MonadError instance of Either) + * Improve printing of SUERefs and Ident +Thu Feb 28 2013 + * Fix parsing and printing of octal character escapes. +Tue Jun 12 2012 + * Export Annotated type class from AST module +Wed Aug 24 2012 + * Patch for alex-3.0 + +Changes 0.3.1 - 0.4.1 +========================================================================== +Tue Aug 16 2011: + * Port to ghc-7.2 +Fr April 15 2011: Alexander Bernauer <bernauer@inf.ethz.ch> + * Show instances (popular request) for AST types, DumpAst demo + +Changes 0.3 - 0.3.1 +========================================================================== +Thu Aug 21 benedikt.huber@gmail.com + * add aliases for exposed parsers, in order to document them + +Fri Aug 15 benedikt.huber@gmail.com + * Remove NameMap from Data.Name. We will do this right when neccessary. + * Parser public API: expose parsers and the Parser Monad + * ParserMonad: Return updated name supply when executing parser + * Parser: Expose expression, statement, declaration and file parsers + * Data: Add newNameSupply ~ (namesStartingFrom 0) + +Thu Aug 14 17:13:29 CEST 2008 iavor.diatchki@gmail.com + * Add a utility function to create a "blank" set of cpp arguments. + * Make that analysis traversal monad abstract. + * Export the type synonym "Register" (and bump version) + +Wed Aug 13 12:00:57 CEST 2008 benedikt.huber@gmail.com + * add Data.Position: internalIdentAt + + +Old Changes +========================================================================== + +Mon Jun 9 23:12:46 CEST 2008 benedikt.huber@gmail.com + * License switched to 3-clause BSD + $ +- In accordance with the original authors, Language.C is now licensed as BSD-3. + See: + http://haskell.org/pipermail/c2hs/2008-June/000833.html + http://haskell.org/pipermail/c2hs/2008-June/000834.html + http://haskell.org/pipermail/c2hs/2008-June/000835.html +
LICENSE view
@@ -1,29 +1,29 @@-Copyright (c) 1999-2008 Manuel M T Chakravarty - Duncan Coutts- Benedikt Huber-Portions Copyright (c) 1989, 1990 James A. Roskind-All rights reserved.--Redistribution and use in source and binary forms, with or without-modification, are permitted provided that the following conditions-are met:-1. Redistributions of source code must retain the above copyright- notice, this list of conditions and the following disclaimer.-2. Redistributions in binary form must reproduce the above copyright- notice, this list of conditions and the following disclaimer in the- documentation and/or other materials provided with the distribution.-3. Neither the name of the author nor the names of his contributors- may be used to endorse or promote products derived from this software- without specific prior written permission.--THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-SUCH DAMAGE.+Copyright (c) 1999-2008 Manuel M T Chakravarty + Duncan Coutts + Benedikt Huber +Portions Copyright (c) 1989, 1990 James A. Roskind +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the author nor the names of his contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE.
README view
@@ -1,56 +1,56 @@-= Language.C =--Language.C is a parser and pretty-printer framework for C11 and the extensions of gcc.--See http://visq.github.io/language-c/--== Build and Install ==--cabal install---- or ----runhaskell Setup.hs configure FLAGS-runhaskell Setup.hs build-runhaskell Setup.hs install--Provide the set of flags passing- --flags="<flags-seperated-by-space>"-to configure.--== Compatibility ==--Tested with GHC 7.8, 7.10, 8.0 and 8.2.-It is recommended to use the most recent platform release: http://hackage.haskell.org/platform/.--== C Language Compatibility ==--Currently unsupported C11 constructs:- - static assertion 6.7.10 (_Static_assert)- - generic selection 6.5.1.1 (_Generic)- - _Atomic, _Alignas, _Thread_local- - Universal character names--Currently unsupported GNU C extensions:- - __auto_type- - __builtin_offsetof- char a[__builtin_offsetof (struct S, sa->f)- - _Decimal32- - Extended assembler- __asm__ __volatile__ ("" : : : );- __asm__ goto ("" : : : : label);--== Sources ==--see src/README--== Examples ==--A couple of small examples are available in /examples--== Testing ==--A couple of regression tests can be run via-> cd test/harness; make--For more tests, see test/README.+= Language.C = + +Language.C is a parser and pretty-printer framework for C11 and the extensions of gcc. + +See http://visq.github.io/language-c/ + +== Build and Install == + +cabal install + +-- or -- + +runhaskell Setup.hs configure FLAGS +runhaskell Setup.hs build +runhaskell Setup.hs install + +Provide the set of flags passing + --flags="<flags-seperated-by-space>" +to configure. + +== Compatibility == + +Tested with GHC 7.8, 7.10, 8.0 and 8.2. +It is recommended to use the most recent platform release: http://hackage.haskell.org/platform/. + +== C Language Compatibility == + +Currently unsupported C11 constructs: + - static assertion 6.7.10 (_Static_assert) + - generic selection 6.5.1.1 (_Generic) + - _Atomic, _Alignas, _Thread_local + - Universal character names + +Currently unsupported GNU C extensions: + - __auto_type + - __builtin_offsetof + char a[__builtin_offsetof (struct S, sa->f) + - _Decimal32 + - Extended assembler + __asm__ __volatile__ ("" : : : ); + __asm__ goto ("" : : : : label); + +== Sources == + +see src/README + +== Examples == + +A couple of small examples are available in /examples + +== Testing == + +A couple of regression tests can be run via +> cd test/harness; make + +For more tests, see test/README.
Setup.hs view
@@ -1,5 +1,5 @@-#!/usr/bin/env runhaskell--import Distribution.Simple--main = defaultMain+#!/usr/bin/env runhaskell + +import Distribution.Simple + +main = defaultMain
− dist/build/Language/C/Parser/Lexer.hs
@@ -1,675 +0,0 @@-{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-}-{-# LANGUAGE CPP,MagicHash #-}-{-# LINE 49 "src/Language/C/Parser/Lexer.x" #-}---module Language.C.Parser.Lexer (lexC, parseError) where--import Data.Char (chr, isDigit)-import Data.Word (Word8)-import Control.Monad (liftM, when)--import Language.C.Data.InputStream- (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars)---- ( InputStream, readInputStream,inputStreamToString,inputStreamFromString,--- takeByte, takeChar, inputStreamEmpty, takeChars,--- countLines,--- )-import Language.C.Data.Position-import Language.C.Data.Ident (mkIdent)--import Language.C.Syntax.Constants--import Language.C.Parser.Tokens-import Language.C.Parser.ParserMonad--#if __GLASGOW_HASKELL__ >= 603-#include "ghcconfig.h"-#elif defined(__GLASGOW_HASKELL__)-#include "config.h"-#endif-#if __GLASGOW_HASKELL__ >= 503-import Data.Array-import Data.Array.Base (unsafeAt)-#else-import Array-#endif-#if __GLASGOW_HASKELL__ >= 503-import GHC.Exts-#else-import GlaExts-#endif-alex_tab_size :: Int-alex_tab_size = 8-alex_base :: AlexAddr-alex_base = AlexA# "\xf8\xff\xff\xff\x6d\x00\x00\x00\x63\x01\x00\x00\x59\x02\x00\x00\x4f\x03\x00\x00\x45\x04\x00\x00\x3b\x05\x00\x00\x31\x06\x00\x00\x27\x07\x00\x00\x1d\x08\x00\x00\x13\x09\x00\x00\xdf\xff\xff\xff\xe0\xff\xff\xff\x6f\x00\x00\x00\xa7\xff\xff\xff\x93\x09\x00\x00\x9c\xff\xff\xff\x13\x0a\x00\x00\x93\x0a\x00\x00\x13\x0b\x00\x00\x93\x0b\x00\x00\x13\x0c\x00\x00\x93\x0c\x00\x00\x13\x0d\x00\x00\x93\x0d\x00\x00\x13\x0e\x00\x00\x93\x0e\x00\x00\x13\x0f\x00\x00\x93\x0f\x00\x00\x13\x10\x00\x00\xa3\xff\xff\xff\x93\x10\x00\x00\xa6\xff\xff\xff\x13\x11\x00\x00\x93\x11\x00\x00\x13\x12\x00\x00\x93\x12\x00\x00\x13\x13\x00\x00\x93\x13\x00\x00\x13\x14\x00\x00\x93\x14\x00\x00\x13\x15\x00\x00\x93\x15\x00\x00\x13\x16\x00\x00\xab\xff\xff\xff\x4c\x01\x00\x00\x54\x16\x00\x00\x00\x00\x00\x00\xc5\x16\x00\x00\x00\x00\x00\x00\x45\x17\x00\x00\xc5\x17\x00\x00\x54\x00\x00\x00\x37\x02\x00\x00\xc5\x18\x00\x00\x6e\x02\x00\x00\x85\x18\x00\x00\x00\x00\x00\x00\x36\x03\x00\x00\x23\x04\x00\x00\x7b\x19\x00\x00\x49\x04\x00\x00\x19\x05\x00\x00\x50\x05\x00\x00\x0f\x06\x00\x00\x9b\xff\xff\xff\x46\x06\x00\x00\x0e\x07\x00\x00\xaa\xff\xff\xff\x00\x00\x00\x00\xec\x19\x00\x00\xfb\x07\x00\x00\x00\x00\x00\x00\x5d\x1a\x00\x00\x00\x00\x00\x00\xce\x1a\x00\x00\x21\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x1b\x00\x00\xb0\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x1c\x00\x00\x92\x1c\x00\x00\x00\x00\x00\x00\x03\x1d\x00\x00\x00\x00\x00\x00\x74\x1d\x00\x00\x00\x00\x00\x00\xe5\x1d\x00\x00\x00\x00\x00\x00\x56\x1e\x00\x00\x00\x00\x00\x00\xc7\x1e\x00\x00\x00\x00\x00\x00\x38\x1f\x00\x00\x00\x00\x00\x00\x79\x1f\x00\x00\xf1\x08\x00\x00\x00\x00\x00\x00\xba\x1f\x00\x00\x00\x00\x00\x00\xfb\x1f\x00\x00\x17\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3c\x20\x00\x00\x7d\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbe\x20\x00\x00\xff\x20\x00\x00\x00\x00\x00\x00\x40\x21\x00\x00\x00\x00\x00\x00\x81\x21\x00\x00\x00\x00\x00\x00\xc2\x21\x00\x00\x00\x00\x00\x00\x03\x22\x00\x00\xa1\xff\xff\xff\x00\x00\x00\x00\x44\x22\x00\x00\x00\x00\x00\x00\x85\x22\x00\x00\x85\x23\x00\x00\x59\x19\x00\x00\x81\x19\x00\x00\x45\x23\x00\x00\x00\x00\x00\x00\x45\x24\x00\x00\x95\x24\x00\x00\xad\x24\x00\x00\x66\x24\x00\x00\x00\x00\x00\x00\x66\x25\x00\x00\x26\x25\x00\x00\x00\x00\x00\x00\xf6\x25\x00\x00\x5d\x26\x00\x00\xdd\x26\x00\x00\x2d\x27\x00\x00\x44\x27\x00\x00\x7b\x27\x00\x00\x96\x27\x00\x00\x4f\x27\x00\x00\x8f\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\x28\x00\x00\x0f\x29\x00\x00\x5f\x29\x00\x00\x76\x29\x00\x00\xad\x29\x00\x00\xc8\x29\x00\x00\x81\x29\x00\x00\xc1\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x2a\x00\x00\x11\x2b\x00\x00\x29\x2b\x00\x00\xe2\x2a\x00\x00\x00\x00\x00\x00\xe2\x2b\x00\x00\x32\x2c\x00\x00\x4a\x2c\x00\x00\x03\x2c\x00\x00\x00\x00\x00\x00\x03\x2d\x00\x00\x53\x2d\x00\x00\x98\x2d\x00\x00\x8e\x2e\x00\x00\xce\x2e\x00\x00\x00\x00\x00\x00\xce\x2f\x00\x00\x6c\x2e\x00\x00\x44\x30\x00\x00\x3a\x31\x00\x00\x7a\x31\x00\x00\x00\x00\x00\x00\x7a\x32\x00\x00\x9d\xff\xff\xff\x3a\x32\x00\x00\x00\x00\x00\x00\x3a\x33\x00\x00\xfa\x32\x00\x00\x00\x00\x00\x00\xf0\x33\x00\x00\xe2\xff\xff\xff\xe6\x34\x00\x00\xdc\x35\x00\x00\xd2\x36\x00\x00\xc8\x37\x00\x00\xbe\x38\x00\x00\x92\x2e\x00\x00\x9a\x00\x00\x00\x79\x00\x00\x00\xb0\x00\x00\x00\x8b\x00\x00\x00\x76\x2d\x00\x00\x95\x01\x00\x00\x2b\x30\x00\x00\x18\x31\x00\x00\xb4\x39\x00\x00\xaa\x3a\x00\x00\x88\x02\x00\x00\x87\x04\x00\x00\x6a\x05\x00\x00\x60\x06\x00\x00\x08\x00\x00\x00\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x33\x00\x00\xe2\x34\x00\x00\x26\x01\x00\x00\x67\x01\x00\x00\xe3\xff\xff\xff\x30\x01\x00\x00\x61\x02\x00\x00\x51\x03\x00\x00\x00\x00\x00\x00\xa8\xff\xff\xff\x55\x03\x00\x00\x5a\x01\x00\x00\x68\x01\x00\x00\x59\x03\x00\x00\x43\x05\x00\x00\xc7\xff\xff\xff\x47\x00\x00\x00\x3b\x31\x00\x00\xba\x35\x00\x00\x39\x06\x00\x00\x29\x07\x00\x00\x5f\x00\x00\x00\x32\x01\x00\x00\x2d\x07\x00\x00\x31\x07\x00\x00\x00\x00\x00\x00\xa9\xff\xff\xff\x1f\x08\x00\x00\x60\x01\x00\x00\x62\x02\x00\x00\x23\x08\x00\x00\x27\x08\x00\x00\xca\xff\xff\xff\x38\x01\x00\x00\xe5\x35\x00\x00\x15\x09\x00\x00\x19\x09\x00\x00\x34\x01\x00\x00\x66\x01\x00\x00\x1d\x09\x00\x00\x58\x19\x00\x00\x00\x00\x00\x00\xe8\xff\xff\xff\x7f\x19\x00\x00\x64\x01\x00\x00\x41\x03\x00\x00\x87\x24\x00\x00\x4a\x27\x00\x00\xcb\xff\xff\xff\x57\x01\x00\x00\xb4\x36\x00\x00\xb0\x37\x00\x00\x54\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x04\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x88\x27\x00\x00\x9c\x38\x00\x00\xa6\x38\x00\x00\x8f\x39\x00\x00\xb7\x39\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x9f\x29\x00\x00\x85\x3a\x00\x00\x7a\x3b\x00\x00\x00\x00\x00\x00\xaa\x3b\x00\x00\x00\x00\x00\x00\xa0\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x65\x04\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x00\x00\x00\x61\x00\x00\x00\x53\x00\x00\x00\x5e\x00\x00\x00\x60\x00\x00\x00\xaf\x00\x00\x00\x89\x00\x00\x00\x99\x00\x00\x00\xae\x00\x00\x00\x00\x00\x00\x00\x37\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x3a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--alex_table :: AlexAddr-alex_table = AlexA# "\x00\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\x22\x01\x23\x01\xce\x00\x0e\x00\x10\x00\x79\x00\x1e\x00\x2c\x00\x20\x00\xb7\x00\x52\x01\xcd\x00\xd5\x00\xe0\x00\xe0\x00\xf1\x00\xf1\x00\x01\x01\xd4\x00\x2b\x01\xc2\x00\x0d\x00\xd8\x00\x33\x01\x34\x01\xb3\x00\x25\x01\x26\x01\x31\x01\x2f\x01\x4e\x01\x30\x01\x2a\x01\x32\x01\xea\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\x42\x01\x4f\x01\x37\x01\x43\x01\x39\x01\x41\x01\xe0\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd9\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x27\x01\x01\x01\x28\x01\x3d\x01\xd8\x00\xe0\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x50\x01\x3e\x01\x51\x01\x2c\x01\xff\xff\x0d\x00\x3c\x01\xff\xff\xd4\x00\xd4\x00\xd4\x00\xd4\x00\xd4\x00\x13\x01\x13\x01\x1a\x01\x1a\x01\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x2e\x01\x0d\x00\x46\x01\x00\x00\xd4\x00\xe7\x00\x0d\x01\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x47\x01\x00\x00\x48\x01\x45\x01\x29\x01\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\xe1\x00\xf1\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x3a\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\xc6\x00\x4c\x01\xc6\x00\x2d\x01\xa7\x00\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\xf1\x00\x3f\x01\x4d\x01\x00\x00\x44\x00\x4a\x01\x44\x01\xc8\x00\x3b\x01\xc8\x00\x00\x00\x41\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x35\x01\x38\x01\x49\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\x00\x00\xff\xff\x00\x00\x0c\x01\x3c\x00\x3a\x01\x36\x01\x00\x00\x4b\x01\x00\x00\x00\x00\x00\x00\xde\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\xf8\x00\xe0\x00\x00\x00\xf1\x00\x00\x00\x01\x01\x0d\x01\x3c\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\x3c\x00\x0c\x01\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\xde\x00\xdc\x00\x00\x00\xed\x00\x00\x00\x00\x00\x34\x00\x00\x00\x08\x01\xf2\x00\xe0\x00\xdc\x00\xf1\x00\x3c\x00\x01\x01\x00\x00\x00\x00\xed\x00\x3c\x00\x3c\x00\xe0\x00\xfd\x00\x3c\x00\x3c\x00\x0c\x01\xe3\x00\xf1\x00\x40\x01\x00\x00\x00\x00\x01\x01\x3c\x00\x01\x01\xde\x00\xe8\x00\x3c\x00\xa7\x00\x3c\x00\x42\x00\x3c\x00\x02\x01\x37\x00\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\xe0\x00\xe0\x00\xe0\x00\xfd\x00\xda\x00\xdd\x00\xf1\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x01\x01\xde\x00\xe8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x00\x00\x00\x00\x0d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\xcf\x00\xd5\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3b\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xf4\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\xa7\x00\x0c\x01\xf9\x00\x00\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\x00\x00\x0c\x01\xee\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x3c\x00\x00\x00\x0c\x01\xf9\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x01\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x09\x01\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x3d\x00\x0c\x01\x00\x00\x00\x00\x0c\x01\xda\x00\x00\x00\x00\x00\x00\x00\xde\x00\x0c\x01\x00\x00\x00\x00\x0c\x01\xde\x00\xa7\x00\x00\x00\xfe\x00\x0c\x01\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x09\x01\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\x00\x00\xde\x00\xe0\x00\xe0\x00\x0c\x01\x0c\x01\xe0\x00\xe0\x00\x00\x00\x0c\x01\x0c\x01\x00\x00\x00\x00\x0c\x01\xde\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x00\x00\x00\x00\x0e\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x11\x01\x00\x00\x00\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x00\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3e\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\xd0\x00\xd5\x00\x00\x00\xbe\x00\xd3\x00\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd0\x00\x00\x00\xbd\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\xcf\x00\xd5\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x40\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\xa2\x00\x0c\x01\x00\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\xe0\x00\x00\x00\xdf\x00\x00\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x42\x00\x00\x00\x0c\x01\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x00\x00\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\xd0\x00\xd5\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x00\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x43\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\xd0\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\xa2\x00\xef\x00\x00\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\x0c\x01\x00\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x47\x00\x00\x00\xef\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x01\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x4c\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\xef\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xa2\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x00\xf1\x00\x00\x00\xeb\x00\xf1\x00\xf1\x00\x00\x00\x0c\x01\xf1\x00\xf1\x00\x00\x00\xef\x00\xef\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x00\x00\x00\x00\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x63\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x00\x00\x00\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\xf6\x00\xef\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xa7\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\x68\x00\xf1\x00\xf1\x00\x00\x00\x0c\x01\xf1\x00\xf1\x00\x00\x00\x0c\x01\xf1\x00\xf1\x00\x00\x00\xf0\x00\xef\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa8\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x74\x00\x23\x00\x57\x00\x57\x00\x57\x00\x58\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x00\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x0c\x01\xff\x00\x00\x00\x00\x00\x00\x00\xff\x00\xa2\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x8b\x00\x01\x01\x01\x01\x00\x00\x0c\x01\x01\x01\x01\x01\x00\x00\xfb\x00\x01\x01\x01\x01\x00\x00\x0c\x01\xff\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa3\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x72\x00\x24\x00\x55\x00\x55\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xba\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xb6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb0\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xaa\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xa5\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa9\x00\xa0\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\x96\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x97\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x8c\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x8d\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x88\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x83\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x7e\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x0f\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x11\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x12\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x13\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x14\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x73\x00\x15\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x71\x00\x17\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x16\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x19\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x18\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x1a\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x1b\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x1c\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\x00\x00\x00\x00\xff\xff\xbd\x00\x0c\x01\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\x00\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\xbd\x00\x01\x01\x01\x01\x00\x00\xff\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\xbd\x00\x00\x00\x00\x00\xbd\x00\xbd\x00\x01\x01\x01\x01\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x00\xbd\x00\x00\x00\x00\x00\x00\x00\xbd\x00\xff\x00\xbd\x00\x00\x00\xbd\x00\x00\x00\x7f\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x38\x00\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x32\x00\x31\x00\x31\x00\x31\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x62\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x81\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x86\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x89\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x92\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x93\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x9d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa8\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xae\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb4\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb8\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xbb\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xff\x00\xbf\x00\x00\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x0c\x01\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\xbf\x00\x0c\x01\x00\x00\x00\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\xbf\x00\x0c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\xbf\x00\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\x00\x00\x00\x00\xbf\x00\x00\x00\xbf\x00\x42\x00\xbf\x00\x00\x00\x84\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\x00\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x0c\x01\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x01\x01\x01\x01\x00\x00\x00\x01\x00\x00\xc1\x00\x00\x00\xc0\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x0c\x01\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\xc1\x00\x13\x01\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x13\x01\xc1\x00\x00\x00\xc0\x00\x00\x00\x13\x01\x00\x00\xc1\x00\xc0\x00\xc0\x00\x00\x00\x13\x01\xc0\x00\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x13\x01\xc0\x00\x42\x00\xc0\x00\xc1\x00\x8e\x00\x13\x01\x00\x00\x00\x00\xc1\x00\xc1\x00\x13\x01\x00\x00\xc1\x00\xc1\x00\x00\x00\x00\x00\x13\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\xc1\x00\x00\x00\xc1\x00\x00\x00\x8f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x00\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\xc2\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x1a\x01\xc2\x00\x00\x00\x00\x00\xc3\x00\x1a\x01\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\x1a\x01\x00\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x34\x00\x00\x00\x00\x00\x1a\x01\x00\x00\xc3\x00\x00\x00\xc2\x00\x00\x00\x1a\x01\x00\x00\xc3\x00\xc2\x00\xc2\x00\x1a\x01\x00\x00\xc2\x00\xc2\x00\x00\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x00\xc2\x00\x42\x00\xc2\x00\xc3\x00\x98\x00\x00\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\xc3\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\xc3\x00\x00\x00\xc3\x00\x00\x00\x99\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x0a\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x00\x00\x0a\x00\x00\x00\xa1\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x09\x00\x00\x00\x00\x00\x09\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x09\x00\x00\x00\x09\x00\x00\x00\xa6\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x16\x01\x00\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x08\x00\x05\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x05\x00\x00\x00\x00\x00\x05\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x05\x00\x43\x00\x05\x00\x00\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x88\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x89\x00\x1a\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x67\x00\x29\x00\x4a\x00\x4a\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x00\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xaa\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xaf\x00\xae\x00\x13\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x75\x00\x76\x00\x22\x00\x59\x00\x59\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x43\x00\x01\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x88\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x89\x00\x1a\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x66\x00\x67\x00\x29\x00\x4a\x00\x4a\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xc4\x00\xff\xff\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xc9\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\xe4\x00\xe4\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb0\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb5\x00\xb4\x00\x12\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x77\x00\x78\x00\x21\x00\x5b\x00\x5b\x00\x5b\x00\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x80\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7e\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x81\x00\x1c\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x61\x00\x62\x00\x2b\x00\x45\x00\x45\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\xd8\x00\x00\x00\x24\x01\xad\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x85\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x83\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x86\x00\x1b\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x65\x00\x2a\x00\x48\x00\x48\x00\x48\x00\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x16\x01\xff\xff\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xe9\x00\xc9\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x01\xc7\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\x00\x00\xcb\x00\x16\x01\x00\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xfa\x00\xc7\x00\x00\x00\x00\x00\x00\x00\xe4\x00\xe4\x00\x00\x00\xdb\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\x00\x00\x00\xf3\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x00\x00\x00\x00\x00\x00\xf5\x00\xf5\x00\x00\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8c\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x94\x00\x92\x00\x18\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6a\x00\x6b\x00\x28\x00\x4d\x00\x4d\x00\x4d\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x0a\x01\x00\x00\x00\x00\x05\x01\x05\x01\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8d\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x95\x00\x93\x00\x19\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x69\x00\x6c\x00\x27\x00\x4e\x00\x4e\x00\x4e\x00\x4f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x1f\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x0b\x01\x00\x00\x00\x00\x05\x01\x05\x01\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x96\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9e\x00\x9c\x00\x16\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6e\x00\x6f\x00\x26\x00\x51\x00\x51\x00\x51\x00\x54\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x15\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x1e\x01\xc7\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\xc7\x00\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\xc7\x00\x12\x01\x00\x00\x00\x00\x14\x01\x14\x01\x00\x00\x12\x01\x00\x00\x00\x00\xc7\x00\x12\x01\x12\x01\x00\x00\x14\x01\x14\x01\x00\x00\x12\x01\x12\x01\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x9b\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x97\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9f\x00\x9d\x00\x17\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x6d\x00\x70\x00\x25\x00\x52\x00\x52\x00\x52\x00\x53\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd7\x00\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x17\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\xca\x00\x12\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x18\x01\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x14\x01\x14\x01\x00\x00\x12\x01\xc7\x00\x12\x01\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x12\x01\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x12\x01\x00\x00\x00\x00\x14\x01\x14\x01\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb6\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb9\x00\xb8\x00\x11\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7a\x00\x7b\x00\x1f\x00\x5d\x00\x5d\x00\x5d\x00\x5e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd6\x00\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x1b\x01\x1b\x01\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xba\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbc\x00\xbb\x00\x0f\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7c\x00\x7d\x00\x1d\x00\x5f\x00\x5f\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x1d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x38\x00\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x32\x00\x31\x00\x31\x00\x31\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x39\x00\x38\x00\x33\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2e\x00\x32\x00\x31\x00\x31\x00\x31\x00\x30\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x83\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x87\x00\x86\x00\x1b\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x64\x00\x65\x00\x2a\x00\x48\x00\x48\x00\x48\x00\x49\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--alex_check :: AlexAddr-alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x27\x00\x27\x00\x61\x00\x6d\x00\x67\x00\x65\x00\x61\x00\x72\x00\x64\x00\x6e\x00\x2e\x00\x74\x00\x0a\x00\x4c\x00\x6c\x00\x6c\x00\x4c\x00\x4c\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x55\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x6c\x00\x5d\x00\x5e\x00\x5f\x00\x75\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x0a\x00\x09\x00\x3d\x00\x0d\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x69\x00\x6a\x00\x69\x00\x6a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2d\x00\x20\x00\x3d\x00\xff\xff\x20\x00\x4c\x00\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x3d\x00\xff\xff\x3d\x00\x3d\x00\x3e\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x6c\x00\x55\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2b\x00\x3d\x00\x2d\x00\x2b\x00\x5c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x75\x00\x26\x00\x3d\x00\xff\xff\x69\x00\x3d\x00\x3d\x00\x2b\x00\x3d\x00\x2d\x00\xff\xff\x70\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3c\x00\x3d\x00\x3d\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x22\x00\xff\xff\x0d\x00\xff\xff\x4c\x00\x27\x00\x3d\x00\x3e\x00\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x4c\x00\x55\x00\xff\xff\x55\x00\xff\xff\x55\x00\x27\x00\x3f\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\x45\x00\x6c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x75\x00\x6c\x00\xff\xff\x6c\x00\xff\xff\xff\xff\x55\x00\xff\xff\x4c\x00\x6c\x00\x75\x00\x4c\x00\x75\x00\x5c\x00\x75\x00\xff\xff\xff\xff\x4c\x00\x61\x00\x62\x00\x55\x00\x4c\x00\x65\x00\x66\x00\x4c\x00\x4c\x00\x55\x00\x7c\x00\xff\xff\xff\xff\x55\x00\x6e\x00\x55\x00\x55\x00\x55\x00\x72\x00\x5c\x00\x74\x00\x75\x00\x76\x00\x6c\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x75\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x75\x00\x75\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x4c\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\x55\x00\x55\x00\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x6c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\x75\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x4c\x00\xff\xff\xff\xff\x4c\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\x55\x00\x55\x00\x5c\x00\xff\xff\x6c\x00\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\x6c\x00\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\x75\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x09\x00\x0a\x00\xff\xff\x2e\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\xff\xff\x22\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\x55\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x09\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x20\x00\xff\xff\x22\x00\xff\xff\xff\xff\x4c\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5c\x00\x55\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x75\x00\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x5c\x00\xff\xff\xff\xff\x55\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x5c\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x55\x00\xff\xff\xff\xff\xff\xff\x55\x00\x5c\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\x75\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\x22\x00\x4c\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x3f\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x75\x00\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x55\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\x45\x00\x6c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x55\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\x22\x00\xff\xff\x3f\x00\xff\xff\xff\xff\x27\x00\xff\xff\x75\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x46\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\x4c\x00\x3f\x00\xff\xff\x5c\x00\xff\xff\x51\x00\xff\xff\x45\x00\x61\x00\x62\x00\xff\xff\x57\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x66\x00\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\x6c\x00\xff\xff\xff\xff\x61\x00\x62\x00\x71\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x4c\x00\x3f\x00\xff\xff\xff\xff\x27\x00\x51\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x57\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x66\x00\xff\xff\x3f\x00\xff\xff\x5c\x00\xff\xff\x6c\x00\xff\xff\x45\x00\x61\x00\x62\x00\x71\x00\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\x5c\x00\x78\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\xff\xff\x76\x00\xff\xff\x78\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x00\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x22\x00\x45\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\x00\x75\x00\x76\x00\xff\xff\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\x2e\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\x24\x00\xff\xff\x22\x00\x27\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\x5c\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\x2e\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x45\x00\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\x58\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x65\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x4c\x00\x78\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\x70\x00\xff\xff\xff\xff\xff\xff\x5c\x00\x75\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x22\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x45\x00\x46\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\x57\x00\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\x00\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\x65\x00\x66\x00\x71\x00\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x77\x00\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x57\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\x45\x00\x46\x00\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\x77\x00\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x57\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\xff\xff\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x77\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\x00\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00"#--alex_deflt :: AlexAddr-alex_deflt = AlexA# "\xff\xff\x09\x00\x09\x00\x09\x00\x09\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x09\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x39\x00\x39\x00\x2f\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\xff\xff\x3c\x00\x3c\x00\xff\xff\xff\xff\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x61\x00\xff\xff\x64\x00\x64\x00\x66\x00\x66\x00\xff\xff\x6a\x00\x69\x00\x69\x00\x6a\x00\x6e\x00\x6d\x00\x6d\x00\x6e\x00\x71\x00\x71\x00\x73\x00\x73\x00\x75\x00\x75\x00\x77\x00\x77\x00\x7a\x00\x7a\x00\x7c\x00\x7c\x00\x82\x00\x82\x00\xff\xff\x87\x00\x87\x00\x8a\x00\x8a\x00\xff\xff\x95\x00\x94\x00\x94\x00\x95\x00\x9f\x00\x9e\x00\x9e\x00\x9f\x00\xa4\x00\xa4\x00\xa9\x00\xa9\x00\xaf\x00\xaf\x00\xb5\x00\xb5\x00\xff\xff\xb9\x00\xb9\x00\xbc\x00\xbc\x00\xbd\x00\xff\xff\xff\xff\xbd\x00\xbd\x00\xbf\x00\xff\xff\xff\xff\xbf\x00\xbf\x00\x0c\x00\x0c\x00\x0c\x00\xff\xff\xc0\x00\xc1\x00\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\xc1\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\xc2\x00\xc3\x00\x0a\x00\xff\xff\xff\xff\x0a\x00\x0a\x00\x09\x00\xff\xff\xff\xff\x09\x00\x09\x00\x05\x00\xff\xff\x0c\x00\x05\x00\x05\x00\x05\x00\x01\x00\xff\xff\x0c\x00\x01\x00\x01\x00\x01\x00\xcd\x00\xff\xff\xcd\x00\xcd\x00\xce\x00\xce\x00\xce\x00\xbd\x00\xff\xff\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xcd\x00\xce\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3c\x00\xff\xff\x3c\x00\xff\xff\xff\xff\xbf\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--alex_accept = listArray (0::Int,338) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAcc (alex_action_1),AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_4),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_14),AlexAcc (alex_action_15),AlexAcc (alex_action_15),AlexAcc (alex_action_15),AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_36),AlexAcc (alex_action_37),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_44),AlexAcc (alex_action_45),AlexAcc (alex_action_46),AlexAcc (alex_action_47),AlexAcc (alex_action_48),AlexAcc (alex_action_49),AlexAcc (alex_action_50),AlexAcc (alex_action_51),AlexAcc (alex_action_52),AlexAcc (alex_action_53),AlexAcc (alex_action_54),AlexAcc (alex_action_55),AlexAcc (alex_action_56),AlexAcc (alex_action_57),AlexAcc (alex_action_58),AlexAcc (alex_action_59),AlexAcc (alex_action_60),AlexAcc (alex_action_61),AlexAcc (alex_action_62),AlexAcc (alex_action_63),AlexAcc (alex_action_64),AlexAcc (alex_action_65),AlexAcc (alex_action_66),AlexAcc (alex_action_67)]-{-# LINE 262 "src/Language/C/Parser/Lexer.x" #-}---- Fix the 'octal' lexing of '0'-readCOctal :: String -> Either String CInteger-readCOctal s@('0':r) =- case r of- (c:_) | isDigit c -> readCInteger OctalRepr r- _ -> readCInteger DecRepr s-readCOctal _ = error "ReadOctal: string does not start with `0'"---- We use the odd looking list of string patterns here rather than normal--- string literals since GHC converts the latter into a sequence of string--- comparisons (ie a linear search) but it translates the former using its--- effecient pattern matching which gives us the expected radix-style search.--- This change makes a significant performance difference [chak]------ To make this a little more maintainable, we autogenerate it from this list,--- using the script GenerateKeywords.hs (in /scripts)-{--alignas _Alignas, alignof _Alignof __alignof alignof __alignof__, asm @__, atomic _Atomic, auto-break, bool _Bool,-case, char, const @__, continue, complex _Complex __complex__-default, do, double,-else, enum, extern,-float, for, goto,-if, inline @__, int, __int128, long, noreturn _Noreturn,-float, for,-generic _Generic, goto,-if, inline @__, int, int128 __int128, long,-noreturn _Noreturn, _Nullable __nullable, _Nonnull __nonnull,-register, restrict @__, return-short, signed @__, sizeof, static, staticAssert _Static_assert, struct, switch,-typedef, typeof @__, thread __thread _Thread_local-union, unsigned, void, volatile @__,-while,-label __label__-(CTokGnuC GnuCAttrTok) __attribute __attribute__-(CTokGnuC GnuCExtTok) __extension__-(CTokGnuC GnuCComplexReal) __real __real__-(CTokGnuC GnuCComplexImag) __imag __imag__-(CTokGnuC GnuCVaArg) __builtin_va_arg-(CTokGnuC GnuCOffsetof) __builtin_offsetof-(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p-(CTokClangC ClangBuiltinConvertVector) __builtin_convertvector--}--- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float __float128 _Float128 for _Generic goto if __inline inline __inline__ int __int128 long _Noreturn _Nullable __nullable _Nonnull __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local union unsigned void __volatile volatile __volatile__ while __label__ __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p __builtin_convertvector-idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas-idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof-idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic-idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool-idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex-idkwtok ('_' : 'N' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 8 CTokNonnull-idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric-idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn-idkwtok ('_' : 'N' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 9 CTokNullable-idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert-idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread-idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof-idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof-idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof-idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm-idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm-idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm-idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok)-idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok)-idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto-idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector)-idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase-idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar-idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex-idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst-idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst-idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst-idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue-idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault-idkwtok ('d' : 'o' : []) = tok 2 CTokDo-idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble-idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse-idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum-idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok)-idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern-idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat-idkwtok ('_' : '_' : 'f' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 CTokFloat128-idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 CTokFloat128-idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor-idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto-idkwtok ('i' : 'f' : []) = tok 2 CTokIf-idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag)-idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag)-idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline-idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline-idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline-idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt-idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128-idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel-idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong-idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull-idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable-idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal)-idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal)-idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister-idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict-idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict-idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict-idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn-idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort-idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned-idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned-idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned-idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof-idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic-idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct-idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch-idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread-idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef-idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof-idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof-idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof-idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion-idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned-idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid-idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile-idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile-idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile-idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile--idkwtok cs = \pos -> do- name <- getNewName- let len = case length cs of l -> l- let ident = mkIdent pos cs name- tyident <- isTypeIdent ident- if tyident- then return (CTokTyIdent (pos,len) ident)- else return (CTokIdent (pos,len) ident)--ignoreAttribute :: P ()-ignoreAttribute = skipTokens (0::Int)- where skipTokens :: Int -> P ()- skipTokens n = do- ntok <- lexToken' False- case ntok of- CTokRParen _ | n == 1 -> return ()- | otherwise -> skipTokens (n-1)- CTokLParen _ -> skipTokens (n+1)- _ -> skipTokens n--tok :: Int -> (PosLength -> CToken) -> Position -> P CToken-tok len tc pos = return (tc (pos,len))--adjustLineDirective :: Int -> String -> Position -> Position-adjustLineDirective pragmaLen str pos =- offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent')- where- -- offset changes by length of #line pragma- offs' = (posOffset pos) + pragmaLen- str' = dropWhite . drop 1 $ str- (rowStr, str'') = span isDigit str'- -- row changes to the first number in the line pragma- row' = read rowStr- str''' = dropWhite str''- (fnameStr,str'''') = span (/= '"') . drop 1 $ str'''- fname = posFile pos- no_fn = null str''' || (head str''' /= '"') || (head str'''' /= '"')- -- filename changes to new filename, if specified- fname' | no_fn = fname- -- try and get more sharing of file name strings- | fnameStr == fname = fname- | otherwise = fnameStr- -- analye flags- min_flag = find_min_flag (5 :: Int) (drop 1 str'''')- find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit)- where- select_min (numStr, fstr') | null numStr = cur_min- | otherwise = find_min_flag (read numStr `min` cur_min) fstr'- parent = posParent pos- parent' = case min_flag of- 1 -> Just pos -- push- 2 -> case parent >>= posParent of- Nothing -> Nothing -- pop/underflow- Just gp -> gp `seq` Just gp -- pop- 3 -> parent -- unchanged stack, system header info- 4 -> parent -- unchanged stack, extern C info- _ -> Nothing- --- dropWhite = dropWhile (\c -> c == ' ' || c == '\t')---- special utility for the lexer-unescapeMultiChars :: String -> [Char]-unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'-unescapeMultiChars ('\'' : []) = []-unescapeMultiChars _ = error "Unexpected end of multi-char constant"--{-# INLINE token_ #-}--- token that ignores the string-token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken-token_ len mkTok pos _ _ = return (mkTok (pos,len))--{-# INLINE token_fail #-}--- error token-token_fail :: String -> Position ->- Int -> InputStream -> P CToken-token_fail errmsg pos _ _ = failP pos [ "Lexical Error !", errmsg ]---{-# INLINE token #-}--- token that uses the string-token :: (PosLength -> a -> CToken) -> (String -> a)- -> Position -> Int -> InputStream -> P CToken-token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str))--{-# INLINE token_plus #-}--- token that may fail-token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a)- -> Position -> Int -> InputStream -> P CToken-token_plus mkTok fromStr pos len str =- case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]- Right ok -> return $! mkTok (pos,len) ok---- -------------------------------------------------------------------------------- The input type--type AlexInput = (Position, -- current position,- InputStream) -- current input string--alexInputPrevChar :: AlexInput -> Char-alexInputPrevChar _ = error "alexInputPrevChar not used"---- for alex-3.0-alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)-alexGetByte (p,is) | inputStreamEmpty is = Nothing- | otherwise = let (b,s) = takeByte is in- -- this is safe for latin-1, but ugly- let p' = alexMove p (chr (fromIntegral b)) in p' `seq`- Just (b, (p', s))--alexGetChar :: AlexInput -> Maybe (Char,AlexInput)-alexGetChar (p,is) | inputStreamEmpty is = Nothing- | otherwise = let (c,s) = takeChar is in- let p' = alexMove p c in p' `seq`- Just (c, (p', s))--alexMove :: Position -> Char -> Position-alexMove pos ' ' = incPos pos 1-alexMove pos '\n' = retPos pos-alexMove pos '\r' = incOffset pos 1-alexMove pos _ = incPos pos 1--lexicalError :: P a-lexicalError = do- pos <- getPos- (c,_) <- liftM takeChar getInput- failP pos- ["Lexical error !",- "The character " ++ show c ++ " does not fit here."]--parseError :: P a-parseError = do- lastTok <- getLastToken- failP (posOf lastTok)- ["Syntax error !",- "The symbol `" ++ show lastTok ++ "' does not fit here."]---- there is a problem with ignored tokens here (that aren't skipped)--- consider--- 1 > int x;--- 2 > LINE "ex.c" 4--- 4 > int y;--- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache.--- Now we run--- > action (pos 2,0) 14 "LINE \"ex.c\" 3\n"--- which in turn adjusts the position and then calls lexToken again--- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine)--- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad)--- to resolve this, recursive calls invoke lexToken' False.-lexToken :: P CToken-lexToken = lexToken' True--lexToken' :: Bool -> P CToken-lexToken' modifyCache = do- pos <- getPos- inp <- getInput- case alexScan (pos, inp) 0 of- AlexEOF -> do- handleEofToken- return CTokEof- AlexError _inp -> lexicalError- AlexSkip (pos', inp') _len -> do- setPos pos'- setInput inp'- lexToken' modifyCache- AlexToken (pos', inp') len action -> do- setPos pos'- setInput inp'- nextTok <- action pos len inp- when modifyCache $ setLastToken nextTok- return nextTok--lexC :: (CToken -> P a) -> P a-lexC cont = do- nextTok <- lexToken- cont nextTok--alex_action_1 = \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False -alex_action_4 = \pos len str -> idkwtok (takeChars len str) pos -alex_action_5 = token_plus CTokILit readCOctal -alex_action_6 = token_plus CTokILit (readCInteger DecRepr) -alex_action_7 = token_plus CTokILit (readCInteger HexRepr . drop 2) -alex_action_8 = token_fail "Invalid integer constant suffix" -alex_action_9 = token CTokCLit (cChar . fst . unescapeChar . tail) -alex_action_10 = token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) -alex_action_11 = token CTokCLit (flip cChars False . unescapeMultiChars .tail) -alex_action_12 = token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) -alex_action_13 = token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion -alex_action_14 = token CTokFLit readCFloat -alex_action_15 = token CTokFLit readCFloat -alex_action_16 = token_fail "Hexadecimal floating constant requires an exponent" -alex_action_17 = token CTokSLit (cString . unescapeString . init . tail) -alex_action_18 = token CTokSLit (cString_w . unescapeString . init . tail . tail) -alex_action_19 = token_fail "Universal character names are unsupported" -alex_action_20 = token_fail "Invalid escape sequence" -alex_action_21 = token_fail "Universal character names in string literals are unsupported"-alex_action_22 = token_ 1 CTokLParen -alex_action_23 = token_ 1 CTokRParen -alex_action_24 = token_ 1 CTokLBracket -alex_action_25 = token_ 1 CTokRBracket -alex_action_26 = token_ 2 CTokArrow -alex_action_27 = token_ 1 CTokDot -alex_action_28 = token_ 1 CTokExclam -alex_action_29 = token_ 1 CTokTilde -alex_action_30 = token_ 2 CTokInc -alex_action_31 = token_ 2 CTokDec -alex_action_32 = token_ 1 CTokPlus -alex_action_33 = token_ 1 CTokMinus -alex_action_34 = token_ 1 CTokStar -alex_action_35 = token_ 1 CTokSlash -alex_action_36 = token_ 1 CTokPercent -alex_action_37 = token_ 1 CTokAmper -alex_action_38 = token_ 2 CTokShiftL -alex_action_39 = token_ 2 CTokShiftR -alex_action_40 = token_ 1 CTokLess -alex_action_41 = token_ 2 CTokLessEq -alex_action_42 = token_ 1 CTokHigh -alex_action_43 = token_ 2 CTokHighEq -alex_action_44 = token_ 2 CTokEqual -alex_action_45 = token_ 2 CTokUnequal -alex_action_46 = token_ 1 CTokHat -alex_action_47 = token_ 1 CTokBar -alex_action_48 = token_ 2 CTokAnd -alex_action_49 = token_ 2 CTokOr -alex_action_50 = token_ 1 CTokQuest -alex_action_51 = token_ 1 CTokColon -alex_action_52 = token_ 1 CTokAssign -alex_action_53 = token_ 2 CTokPlusAss -alex_action_54 = token_ 2 CTokMinusAss -alex_action_55 = token_ 2 CTokStarAss -alex_action_56 = token_ 2 CTokSlashAss -alex_action_57 = token_ 2 CTokPercAss -alex_action_58 = token_ 2 CTokAmpAss -alex_action_59 = token_ 2 CTokHatAss -alex_action_60 = token_ 2 CTokBarAss -alex_action_61 = token_ 3 CTokSLAss -alex_action_62 = token_ 3 CTokSRAss -alex_action_63 = token_ 1 CTokComma -alex_action_64 = token_ 1 CTokSemic -alex_action_65 = token_ 1 CTokLBrace -alex_action_66 = token_ 1 CTokRBrace -alex_action_67 = token_ 3 CTokEllipsis -{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command-line>" #-}-{-# LINE 8 "<command-line>" #-}-# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4--------------------------------------------{-# LINE 8 "<command-line>" #-}-{-# LINE 1 "/usr/lib/ghc-7.10.3/include/ghcversion.h" #-}------------------{-# LINE 8 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- -------------------------------------------------------------------------------- ALEX TEMPLATE------ This code is in the PUBLIC DOMAIN; you may copy it freely and use--- it for any purpose whatsoever.---- -------------------------------------------------------------------------------- INTERNALS and main scanner engine--{-# LINE 21 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define GTE(n,m) (tagToEnum# (n >=# m))-#define EQ(n,m) (tagToEnum# (n ==# m))-#else-#define GTE(n,m) (n >=# m)-#define EQ(n,m) (n ==# m)-#endif-{-# LINE 51 "templates/GenericTemplate.hs" #-}---data AlexAddr = AlexA# Addr#--- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ < 503-uncheckedShiftL# = shiftL#-#endif--{-# INLINE alexIndexInt16OffAddr #-}-alexIndexInt16OffAddr (AlexA# arr) off =-#ifdef WORDS_BIGENDIAN- narrow16Int# i- where- i = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)- high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))- low = int2Word# (ord# (indexCharOffAddr# arr off'))- off' = off *# 2#-#else- indexInt16OffAddr# arr off-#endif------{-# INLINE alexIndexInt32OffAddr #-}-alexIndexInt32OffAddr (AlexA# arr) off = -#ifdef WORDS_BIGENDIAN- narrow32Int# i- where- i = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`- (b2 `uncheckedShiftL#` 16#) `or#`- (b1 `uncheckedShiftL#` 8#) `or#` b0)- b3 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))- b2 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))- b1 = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))- b0 = int2Word# (ord# (indexCharOffAddr# arr off'))- off' = off *# 4#-#else- indexInt32OffAddr# arr off-#endif-------#if __GLASGOW_HASKELL__ < 503-quickIndex arr i = arr ! i-#else--- GHC >= 503, unsafeAt is available from Data.Array.Base.-quickIndex = unsafeAt-#endif------- -------------------------------------------------------------------------------- Main lexing routines--data AlexReturn a- = AlexEOF- | AlexError !AlexInput- | AlexSkip !AlexInput !Int- | AlexToken !AlexInput !Int a---- alexScan :: AlexInput -> StartCode -> AlexReturn a-alexScan input (I# (sc))- = alexScanUser undefined input (I# (sc))--alexScanUser user input (I# (sc))- = case alex_scan_tkn user input 0# input sc AlexNone of- (AlexNone, input') ->- case alexGetByte input of- Nothing -> ---- AlexEOF- Just _ ->---- AlexError input'-- (AlexLastSkip input'' len, _) ->---- AlexSkip input'' len-- (AlexLastAcc k input''' len, _) ->---- AlexToken input''' len k----- Push the input through the DFA, remembering the most recent accepting--- state it encountered.--alex_scan_tkn user orig_input len input s last_acc =- input `seq` -- strict in the input- let - new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))- in- new_acc `seq`- case alexGetByte input of- Nothing -> (new_acc, input)- Just (c, new_input) -> ---- case fromIntegral c of { (I# (ord_c)) ->- let- base = alexIndexInt32OffAddr alex_base s- offset = (base +# ord_c)- check = alexIndexInt16OffAddr alex_check offset- - new_s = if GTE(offset,0#) && EQ(check,ord_c)- then alexIndexInt16OffAddr alex_table offset- else alexIndexInt16OffAddr alex_deflt s- in- case new_s of- -1# -> (new_acc, input)- -- on an error, we want to keep the input *before* the- -- character that failed, not after.- _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)- -- note that the length is increased ONLY if this is the 1st byte in a char encoding)- new_input new_s new_acc- }- where- check_accs (AlexAccNone) = last_acc- check_accs (AlexAcc a ) = AlexLastAcc a input (I# (len))- check_accs (AlexAccSkip) = AlexLastSkip input (I# (len))-{-# LINE 198 "templates/GenericTemplate.hs" #-}--data AlexLastAcc a- = AlexNone- | AlexLastAcc a !AlexInput !Int- | AlexLastSkip !AlexInput !Int--instance Functor AlexLastAcc where- fmap _ AlexNone = AlexNone- fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z- fmap _ (AlexLastSkip x y) = AlexLastSkip x y--data AlexAcc a user- = AlexAccNone- | AlexAcc a- | AlexAccSkip
− dist/build/Language/C/Parser/Parser.hs
@@ -1,6710 +0,0 @@-{-# OPTIONS_GHC -w #-}-{-# OPTIONS -fglasgow-exts -cpp #-}-module Language.C.Parser.Parser (- -- * Parse a C translation unit- parseC,- -- * Exposed Parsers- translUnitP, extDeclP, statementP, expressionP-) where---- Relevant C99 sections:------ 6.5 Expressions .1 - .17 and 6.6 (almost literally)--- Supported GNU extensions:--- - Allow a compound statement as an expression--- - Various __builtin_* forms that take type parameters--- - `alignof' expression or type--- - `__extension__' to suppress warnings about extensions--- - Allow taking address of a label with: && label--- - Omitting the `then' part of conditional expressions--- - complex numbers------ 6.7 C Declarations .1 -.8--- Supported GNU extensions:--- - '__thread' thread local storage (6.7.1)------ 6.8 Statements .1 - .8--- Supported GNU extensions:--- - case ranges (C99 6.8.1)--- - '__label__ ident;' declarations (C99 6.8.2)--- - computed gotos (C99 6.8.6)------ 6.9 Translation unit--- Supported GNU extensions:--- - allow empty translation_unit--- - allow redundant ';'--- - allow extension keyword before external declaration--- - asm definitions------ Since some of the grammar productions are quite difficult to read,--- (especially those involved with the decleration syntax) we document them--- with an extended syntax that allows a more consise representation:------ Ordinary rules------ foo named terminal or non-terminal------ 'c' terminal, literal character token------ A B concatenation------ A | B alternation------ (A) grouping------ Extended rules------ A? optional, short hand for (A|) or [A]{ 0==A || 1==A }------ ... stands for some part of the grammar omitted for clarity------ {A} represents sequences, 0 or more.------ <permute> modifier which states that any permutation of the immediate subterms is valid---------- TODO ---------------------------------------------------------------------------- !* We ignore C11 _Atomic type annotations--- !* We ignore the C99 static keyword (see C99 6.7.5.3)--- !* We do not distinguish in the AST between incomplete array types and--- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)--- !* The AST doesn't allow recording __attribute__ of unnamed struct field--- (see , struct_default_declaring_list, struct_identifier_declarator)--- !* see `We're being far to liberal here' (... struct definition within structs)--- * Documentation isn't complete and consistent yet.--import Prelude hiding (reverse)-import qualified Data.List as List-import Control.Monad (mplus)-import Language.C.Parser.Builtin (builtinTypeNames)-import Language.C.Parser.Lexer (lexC, parseError)-import Language.C.Parser.Tokens (CToken(..), GnuCTok(..), ClangCTok (..), posLenOfTok)-import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition,- enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..))--import Language.C.Data.RList-import Language.C.Data.InputStream-import Language.C.Data.Ident-import Language.C.Data.Name-import Language.C.Data.Node-import Language.C.Data.Position-import Language.C.Syntax-import qualified Data.Array as Happy_Data_Array-import qualified GHC.Exts as Happy_GHC_Exts-import Control.Applicative(Applicative(..))---- parser produced by Happy Version 1.19.4--newtype HappyAbsSyn = HappyAbsSyn HappyAny-#if __GLASGOW_HASKELL__ >= 607-type HappyAny = Happy_GHC_Exts.Any-#else-type HappyAny = forall a . a-#endif-happyIn7 :: (CTranslUnit) -> (HappyAbsSyn )-happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn7 #-}-happyOut7 :: (HappyAbsSyn ) -> (CTranslUnit)-happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut7 #-}-happyIn8 :: (Reversed [CExtDecl]) -> (HappyAbsSyn )-happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn8 #-}-happyOut8 :: (HappyAbsSyn ) -> (Reversed [CExtDecl])-happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut8 #-}-happyIn9 :: (CExtDecl) -> (HappyAbsSyn )-happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn9 #-}-happyOut9 :: (HappyAbsSyn ) -> (CExtDecl)-happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut9 #-}-happyIn10 :: (CFunDef) -> (HappyAbsSyn )-happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn10 #-}-happyOut10 :: (HappyAbsSyn ) -> (CFunDef)-happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut10 #-}-happyIn11 :: (CDeclr) -> (HappyAbsSyn )-happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn11 #-}-happyOut11 :: (HappyAbsSyn ) -> (CDeclr)-happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut11 #-}-happyIn12 :: (CStat) -> (HappyAbsSyn )-happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn12 #-}-happyOut12 :: (HappyAbsSyn ) -> (CStat)-happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut12 #-}-happyIn13 :: (CStat) -> (HappyAbsSyn )-happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn13 #-}-happyOut13 :: (HappyAbsSyn ) -> (CStat)-happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut13 #-}-happyIn14 :: (CStat) -> (HappyAbsSyn )-happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn14 #-}-happyOut14 :: (HappyAbsSyn ) -> (CStat)-happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut14 #-}-happyIn15 :: (()) -> (HappyAbsSyn )-happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn15 #-}-happyOut15 :: (HappyAbsSyn ) -> (())-happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut15 #-}-happyIn16 :: (()) -> (HappyAbsSyn )-happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn16 #-}-happyOut16 :: (HappyAbsSyn ) -> (())-happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut16 #-}-happyIn17 :: (Reversed [CBlockItem]) -> (HappyAbsSyn )-happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn17 #-}-happyOut17 :: (HappyAbsSyn ) -> (Reversed [CBlockItem])-happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut17 #-}-happyIn18 :: (CBlockItem) -> (HappyAbsSyn )-happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn18 #-}-happyOut18 :: (HappyAbsSyn ) -> (CBlockItem)-happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut18 #-}-happyIn19 :: (CBlockItem) -> (HappyAbsSyn )-happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn19 #-}-happyOut19 :: (HappyAbsSyn ) -> (CBlockItem)-happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut19 #-}-happyIn20 :: (CFunDef) -> (HappyAbsSyn )-happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn20 #-}-happyOut20 :: (HappyAbsSyn ) -> (CFunDef)-happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut20 #-}-happyIn21 :: (Reversed [Ident]) -> (HappyAbsSyn )-happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn21 #-}-happyOut21 :: (HappyAbsSyn ) -> (Reversed [Ident])-happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut21 #-}-happyIn22 :: (CStat) -> (HappyAbsSyn )-happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn22 #-}-happyOut22 :: (HappyAbsSyn ) -> (CStat)-happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut22 #-}-happyIn23 :: (CStat) -> (HappyAbsSyn )-happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn23 #-}-happyOut23 :: (HappyAbsSyn ) -> (CStat)-happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut23 #-}-happyIn24 :: (CStat) -> (HappyAbsSyn )-happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn24 #-}-happyOut24 :: (HappyAbsSyn ) -> (CStat)-happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut24 #-}-happyIn25 :: (CStat) -> (HappyAbsSyn )-happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn25 #-}-happyOut25 :: (HappyAbsSyn ) -> (CStat)-happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut25 #-}-happyIn26 :: (CAsmStmt) -> (HappyAbsSyn )-happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn26 #-}-happyOut26 :: (HappyAbsSyn ) -> (CAsmStmt)-happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut26 #-}-happyIn27 :: (Maybe CTypeQual) -> (HappyAbsSyn )-happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn27 #-}-happyOut27 :: (HappyAbsSyn ) -> (Maybe CTypeQual)-happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut27 #-}-happyIn28 :: ([CAsmOperand]) -> (HappyAbsSyn )-happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn28 #-}-happyOut28 :: (HappyAbsSyn ) -> ([CAsmOperand])-happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut28 #-}-happyIn29 :: (Reversed [CAsmOperand]) -> (HappyAbsSyn )-happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn29 #-}-happyOut29 :: (HappyAbsSyn ) -> (Reversed [CAsmOperand])-happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut29 #-}-happyIn30 :: (CAsmOperand) -> (HappyAbsSyn )-happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn30 #-}-happyOut30 :: (HappyAbsSyn ) -> (CAsmOperand)-happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut30 #-}-happyIn31 :: (Reversed [CStrLit]) -> (HappyAbsSyn )-happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn31 #-}-happyOut31 :: (HappyAbsSyn ) -> (Reversed [CStrLit])-happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut31 #-}-happyIn32 :: (CDecl) -> (HappyAbsSyn )-happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn32 #-}-happyOut32 :: (HappyAbsSyn ) -> (CDecl)-happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut32 #-}-happyIn33 :: (Reversed [CDecl]) -> (HappyAbsSyn )-happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn33 #-}-happyOut33 :: (HappyAbsSyn ) -> (Reversed [CDecl])-happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut33 #-}-happyIn34 :: (CDecl) -> (HappyAbsSyn )-happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn34 #-}-happyOut34 :: (HappyAbsSyn ) -> (CDecl)-happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut34 #-}-happyIn35 :: ((Maybe CStrLit, [CAttr])) -> (HappyAbsSyn )-happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn35 #-}-happyOut35 :: (HappyAbsSyn ) -> ((Maybe CStrLit, [CAttr]))-happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut35 #-}-happyIn36 :: (CDecl) -> (HappyAbsSyn )-happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn36 #-}-happyOut36 :: (HappyAbsSyn ) -> (CDecl)-happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut36 #-}-happyIn37 :: ([CDeclSpec]) -> (HappyAbsSyn )-happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn37 #-}-happyOut37 :: (HappyAbsSyn ) -> ([CDeclSpec])-happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut37 #-}-happyIn38 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn38 #-}-happyOut38 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut38 #-}-happyIn39 :: (CDeclSpec) -> (HappyAbsSyn )-happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn39 #-}-happyOut39 :: (HappyAbsSyn ) -> (CDeclSpec)-happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut39 #-}-happyIn40 :: (CDeclSpec) -> (HappyAbsSyn )-happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn40 #-}-happyOut40 :: (HappyAbsSyn ) -> (CDeclSpec)-happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut40 #-}-happyIn41 :: (CStorageSpec) -> (HappyAbsSyn )-happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn41 #-}-happyOut41 :: (HappyAbsSyn ) -> (CStorageSpec)-happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut41 #-}-happyIn42 :: (CFunSpec) -> (HappyAbsSyn )-happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn42 #-}-happyOut42 :: (HappyAbsSyn ) -> (CFunSpec)-happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut42 #-}-happyIn43 :: (CAlignSpec) -> (HappyAbsSyn )-happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn43 #-}-happyOut43 :: (HappyAbsSyn ) -> (CAlignSpec)-happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut43 #-}-happyIn44 :: ([CDeclSpec]) -> (HappyAbsSyn )-happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn44 #-}-happyOut44 :: (HappyAbsSyn ) -> ([CDeclSpec])-happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut44 #-}-happyIn45 :: (CTypeSpec) -> (HappyAbsSyn )-happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn45 #-}-happyOut45 :: (HappyAbsSyn ) -> (CTypeSpec)-happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut45 #-}-happyIn46 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn46 #-}-happyOut46 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut46 #-}-happyIn47 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn47 #-}-happyOut47 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut47 #-}-happyIn48 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn48 #-}-happyOut48 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut48 #-}-happyIn49 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn49 #-}-happyOut49 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut49 #-}-happyIn50 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn50 #-}-happyOut50 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut50 #-}-happyIn51 :: (Reversed [CDeclSpec]) -> (HappyAbsSyn )-happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn51 #-}-happyOut51 :: (HappyAbsSyn ) -> (Reversed [CDeclSpec])-happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut51 #-}-happyIn52 :: (CTypeSpec) -> (HappyAbsSyn )-happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn52 #-}-happyOut52 :: (HappyAbsSyn ) -> (CTypeSpec)-happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut52 #-}-happyIn53 :: (CStructUnion) -> (HappyAbsSyn )-happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn53 #-}-happyOut53 :: (HappyAbsSyn ) -> (CStructUnion)-happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut53 #-}-happyIn54 :: (Located CStructTag) -> (HappyAbsSyn )-happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn54 #-}-happyOut54 :: (HappyAbsSyn ) -> (Located CStructTag)-happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut54 #-}-happyIn55 :: (Reversed [CDecl]) -> (HappyAbsSyn )-happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn55 #-}-happyOut55 :: (HappyAbsSyn ) -> (Reversed [CDecl])-happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut55 #-}-happyIn56 :: (CDecl) -> (HappyAbsSyn )-happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn56 #-}-happyOut56 :: (HappyAbsSyn ) -> (CDecl)-happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut56 #-}-happyIn57 :: (CDecl) -> (HappyAbsSyn )-happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn57 #-}-happyOut57 :: (HappyAbsSyn ) -> (CDecl)-happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut57 #-}-happyIn58 :: (CDecl) -> (HappyAbsSyn )-happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn58 #-}-happyOut58 :: (HappyAbsSyn ) -> (CDecl)-happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut58 #-}-happyIn59 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )-happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn59 #-}-happyOut59 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))-happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut59 #-}-happyIn60 :: ((Maybe CDeclr, Maybe CExpr)) -> (HappyAbsSyn )-happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn60 #-}-happyOut60 :: (HappyAbsSyn ) -> ((Maybe CDeclr, Maybe CExpr))-happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut60 #-}-happyIn61 :: (CEnum) -> (HappyAbsSyn )-happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn61 #-}-happyOut61 :: (HappyAbsSyn ) -> (CEnum)-happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut61 #-}-happyIn62 :: (Reversed [(Ident, Maybe CExpr)]) -> (HappyAbsSyn )-happyIn62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn62 #-}-happyOut62 :: (HappyAbsSyn ) -> (Reversed [(Ident, Maybe CExpr)])-happyOut62 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut62 #-}-happyIn63 :: ((Ident, Maybe CExpr)) -> (HappyAbsSyn )-happyIn63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn63 #-}-happyOut63 :: (HappyAbsSyn ) -> ((Ident, Maybe CExpr))-happyOut63 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut63 #-}-happyIn64 :: (CTypeQual) -> (HappyAbsSyn )-happyIn64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn64 #-}-happyOut64 :: (HappyAbsSyn ) -> (CTypeQual)-happyOut64 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut64 #-}-happyIn65 :: (Reversed [CTypeQual]) -> (HappyAbsSyn )-happyIn65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn65 #-}-happyOut65 :: (HappyAbsSyn ) -> (Reversed [CTypeQual])-happyOut65 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut65 #-}-happyIn66 :: (CDeclrR) -> (HappyAbsSyn )-happyIn66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn66 #-}-happyOut66 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut66 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut66 #-}-happyIn67 :: (Maybe CStrLit) -> (HappyAbsSyn )-happyIn67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn67 #-}-happyOut67 :: (HappyAbsSyn ) -> (Maybe CStrLit)-happyOut67 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut67 #-}-happyIn68 :: (CDeclrR) -> (HappyAbsSyn )-happyIn68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn68 #-}-happyOut68 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut68 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut68 #-}-happyIn69 :: (CDeclrR) -> (HappyAbsSyn )-happyIn69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn69 #-}-happyOut69 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut69 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut69 #-}-happyIn70 :: (CDeclrR) -> (HappyAbsSyn )-happyIn70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn70 #-}-happyOut70 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut70 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut70 #-}-happyIn71 :: (CDeclrR) -> (HappyAbsSyn )-happyIn71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn71 #-}-happyOut71 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut71 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut71 #-}-happyIn72 :: (CDeclrR) -> (HappyAbsSyn )-happyIn72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn72 #-}-happyOut72 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut72 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut72 #-}-happyIn73 :: (CDeclrR) -> (HappyAbsSyn )-happyIn73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn73 #-}-happyOut73 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut73 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut73 #-}-happyIn74 :: (CDeclrR) -> (HappyAbsSyn )-happyIn74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn74 #-}-happyOut74 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut74 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut74 #-}-happyIn75 :: (CDeclrR) -> (HappyAbsSyn )-happyIn75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn75 #-}-happyOut75 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut75 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut75 #-}-happyIn76 :: (CDeclrR) -> (HappyAbsSyn )-happyIn76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn76 #-}-happyOut76 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut76 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut76 #-}-happyIn77 :: (CDeclrR) -> (HappyAbsSyn )-happyIn77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn77 #-}-happyOut77 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut77 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut77 #-}-happyIn78 :: (CDeclrR) -> (HappyAbsSyn )-happyIn78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn78 #-}-happyOut78 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut78 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut78 #-}-happyIn79 :: (CDeclr) -> (HappyAbsSyn )-happyIn79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn79 #-}-happyOut79 :: (HappyAbsSyn ) -> (CDeclr)-happyOut79 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut79 #-}-happyIn80 :: (CDeclrR) -> (HappyAbsSyn )-happyIn80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn80 #-}-happyOut80 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut80 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut80 #-}-happyIn81 :: (CDeclrR) -> (HappyAbsSyn )-happyIn81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn81 #-}-happyOut81 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut81 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut81 #-}-happyIn82 :: (([CDecl], Bool)) -> (HappyAbsSyn )-happyIn82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn82 #-}-happyOut82 :: (HappyAbsSyn ) -> (([CDecl], Bool))-happyOut82 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut82 #-}-happyIn83 :: (Reversed [CDecl]) -> (HappyAbsSyn )-happyIn83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn83 #-}-happyOut83 :: (HappyAbsSyn ) -> (Reversed [CDecl])-happyOut83 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut83 #-}-happyIn84 :: (CDecl) -> (HappyAbsSyn )-happyIn84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn84 #-}-happyOut84 :: (HappyAbsSyn ) -> (CDecl)-happyOut84 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut84 #-}-happyIn85 :: (Reversed [Ident]) -> (HappyAbsSyn )-happyIn85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn85 #-}-happyOut85 :: (HappyAbsSyn ) -> (Reversed [Ident])-happyOut85 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut85 #-}-happyIn86 :: (CDecl) -> (HappyAbsSyn )-happyIn86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn86 #-}-happyOut86 :: (HappyAbsSyn ) -> (CDecl)-happyOut86 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut86 #-}-happyIn87 :: (CDeclrR) -> (HappyAbsSyn )-happyIn87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn87 #-}-happyOut87 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut87 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut87 #-}-happyIn88 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )-happyIn88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn88 #-}-happyOut88 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)-happyOut88 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut88 #-}-happyIn89 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )-happyIn89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn89 #-}-happyOut89 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)-happyOut89 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut89 #-}-happyIn90 :: (CDeclrR -> CDeclrR) -> (HappyAbsSyn )-happyIn90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn90 #-}-happyOut90 :: (HappyAbsSyn ) -> (CDeclrR -> CDeclrR)-happyOut90 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut90 #-}-happyIn91 :: (CDeclrR) -> (HappyAbsSyn )-happyIn91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn91 #-}-happyOut91 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut91 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut91 #-}-happyIn92 :: (CDeclrR) -> (HappyAbsSyn )-happyIn92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn92 #-}-happyOut92 :: (HappyAbsSyn ) -> (CDeclrR)-happyOut92 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut92 #-}-happyIn93 :: (CInit) -> (HappyAbsSyn )-happyIn93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn93 #-}-happyOut93 :: (HappyAbsSyn ) -> (CInit)-happyOut93 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut93 #-}-happyIn94 :: (Maybe CInit) -> (HappyAbsSyn )-happyIn94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn94 #-}-happyOut94 :: (HappyAbsSyn ) -> (Maybe CInit)-happyOut94 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut94 #-}-happyIn95 :: (Reversed CInitList) -> (HappyAbsSyn )-happyIn95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn95 #-}-happyOut95 :: (HappyAbsSyn ) -> (Reversed CInitList)-happyOut95 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut95 #-}-happyIn96 :: ([CDesignator]) -> (HappyAbsSyn )-happyIn96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn96 #-}-happyOut96 :: (HappyAbsSyn ) -> ([CDesignator])-happyOut96 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut96 #-}-happyIn97 :: (Reversed [CDesignator]) -> (HappyAbsSyn )-happyIn97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn97 #-}-happyOut97 :: (HappyAbsSyn ) -> (Reversed [CDesignator])-happyOut97 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut97 #-}-happyIn98 :: (CDesignator) -> (HappyAbsSyn )-happyIn98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn98 #-}-happyOut98 :: (HappyAbsSyn ) -> (CDesignator)-happyOut98 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut98 #-}-happyIn99 :: (CDesignator) -> (HappyAbsSyn )-happyIn99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn99 #-}-happyOut99 :: (HappyAbsSyn ) -> (CDesignator)-happyOut99 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut99 #-}-happyIn100 :: (CExpr) -> (HappyAbsSyn )-happyIn100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn100 #-}-happyOut100 :: (HappyAbsSyn ) -> (CExpr)-happyOut100 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut100 #-}-happyIn101 :: (Reversed [(Maybe CDecl, CExpr)]) -> (HappyAbsSyn )-happyIn101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn101 #-}-happyOut101 :: (HappyAbsSyn ) -> (Reversed [(Maybe CDecl, CExpr)])-happyOut101 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut101 #-}-happyIn102 :: ((Maybe CDecl, CExpr)) -> (HappyAbsSyn )-happyIn102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn102 #-}-happyOut102 :: (HappyAbsSyn ) -> ((Maybe CDecl, CExpr))-happyOut102 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut102 #-}-happyIn103 :: (Reversed [CDesignator]) -> (HappyAbsSyn )-happyIn103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn103 #-}-happyOut103 :: (HappyAbsSyn ) -> (Reversed [CDesignator])-happyOut103 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut103 #-}-happyIn104 :: (CExpr) -> (HappyAbsSyn )-happyIn104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn104 #-}-happyOut104 :: (HappyAbsSyn ) -> (CExpr)-happyOut104 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut104 #-}-happyIn105 :: (Reversed [CExpr]) -> (HappyAbsSyn )-happyIn105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn105 #-}-happyOut105 :: (HappyAbsSyn ) -> (Reversed [CExpr])-happyOut105 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut105 #-}-happyIn106 :: (CExpr) -> (HappyAbsSyn )-happyIn106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn106 #-}-happyOut106 :: (HappyAbsSyn ) -> (CExpr)-happyOut106 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut106 #-}-happyIn107 :: (Located CUnaryOp) -> (HappyAbsSyn )-happyIn107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn107 #-}-happyOut107 :: (HappyAbsSyn ) -> (Located CUnaryOp)-happyOut107 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut107 #-}-happyIn108 :: (CExpr) -> (HappyAbsSyn )-happyIn108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn108 #-}-happyOut108 :: (HappyAbsSyn ) -> (CExpr)-happyOut108 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut108 #-}-happyIn109 :: (CExpr) -> (HappyAbsSyn )-happyIn109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn109 #-}-happyOut109 :: (HappyAbsSyn ) -> (CExpr)-happyOut109 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut109 #-}-happyIn110 :: (CExpr) -> (HappyAbsSyn )-happyIn110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn110 #-}-happyOut110 :: (HappyAbsSyn ) -> (CExpr)-happyOut110 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut110 #-}-happyIn111 :: (CExpr) -> (HappyAbsSyn )-happyIn111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn111 #-}-happyOut111 :: (HappyAbsSyn ) -> (CExpr)-happyOut111 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut111 #-}-happyIn112 :: (CExpr) -> (HappyAbsSyn )-happyIn112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn112 #-}-happyOut112 :: (HappyAbsSyn ) -> (CExpr)-happyOut112 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut112 #-}-happyIn113 :: (CExpr) -> (HappyAbsSyn )-happyIn113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn113 #-}-happyOut113 :: (HappyAbsSyn ) -> (CExpr)-happyOut113 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut113 #-}-happyIn114 :: (CExpr) -> (HappyAbsSyn )-happyIn114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn114 #-}-happyOut114 :: (HappyAbsSyn ) -> (CExpr)-happyOut114 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut114 #-}-happyIn115 :: (CExpr) -> (HappyAbsSyn )-happyIn115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn115 #-}-happyOut115 :: (HappyAbsSyn ) -> (CExpr)-happyOut115 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut115 #-}-happyIn116 :: (CExpr) -> (HappyAbsSyn )-happyIn116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn116 #-}-happyOut116 :: (HappyAbsSyn ) -> (CExpr)-happyOut116 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut116 #-}-happyIn117 :: (CExpr) -> (HappyAbsSyn )-happyIn117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn117 #-}-happyOut117 :: (HappyAbsSyn ) -> (CExpr)-happyOut117 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut117 #-}-happyIn118 :: (CExpr) -> (HappyAbsSyn )-happyIn118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn118 #-}-happyOut118 :: (HappyAbsSyn ) -> (CExpr)-happyOut118 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut118 #-}-happyIn119 :: (CExpr) -> (HappyAbsSyn )-happyIn119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn119 #-}-happyOut119 :: (HappyAbsSyn ) -> (CExpr)-happyOut119 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut119 #-}-happyIn120 :: (CExpr) -> (HappyAbsSyn )-happyIn120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn120 #-}-happyOut120 :: (HappyAbsSyn ) -> (CExpr)-happyOut120 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut120 #-}-happyIn121 :: (Located CAssignOp) -> (HappyAbsSyn )-happyIn121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn121 #-}-happyOut121 :: (HappyAbsSyn ) -> (Located CAssignOp)-happyOut121 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut121 #-}-happyIn122 :: (CExpr) -> (HappyAbsSyn )-happyIn122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn122 #-}-happyOut122 :: (HappyAbsSyn ) -> (CExpr)-happyOut122 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut122 #-}-happyIn123 :: (Reversed [CExpr]) -> (HappyAbsSyn )-happyIn123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn123 #-}-happyOut123 :: (HappyAbsSyn ) -> (Reversed [CExpr])-happyOut123 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut123 #-}-happyIn124 :: (Maybe CExpr) -> (HappyAbsSyn )-happyIn124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn124 #-}-happyOut124 :: (HappyAbsSyn ) -> (Maybe CExpr)-happyOut124 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut124 #-}-happyIn125 :: (Maybe CExpr) -> (HappyAbsSyn )-happyIn125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn125 #-}-happyOut125 :: (HappyAbsSyn ) -> (Maybe CExpr)-happyOut125 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut125 #-}-happyIn126 :: (CExpr) -> (HappyAbsSyn )-happyIn126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn126 #-}-happyOut126 :: (HappyAbsSyn ) -> (CExpr)-happyOut126 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut126 #-}-happyIn127 :: (CConst) -> (HappyAbsSyn )-happyIn127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn127 #-}-happyOut127 :: (HappyAbsSyn ) -> (CConst)-happyOut127 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut127 #-}-happyIn128 :: (CStrLit) -> (HappyAbsSyn )-happyIn128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn128 #-}-happyOut128 :: (HappyAbsSyn ) -> (CStrLit)-happyOut128 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut128 #-}-happyIn129 :: (Reversed [CString]) -> (HappyAbsSyn )-happyIn129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn129 #-}-happyOut129 :: (HappyAbsSyn ) -> (Reversed [CString])-happyOut129 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut129 #-}-happyIn130 :: (ClangCVersion) -> (HappyAbsSyn )-happyIn130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn130 #-}-happyOut130 :: (HappyAbsSyn ) -> (ClangCVersion)-happyOut130 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut130 #-}-happyIn131 :: (Ident) -> (HappyAbsSyn )-happyIn131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn131 #-}-happyOut131 :: (HappyAbsSyn ) -> (Ident)-happyOut131 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut131 #-}-happyIn132 :: ([CAttr]) -> (HappyAbsSyn )-happyIn132 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn132 #-}-happyOut132 :: (HappyAbsSyn ) -> ([CAttr])-happyOut132 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut132 #-}-happyIn133 :: ([CAttr]) -> (HappyAbsSyn )-happyIn133 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn133 #-}-happyOut133 :: (HappyAbsSyn ) -> ([CAttr])-happyOut133 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut133 #-}-happyIn134 :: ([CAttr]) -> (HappyAbsSyn )-happyIn134 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn134 #-}-happyOut134 :: (HappyAbsSyn ) -> ([CAttr])-happyOut134 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut134 #-}-happyIn135 :: (Reversed [CAttr]) -> (HappyAbsSyn )-happyIn135 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn135 #-}-happyOut135 :: (HappyAbsSyn ) -> (Reversed [CAttr])-happyOut135 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut135 #-}-happyIn136 :: (Maybe CAttr) -> (HappyAbsSyn )-happyIn136 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn136 #-}-happyOut136 :: (HappyAbsSyn ) -> (Maybe CAttr)-happyOut136 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut136 #-}-happyIn137 :: (Reversed [CExpr]) -> (HappyAbsSyn )-happyIn137 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyIn137 #-}-happyOut137 :: (HappyAbsSyn ) -> (Reversed [CExpr])-happyOut137 x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOut137 #-}-happyInTok :: (CToken) -> (HappyAbsSyn )-happyInTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyInTok #-}-happyOutTok :: (HappyAbsSyn ) -> (CToken)-happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x-{-# INLINE happyOutTok #-}---happyActOffsets :: HappyAddr-happyActOffsets = HappyA# "\x00\x00\xa9\x0a\x16\x0a\x9c\x0f\x00\x00\x42\x07\x00\x00\x76\x04\xe0\x25\x9c\x0f\x00\x00\xe0\x09\xdd\x05\xad\x05\xa9\x03\x5f\x05\xc8\x08\xbe\x08\xb5\x08\xb3\x08\xf4\x04\x00\x00\x91\x08\x42\x08\x00\x00\x00\x00\x38\x09\x00\x00\x00\x00\x70\x0f\x70\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x04\x2d\x0f\xab\x08\x01\x0f\x00\x00\x00\x00\x00\x00\x41\x08\x00\x00\xbe\x0e\x92\x0e\x92\x0e\xa0\x08\x9f\x08\x9d\x08\x97\x08\x25\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x08\x75\x08\x00\x00\x00\x00\xa8\x09\x65\x08\x4f\x0e\x63\x08\x6e\x08\x16\x0a\x84\x08\x26\x00\x82\x08\x4f\x0e\x81\x08\x78\x08\x60\x08\x00\x00\x06\x08\x00\x00\x44\x08\x00\x00\xae\x04\x7d\x04\xad\x01\x39\x13\x00\x00\x00\x00\x00\x00\x00\x00\xad\x01\x00\x00\xd6\x1c\x63\x1d\x0b\x1b\x1e\x1b\x39\x1d\x74\x1e\x00\x00\x00\x00\x01\x08\x00\x00\xff\x12\x00\x00\x00\x00\x00\x00\x49\x02\x00\x00\x00\x00\x00\x00\xa8\x09\x87\x0b\x00\x00\x4f\x01\x4f\x01\x67\x08\x5f\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x08\x00\x00\x00\x00\x28\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x08\xa9\x0a\x9c\x07\x00\x00\xfb\x07\xa7\x09\x4f\x0e\x61\x01\x9a\x07\x94\x07\xa7\x09\x10\x15\x00\x00\x00\x00\x07\x01\xef\x07\xd0\x09\xee\x07\x07\x01\xbf\x07\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\x00\x00\xe2\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x1b\x00\x00\xde\x07\x00\x00\xbc\x1b\x35\x0b\xb4\x07\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\xc5\x12\xd8\x07\x00\x00\x39\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x07\xa1\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x07\x00\x00\xfc\x00\xd7\x00\x37\x02\x9b\x07\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\x00\x00\xc4\x07\x00\x00\x96\x07\x91\x07\x00\x00\x57\x07\x00\x00\x57\x07\x00\x00\x00\x00\x4f\x0e\x4f\x0e\x00\x00\x90\x07\x4f\x0e\x8f\x07\x4f\x0e\x00\x00\x5a\x08\x53\x07\x16\x0a\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x92\x07\x00\x00\x4b\x07\x29\x07\x00\x00\x4f\x0e\x51\x1f\x51\x1f\x4f\x0e\x00\x00\x38\x09\x00\x00\x00\x00\x24\x07\x00\x00\x00\x00\x38\x09\x4f\x0e\x00\x00\x38\x09\x00\x00\x00\x00\x00\x00\x8e\x07\xfd\x02\x5f\x1e\x7a\x0a\x7a\x0a\x4d\x14\x8c\x07\x85\x07\x25\x1f\x4f\x0e\x4f\x0e\x23\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x4f\x0e\x00\x00\x4f\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x0d\x4f\x0e\x0e\x04\x0e\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x07\x41\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x09\xb1\x09\x96\x04\x96\x04\x34\x04\x34\x04\x34\x04\x34\x04\xa9\x03\xa9\x03\x28\x04\x70\x07\x65\x07\x63\x07\x5d\x07\x4f\x0e\x5f\x07\x00\x00\x4e\x07\x00\x00\xb4\x0d\x00\x00\x00\x00\x00\x00\x0e\x07\x2b\x1e\xf7\x1d\x8b\x12\x05\x15\x00\x00\x00\x00\x71\x07\x47\x07\x6c\x07\x00\x00\x69\x07\x3f\x07\x2f\x07\x2d\x07\x2c\x07\x16\x0a\xeb\x07\xf5\x06\xd4\x06\xcc\x06\x16\x0a\x4f\x0e\x00\x00\x27\x07\x9d\x1c\xfb\x06\xfa\x06\x00\x00\x20\x07\x00\x00\x1b\x07\x0b\x07\x17\x01\xa4\x01\x4d\x1b\xeb\x06\xa3\x06\x06\x07\x00\x00\xa7\x09\x4d\x1b\xe7\x06\x00\x00\x00\x00\x67\x1c\x9c\x14\x00\x00\x00\x00\xc7\x00\xaa\x00\x02\x07\x01\x07\x37\x02\xd2\x00\xaa\x00\x00\x00\x4d\x1b\xd0\x06\x00\x00\xbf\x06\x00\x00\xa7\x09\xbd\x06\x00\x00\x00\x00\x00\x00\x00\x00\xe2\xff\x00\x00\xe3\x06\x00\x00\x4d\x1b\xc3\x06\x00\x00\xc6\x0a\x00\x00\xdd\x06\xa4\x0b\x2b\x00\x76\x06\x34\x01\xdb\x10\x34\x01\x39\x1d\x74\x1e\x87\x10\xd7\x06\xb3\x06\x00\x00\xe4\x00\x08\x1d\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x01\x37\x12\xa4\x01\xfd\x11\x18\x0b\xa7\x09\x4d\x1b\xaa\x06\x00\x00\xc1\x06\xba\x09\xc2\x00\xc2\x00\x37\x02\x00\x00\x37\x02\x00\x00\x37\x02\x00\x00\x00\x00\xe4\x14\xc0\x06\xb7\x06\xb5\x06\x8a\x06\xcf\x03\x84\x06\xb1\x06\x9a\x06\xd0\xff\xdc\x00\x00\x00\x00\x00\x93\x06\x00\x00\x00\x00\x19\x06\x53\x03\x00\x00\xe8\xff\xcf\x03\x59\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x14\x7d\x09\x00\x00\x37\x02\x00\x00\x6e\x0d\x00\x00\x73\x06\x71\x06\x40\x06\x40\x06\xc3\x11\x00\x00\x8a\x00\x4e\x00\x40\x06\x00\x00\x09\x06\x83\x1b\x00\x00\x02\x06\x00\x00\x2e\x1c\xf5\x1b\x33\x10\x92\x14\x02\x06\x02\x06\x00\x00\xdf\x0f\x0f\x0e\x02\x06\x00\x00\x02\x06\x02\x06\x00\x00\x7a\x0a\x13\x0c\x56\x06\x54\x06\x2b\x00\x00\x00\x53\x06\xea\x05\x57\x0a\x2b\x00\x00\x00\x00\x00\xa7\x09\x4d\x1b\x18\x06\x00\x00\x34\x06\x2e\x06\xd1\x1a\x00\x00\x00\x00\x00\x00\xda\x08\x2c\x06\x4a\x00\x0c\x00\x2b\x06\x37\x02\x37\x02\x6b\x08\x00\x00\x00\x00\x00\x00\x76\x14\x08\x00\x00\x00\x00\x00\x28\x06\x13\x06\xaa\x05\x00\x00\x00\x00\x00\x00\xf3\x05\xf3\x05\x16\x0a\x16\x0a\x16\x0a\x00\x00\x4f\x0e\x4f\x0e\x4f\x0e\xe6\x05\x00\x00\xea\x01\x81\x03\xeb\x07\xa0\x05\x00\x00\xd6\x05\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x01\x89\x11\xa4\x01\x4f\x11\xe2\x05\xc9\x08\x00\x00\xf9\x1e\xf9\x1e\x36\x03\xf9\x1e\xcf\x05\xcf\x05\xcd\x1e\xcf\x05\xc8\x14\x00\x00\xbf\x14\xe9\x05\xe3\x05\x0f\x00\x15\x14\x00\x00\x00\x00\xb9\x0c\x4f\x0e\x00\x00\x4f\x0e\x00\x00\x4f\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x03\x6e\x0d\x37\x03\x00\x00\x06\x03\x00\x00\xbf\x05\x4f\x0e\x36\x03\xb9\x0c\xe0\x05\xcb\x05\x0e\x00\x00\x00\x37\x02\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x0a\xa9\x05\xd5\x00\x00\x00\x9d\x05\xb4\x05\x01\x03\x00\x00\xa4\x05\x9e\x05\x00\x00\x65\x05\x15\x11\x65\x05\x65\x05\x65\x05\x00\x00\x34\x03\x5d\x05\x00\x00\x4e\x05\x49\x00\x16\x0a\x71\x05\x43\x05\x21\x05\x20\x05\x00\x00\x00\x00\x1f\x05\x1f\x05\x2c\x05\x00\x00\x00\x00\x5b\x08\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x10\x37\x02\x00\x00\x9c\x1a\x8a\x03\x00\x00\xfe\x02\xb7\x02\xc3\x1d\x87\x07\x00\x00\x00\x00\x98\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x28\x05\xfe\x04\x24\x05\x12\x05\x2b\x00\xb4\x04\x00\x00\xec\x04\x00\x00\x00\x00\xe8\x04\x4f\x0e\x00\x00\x00\x00\x00\x00\x4d\x04\x0a\x01\xd1\x13\x00\x00\x00\x00\x47\x10\x5c\x0f\x8d\x13\x00\x00\x00\x00\x00\x00\x00\x00\xed\x0e\x05\x00\x05\x00\xb0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9d\x02\xe5\xff\x4f\x0e\xa6\x01\x00\x00\xde\x04\x43\x0d\xc5\x04\xd0\xff\x00\x00\x00\x00\xe0\x25\x00\x00\xd4\x00\x00\x00\x98\x04\x00\x00\x00\x00\x00\x00\x4f\x0e\x6a\x01\x00\x00\x05\x00\xbb\x14\x7e\x0e\xbd\x04\x00\x00\x00\x00\x4f\x0e\xb8\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x04\x7f\x04\x4f\x0e\x12\x00\x8f\x1d\x31\x04\x00\x00\x31\x04\x00\x00\x31\x04\x65\x04\x4f\x0e\x00\x00\x00\x00\x7e\x0e\xfd\x07\x00\x00\x00\x00\x00\x00\x00\x00\x16\x0a\x4f\x0e\x4f\x0e\x5e\x04\x00\x00\xc2\x01\x57\x04\x00\x00\x7c\x04\x2b\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x04\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x0e\x25\x02\x00\x00\x4f\x0e\x00\x00\xcd\x1e\x4f\x0e\x00\x00\x00\x00\x37\x02\x00\x00\x3e\x02\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x0c\x00\x00\x00\x00\x28\x0d\x00\x00\x00\x00\x4f\x0e\x2f\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x04\x00\x00\x5c\x04\x58\x04\x4f\x0e\x49\x00\x2a\x04\x49\x00\x00\x00\x2f\x04\x1f\x04\x00\x00\x00\x00\x00\x00\x4f\x0e\x00\x00\x12\x00\x8a\x03\xa4\x03\x00\x00\x4f\x0e\x00\x00\x00\x00\x06\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x0e\xa5\x07\x00\x00\x00\x00\x00\x00\xe0\x25\x00\x00\x00\x00\x00\x00\x8b\x03\x8b\x03\x00\x00\x16\x0a\x16\x0a\x7a\x01\x00\x00\x00\x00\xed\x03\x85\x03\x85\x03\x00\x00\x00\x00\xe4\x03\x00\x00\x00\x00\xe5\x03\xda\x03\x00\x00\xab\x03\x5e\x03\x00\x00\x00\x00\x00\x00\xa5\x07\x00\x00\x00\x00\x00\x00\xb1\x00\x00\x00\x00\x00\x4f\x0e\x4f\x0e\xbe\x03\xb6\x03\x86\x03\x3a\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyGotoOffsets :: HappyAddr-happyGotoOffsets = HappyA# "\x10\x02\x77\x00\xab\x06\x19\x22\x97\x03\x3b\x00\x00\x00\x00\x00\x1d\x03\xb0\x0d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x03\x00\x00\x00\x00\xe6\x0a\xc0\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x27\x03\x2a\x0a\x00\x00\xc7\x09\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x92\x0d\x7d\x08\x0e\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x03\x02\x00\x00\x00\x3f\x24\x00\x00\x00\x00\x67\x06\x00\x00\xe8\x02\x00\x00\xbb\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x03\x00\x00\x00\x00\x00\x00\x86\x09\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x63\x02\x00\x00\x64\x02\x96\x01\x45\x03\x1e\x01\x00\x03\xac\x00\x00\x00\x00\x00\x6a\x07\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x00\x8b\x07\x21\x03\x00\x00\x00\x00\xcf\x02\x30\x01\x00\x00\x95\x04\xc0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xa7\x18\x26\x24\xb8\x02\xb3\x02\x94\x02\x02\x19\x60\x03\x00\x00\x00\x00\xeb\x01\x00\x00\x51\x07\x00\x00\xd4\x01\xff\x02\x00\x00\x00\x00\x00\x00\xad\x02\xe5\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x05\x00\x00\xa8\x02\x00\x00\x30\x16\xfa\x19\xe4\x02\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x02\xbf\x02\xd6\x00\x00\x00\x00\x00\x59\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x02\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x02\x7d\x18\xbe\x0d\xf3\x06\x98\x02\x00\x00\x00\x00\x00\x00\x33\x02\x7d\x02\x00\x00\x00\x00\x00\x00\x7e\x02\x11\x02\x69\x02\xb9\x06\x00\x00\xb0\x06\x00\x00\x00\x00\x00\x22\xe7\x21\x00\x00\x00\x00\xce\x21\x00\x00\xb5\x21\x00\x00\xf7\x06\x00\x00\x3c\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\xac\x06\x00\x00\x0d\x24\x99\x19\x86\x19\xf4\x23\x00\x00\x64\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x03\xdb\x23\x00\x00\xae\x02\x00\x00\x00\x00\x00\x00\x00\x00\x34\x09\x3a\x01\xd6\xff\xd3\xff\xa3\x19\x00\x00\x00\x00\xb1\x02\x9c\x21\x8a\x24\x83\x21\xa3\x24\xbc\x24\xd5\x24\xee\x24\x15\x25\xfc\x24\x3b\x25\x2e\x25\x22\x25\xea\x14\x88\x19\x8c\x17\x77\x0e\x3e\x0d\xdd\x0c\x02\x0c\xc5\x0b\x00\x00\xc2\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x21\x51\x21\xf1\x01\xe5\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x24\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x07\x00\x00\x00\x00\x00\x00\xde\x01\x1b\x04\x00\x00\xf8\x15\x66\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x06\x53\x02\x5f\x02\x0d\x02\xd5\x01\xf8\x05\xa9\x23\x00\x00\x00\x00\x5c\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x03\xb7\x25\xd0\x04\xc6\x01\xa2\x06\x00\x00\x00\x00\x81\x18\xa7\x04\xc0\x01\x00\x00\x00\x00\x65\x16\xee\x09\x00\x00\x00\x00\x6b\x04\xfc\x17\x00\x00\x00\x00\xaf\x06\x00\x05\xea\x15\x00\x00\x69\x04\xb2\x01\x00\x00\x00\x00\xbd\x01\x26\x18\xbe\x01\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x01\x8c\x01\x00\x00\x00\x00\x40\x04\x9d\x01\x00\x00\xc2\x19\x00\x00\x00\x00\x3a\x20\x68\x06\x2e\x01\x82\x25\xb1\x16\x6a\x25\x8f\x02\x6f\x00\x0b\x17\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x03\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x25\xda\x16\x9d\x25\x05\x17\x82\x17\x00\x18\xd9\x03\x8f\x01\x00\x00\x00\x00\x74\x06\x4f\x02\x03\x06\x6e\x06\x00\x00\x45\x06\x00\x00\x2a\x06\x00\x00\x00\x00\xd0\x03\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00\x59\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4a\x01\x00\x00\x00\x00\x10\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x03\x2a\x06\x00\x00\x78\x05\x00\x00\x21\x20\x00\x00\x00\x00\x00\x00\xbc\x01\xb6\x01\x7c\x17\x00\x00\x90\x15\x97\x0c\x32\x01\x00\x00\x00\x00\x98\x16\x00\x00\xd3\x05\x00\x00\x1c\x07\x00\x00\xc0\x15\x47\x1a\xc7\x05\xbc\x05\x00\x00\x76\x15\x40\x1a\x94\x05\x00\x00\x8f\x05\x62\x05\x00\x00\x09\x00\x49\x1a\x00\x00\x00\x00\x25\x05\x00\x00\x00\x00\x00\x00\x46\x13\xa4\x04\x00\x00\x00\x00\xa5\x17\x23\x03\x64\x01\x00\x00\x00\x00\x00\x00\x2c\x09\x6e\x01\x00\x00\x00\x00\x4c\x05\x00\x00\xf4\x03\x2d\x0e\x00\x00\x32\x05\x09\x05\xff\x04\x00\x00\x00\x00\x00\x00\xd9\x04\x6e\x12\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\xf7\x00\x6e\x00\xb3\x05\x89\x05\x6b\x05\x00\x00\xa2\x20\x89\x20\x38\x21\x00\x00\x00\x00\x00\x00\x00\x00\xd8\x01\x2d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x10\x90\x01\xb5\x0f\x5d\x01\x00\x00\xcf\x06\x00\x00\x73\x19\x60\x19\x0c\x01\xb4\x17\x00\x00\x00\x00\x15\x19\x00\x00\xae\x0b\x00\x00\xf9\x08\x00\x00\x00\x00\xea\x00\xbe\x0c\x00\x00\x00\x00\x89\x1f\x90\x23\x00\x00\x58\x24\x00\x00\x77\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x20\x33\x01\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x23\xd3\x00\x64\x1f\x00\x00\x00\x00\x8b\x00\x00\x00\xf0\x04\x00\x00\x00\x00\x00\x00\x00\x00\xd2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3f\x01\x63\x01\x2f\x01\x25\x01\x12\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x01\x44\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x00\xa4\x00\x00\x00\x00\x00\x00\x00\xb6\x04\x00\x00\x00\x00\xfb\x13\x00\x00\x00\x00\x00\x00\x00\x00\x08\x0c\x53\x04\x00\x00\xbd\x08\x63\x16\x00\x00\x00\x00\x00\x00\x3b\x09\x3b\x0d\x00\x00\x00\x00\x4e\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x03\xc5\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x23\x00\x00\x00\x00\x00\x00\xc9\x19\x42\x05\x40\x17\x00\x00\x00\x00\xfe\x19\xe7\x14\x46\x17\x00\x00\x00\x00\x00\x00\x00\x00\x59\x0a\xb7\x13\x70\x0c\xfb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x00\x2c\x23\x51\x00\x00\x00\x00\x00\xc7\x1f\x00\x00\x72\x00\x00\x00\x00\x00\x71\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x23\x51\x00\x00\x00\x49\x0c\xd0\x03\x1c\x03\x00\x00\x00\x00\x00\x00\xfa\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5e\x00\x00\x00\xe1\x22\x88\x07\x1b\x04\xa0\x03\x00\x00\x93\x03\x00\x00\x5b\x03\x00\x00\xc8\x22\x00\x00\x00\x00\x1c\x03\x43\x03\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x04\x70\x20\x57\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x21\x46\x00\x00\x00\xaf\x22\x00\x00\x28\x19\x96\x22\x00\x00\x00\x00\x32\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xad\x1f\x00\x00\x00\x00\xe7\x1f\x00\x00\x00\x00\x7d\x22\xad\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x21\x33\x00\x00\x00\xcb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x22\x00\x00\x72\x07\x65\x12\x2a\x00\x00\x00\x4b\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x22\xd8\x06\x00\x00\x00\x00\x00\x00\xce\xff\x00\x00\x00\x00\x00\x00\x4d\x00\xd4\xff\x00\x00\x89\x02\xbb\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc1\xff\xa2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x36\x00\x29\x00\x00\x00\x00\x00\xdb\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xed\x20\xd4\x20\x00\x00\x00\x00\x00\x00\x8c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyDefActions :: HappyAddr-happyDefActions = HappyA# "\xfa\xff\x25\xfe\x00\x00\x00\x00\x00\x00\x25\xfe\x84\xfe\x78\xfe\x66\xfe\x00\x00\x64\xfe\x60\xfe\x5d\xfe\x5a\xfe\x55\xfe\x52\xfe\x50\xfe\x4e\xfe\x4c\xfe\x4a\xfe\x48\xfe\x45\xfe\x38\xfe\x00\x00\x94\xfe\x93\xfe\x25\xfe\x67\xfe\x68\xfe\x00\x00\x00\x00\x6a\xfe\x69\xfe\x6b\xfe\x6c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x2e\xfe\x2f\xfe\x2d\xfe\x2c\xfe\x95\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xff\xe3\xff\xe2\xff\xe1\xff\xe0\xff\xdf\xff\xde\xff\x00\x00\x00\x00\xc7\xff\xd7\xff\xb5\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\xfe\x00\x00\x00\x00\x95\xfe\x26\xfe\x00\x00\xf7\xff\x00\x00\xf6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x97\xff\x8d\xff\x8c\xff\x8b\xff\x00\x00\x6a\xff\x9a\xff\x80\xff\x99\xff\x7f\xff\x98\xff\x7e\xff\x5f\xff\x45\xff\x25\xfe\x44\xff\x00\x00\xe5\xff\xf9\xfe\xf7\xfe\xf8\xfe\xa5\xff\xea\xfe\xe9\xfe\x00\x00\x24\xfe\x23\xfe\x00\x00\x25\xfe\x00\x00\x00\x00\x87\xff\x74\xff\x7c\xff\x73\xff\x77\xff\x25\xfe\x89\xff\x78\xff\x71\xff\x70\xff\x84\xff\x7a\xff\x72\xff\x79\xff\x83\xff\x86\xff\x7b\xff\x76\xff\x88\xff\x00\x00\x40\xff\x8a\xff\x00\x00\x85\xff\x3f\xff\x75\xff\x7d\xff\xed\xfe\x53\xff\x00\x00\x25\xfe\x00\x00\xf5\xff\x00\x00\x25\xfe\x00\x00\x00\x00\x24\xfe\x00\x00\x25\xfe\x00\x00\xf6\xfe\xe8\xfe\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\xff\x69\xff\x5e\xff\x15\xff\xa5\xff\x22\xfe\x00\x00\x4d\xff\x1a\xff\x1b\xff\x20\xff\x1d\xff\x1c\xff\x1e\xff\x1f\xff\x25\xfe\xf2\xfe\xc6\xfe\xc4\xfe\xe3\xfe\x32\xfe\x00\x00\x95\xff\x68\xff\x5d\xff\x19\xff\x15\xff\xa5\xff\x00\x00\x00\x00\x50\xff\x00\x00\x59\xff\x47\xff\x46\xff\x55\xff\x91\xff\x8f\xff\x8e\xff\x90\xff\x54\xff\x62\xff\x5b\xff\x5a\xff\xa9\xff\x61\xff\x60\xff\xaa\xff\x6e\xff\x65\xff\x66\xff\x64\xff\x6d\xff\x6c\xff\x6b\xff\x00\x00\x15\xff\x16\xff\x12\xff\x0f\xff\x0e\xff\x13\xff\x05\xff\x17\xff\xa5\xff\x00\x00\x25\xfe\x11\xff\x00\x00\x93\xff\x6f\xff\x63\xff\x15\xff\xa5\xff\x92\xff\x00\x00\x58\xff\x00\x00\x15\xff\xa5\xff\x25\xfe\xa8\xff\x25\xfe\xa7\xff\xf3\xff\x00\x00\x00\x00\x33\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x27\xfe\x34\xfe\x00\x00\x00\x00\xbc\xff\x66\xfe\x30\xfe\x00\x00\xbb\xff\x00\x00\xb4\xff\xd5\xff\x25\xfe\xc6\xff\x00\x00\x25\xfe\x25\xfe\x00\x00\x6e\xfe\x25\xfe\x6f\xfe\x75\xfe\x2b\xfe\x2a\xfe\x73\xfe\x25\xfe\x00\x00\x71\xfe\x25\xfe\x6d\xfe\x76\xfe\x77\xfe\x00\x00\xcd\xfe\x80\xff\x7f\xff\x7e\xff\x00\x00\x00\x00\x00\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\xfe\x00\x00\x43\xfe\x3f\xfe\x3e\xfe\x42\xfe\x41\xfe\x40\xfe\x3b\xfe\x3a\xfe\x39\xfe\x3d\xfe\x3c\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x7e\xfe\x7d\xfe\xf8\xff\xf9\xff\x80\xfe\x7f\xfe\x00\x00\x00\x00\x7a\xfe\x82\xfe\x44\xfe\x61\xfe\x62\xfe\x63\xfe\x5e\xfe\x5f\xfe\x5b\xfe\x5c\xfe\x56\xfe\x58\xfe\x57\xfe\x59\xfe\x53\xfe\x54\xfe\x51\xfe\x4f\xfe\x4d\xfe\x4b\xfe\x00\x00\x00\x00\x49\xfe\x36\xfe\x37\xfe\x92\xfe\x00\x00\xca\xfe\xc7\xfe\xc9\xfe\xc8\xfe\x00\x00\xcb\xfe\xe3\xfe\xb7\xfe\xcc\xfe\x90\xfe\x00\x00\x00\x00\x00\x00\x29\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd6\xff\xd5\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdb\xff\x00\x00\x25\xfe\x00\x00\x00\x00\xbe\xff\x00\x00\xba\xff\x00\x00\x00\x00\x00\x00\x00\x00\x25\xfe\xa5\xfe\x25\xfe\x00\x00\xf1\xff\x25\xfe\x25\xfe\xa5\xfe\xef\xff\x10\xff\xe3\xfe\x00\x00\x0d\xff\x01\xff\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xfe\x25\xfe\xa5\xfe\xf0\xff\x41\xff\x3e\xff\x25\xfe\x00\x00\x94\xff\x67\xff\x5c\xff\x18\xff\x15\xff\xa5\xff\x00\x00\x4a\xff\x25\xfe\xa5\xfe\xee\xff\x32\xfe\x31\xfe\x00\x00\x32\xfe\x6b\xfe\x25\xfe\xde\xfe\xda\xfe\xd7\xfe\x99\xff\x7f\xff\xd3\xfe\x00\x00\xe2\xfe\xe0\xfe\x00\x00\x24\xfe\xcf\xfe\xc3\xfe\xec\xff\xa4\xff\x00\x00\x00\x00\x00\x00\x00\x00\x24\xfe\x25\xfe\x25\xfe\xa5\xfe\xf2\xff\x00\x00\x00\x00\x00\x00\x25\xfe\xe5\xfe\xec\xfe\xf1\xfe\xf5\xfe\xf8\xfe\xf4\xfe\xe7\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x27\xff\x00\x00\x00\x00\x00\x00\x00\x00\x1e\xfe\x00\x00\x20\xfe\x1c\xfe\x1d\xfe\x52\xff\x51\xff\x00\x00\x00\x00\x26\xff\x24\xff\x00\x00\x00\x00\x81\xff\x82\xff\xf3\xfe\xf0\xfe\xe4\xfe\x00\x00\x00\x00\xeb\xfe\xef\xfe\xa0\xff\x00\x00\xeb\xff\x00\x00\x00\x00\x15\xff\x15\xff\x00\x00\x17\xff\x00\x00\x25\xfe\x15\xff\xe6\xfe\x00\x00\x25\xfe\xc5\xfe\x25\xfe\xd1\xfe\x00\x00\xd2\xfe\xe3\xfe\xb7\xfe\x25\xfe\x25\xfe\xd6\xfe\xe3\xfe\xb7\xfe\x25\xfe\xd9\xfe\x25\xfe\x25\xfe\xdd\xfe\x25\xfe\x00\x00\x00\x00\x00\x00\x6b\xfe\xc2\xfe\x00\x00\x00\x00\x32\xfe\x6b\xfe\xa2\xff\xe7\xff\x25\xfe\x25\xfe\xa5\xfe\xed\xff\x00\x00\x00\x00\x25\xfe\x3e\xff\x9c\xff\xe9\xff\x00\x00\x00\x00\x00\x00\x25\xfe\x00\x00\xfe\xfe\x09\xff\x00\x00\x0c\xff\x0b\xff\x00\xff\x00\x00\x00\x00\xa3\xff\xe8\xff\x00\x00\x00\x00\x00\x00\x9e\xff\x9d\xff\xea\xff\x15\xff\x15\xff\x00\x00\x00\x00\x00\x00\xbd\xff\x34\xfe\x34\xfe\x00\x00\x00\x00\xdc\xff\x00\x00\x00\x00\xd6\xff\x00\x00\xd3\xff\x00\x00\xd4\xff\xd2\xff\xd0\xff\xd1\xff\x00\x00\x00\x00\x00\x00\x00\x00\x53\xff\x25\xfe\xdd\xff\x25\xfe\x25\xfe\x00\x00\x25\xfe\x00\x00\x72\xfe\x25\xfe\x70\xfe\x25\xfe\xb5\xfe\xb3\xfe\x00\x00\x00\x00\x00\x00\x24\xfe\xa9\xfe\x65\xfe\xa3\xfe\x00\x00\x46\xfe\x00\x00\x81\xfe\x00\x00\x83\xfe\x79\xfe\x47\xfe\x35\xfe\xa2\xfe\x00\x00\x00\x00\x00\x00\x9b\xfe\x9c\xfe\xa8\xfe\x00\x00\x00\x00\x00\x00\xa3\xfe\x00\x00\x00\x00\x00\x00\xb0\xfe\xb1\xfe\xaf\xfe\xb2\xfe\xb4\xfe\xb6\xfe\x24\xfe\x00\x00\x00\x00\x8a\xfe\x00\x00\x00\x00\x00\x00\x87\xfe\x00\x00\x00\x00\xcf\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xff\x00\x00\x00\x00\xc9\xff\x00\x00\xb3\xff\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xff\xc3\xff\xc2\xff\xa5\xfe\xa5\xfe\x00\x00\x57\xff\x56\xff\x00\x00\x0a\xff\xff\xfe\x00\x00\x04\xff\x08\xff\xfc\xfe\xfd\xfe\x00\x00\x07\xff\xfa\xfe\x25\xfe\x33\xff\x3c\xff\x00\x00\x00\x00\x25\xfe\x24\xfe\x3d\xff\x42\xff\x25\xfe\x4f\xff\x4e\xff\xa1\xff\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x6b\xfe\x25\xfe\xc0\xfe\x00\x00\xc1\xfe\xbb\xfe\x00\x00\x00\x00\xdc\xfe\xdb\xfe\xd8\xfe\x25\xfe\xb3\xfe\x24\xfe\xd5\xfe\xd4\xfe\x25\xfe\xb3\xfe\x24\xfe\xd0\xfe\xdf\xfe\xe1\xfe\xce\xfe\x00\x00\x00\x00\x00\x00\x15\xff\x4c\xff\x4b\xff\xa4\xfe\xee\xfe\xf4\xff\x00\x00\x23\xff\x00\x00\x00\x00\x2b\xff\x00\x00\x00\x00\x00\x00\x1e\xfe\x1f\xfe\x21\xfe\x66\xfe\x19\xfe\x00\x00\x1a\xfe\x00\x00\x25\xff\x2a\xff\x21\xff\x00\x00\x00\x00\x29\xff\x00\x00\x24\xfe\x24\xfe\x00\x00\xbe\xfe\xba\xfe\x00\x00\x00\x00\xbf\xfe\xb9\xfe\x49\xff\x48\xff\x39\xff\x37\xff\x2f\xff\x00\x00\x00\x00\x24\xfe\x25\xfe\x3b\xff\x25\xfe\x3a\xff\x25\xfe\x32\xff\x00\x00\x43\xff\x06\xff\x00\x00\x00\x00\x03\xff\x14\xff\x9b\xff\x9f\xff\x00\x00\x34\xfe\x34\xfe\x00\x00\xda\xff\x00\x00\xb2\xff\xb1\xff\x00\x00\x00\x00\xb9\xff\xd8\xff\xc8\xff\xce\xff\xcc\xff\xcd\xff\x00\x00\xcb\xff\x8c\xfe\x8d\xfe\x8e\xfe\x00\x00\x00\x00\x8f\xfe\x00\x00\x91\xfe\x25\xfe\x00\x00\xae\xfe\xac\xfe\xad\xfe\xab\xfe\x00\x00\x98\xfe\x00\x00\x9d\xfe\x9a\xfe\x97\xfe\x9e\xfe\xa1\xfe\x00\x00\x7c\xfe\xa0\xfe\x00\x00\x7b\xfe\x99\xfe\x00\x00\x00\x00\xa7\xfe\xaa\xfe\x89\xfe\x8b\xfe\x88\xfe\x86\xfe\x00\x00\xca\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb3\xff\xc1\xff\x00\x00\x00\x00\xc4\xff\x02\xff\x31\xff\x00\x00\x35\xff\x00\x00\x00\x00\x38\xff\x2e\xff\x00\x00\x2c\xff\xb8\xfe\x00\x00\xbd\xfe\x28\xff\x22\xff\xa6\xff\x1b\xfe\x00\x00\x00\x00\x17\xfe\x18\xfe\x28\xfe\x66\xfe\x16\xfe\xbc\xfe\x2d\xff\x25\xfe\x36\xff\x30\xff\x00\x00\x00\x00\x00\x00\xb8\xff\xb0\xff\x00\x00\x00\x00\x00\x00\x85\xfe\xa6\xfe\x00\x00\x9f\xfe\x96\xfe\x00\x00\x00\x00\xaf\xff\x00\x00\x00\x00\xd6\xff\xc0\xff\x34\xff\x00\x00\x15\xfe\x14\xfe\xbf\xff\x00\x00\xac\xff\xb7\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xff\xb6\xff\xad\xff\xae\xff"#--happyCheck :: HappyAddr-happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x04\x00\x1f\x00\x79\x00\x01\x00\x1f\x00\x38\x00\x01\x00\x04\x00\x39\x00\x39\x00\x01\x00\x2c\x00\x39\x00\x02\x00\x02\x00\x0d\x00\x01\x00\x32\x00\x0d\x00\x14\x00\x1c\x00\x19\x00\x0d\x00\x1b\x00\x79\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x04\x00\x1e\x00\x1e\x00\x09\x00\x0d\x00\x2e\x00\x36\x00\x66\x00\x3c\x00\x0a\x00\x3a\x00\x79\x00\x39\x00\x0e\x00\x02\x00\x03\x00\x04\x00\x72\x00\x2e\x00\x39\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x17\x00\x01\x00\x03\x00\x68\x00\x18\x00\x01\x00\x68\x00\x7f\x00\x7f\x00\x7f\x00\x19\x00\x7f\x00\x1b\x00\x0d\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x66\x00\x67\x00\x68\x00\x66\x00\x67\x00\x68\x00\x36\x00\x66\x00\x67\x00\x68\x00\x3a\x00\x68\x00\x68\x00\x66\x00\x02\x00\x03\x00\x04\x00\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x7d\x00\x7e\x00\x7f\x00\x38\x00\x1c\x00\x01\x00\x66\x00\x67\x00\x7e\x00\x7f\x00\x19\x00\x22\x00\x1b\x00\x68\x00\x1d\x00\x1e\x00\x1f\x00\x0d\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x04\x00\x39\x00\x7f\x00\x3c\x00\x01\x00\x79\x00\x36\x00\x65\x00\x79\x00\x66\x00\x3a\x00\x68\x00\x02\x00\x66\x00\x67\x00\x68\x00\x0d\x00\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x7c\x00\x01\x00\x21\x00\x22\x00\x23\x00\x24\x00\x01\x00\x26\x00\x7d\x00\x7e\x00\x7f\x00\x7c\x00\x22\x00\x0d\x00\x2d\x00\x2e\x00\x2f\x00\x01\x00\x0d\x00\x07\x00\x02\x00\x02\x00\x01\x00\x36\x00\x04\x00\x2a\x00\x39\x00\x7f\x00\x02\x00\x0d\x00\x15\x00\x16\x00\x17\x00\x72\x00\x0d\x00\x39\x00\x02\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x7f\x00\x7f\x00\x66\x00\x67\x00\x68\x00\x81\x00\x7d\x00\x7e\x00\x7f\x00\x21\x00\x22\x00\x23\x00\x24\x00\x57\x00\x26\x00\x01\x00\x2a\x00\x2a\x00\x37\x00\x38\x00\x57\x00\x2d\x00\x2e\x00\x2f\x00\x2a\x00\x04\x00\x01\x00\x0d\x00\x7f\x00\x01\x00\x36\x00\x03\x00\x2a\x00\x39\x00\x66\x00\x67\x00\x68\x00\x1c\x00\x0d\x00\x37\x00\x38\x00\x0d\x00\x01\x00\x07\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x7e\x00\x7f\x00\x20\x00\x0d\x00\x22\x00\x23\x00\x24\x00\x66\x00\x26\x00\x68\x00\x7f\x00\x07\x00\x66\x00\x67\x00\x68\x00\x2d\x00\x2e\x00\x2f\x00\x3c\x00\x04\x00\x01\x00\x07\x00\x03\x00\x66\x00\x36\x00\x68\x00\x31\x00\x39\x00\x66\x00\x67\x00\x68\x00\x22\x00\x0d\x00\x38\x00\x02\x00\x79\x00\x7c\x00\x07\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x1c\x00\x7c\x00\x01\x00\x21\x00\x22\x00\x23\x00\x24\x00\x7f\x00\x26\x00\x39\x00\x4e\x00\x4f\x00\x7c\x00\x51\x00\x0d\x00\x2d\x00\x2e\x00\x2f\x00\x26\x00\x04\x00\x66\x00\x67\x00\x68\x00\x2c\x00\x36\x00\x04\x00\x3a\x00\x7f\x00\x60\x00\x2a\x00\x60\x00\x66\x00\x3c\x00\x68\x00\x66\x00\x67\x00\x68\x00\x39\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4e\x00\x02\x00\x66\x00\x21\x00\x22\x00\x23\x00\x24\x00\x7f\x00\x26\x00\x21\x00\x22\x00\x23\x00\x24\x00\x7c\x00\x26\x00\x2d\x00\x2e\x00\x2f\x00\x2c\x00\x5b\x00\x5c\x00\x2d\x00\x2e\x00\x2f\x00\x36\x00\x04\x00\x79\x00\x39\x00\x2d\x00\x1e\x00\x36\x00\x66\x00\x67\x00\x39\x00\x7f\x00\x30\x00\x66\x00\x67\x00\x44\x00\x45\x00\x46\x00\x47\x00\x01\x00\x1a\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7d\x00\x7e\x00\x7f\x00\x01\x00\x7f\x00\x20\x00\x0d\x00\x22\x00\x23\x00\x24\x00\x66\x00\x26\x00\x68\x00\x22\x00\x7f\x00\x0d\x00\x57\x00\x26\x00\x2d\x00\x2e\x00\x2f\x00\x05\x00\x06\x00\x07\x00\x79\x00\x02\x00\x07\x00\x36\x00\x66\x00\x67\x00\x39\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x39\x00\x66\x00\x67\x00\x1c\x00\x2d\x00\x44\x00\x45\x00\x46\x00\x47\x00\x1c\x00\x80\x00\x81\x00\x7e\x00\x7f\x00\x05\x00\x06\x00\x07\x00\x1e\x00\x09\x00\x7f\x00\x0b\x00\x0c\x00\x0d\x00\x57\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x02\x00\x30\x00\x15\x00\x16\x00\x17\x00\x19\x00\x3c\x00\x1b\x00\x57\x00\x1d\x00\x1e\x00\x1f\x00\x3c\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x1e\x00\x57\x00\x66\x00\x67\x00\x66\x00\x67\x00\x36\x00\x7f\x00\x00\x00\x01\x00\x3a\x00\x66\x00\x67\x00\x7f\x00\x1c\x00\x57\x00\x5d\x00\x45\x00\x46\x00\x47\x00\x61\x00\x57\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x1c\x00\x73\x00\x44\x00\x45\x00\x46\x00\x47\x00\x78\x00\x79\x00\x5d\x00\x3c\x00\x7c\x00\x01\x00\x61\x00\x03\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x01\x00\x73\x00\x03\x00\x3c\x00\x79\x00\x1c\x00\x78\x00\x79\x00\x79\x00\x7f\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x05\x00\x06\x00\x07\x00\x4e\x00\x09\x00\x7f\x00\x0b\x00\x0c\x00\x0d\x00\x7c\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x04\x00\x2a\x00\x0a\x00\x7f\x00\x2d\x00\x19\x00\x7c\x00\x1b\x00\x3c\x00\x1d\x00\x1e\x00\x1f\x00\x1c\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x1a\x00\x20\x00\x07\x00\x22\x00\x23\x00\x24\x00\x36\x00\x26\x00\x66\x00\x67\x00\x3a\x00\x05\x00\x06\x00\x07\x00\x66\x00\x67\x00\x3c\x00\x45\x00\x46\x00\x47\x00\x1a\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x39\x00\x3b\x00\x07\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x1a\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x07\x00\x20\x00\x5d\x00\x22\x00\x23\x00\x24\x00\x61\x00\x07\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x1c\x00\x73\x00\x2a\x00\x39\x00\x1c\x00\x2d\x00\x78\x00\x79\x00\x7e\x00\x7f\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x7c\x00\x28\x00\x26\x00\x2a\x00\x1a\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x2d\x00\x2e\x00\x2f\x00\x2a\x00\x2b\x00\x7f\x00\x36\x00\x3c\x00\x5d\x00\x36\x00\x3a\x00\x3c\x00\x61\x00\x07\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x53\x00\x73\x00\x4f\x00\x01\x00\x1a\x00\x03\x00\x78\x00\x79\x00\x02\x00\x03\x00\x7c\x00\x07\x00\x06\x00\x39\x00\x03\x00\x0d\x00\x5d\x00\x06\x00\x79\x00\x7f\x00\x61\x00\x07\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x20\x00\x73\x00\x22\x00\x23\x00\x24\x00\x1f\x00\x78\x00\x79\x00\x2a\x00\x2b\x00\x07\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x7f\x00\x28\x00\x7f\x00\x2a\x00\x7c\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x39\x00\x03\x00\x1a\x00\x19\x00\x06\x00\x1b\x00\x36\x00\x1d\x00\x1e\x00\x1f\x00\x3a\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x07\x00\x2a\x00\x39\x00\x1f\x00\x2d\x00\x4f\x00\x36\x00\x3e\x00\x3f\x00\x40\x00\x3a\x00\x2a\x00\x2b\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7c\x00\x20\x00\x5d\x00\x22\x00\x23\x00\x24\x00\x61\x00\x07\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x08\x00\x73\x00\x2a\x00\x39\x00\x7f\x00\x2d\x00\x78\x00\x79\x00\x51\x00\x52\x00\x53\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x01\x00\x28\x00\x7a\x00\x2a\x00\x72\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x51\x00\x52\x00\x53\x00\x0d\x00\x01\x00\x39\x00\x36\x00\x7f\x00\x66\x00\x67\x00\x3a\x00\x65\x00\x7d\x00\x7e\x00\x7f\x00\x7c\x00\x44\x00\x45\x00\x46\x00\x47\x00\x1e\x00\x49\x00\x4a\x00\x2a\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x2b\x00\x26\x00\x4f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x02\x00\x2d\x00\x2e\x00\x2f\x00\x13\x00\x14\x00\x15\x00\x16\x00\x02\x00\x5d\x00\x36\x00\x65\x00\x7f\x00\x61\x00\x07\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x2b\x00\x73\x00\x7d\x00\x7e\x00\x7f\x00\x01\x00\x78\x00\x79\x00\x7e\x00\x7f\x00\x07\x00\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\x01\x00\x28\x00\x04\x00\x2a\x00\x65\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x02\x00\x66\x00\x67\x00\x19\x00\x68\x00\x1b\x00\x36\x00\x1d\x00\x1e\x00\x1f\x00\x3a\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x39\x00\x04\x00\x7f\x00\x68\x00\x39\x00\x4f\x00\x36\x00\x7d\x00\x7e\x00\x7f\x00\x3a\x00\x44\x00\x45\x00\x46\x00\x47\x00\x44\x00\x45\x00\x46\x00\x47\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x02\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x02\x00\x73\x00\x3f\x00\x40\x00\x66\x00\x67\x00\x78\x00\x79\x00\x45\x00\x46\x00\x47\x00\x7d\x00\x7e\x00\x7f\x00\x17\x00\x18\x00\x26\x00\x7d\x00\x7e\x00\x7f\x00\x11\x00\x12\x00\x07\x00\x2d\x00\x2e\x00\x2f\x00\x7d\x00\x7e\x00\x7f\x00\x01\x00\x7f\x00\x03\x00\x36\x00\x7e\x00\x7f\x00\x39\x00\x2b\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x0d\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x04\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x07\x00\x04\x00\x7e\x00\x7f\x00\x66\x00\x67\x00\x36\x00\x01\x00\x2c\x00\x03\x00\x3a\x00\x05\x00\x06\x00\x01\x00\x31\x00\x09\x00\x0a\x00\x2a\x00\x19\x00\x1e\x00\x1b\x00\x38\x00\x1d\x00\x1e\x00\x1f\x00\x2b\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x68\x00\x7f\x00\x4e\x00\x4f\x00\x1e\x00\x51\x00\x36\x00\x3a\x00\x0b\x00\x0c\x00\x3a\x00\x51\x00\x52\x00\x53\x00\x2a\x00\x2b\x00\x3e\x00\x3f\x00\x40\x00\x68\x00\x60\x00\x07\x00\x44\x00\x45\x00\x46\x00\x47\x00\x66\x00\x67\x00\x68\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x04\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x04\x00\x1b\x00\x2b\x00\x1d\x00\x1e\x00\x1f\x00\x02\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x07\x00\x2a\x00\x2b\x00\x45\x00\x46\x00\x47\x00\x36\x00\x49\x00\x4a\x00\x02\x00\x3a\x00\x32\x00\x7d\x00\x7e\x00\x7f\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x7f\x00\x1b\x00\x04\x00\x1d\x00\x1e\x00\x1f\x00\x04\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x02\x00\x05\x00\x06\x00\x07\x00\x66\x00\x67\x00\x36\x00\x51\x00\x52\x00\x53\x00\x3a\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x1c\x00\x1d\x00\x39\x00\x7e\x00\x7f\x00\x07\x00\x04\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x68\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7d\x00\x7e\x00\x7f\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x04\x00\x1b\x00\x02\x00\x1d\x00\x1e\x00\x1f\x00\x02\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x1f\x00\x3f\x00\x40\x00\x51\x00\x52\x00\x53\x00\x36\x00\x45\x00\x46\x00\x47\x00\x3a\x00\x05\x00\x06\x00\x07\x00\x2b\x00\x7d\x00\x7e\x00\x7f\x00\x51\x00\x52\x00\x53\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7f\x00\x5d\x00\x51\x00\x52\x00\x53\x00\x61\x00\x3e\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x2b\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x17\x00\x18\x00\x7c\x00\x2b\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7f\x00\x3e\x00\x3f\x00\x40\x00\x51\x00\x52\x00\x53\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2d\x00\x7d\x00\x7e\x00\x7f\x00\x05\x00\x06\x00\x07\x00\x2c\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x51\x00\x52\x00\x53\x00\x02\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x02\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x02\x00\x73\x00\x05\x00\x06\x00\x07\x00\x1e\x00\x78\x00\x79\x00\x11\x00\x12\x00\x7c\x00\x7f\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x1e\x00\x5d\x00\x51\x00\x52\x00\x53\x00\x61\x00\x02\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x1e\x00\x73\x00\x7d\x00\x7e\x00\x7f\x00\x02\x00\x78\x00\x79\x00\x02\x00\x5d\x00\x7c\x00\x0b\x00\x0c\x00\x61\x00\x02\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x2c\x00\x73\x00\x05\x00\x06\x00\x07\x00\x1e\x00\x78\x00\x79\x00\x2d\x00\x1e\x00\x7c\x00\x66\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7d\x00\x7e\x00\x7f\x00\x65\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x02\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x32\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x02\x00\x02\x00\x7c\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x02\x00\x1f\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x3a\x00\x63\x00\x64\x00\x56\x00\x05\x00\x06\x00\x07\x00\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x7d\x00\x7e\x00\x7f\x00\x78\x00\x79\x00\x5d\x00\x7b\x00\x04\x00\x04\x00\x61\x00\x04\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x68\x00\x73\x00\x05\x00\x06\x00\x07\x00\x66\x00\x78\x00\x79\x00\x32\x00\x02\x00\x7c\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x51\x00\x52\x00\x53\x00\x65\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x2b\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x01\x00\x73\x00\x51\x00\x52\x00\x53\x00\x5d\x00\x78\x00\x79\x00\x02\x00\x61\x00\x7c\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x2a\x00\x73\x00\x05\x00\x06\x00\x07\x00\x02\x00\x78\x00\x79\x00\x2c\x00\x02\x00\x7c\x00\x02\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x51\x00\x52\x00\x53\x00\x02\x00\x02\x00\x5d\x00\x51\x00\x52\x00\x53\x00\x61\x00\x1f\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x02\x00\x73\x00\x0c\x00\x0d\x00\x2a\x00\x68\x00\x78\x00\x79\x00\x04\x00\x1f\x00\x7c\x00\x01\x00\x7d\x00\x7e\x00\x7f\x00\x19\x00\x2c\x00\x1b\x00\x2c\x00\x1d\x00\x1e\x00\x1f\x00\x1f\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x08\x00\x51\x00\x52\x00\x53\x00\x02\x00\x02\x00\x36\x00\x1f\x00\x01\x00\x5d\x00\x3a\x00\x1f\x00\x68\x00\x61\x00\x02\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x02\x00\x73\x00\x7d\x00\x7e\x00\x7f\x00\x02\x00\x78\x00\x79\x00\x2b\x00\x2b\x00\x7c\x00\x01\x00\x7d\x00\x7e\x00\x7f\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x65\x00\x63\x00\x64\x00\x65\x00\x5d\x00\x7d\x00\x7e\x00\x7f\x00\x61\x00\x66\x00\x63\x00\x64\x00\x21\x00\x22\x00\x23\x00\x24\x00\x4c\x00\x26\x00\x01\x00\x51\x00\x52\x00\x53\x00\x78\x00\x79\x00\x2d\x00\x2e\x00\x2f\x00\x7d\x00\x7e\x00\x7f\x00\x0d\x00\x78\x00\x79\x00\x36\x00\x7b\x00\x5d\x00\x39\x00\x2a\x00\x2a\x00\x61\x00\x2a\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x2a\x00\x73\x00\x02\x00\x75\x00\x2b\x00\x02\x00\x78\x00\x79\x00\x2a\x00\x30\x00\x02\x00\x32\x00\x33\x00\x68\x00\x35\x00\x2a\x00\x37\x00\x1b\x00\x1e\x00\x3a\x00\x1a\x00\x19\x00\x3d\x00\x10\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x04\x00\x02\x00\x01\x00\x65\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x02\x00\x4d\x00\x02\x00\x68\x00\x50\x00\x01\x00\x0d\x00\x53\x00\x54\x00\x4c\x00\x56\x00\x57\x00\x58\x00\x7f\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x51\x00\x52\x00\x53\x00\x1e\x00\x01\x00\x35\x00\x66\x00\x67\x00\x68\x00\x69\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x71\x00\x61\x00\x10\x00\x44\x00\x45\x00\x46\x00\x47\x00\x2b\x00\x2b\x00\x35\x00\x35\x00\x37\x00\x68\x00\x1b\x00\x3a\x00\x2c\x00\x32\x00\x3d\x00\x01\x00\x3f\x00\x2c\x00\x41\x00\x42\x00\x43\x00\x2c\x00\x44\x00\x45\x00\x46\x00\x47\x00\x49\x00\x4a\x00\x4b\x00\x32\x00\x2f\x00\x7d\x00\x7e\x00\x7f\x00\x2c\x00\x01\x00\x53\x00\x54\x00\x51\x00\x52\x00\x53\x00\x58\x00\x2c\x00\x03\x00\x5b\x00\x01\x00\x5d\x00\x5e\x00\x5f\x00\x7d\x00\x7e\x00\x7f\x00\x45\x00\x2c\x00\x01\x00\x66\x00\x67\x00\x68\x00\x02\x00\x02\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x65\x00\x55\x00\x10\x00\x01\x00\x5d\x00\x01\x00\x02\x00\x03\x00\x61\x00\x68\x00\x63\x00\x64\x00\x65\x00\x1b\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x01\x00\x71\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x2b\x00\x2c\x00\x78\x00\x79\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x01\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x01\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x01\x00\x02\x00\x03\x00\x68\x00\x01\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x01\x00\x68\x00\x10\x00\x5d\x00\x01\x00\x02\x00\x03\x00\x61\x00\x2c\x00\x63\x00\x64\x00\x25\x00\x26\x00\x1b\x00\x28\x00\x71\x00\x2a\x00\x01\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x1e\x00\x31\x00\x32\x00\x33\x00\x01\x00\x01\x00\x36\x00\x01\x00\x78\x00\x79\x00\x3a\x00\x2f\x00\x30\x00\x31\x00\x1e\x00\x33\x00\x2b\x00\x35\x00\x2b\x00\x37\x00\x38\x00\x1e\x00\x3a\x00\x2b\x00\x71\x00\x3d\x00\x01\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x01\x00\x45\x00\x01\x00\x01\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x65\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x01\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x71\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x2a\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x7d\x00\x7e\x00\x7f\x00\x1b\x00\x1a\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x19\x00\x10\x00\x10\x00\x5d\x00\x01\x00\x02\x00\x03\x00\x61\x00\xff\xff\x63\x00\x64\x00\x25\x00\x26\x00\x1b\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x31\x00\x32\x00\x33\x00\xff\xff\xff\xff\x36\x00\xff\xff\x78\x00\x79\x00\x3a\x00\x2f\x00\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x25\x00\x26\x00\x1b\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x31\x00\x32\x00\x33\x00\xff\xff\x26\x00\x36\x00\xff\xff\x2c\x00\xff\xff\x3a\x00\x2f\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\x36\x00\x3a\x00\xff\xff\x39\x00\x3d\x00\xff\xff\x3f\x00\x7f\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x01\x00\x02\x00\x03\x00\x49\x00\x4a\x00\x4b\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x04\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x7d\x00\x7e\x00\x7f\x00\x01\x00\x02\x00\x03\x00\x0d\x00\x0e\x00\x0f\x00\x3b\x00\x1b\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\x38\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x0d\x00\x0e\x00\x0f\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\x60\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5d\x00\xff\xff\x10\x00\x39\x00\x61\x00\xff\xff\x63\x00\x64\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x1b\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x2b\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\x32\x00\xff\xff\x34\x00\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\x3b\x00\x3c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x52\x00\xff\xff\xff\xff\x55\x00\x7e\x00\x7f\x00\xff\xff\x59\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x2f\x00\x5d\x00\x31\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x38\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x45\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x78\x00\x79\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x01\x00\x31\x00\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x7e\x00\x7f\x00\x30\x00\x60\x00\x32\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x1b\x00\x68\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\x2f\x00\x4d\x00\x31\x00\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\x38\x00\x56\x00\x57\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x69\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x01\x00\xff\xff\x55\x00\x56\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x0d\x00\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x5d\x00\xff\xff\x10\x00\xff\xff\x61\x00\x30\x00\x63\x00\x64\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x1b\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\x78\x00\x79\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x2f\x00\x4d\x00\x31\x00\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\x38\x00\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x01\x00\xff\xff\x55\x00\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x1b\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\x2f\x00\x4d\x00\x31\x00\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\x38\x00\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x39\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x60\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5d\x00\x10\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x7d\x00\x7e\x00\x7f\x00\x1b\x00\xff\xff\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x78\x00\x79\x00\x10\x00\xff\xff\x39\x00\x2f\x00\xff\xff\x31\x00\xff\xff\x3e\x00\x3f\x00\x40\x00\xff\xff\x1b\x00\x38\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\x2c\x00\x2d\x00\xff\xff\x2f\x00\x5d\x00\xff\xff\x4e\x00\x4f\x00\x61\x00\x51\x00\x63\x00\x64\x00\x65\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x60\x00\x45\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x78\x00\x79\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\xff\xff\x55\x00\xff\xff\x7e\x00\x7f\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x1b\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x7e\x00\x7f\x00\x10\x00\x2c\x00\x2d\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x1b\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x21\x00\x22\x00\x23\x00\x24\x00\x45\x00\x26\x00\x2c\x00\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x55\x00\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x55\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x5d\x00\xff\xff\xff\xff\x7f\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x1b\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\x2c\x00\x78\x00\x79\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x45\x00\xff\xff\x01\x00\x35\x00\x36\x00\x2f\x00\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x55\x00\x10\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x1b\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x55\x00\xff\xff\x2c\x00\x5d\x00\xff\xff\x2f\x00\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x45\x00\xff\xff\x01\x00\x78\x00\x79\x00\xff\xff\xff\xff\x7f\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x55\x00\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\xff\xff\xff\xff\x2c\x00\x01\x00\x02\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x5d\x00\x10\x00\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x3a\x00\x45\x00\xff\xff\x1b\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\x55\x00\x78\x00\x79\x00\xff\xff\x5d\x00\xff\xff\x2f\x00\x01\x00\x61\x00\x03\x00\x63\x00\x64\x00\x65\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0d\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\xff\xff\xff\xff\x78\x00\x79\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x1b\x00\xff\xff\x31\x00\x1e\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x38\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4e\x00\x4f\x00\x10\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\x45\x00\xff\xff\x1b\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\x60\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x66\x00\x67\x00\x68\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0d\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x1b\x00\xff\xff\x31\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x38\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4e\x00\x4f\x00\x10\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x45\x00\x61\x00\x1b\x00\x63\x00\x64\x00\x65\x00\x66\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x01\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0d\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\x31\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x38\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4e\x00\x4f\x00\x10\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x1b\x00\xff\xff\xff\xff\xff\xff\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\x01\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\x0d\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\xff\xff\x10\x00\xff\xff\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1b\x00\xff\xff\x31\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x38\x00\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x4e\x00\x4f\x00\x10\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\x1b\x00\xff\xff\x04\x00\xff\xff\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\x68\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x01\x00\x45\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\x3b\x00\x55\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\x04\x00\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x01\x00\xff\xff\x03\x00\xff\xff\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x0d\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x31\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\x38\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x66\x00\x67\x00\x68\x00\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x60\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x31\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\x38\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x3a\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\x34\x00\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\x01\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\x0d\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\x39\x00\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\x01\x00\x56\x00\x03\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\x30\x00\x78\x00\x79\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x7f\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x01\x00\xff\xff\x03\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\x0d\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x01\x00\xff\xff\x03\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\x0d\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x7e\x00\x7f\x00\x66\x00\x67\x00\x68\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\x01\x00\x3a\x00\x03\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x0d\x00\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x01\x00\xff\xff\x7e\x00\x7f\x00\xff\xff\x67\x00\x68\x00\x31\x00\xff\xff\xff\xff\xff\xff\x35\x00\x0d\x00\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x01\x00\x51\x00\x0d\x00\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\x31\x00\x5b\x00\x0d\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\x01\x00\xff\xff\x03\x00\x31\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x0d\x00\x01\x00\x38\x00\x03\x00\x0d\x00\x31\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x0d\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x01\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\x31\x00\x51\x00\xff\xff\xff\xff\x31\x00\x0d\x00\x60\x00\x38\x00\xff\xff\xff\xff\xff\xff\x38\x00\x66\x00\x31\x00\x68\x00\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\x66\x00\x67\x00\x68\x00\xff\xff\x01\x00\xff\xff\x03\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\x01\x00\x0d\x00\xff\xff\xff\xff\x31\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x60\x00\x38\x00\x0d\x00\xff\xff\x60\x00\xff\xff\x66\x00\xff\xff\x68\x00\xff\xff\xff\xff\xff\xff\x68\x00\x60\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x68\x00\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\x31\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x38\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\xff\xff\x60\x00\xff\xff\xff\xff\x5d\x00\x38\x00\xff\xff\x66\x00\x61\x00\x68\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\x78\x00\x79\x00\xff\xff\x60\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x68\x00\xff\xff\xff\xff\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x19\x00\x66\x00\x1b\x00\x68\x00\x1d\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x1e\x00\x1f\x00\x3a\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\x7e\x00\x7f\x00\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x36\x00\x45\x00\x46\x00\x47\x00\x3a\x00\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x7e\x00\x7f\x00\x3a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x4b\x00\x4c\x00\x4d\x00\x4e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x34\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x3b\x00\x3a\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x4b\x00\x4c\x00\x4d\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1f\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x20\x00\x3a\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\x4d\x00\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x20\x00\xff\xff\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x21\x00\x22\x00\x23\x00\x24\x00\x7f\x00\x26\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x3f\x00\x40\x00\xff\xff\xff\xff\x7e\x00\x7f\x00\x45\x00\x46\x00\x47\x00\xff\xff\x7e\x00\x7f\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x21\x00\x22\x00\x23\x00\x24\x00\xff\xff\x26\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\x2d\x00\x2e\x00\x2f\x00\x36\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\x36\x00\x28\x00\xff\xff\x2a\x00\x3a\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x36\x00\xff\xff\xff\xff\x61\x00\x3a\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x4f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\x5d\x00\x4f\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x5d\x00\xff\xff\xff\xff\x3a\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x4f\x00\xff\xff\xff\xff\x78\x00\x79\x00\x7e\x00\x7f\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\xff\xff\x3a\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\x45\x00\x46\x00\x47\x00\xff\xff\x49\x00\x4a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x5d\x00\xff\xff\xff\xff\x3a\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x4f\x00\xff\xff\xff\xff\x78\x00\x79\x00\x7e\x00\x7f\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x5d\x00\xff\xff\xff\xff\x3a\x00\x61\x00\x4f\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\x4f\x00\xff\xff\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\x25\x00\x26\x00\x5f\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\xff\xff\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\x25\x00\x26\x00\x3a\x00\x28\x00\x4f\x00\x2a\x00\xff\xff\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x36\x00\x2d\x00\x2e\x00\x2f\x00\x3a\x00\xff\xff\x4f\x00\xff\xff\xff\xff\xff\xff\x36\x00\xff\xff\xff\xff\x39\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\x4f\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x7d\x00\x7e\x00\x7f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x39\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x5d\x00\xff\xff\x7e\x00\x7f\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x3a\x00\xff\xff\xff\xff\x39\x00\x76\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x44\x00\x45\x00\x46\x00\x47\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\x3a\x00\x7d\x00\x7e\x00\x7f\x00\x3e\x00\x3f\x00\x40\x00\x3a\x00\x39\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\x7d\x00\x7e\x00\x7f\x00\xff\xff\x78\x00\x79\x00\xff\xff\x7d\x00\x7e\x00\x7f\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x67\x00\x68\x00\x69\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2b\x00\xff\xff\x40\x00\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\xff\xff\x48\x00\xff\xff\xff\xff\x38\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x40\x00\xff\xff\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\x60\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\xff\xff\xff\xff\x68\x00\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\x2c\x00\x5c\x00\xff\xff\xff\xff\x30\x00\x60\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\x68\x00\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\x57\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\x30\x00\x67\x00\x68\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x67\x00\x68\x00\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\x57\x00\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\xff\xff\x5e\x00\x5f\x00\x60\x00\xff\xff\x30\x00\xff\xff\xff\xff\x33\x00\xff\xff\x35\x00\x68\x00\x37\x00\xff\xff\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x4d\x00\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\x58\x00\xff\xff\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\xff\xff\x30\x00\x31\x00\xff\xff\x33\x00\xff\xff\xff\xff\x67\x00\x68\x00\x38\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x48\x00\xff\xff\xff\xff\xff\xff\xff\xff\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\x31\x00\x5c\x00\x33\x00\xff\xff\x35\x00\x60\x00\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\x68\x00\xff\xff\x40\x00\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\x5a\x00\xff\xff\x5c\x00\x31\x00\x5e\x00\x5f\x00\x60\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\x68\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x67\x00\x68\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x67\x00\x68\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x67\x00\x68\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x00\xff\xff\x67\x00\x68\x00\x35\x00\xff\xff\x37\x00\x38\x00\xff\xff\x3a\x00\xff\xff\xff\xff\x3d\x00\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\x31\x00\xff\xff\x33\x00\x49\x00\x4a\x00\x4b\x00\xff\xff\x38\x00\x4e\x00\x4f\x00\xff\xff\x51\x00\xff\xff\x53\x00\x54\x00\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5e\x00\x5f\x00\x60\x00\xff\xff\xff\xff\x4e\x00\x4f\x00\x50\x00\x51\x00\xff\xff\x68\x00\xff\xff\xff\xff\x56\x00\xff\xff\xff\xff\x35\x00\x5a\x00\x37\x00\x5c\x00\xff\xff\x3a\x00\xff\xff\x60\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\x68\x00\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x69\x00\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x3b\x00\xff\xff\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x67\x00\x68\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x67\x00\x68\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\x35\x00\xff\xff\x37\x00\xff\xff\xff\xff\x3a\x00\x67\x00\x68\x00\x3d\x00\xff\xff\x3f\x00\xff\xff\x41\x00\x42\x00\x43\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x49\x00\x4a\x00\x4b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x53\x00\x54\x00\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\x5b\x00\xff\xff\x5d\x00\x5e\x00\x5f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x00\x68\x00\x56\x00\xff\xff\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\xff\xff\x56\x00\x7c\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x56\x00\xff\xff\x7c\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x78\x00\x79\x00\xff\xff\x61\x00\x7c\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x56\x00\x77\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x82\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x56\x00\xff\xff\xff\xff\xff\xff\xff\xff\x78\x00\x79\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x76\x00\xff\xff\x78\x00\x79\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\x7f\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\x75\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\x74\x00\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\x73\x00\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\x77\x00\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x5d\x00\xff\xff\xff\xff\xff\xff\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xff\xff\x5d\x00\xff\xff\x78\x00\x79\x00\x61\x00\xff\xff\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\xff\xff\xff\xff\x78\x00\x79\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\x78\x00\x79\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x3e\x00\x3f\x00\x40\x00\xff\xff\xff\xff\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x3b\x00\xff\xff\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\xff\xff\x44\x00\x45\x00\x46\x00\x47\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#--happyTable :: HappyAddr-happyTable = HappyA# "\x00\x00\x94\x00\x4e\x00\x4f\x00\x11\x03\xb5\x03\xf7\x02\x00\x03\xf6\x01\xad\x01\x62\x03\xb8\x01\xc6\x00\x41\x02\xe5\xff\xcf\x00\x52\x03\x99\x02\x13\x02\xe1\x01\x9c\x01\xe8\x00\x0a\x01\x36\x02\x50\x00\x42\x02\x51\x00\xa0\x03\x52\x00\x53\x00\x54\x00\xe2\x01\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x25\xfe\x23\x03\x8b\x01\xab\x03\x01\x01\x63\x03\x64\x00\xf7\x01\x9a\x01\x86\x01\x65\x00\xa1\x03\x0b\x01\x87\x01\x51\x01\x4e\x00\x4f\x00\xa8\x03\x8c\x01\xbe\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x97\x03\x41\x02\x3e\x03\x92\x00\xac\x03\xf6\x02\x92\x00\xaa\x00\xc7\x00\x7f\x03\x50\x00\xd0\x00\x51\x00\x42\x02\x52\x00\x53\x00\x54\x00\x13\x02\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x90\x00\xae\x01\x92\x00\x90\x00\xae\x01\x92\x00\x64\x00\x90\x00\xe9\x00\x92\x00\x65\x00\x92\x00\x92\x00\x90\x00\x4d\x00\x4e\x00\x4f\x00\x6d\x00\x6e\x00\x6f\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\xe4\x02\x9e\x02\x6f\x00\x0d\x03\xbb\x02\xf7\x02\x02\x01\x4d\x00\xfe\x02\x6f\x00\x50\x00\xce\x00\x51\x00\x92\x00\x52\x00\x53\x00\x54\x00\x13\x02\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xba\x00\xcf\x00\x7f\x03\x9a\x01\xad\x01\x3c\x03\x64\x00\x2b\x00\xad\x03\x90\x00\x65\x00\x92\x00\xb4\x03\x90\x00\xe9\x00\x92\x00\xe8\x00\x6d\x00\x6e\x00\x6f\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x69\x03\xe1\x01\xbb\x00\x56\x00\x57\x00\x58\x00\x41\x02\xbc\x00\xa7\x03\x99\x00\x6f\x00\xfc\x01\xc5\x00\xe2\x01\xbd\x00\x62\x00\x63\x00\x41\x02\x42\x02\x6b\x03\x87\x03\x4e\x03\xa8\x01\x64\x00\xb4\x01\xb5\x03\xbe\x00\x7f\x03\x05\x03\x42\x02\x95\x03\x3a\x03\x3b\x03\x88\x03\xe8\x00\xc6\x00\x15\x02\xbf\x00\x67\x00\x68\x00\x69\x00\xc0\x00\x6b\x00\x6c\x00\xd0\x00\xaa\x00\x90\x00\xae\x01\x92\x00\x06\x03\x6d\x00\x6e\x00\x6f\x00\xb5\x01\x56\x00\x57\x00\x58\x00\x32\x03\xb6\x01\xad\x01\x88\x03\x4f\x03\xfd\x02\xfb\x01\x33\x03\xb7\x01\x62\x00\x63\x00\x06\x03\xe9\x00\xe1\x01\xe8\x00\x7e\x02\x22\x02\x64\x00\xba\x00\x16\x02\xb8\x01\x90\x00\xae\x01\x92\x00\xbc\x02\xe2\x01\xfa\x01\xfb\x01\x23\x02\xe1\x01\x41\x03\xb9\x01\x67\x00\x68\x00\x69\x00\xba\x01\x6b\x00\x6c\x00\xc1\x00\x6f\x00\xea\x00\xe2\x01\xc9\x00\xca\x00\xcb\x00\x90\x00\xeb\x00\x92\x00\xc7\x00\x42\x03\x90\x00\xe9\x00\x92\x00\xec\x00\x62\x00\x63\x00\x9a\x01\xa4\x00\x22\x02\x43\x03\xba\x00\x90\x00\x64\x00\x92\x00\x24\xfe\xcc\x00\x90\x00\xe9\x00\x92\x00\xce\x00\x23\x02\x24\xfe\x85\x02\x3c\x03\xfc\x01\x45\x03\xed\x00\x67\x00\x68\x00\x69\x00\xee\x00\x6b\x00\x6c\x00\x9f\x01\x55\x03\x71\x00\xa5\x00\x56\x00\x57\x00\x58\x00\xaa\x00\xa6\x00\xcf\x00\x24\xfe\x24\xfe\xfc\x01\x24\xfe\x72\x00\xa7\x00\x62\x00\x63\x00\xd6\x00\xa9\x02\x90\x00\xae\x01\x92\x00\xb3\x01\x64\x00\x44\x03\x28\x02\x7e\x02\x24\xfe\x86\x02\xa4\x02\x90\x00\x9a\x01\x92\x00\x90\x00\xe9\x00\x92\x00\xd7\x00\xa8\x00\x67\x00\x68\x00\x69\x00\xa9\x00\x6b\x00\x6c\x00\xaf\x02\xa4\x03\x90\x00\xbb\x00\x56\x00\x57\x00\x58\x00\xef\x00\xbc\x00\xb5\x01\x56\x00\x57\x00\x58\x00\xa5\x02\xb6\x01\xbd\x00\x62\x00\x63\x00\xef\x01\x58\x03\x59\x03\xb7\x01\x62\x00\x63\x00\x64\x00\xac\x02\xbd\x02\xbe\x00\x84\x03\xa5\x03\x64\x00\x90\x00\xe9\x00\xb8\x01\xd0\x00\xcb\x02\x02\x01\x4d\x00\xbf\x00\x67\x00\x68\x00\xe6\x01\x12\x02\x35\x02\xb9\x01\x67\x00\x68\x00\xe6\x01\x29\x02\x99\x00\x6f\x00\xe7\x00\xaa\x00\xea\x00\x13\x02\xc9\x00\xca\x00\xcb\x00\x90\x00\xeb\x00\x92\x00\xd5\x00\xd8\x00\xe8\x00\xd7\x02\xd6\x00\xec\x00\x62\x00\x63\x00\xa5\x03\x34\x00\x35\x00\x02\x03\x71\x03\x37\x02\x64\x00\x02\x01\x4d\x00\xcc\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xd7\x00\x02\x01\x4d\x00\xbe\x01\x0f\x03\xed\x00\x67\x00\x68\x00\xe6\x01\xdc\x01\xf3\x01\xf4\x01\xaa\x02\x6f\x00\x62\x02\x34\x00\x35\x00\x72\x03\xb0\x02\xaa\x00\x64\x02\x65\x02\x66\x02\x08\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xb3\x02\x3a\x02\x39\x03\x3a\x03\x3b\x03\x67\x02\x9a\x01\x51\x00\x32\x02\x52\x00\x68\x02\x69\x02\x9a\x01\x55\x00\x56\x00\x57\x00\x58\x00\x6a\x02\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xb4\x02\x3c\x02\x90\x00\xe9\x00\x02\x01\x4d\x00\x64\x00\xef\x00\x93\x00\x05\x00\x6b\x02\x90\x00\xe9\x00\xd8\x00\x36\x02\x4b\x02\x06\x00\xde\x01\x68\x00\xdf\x01\x07\x00\x51\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x99\x01\x3b\x00\xe5\x01\x67\x00\x68\x00\xe6\x01\x18\x00\x19\x00\x06\x00\x9a\x01\x3c\x00\xa3\x01\x07\x00\xba\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xb9\x00\x3b\x00\xba\x00\x9a\x01\x5e\x02\x9f\x01\x18\x00\x19\x00\x3c\x03\xaa\x00\x3c\x00\x6d\x00\xd9\x01\x6f\x00\x62\x02\x34\x00\x35\x00\x5f\x02\x63\x02\x7e\x02\x64\x02\x65\x02\x66\x02\x53\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xdc\x00\x64\x03\x60\x02\xaa\x00\x65\x03\x67\x02\x54\x01\x51\x00\x9a\x01\x52\x00\x68\x02\x69\x02\xaf\x01\x55\x00\x56\x00\x57\x00\x58\x00\x6a\x02\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x98\x01\xd9\x00\x9c\x01\xc9\x00\xca\x00\xcb\x00\x64\x00\xda\x00\x02\x01\x4d\x00\x6b\x02\xa6\x03\x34\x00\x35\x00\x6d\x03\x6e\x03\x9a\x01\xa0\x00\x68\x00\x05\x02\x9e\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xcc\x00\xdd\x00\xa0\x01\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xae\x01\xe4\x00\x67\x00\x68\x00\x69\x00\xe5\x00\x6b\x00\x6c\x00\xb0\x01\xd2\x00\x06\x00\xc9\x00\xca\x00\xcb\x00\x07\x00\x21\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xbe\x01\x3b\x00\x12\x03\xcc\x00\xdc\x01\x13\x03\x18\x00\x19\x00\xa3\x00\x6f\x00\x3c\x00\x6d\x00\xd9\x01\x6f\x00\x22\x01\x5a\x00\xb1\x01\x23\x01\xa6\x00\x24\x01\xbd\x01\x25\x01\x61\x00\x62\x00\x63\x00\xa7\x00\x62\x00\x63\x00\x26\x03\x27\x03\xdb\x00\x64\x00\x9a\x01\x06\x00\x64\x00\x26\x01\x9a\x01\x07\x00\xbf\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xd2\x01\x3b\x00\x7c\x01\x79\x01\xdb\x01\xba\x00\x18\x00\x19\x00\x49\x03\x4a\x03\x3c\x00\xdd\x01\x4b\x03\xad\x00\x97\xfe\x7a\x01\x06\x00\x97\xfe\xec\x01\xd3\x00\x07\x00\x21\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xc8\x00\x28\x01\xc9\x00\xca\x00\xcb\x00\x97\xfe\x18\x00\x19\x00\x28\x03\x29\x03\xd8\x02\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\xaa\x00\x23\x01\xaa\x00\x24\x01\xed\x01\x25\x01\x61\x00\x62\x00\x63\x00\xcc\x00\x93\x02\xb4\x00\xd4\x01\x94\x02\x51\x00\x64\x00\x52\x00\xd5\x01\xd6\x01\x26\x01\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xf9\x00\x5d\x03\xb8\x01\x5b\x03\x5e\x03\x7e\x01\x64\x00\xc1\x02\xe0\x00\xe1\x00\xd8\x01\x16\x02\x41\x03\x01\x02\x67\x00\x68\x00\xe6\x01\xff\x00\xd2\x00\x06\x00\xc9\x00\xca\x00\xcb\x00\x07\x00\x21\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0c\x01\x28\x01\x01\x03\xcc\x00\xcd\x00\x02\x03\x18\x00\x19\x00\x65\x03\xb6\x00\xb7\x00\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\x12\x02\x23\x01\x17\x01\x24\x01\x3f\x01\x25\x01\x61\x00\x62\x00\x63\x00\x42\x02\xb6\x00\xb7\x00\x13\x02\x05\x00\xbe\x00\x64\x00\xaa\x00\x02\x01\x4d\x00\x26\x01\x2b\x00\x6d\x00\xd9\x01\x6f\x00\x1e\x01\xe7\x01\x67\x00\x68\x00\x69\x00\x2c\x03\xe8\x01\x6c\x00\x16\x02\xb2\x02\xa5\x00\x56\x00\x57\x00\x58\x00\xb7\x03\xa6\x00\x80\x01\x54\x02\x67\x00\x68\x00\xe6\x01\xb8\x03\xa7\x00\x62\x00\x63\x00\x34\x01\x35\x01\x36\x01\x37\x01\xb9\x03\x06\x00\x64\x00\x2b\x00\xd3\x00\x07\x00\x21\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xaf\x03\x28\x01\x79\x03\x99\x00\x6f\x00\xb0\x03\x18\x00\x19\x00\xe9\x01\x6f\x00\x0a\x02\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\xb1\x03\x23\x01\xa0\x03\x24\x01\x2b\x00\x25\x01\x61\x00\x62\x00\x63\x00\xa3\x03\x90\x00\xe9\x00\xd4\x01\x92\x00\x51\x00\x64\x00\x52\x00\xd5\x01\xd6\x01\x26\x01\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\xb8\x01\x8f\x03\xaa\x00\x92\x00\xbe\x00\x27\x01\x64\x00\x7a\x03\x99\x00\x6f\x00\xd8\x01\x01\x02\x67\x00\x68\x00\xe6\x01\xe7\x01\x67\x00\x68\x00\xe6\x01\x06\x00\x7b\x03\x99\x00\x6f\x00\x07\x00\x94\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x95\x03\x28\x01\xa8\x01\xe1\x00\x02\x01\x4d\x00\x18\x00\x19\x00\xa0\x00\x68\x00\x05\x02\x6d\x00\x29\x01\x6f\x00\x32\x01\x33\x01\xb6\x01\x19\x03\x99\x00\x6f\x00\x38\x01\x39\x01\x33\x02\xb7\x01\x62\x00\x63\x00\x1a\x03\x99\x00\x6f\x00\x22\x02\xaa\x00\xba\x00\x64\x00\xe9\x01\x6f\x00\xb8\x01\x97\x03\x6d\x00\xd9\x01\x6f\x00\xd4\x01\x23\x02\x51\x00\x9a\x03\x52\x00\xd5\x01\xd6\x01\x9b\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x3d\x02\x9c\x03\xab\x01\x6f\x00\x02\x01\x4d\x00\x64\x00\x4c\x01\x3f\x00\x4d\x01\xd8\x01\x4e\x01\x4f\x01\x6f\x03\xaf\x00\x50\x01\x51\x01\x70\x03\xd4\x01\x79\x03\x51\x00\xb0\x00\x52\x00\xd5\x01\xd6\x01\x73\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x92\x00\xaa\x00\xb1\x00\xb2\x00\x7f\x03\xb3\x00\x64\x00\x77\x02\x3a\x01\x3b\x01\xd8\x01\x2d\x03\xb6\x00\xb7\x00\xf6\x00\xf7\x00\x46\x02\xe0\x00\xe1\x00\x92\x00\xb4\x00\x4c\x02\xe5\x01\x67\x00\x68\x00\xe6\x01\x90\x00\xe9\x00\x92\x00\x78\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x81\x03\x6d\x00\xd9\x01\x6f\x00\xd4\x01\x83\x03\x51\x00\x86\x03\x52\x00\xd5\x01\xd6\x01\x08\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x52\x02\xf8\x00\xf9\x00\xa0\x00\x68\x00\xa1\x00\x64\x00\xa2\x00\x6c\x00\x0d\x03\xd8\x01\x9c\x01\x6d\x00\x79\x02\x6f\x00\x6d\x00\xd9\x01\x6f\x00\xd4\x01\xaa\x00\x51\x00\x18\x03\x52\x00\xd5\x01\xd6\x01\x19\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x1e\x03\x75\x03\x34\x00\x35\x00\x02\x01\x4d\x00\x64\x00\x42\x02\xb6\x00\xb7\x00\xd8\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x2c\x01\x2d\x01\xb8\x01\xa3\x00\x6f\x00\xd3\x01\x1c\x03\xc1\x02\xe0\x00\xe1\x00\xc2\x02\xe3\x00\x92\x00\x01\x02\x67\x00\x68\x00\xe6\x01\xdb\x02\x99\x00\x6f\x00\x6d\x00\xd9\x01\x6f\x00\xd4\x01\x1d\x03\x51\x00\x1f\x03\x52\x00\xd5\x01\xd6\x01\x32\x03\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x0a\x02\x3f\x02\xe1\x00\x50\x03\xb6\x00\xb7\x00\x64\x00\xde\x01\x68\x00\xdf\x01\xd8\x01\x38\x03\x34\x00\x35\x00\x36\x03\x6d\x00\xd9\x01\x6f\x00\x42\x02\xb6\x00\xb7\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xaa\x00\x06\x00\xc5\x02\xb6\x00\xb7\x00\x07\x00\x35\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x37\x03\x3b\x00\xb8\x02\x34\x00\x35\x00\x38\x03\x18\x00\x19\x00\x32\x01\x33\x01\x3c\x00\x3f\x03\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xaa\x00\x46\x02\xe0\x00\xe1\x00\xc6\x02\xb6\x00\xb7\x00\xe5\x01\x67\x00\x68\x00\xe6\x01\x40\x03\x6d\x00\xd9\x01\x6f\x00\xb9\x02\x34\x00\x35\x00\x3f\x00\x9b\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x42\x02\xb6\x00\xb7\x00\x47\x03\x06\x00\xe0\x02\x99\x00\x6f\x00\x07\x00\x48\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x4c\x03\x3b\x00\xba\x02\x34\x00\x35\x00\x4d\x03\x18\x00\x19\x00\x38\x01\x39\x01\x3c\x00\xaa\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x50\x03\x06\x00\xfb\x02\xb6\x00\xb7\x00\x07\x00\x53\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x58\x03\x3b\x00\xe5\x02\x99\x00\x6f\x00\x54\x03\x18\x00\x19\x00\x9a\x02\x06\x00\x3c\x00\x3a\x01\x3b\x01\x07\x00\x9b\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x81\x02\x3b\x00\x5d\x02\x34\x00\x35\x00\x26\xfe\x18\x00\x19\x00\xaf\x02\xb5\x02\x3c\x00\xd2\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xe6\x02\x99\x00\x6f\x00\x2b\x00\x06\x00\xe7\x02\x99\x00\x6f\x00\x07\x00\xbf\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x9c\x01\x3b\x00\x6e\x02\x34\x00\x35\x00\xc0\x02\x18\x00\x19\x00\xc8\x02\xca\x02\x3c\x00\xd6\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xd7\x02\x0a\x02\x06\x00\xeb\x02\x99\x00\x6f\x00\x07\x00\x04\x02\xa9\x03\x09\x00\xdf\x02\x8c\x01\x34\x00\x35\x00\xec\x02\x99\x00\x6f\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xf0\x02\x99\x00\x6f\x00\x18\x00\x19\x00\x06\x00\xaa\x03\xe0\x02\xe2\x02\x07\x00\xe3\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x92\x00\x3b\x00\x03\x01\x34\x00\x35\x00\xf4\x02\x18\x00\x19\x00\x9c\x01\xf9\x02\x3c\x00\xfa\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\xb5\x00\xb6\x00\xb7\x00\x2b\x00\x06\x00\x6d\x00\x9f\x00\x6f\x00\x07\x00\xfd\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x04\x03\x3b\x00\x02\x02\xb6\x00\xb7\x00\x06\x00\x18\x00\x19\x00\xf8\x01\x07\x00\x3c\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\xfa\x01\x3b\x00\x33\x00\x34\x00\x35\x00\xf9\x01\x18\x00\x19\x00\xfe\x01\xff\x01\x3c\x00\x00\x02\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x03\x02\xb6\x00\xb7\x00\x01\x02\x08\x02\x06\x00\xb5\x00\xb6\x00\xb7\x00\x07\x00\x0a\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x18\x02\x3b\x00\xa8\x02\x66\x02\x17\x02\x92\x00\x18\x00\x19\x00\x2e\x02\x0a\x02\x3c\x00\x35\x02\x2a\x02\x99\x00\x6f\x00\x67\x02\x3f\x00\x51\x00\x3c\x02\x52\x00\x68\x02\x69\x02\x0a\x02\x55\x00\x56\x00\x57\x00\x58\x00\x6a\x02\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x8e\x01\x42\x02\xb6\x00\xb7\x00\x44\x02\x45\x02\x64\x00\x0a\x02\x50\x02\x06\x00\x6b\x02\x0a\x02\x92\x00\x07\x00\x56\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x57\x02\x3b\x00\x50\x02\x99\x00\x6f\x00\x58\x02\x18\x00\x19\x00\x59\x02\x5a\x02\x3c\x00\x5c\x02\x85\x01\x99\x00\x6f\x00\x06\x00\x96\x01\x99\x00\x6f\x00\x07\x00\x2b\x00\x06\x01\x09\x00\x16\x01\x06\x00\x97\x01\x99\x00\x6f\x00\x07\x00\xd2\x01\x89\x03\x09\x00\xb5\x01\x56\x00\x57\x00\x58\x00\x62\x02\xb6\x01\x71\x00\xa1\x01\xb6\x00\xb7\x00\x18\x00\x19\x00\xb7\x01\x62\x00\x63\x00\x6d\x00\xd9\x01\x6f\x00\x72\x00\x18\x00\x19\x00\x64\x00\x8a\x03\x06\x00\xb8\x01\x70\x02\x71\x02\x07\x00\x72\x02\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x73\x02\xfc\x00\x74\x02\x8f\x01\x53\x01\x75\x02\x18\x00\x19\x00\x76\x02\x73\x00\x77\x02\x74\x00\x75\x00\x92\x00\x76\x00\x82\x02\x77\x00\x2e\x01\x84\x02\x78\x00\x2f\x01\x30\x01\x79\x00\x31\x01\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x87\x02\x71\x01\xe1\x01\x80\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x72\x01\x83\x00\x7c\x01\x92\x00\x84\x00\x8a\x01\xe2\x01\x85\x00\x86\x00\x89\x01\x87\x00\x88\x00\x89\x00\xaa\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb5\x00\xb6\x00\xb7\x00\x23\x03\x15\x01\x91\x03\x90\x00\x91\x00\x92\x00\x93\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xfb\xff\x8e\x01\x23\x00\x21\x03\x67\x00\x68\x00\xe6\x01\x92\x01\x94\x01\x76\x00\x7c\x03\x77\x00\x92\x00\x24\x00\x78\x00\x3f\x00\x9c\x01\x79\x00\x9e\x01\x7a\x00\x3f\x00\x7c\x00\x7d\x00\x7e\x00\xe5\xff\x21\x03\x67\x00\x68\x00\xe6\x01\x80\x00\x81\x00\x82\x00\x9c\x01\x25\x00\x98\x00\x99\x00\x6f\x00\x3f\x00\xb4\x01\x85\x00\x86\x00\xb5\x00\xb6\x00\xb7\x00\x89\x00\x3f\x00\xba\x00\xac\x00\xdb\x01\x8d\x00\x8e\x00\x8f\x00\xc4\x00\x99\x00\x6f\x00\x26\x00\x3f\x00\x1b\x00\x90\x00\xad\x00\x92\x00\xe3\x01\xe5\x01\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x2b\x00\x27\x00\x23\x00\xf3\x01\x06\x00\xa3\x01\x77\x03\xba\x00\x07\x00\x92\x00\x06\x01\x09\x00\x7f\x02\x24\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x96\x00\xff\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x8c\x03\x3e\x00\x3f\x00\x18\x00\x19\x00\x25\x00\x73\x00\x25\xfe\x40\x00\x75\x00\x41\x00\x76\x00\x42\x00\x77\x00\x25\xfe\x43\x00\x78\x00\x44\x00\x45\x00\x79\x00\x97\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x46\x00\x26\x00\x47\x00\x48\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x98\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x49\x00\x85\x00\x86\x00\x27\x00\x87\x00\x88\x00\x89\x00\x4a\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x4b\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x6d\x02\x92\x00\x6e\x02\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\xa3\x01\x31\x03\xba\x00\x92\x00\x9b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x9c\x00\x92\x00\x23\x00\x06\x00\xa3\x01\xc5\x02\xba\x00\x07\x00\x3f\x00\x13\x01\x09\x00\xcc\x02\x5a\x00\x24\x00\x23\x01\xff\xff\x24\x01\xfb\x00\x25\x01\x61\x00\x62\x00\x63\x00\x27\xfe\x1f\x03\xce\x02\xcf\x02\xfc\x00\xff\x00\x64\x00\x03\x01\x18\x00\x19\x00\xd0\x02\x25\x00\xd7\xff\xd7\xff\x05\x01\xd7\xff\x06\x01\xd7\xff\x0a\x01\xd7\xff\xd7\xff\x0e\x01\xd7\xff\x0f\x01\xff\xff\xd7\xff\x10\x01\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x11\x01\x26\x00\x12\x01\x13\x01\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x19\x01\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x1c\x01\xd7\xff\xd7\xff\x27\x00\xd7\xff\xd7\xff\xd7\xff\xff\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\xd7\xff\x2b\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xd7\xff\xd7\xff\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x6d\x00\xd1\x02\x6f\x00\x2e\x01\x2f\x01\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x30\x01\x31\x01\x23\x00\x06\x00\xa3\x01\xcb\x02\xba\x00\x07\x00\x00\x00\x15\x01\x09\x00\xcc\x02\x5a\x00\x24\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\xcd\x02\xce\x02\xcf\x02\x00\x00\x00\x00\x64\x00\x00\x00\x18\x00\x19\x00\xd0\x02\x25\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x26\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x27\x00\x87\x00\x88\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x91\x00\x92\x00\x6e\x02\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x6d\x00\xd1\x02\x6f\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x9b\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x00\x00\xcc\x02\x5a\x00\x24\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\xcd\x02\xce\x02\xcf\x02\x00\x00\xbc\x00\x64\x00\x00\x00\x3f\x00\x00\x00\xd0\x02\x25\x00\xbd\x00\x62\x00\x63\x00\x00\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x64\x00\x78\x00\x00\x00\xbe\x00\x79\x00\x00\x00\x7a\x00\xaa\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x26\x00\xa3\x01\xe4\x01\xba\x00\x80\x00\x81\x00\x82\x00\x7a\x01\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\xf2\x00\x85\x00\x86\x00\x27\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x91\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x6d\x00\xd1\x02\x6f\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x23\x03\x24\x03\x6f\x00\xa3\x01\x07\x02\xba\x00\x3c\x01\x3d\x01\x3e\x01\xf3\x00\x24\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\xe4\x00\x67\x00\x68\x00\x69\x00\xf4\x00\x6b\x00\x6c\x00\xb9\x00\xe4\x01\xba\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\xb0\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x26\x00\x3c\x01\x3d\x01\x3e\x01\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x85\x00\x86\x00\x27\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\xb4\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x91\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x06\x00\x00\x00\x23\x00\xbe\x00\x07\x00\x00\x00\x19\x01\x09\x00\x47\x02\xe0\x00\xe1\x00\x48\x02\xe3\x00\x24\x00\xe7\x01\x67\x00\x68\x00\x69\x00\x00\x00\xe8\x01\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x3e\x00\x3f\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x40\x00\x00\x00\x41\x00\x00\x00\x42\x00\x00\x00\x00\x00\x43\x00\x00\x00\x44\x00\x45\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x46\x00\x26\x00\x47\x00\x48\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xde\x02\x00\x00\x00\x00\x23\x00\x49\x00\x00\x00\x00\x00\x27\x00\x49\x02\x6f\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x25\x00\x06\x00\xaf\x00\x00\x00\x00\x00\x07\x00\x00\x00\x1c\x01\x09\x00\xb0\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x47\x02\xe0\x00\xe1\x00\x48\x02\xe3\x00\x26\x00\xe7\x01\x67\x00\x68\x00\xe6\x01\x00\x00\x18\x00\x19\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x71\x00\xaf\x00\x27\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x72\x00\xb4\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x32\x02\x00\x00\x00\x00\x23\x00\x49\x02\x6f\x00\x73\x00\xb4\x00\x74\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x24\x00\x92\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x25\x00\x83\x00\xaf\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\xb0\x00\x87\x00\x88\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x90\x00\x91\x00\x92\x00\x93\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\xe1\x01\x00\x00\x27\x00\x25\xfe\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x1f\x01\x09\x00\xe2\x01\xb4\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\xc5\x01\x06\x00\x00\x00\x23\x00\x00\x00\x07\x00\x73\x00\x20\x01\x09\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x24\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x18\x00\x19\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x25\x00\x83\x00\x25\xfe\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x25\xfe\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x90\x00\xad\x00\x92\x00\x00\x00\x00\x00\x25\xfe\x25\xfe\x00\x00\x25\xfe\x00\x00\x71\x00\x00\x00\x27\x00\xc6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x72\x00\x25\xfe\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x2d\x02\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x24\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x25\x00\x83\x00\x24\xfe\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x24\xfe\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xbe\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x90\x00\xad\x00\x92\x00\x00\x00\x00\x00\x24\xfe\x24\xfe\x00\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x24\xfe\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x92\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x06\x00\x23\x00\x00\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x5a\x01\x9d\x02\x9e\x02\x6f\x00\x24\x00\x00\x00\x1b\x00\x00\x00\x93\x02\x00\x00\x00\x00\x94\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x18\x00\x19\x00\x23\x00\x00\x00\xbe\x00\x25\x00\x00\x00\xaf\x00\x00\x00\x47\x02\xe0\x00\xe1\x00\x00\x00\x24\x00\xb0\x00\xe7\x01\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x95\x02\x9d\x03\x00\x00\x25\x00\x06\x00\x00\x00\xb1\x00\xb2\x00\x07\x00\xb3\x00\x06\x01\x09\x00\x5b\x01\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x26\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x18\x00\x19\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x27\x00\x00\x00\x2e\x03\x6f\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\xc0\x02\x00\x00\xa0\x00\x68\x00\x05\x02\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x93\x02\x00\x00\x00\x00\x94\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x3e\x02\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x24\x00\x1b\x00\x00\x00\x93\x02\x00\x00\x00\x00\x94\x02\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xab\x01\x6f\x00\x23\x00\x95\x02\x61\x03\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\xf4\x02\x00\x00\x00\x00\x24\x00\xa4\x01\xe0\x00\xe1\x00\xa5\x01\xe3\x00\x00\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\xa5\x00\x56\x00\x57\x00\x58\x00\x26\x00\xa6\x00\x95\x02\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\xa7\x00\x62\x00\x63\x00\xab\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x27\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x27\x00\x95\x02\xb6\x00\xb7\x00\x96\x02\x97\x02\x6d\x00\xa6\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x4c\x00\x4d\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x06\x00\x00\x00\x00\x00\xaa\x00\x07\x00\x00\x00\x06\x01\x09\x00\x5c\x01\x24\x00\x1b\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x95\x02\x18\x00\x19\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x62\x00\x63\x00\x00\x00\x00\x00\x26\x00\x00\x00\x1b\x00\x20\x03\x64\x00\x25\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x27\x00\x23\x00\x21\x03\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x24\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x27\x00\x00\x00\x95\x02\x06\x00\x00\x00\x25\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x5d\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x26\x00\x00\x00\x1b\x00\x18\x00\x19\x00\x00\x00\x00\x00\xaa\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x27\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x00\x00\x81\x02\x1b\x00\x59\x01\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x06\x00\x23\x00\x00\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x16\x01\xa3\x01\x26\x00\x00\x00\x24\x00\xa4\x01\xe0\x00\xe1\x00\xa5\x01\xe3\x00\x00\x00\x9d\x00\x67\x00\x68\x00\x69\x00\x00\x00\x9e\x00\x6c\x00\x27\x00\x18\x00\x19\x00\x00\x00\x06\x00\x00\x00\x25\x00\x22\x02\x07\x00\xba\x00\x06\x01\x09\x00\x3e\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x23\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x26\x00\x00\x00\x00\x00\x18\x00\x19\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xa6\x01\x6f\x00\x24\x00\x00\x00\x25\xfe\x6d\x01\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x25\xfe\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x25\xfe\x25\xfe\x23\x00\x25\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc8\x02\x26\x00\x00\x00\x24\x00\xa4\x01\xe0\x00\xe1\x00\x00\x00\x25\xfe\x00\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\x90\x00\xe9\x00\x92\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x42\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x15\x01\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xa6\x01\x6f\x00\x24\x00\x00\x00\xaf\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xb0\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xb1\x00\xb2\x00\x23\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x26\x00\x07\x00\x24\x00\x06\x01\x09\x00\x0a\x00\x5e\x01\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x14\x03\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x13\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x01\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\xaf\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\xb0\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1e\x01\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\xb1\x00\xb2\x00\x23\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x1d\x02\x00\x00\xba\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x1e\x02\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x15\x01\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x00\x00\x00\x00\x23\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x24\xfe\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x24\xfe\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x1b\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x24\xfe\x24\xfe\x23\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x24\x00\x00\x00\xab\x02\x00\x00\x00\x00\x24\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x22\x02\x26\x00\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x02\x00\x00\x00\x00\x00\x00\xdd\x00\x27\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\xe4\x00\x67\x00\x68\x00\xe6\x01\x00\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x00\x00\x00\x00\x00\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\xad\x02\x77\x00\x25\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x1d\x02\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x1e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x91\x00\x92\x00\x1d\x02\x00\x00\xba\x00\x00\x00\xf3\x00\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x1e\x02\xe4\x00\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x25\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\xb0\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x1d\x02\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x1e\x02\xb1\x00\xb2\x00\x00\x00\xb3\x00\x90\x00\x91\x00\x92\x00\x41\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb4\x00\x42\x02\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\xb0\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x1d\x02\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\xc3\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x1e\x02\xb1\x00\xb2\x00\x00\x00\xb3\x00\x90\x00\xc4\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x9d\x00\x67\x00\x68\x00\x69\x00\x00\x00\x9e\x00\x6c\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xf1\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x6d\x00\x9f\x00\x6f\x00\x00\x00\x90\x00\xf2\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xbc\x01\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xbd\x01\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xc3\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xc4\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xf1\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xf2\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xbc\x01\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xbd\x01\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\xe1\x01\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\xe2\x01\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xc3\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xc4\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x79\x01\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\xf1\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x7a\x01\x90\x03\x00\x00\x00\x00\x00\x00\x90\x00\xf2\x00\x92\x00\x2a\x03\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\xa8\x01\xe1\x00\xa9\x01\xe3\x00\xc0\x02\x00\x00\xa0\x00\x68\x00\xa1\x00\x00\x00\xa2\x00\x6c\x00\x00\x00\x00\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x25\xfe\x00\x00\x78\x00\x71\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x72\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\xab\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x71\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x72\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xbc\x01\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xbd\x01\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x71\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x72\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xc3\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xc4\x00\x92\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x1d\x02\x87\x00\xba\x00\x89\x00\x00\x00\x8a\x00\xf1\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x1e\x02\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xf2\x00\x92\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x02\x73\x00\x18\x00\x19\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xaa\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x22\x02\x00\x00\xba\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x23\x02\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xad\x00\x92\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x45\x02\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x79\x01\x00\x00\xba\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x7a\x01\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\x01\x6f\x00\x90\x00\xad\x00\x92\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x2f\x03\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x79\x01\x78\x00\xba\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x7a\x01\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\xc4\x02\x00\x00\xab\x01\x6f\x00\x00\x00\xad\x00\x92\x00\xaf\x00\x00\x00\x00\x00\x00\x00\x76\x00\x13\x02\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x1d\x02\x00\x00\xba\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x4b\x02\xb3\x00\x1e\x02\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\xaf\x00\xc3\x00\xe8\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00\x79\x01\x00\x00\xba\x00\x25\xfe\xb1\x00\xb2\x00\x00\x00\xb3\x00\xe2\x01\x79\x01\x25\xfe\xba\x00\x7a\x01\xaf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x7a\x01\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x00\x00\x25\xfe\x25\xfe\x00\x00\x25\xfe\x00\x00\xe1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\xaf\x00\xb3\x00\x00\x00\x00\x00\x24\xfe\xe2\x01\x25\xfe\xb0\x00\x00\x00\x00\x00\x00\x00\x24\xfe\x90\x00\xaf\x00\x92\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x90\x00\xe9\x00\x92\x00\x00\x00\x79\x01\x00\x00\xba\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x24\xfe\x24\xfe\x00\x00\x24\xfe\x71\x00\x7a\x01\x00\x00\x00\x00\xaf\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\xb4\x00\xb0\x00\x72\x00\x00\x00\x24\xfe\x00\x00\x90\x00\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x92\x00\xb4\x00\x00\x00\x00\x00\xe5\x01\x67\x00\x68\x00\xe6\x01\x00\x00\x92\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x25\xfe\x9b\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x25\xfe\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x06\x00\xb0\x00\x00\x00\x90\x00\x07\x00\x92\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x61\x01\x25\xfe\x25\xfe\x00\x00\x25\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x18\x00\x19\x00\x00\x00\x25\xfe\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x00\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5a\x02\x90\x00\x51\x00\x92\x00\x52\x00\xd5\x01\xd6\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xd7\x01\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\xc6\x01\xc7\x01\xd8\x01\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\xa8\x01\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x00\x00\x00\x00\xcc\x01\xcd\x01\xce\x01\x00\x00\x00\x00\x00\x00\x7a\x02\xb6\x00\xb7\x00\x7b\x02\x7c\x02\x00\x00\x00\x00\x00\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\xaa\x01\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x6d\x00\xd9\x01\x6f\x00\x00\x00\x00\x00\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xea\x02\x6f\x00\x64\x00\x00\x00\x00\x00\x00\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x68\x00\x05\x02\x00\x00\x00\x00\x00\x00\xcc\x01\xcd\x01\xce\x01\xab\x01\x6f\x00\x00\x00\x7a\x02\xb6\x00\xb7\x00\x7b\x02\x7c\x02\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x3e\x02\x64\x00\xa0\x00\x68\x00\xa1\x00\xcb\x01\xa2\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xef\x02\x6f\x00\x00\x00\x00\x00\x00\x00\xcc\x01\xcd\x01\xce\x01\x00\x00\x00\x00\x00\x00\x7a\x02\xb6\x00\xb7\x00\x7b\x02\x7c\x02\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\xab\x01\x6f\x00\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x7d\x02\x6f\x00\x00\x00\x00\x00\x00\x00\xcc\x01\xcd\x01\xce\x01\xcf\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x29\x03\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x2a\x03\xcb\x01\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x6d\x00\xd0\x01\x6f\x00\xcc\x01\xcd\x01\xce\x01\x00\x00\x00\x00\x00\x00\xc6\x01\xc7\x01\x00\x00\x55\x00\x56\x00\x57\x00\x58\x00\xc8\x01\x5a\x00\x5b\x00\x5c\x00\xc9\x01\xca\x01\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xea\x00\xcb\x01\xc9\x00\xca\x00\xcb\x00\x00\x00\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x00\x62\x00\x63\x00\x00\x00\x6d\x00\xd0\x01\x6f\x00\xf1\x02\x00\x00\x64\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x02\x67\x00\x68\x00\xe6\x01\x00\x00\xea\x00\x00\x00\xc9\x00\xca\x00\xcb\x00\x00\x00\xeb\x00\x24\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\xec\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xcc\x00\x00\x00\x6d\x00\xd0\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x56\x00\x57\x00\x58\x00\x00\x00\xbc\x00\xbb\x00\x56\x00\x57\x00\x58\x00\xef\x00\xbc\x00\xbd\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x62\x00\x63\x00\x64\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x18\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x19\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\xa5\x00\x56\x00\x57\x00\x58\x00\x00\x00\xa6\x00\xa5\x00\x56\x00\x57\x00\x58\x00\x00\x00\xa6\x00\xa7\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x62\x00\x63\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x3f\x02\xe1\x00\x00\x00\x00\x00\x0f\x02\x6f\x00\xde\x01\x68\x00\xdf\x01\x00\x00\x1a\x02\x1b\x02\xde\x01\x68\x00\xdf\x01\x00\x00\x00\x00\x00\x00\x95\x02\xb6\x00\xb7\x00\x96\x02\x97\x02\x00\x00\x95\x02\xb6\x00\xb7\x00\x96\x02\x97\x02\x00\x00\xb5\x01\x56\x00\x57\x00\x58\x00\x00\x00\xb6\x01\xa5\x00\x56\x00\x57\x00\x58\x00\x00\x00\xa6\x00\xb7\x01\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x62\x00\x63\x00\x64\x00\x00\x00\x00\x00\xb8\x01\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\xf7\x02\x67\x00\x68\x00\xe6\x01\x00\x00\xaa\x00\x0d\x02\x67\x00\x68\x00\xe6\x01\x22\x01\x5a\x00\x00\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x5a\x00\x64\x00\x23\x01\x00\x00\x24\x01\x26\x01\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x64\x00\x00\x00\x00\x00\x07\x00\x26\x01\x06\x01\x09\x00\x0a\x00\x0b\x00\x5f\x01\xd9\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\x00\x06\x00\xa3\x02\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xda\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x26\x01\xa8\x01\xe1\x00\xa9\x01\xe3\x00\x45\x02\x00\x00\xa0\x00\x68\x00\xa1\x00\x00\x00\xa2\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x0b\x02\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x06\x00\x00\x00\x00\x00\x26\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x0c\x02\x00\x00\x38\x02\x00\x00\x00\x00\x18\x00\x19\x00\xab\x01\x6f\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x39\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x26\x01\xa8\x01\xe1\x00\xa9\x01\xe3\x00\xaa\x01\x00\x00\xa0\x00\x68\x00\xa1\x00\x00\x00\xa2\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x4d\x02\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x06\x00\x00\x00\x00\x00\x26\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x4e\x02\x00\x00\xf0\x01\x00\x00\x00\x00\x18\x00\x19\x00\xab\x01\x6f\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xf1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x22\x01\x5a\x00\x00\x00\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\xea\x01\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x06\x00\x00\x00\x00\x00\x26\x01\x07\x00\x9f\x02\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\xa0\x02\xa1\x02\x00\x00\x00\x00\x9f\x02\x00\x00\xeb\x01\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x22\x01\x5a\x00\x67\x03\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\x00\x00\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\xa6\x02\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x22\x01\x5a\x00\x26\x01\x23\x01\xa7\x02\x24\x01\x00\x00\x25\x01\x61\x00\x62\x00\x63\x00\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\xbd\x00\x62\x00\x63\x00\x26\x01\x00\x00\x82\x01\x00\x00\x00\x00\x00\x00\x64\x00\x00\x00\x00\x00\xbe\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x83\x01\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x60\x01\x6d\x00\x29\x01\x6f\x00\x72\x01\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x00\x00\xbe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\xbe\x00\x6d\x00\x29\x01\x6f\x00\x00\x00\x47\x02\xe0\x00\xe1\x00\x00\x00\x00\x00\x00\x00\xe7\x01\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6d\x00\x29\x01\x6f\x00\x9c\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x06\x00\x00\x00\x76\x01\x77\x01\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc1\x01\xc0\x01\x00\x00\x00\x00\xbe\x00\x2e\x02\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x2f\x02\x30\x02\x6f\x00\xe7\x01\x67\x00\x68\x00\xe6\x01\x9d\x02\x15\x03\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9c\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x01\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x6d\x00\xc3\x01\x6f\x00\xe8\x02\x9d\x02\x14\x03\x6f\x00\xa4\x01\xe0\x00\xe1\x00\xed\x02\xad\x00\x00\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x9d\x00\x67\x00\x68\x00\xe6\x01\x00\x00\x78\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x78\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xe3\x02\x00\x00\x00\x00\x6d\x00\xe9\x02\x6f\x00\x00\x00\x18\x00\x19\x00\x00\x00\x6d\x00\xee\x02\x6f\x00\xd3\x02\x00\x00\x2d\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\xd3\x02\x00\x00\xd4\x02\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\xd5\x02\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd5\x00\x00\x00\x91\x00\x92\x00\xd5\x02\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x7f\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\xb4\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x92\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x3f\x00\x8c\x00\x00\x00\x00\x00\x73\x00\xb4\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x92\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x88\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\x02\x00\x00\x73\x00\x91\x00\x92\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x25\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd2\x01\x91\x00\x92\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\xfe\x23\xfe\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xbc\x01\x8c\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x01\x92\x00\x73\x00\x25\xfe\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x25\xfe\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x25\xfe\x25\xfe\x84\x00\x25\xfe\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x25\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x91\x00\x92\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x88\x00\x89\x00\x00\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x8c\x00\x00\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x73\x00\x00\x00\x00\x00\x75\x00\x00\x00\x76\x00\x92\x00\x77\x00\x00\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x80\x00\x81\x00\x82\x00\x00\x00\x83\x00\x00\x00\x00\x00\x84\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x89\x00\x00\x00\x8a\x00\xac\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x73\x00\xaf\x00\x00\x00\x75\x00\x00\x00\x00\x00\xad\x00\x92\x00\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\xaf\x00\x8c\x00\x75\x00\x00\x00\x76\x00\xb4\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x92\x00\x00\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\x8c\x00\xaf\x00\x8e\x00\x8f\x00\xb4\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x92\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\xbd\x01\x92\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\xc3\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\xfe\x00\x00\xc4\x00\x92\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x00\x00\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x23\xfe\x23\xfe\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x23\xfe\x00\x00\x00\x00\x23\xfe\x00\x00\x23\xfe\x23\xfe\x23\xfe\x23\xfe\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x23\xfe\x23\xfe\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\xbc\x01\x00\x00\x8d\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\xbd\x01\x92\x00\x76\x00\x00\x00\x77\x00\xb0\x00\x00\x00\x78\x00\x00\x00\x00\x00\x79\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\xaf\x00\x00\x00\x75\x00\x80\x00\x81\x00\x82\x00\x00\x00\xb0\x00\xb1\x00\xb2\x00\x00\x00\xb3\x00\x00\x00\x85\x00\x86\x00\x7b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\x00\x8f\x00\xb4\x00\x00\x00\x00\x00\xb1\x00\xb2\x00\x84\x00\xb3\x00\x00\x00\x92\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x76\x00\x8a\x00\x77\x00\x8c\x00\x00\x00\x78\x00\x00\x00\xb4\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x92\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\xd5\x02\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\xa3\x02\x00\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x91\x00\x92\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\x91\x00\x92\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\xac\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x76\x00\x00\x00\x77\x00\x00\x00\x00\x00\x78\x00\xad\x00\x92\x00\x79\x00\x00\x00\x7a\x00\x00\x00\x7c\x00\x7d\x00\x7e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x81\x00\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\x00\x86\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x8d\x00\x8e\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x00\x92\x00\x8a\x02\x00\x00\x54\x03\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x00\x00\x8a\x02\x91\x02\x8b\x02\x8c\x02\x8d\x02\x8e\x02\x8f\x02\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x5e\x03\x00\x00\x91\x02\x5f\x03\x8d\x02\x8e\x02\x8f\x02\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x18\x00\x19\x00\x00\x00\x07\x00\x91\x02\x08\x03\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x03\x09\x03\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0a\x03\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x5b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\xfa\x02\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x90\x02\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\xc1\x01\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x02\x00\x00\x18\x00\x19\x00\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\xaa\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\x73\x03\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\x74\x03\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\xb6\x02\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\xb7\x02\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xfc\x00\x00\x00\xfd\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xb1\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xb2\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x98\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x6a\x03\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\xb5\x02\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x55\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x56\x01\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x57\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x6b\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x6e\x01\x00\x00\x00\x00\x6f\x01\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x90\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x92\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x94\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x95\x01\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x00\x00\x17\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x8c\x03\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x8d\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x8f\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x92\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x9d\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x66\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x68\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x77\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x7d\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x81\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x84\x03\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x0f\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x03\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x56\x03\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x87\x02\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x89\x02\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x5c\x02\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x59\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x7d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x81\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x84\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\xef\x01\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x07\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x08\x01\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x88\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x82\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x6d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x6a\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x69\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x68\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x67\x01\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x65\x01\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x66\x01\x06\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x62\x01\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x63\x01\x00\x00\x06\x00\x00\x00\x18\x00\x19\x00\x07\x00\x00\x00\x06\x01\x09\x00\x0a\x00\x0b\x00\x0c\x00\x64\x01\x00\x00\x00\x00\x18\x00\x19\x00\x1e\x02\xe0\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x1f\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x18\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\x25\x02\xe0\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x26\x02\x67\x00\x68\x00\xe6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x02\x73\x01\xb6\x00\xb7\x00\x74\x01\x75\x01\xdd\x00\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\xf3\x00\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\x53\x02\x00\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\x00\x00\x10\x02\x67\x00\x68\x00\xe6\x01\x41\x01\x42\x01\x43\x01\x44\x01\x45\x01\x46\x01\x47\x01\x48\x01\x49\x01\x4a\x01\x4b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#--happyReduceArr = Happy_Data_Array.array (4, 491) [- (4 , happyReduce_4),- (5 , happyReduce_5),- (6 , happyReduce_6),- (7 , happyReduce_7),- (8 , happyReduce_8),- (9 , happyReduce_9),- (10 , happyReduce_10),- (11 , happyReduce_11),- (12 , happyReduce_12),- (13 , happyReduce_13),- (14 , happyReduce_14),- (15 , happyReduce_15),- (16 , happyReduce_16),- (17 , happyReduce_17),- (18 , happyReduce_18),- (19 , happyReduce_19),- (20 , happyReduce_20),- (21 , happyReduce_21),- (22 , happyReduce_22),- (23 , happyReduce_23),- (24 , happyReduce_24),- (25 , happyReduce_25),- (26 , happyReduce_26),- (27 , happyReduce_27),- (28 , happyReduce_28),- (29 , happyReduce_29),- (30 , happyReduce_30),- (31 , happyReduce_31),- (32 , happyReduce_32),- (33 , happyReduce_33),- (34 , happyReduce_34),- (35 , happyReduce_35),- (36 , happyReduce_36),- (37 , happyReduce_37),- (38 , happyReduce_38),- (39 , happyReduce_39),- (40 , happyReduce_40),- (41 , happyReduce_41),- (42 , happyReduce_42),- (43 , happyReduce_43),- (44 , happyReduce_44),- (45 , happyReduce_45),- (46 , happyReduce_46),- (47 , happyReduce_47),- (48 , happyReduce_48),- (49 , happyReduce_49),- (50 , happyReduce_50),- (51 , happyReduce_51),- (52 , happyReduce_52),- (53 , happyReduce_53),- (54 , happyReduce_54),- (55 , happyReduce_55),- (56 , happyReduce_56),- (57 , happyReduce_57),- (58 , happyReduce_58),- (59 , happyReduce_59),- (60 , happyReduce_60),- (61 , happyReduce_61),- (62 , happyReduce_62),- (63 , happyReduce_63),- (64 , happyReduce_64),- (65 , happyReduce_65),- (66 , happyReduce_66),- (67 , happyReduce_67),- (68 , happyReduce_68),- (69 , happyReduce_69),- (70 , happyReduce_70),- (71 , happyReduce_71),- (72 , happyReduce_72),- (73 , happyReduce_73),- (74 , happyReduce_74),- (75 , happyReduce_75),- (76 , happyReduce_76),- (77 , happyReduce_77),- (78 , happyReduce_78),- (79 , happyReduce_79),- (80 , happyReduce_80),- (81 , happyReduce_81),- (82 , happyReduce_82),- (83 , happyReduce_83),- (84 , happyReduce_84),- (85 , happyReduce_85),- (86 , happyReduce_86),- (87 , happyReduce_87),- (88 , happyReduce_88),- (89 , happyReduce_89),- (90 , happyReduce_90),- (91 , happyReduce_91),- (92 , happyReduce_92),- (93 , happyReduce_93),- (94 , happyReduce_94),- (95 , happyReduce_95),- (96 , happyReduce_96),- (97 , happyReduce_97),- (98 , happyReduce_98),- (99 , happyReduce_99),- (100 , happyReduce_100),- (101 , happyReduce_101),- (102 , happyReduce_102),- (103 , happyReduce_103),- (104 , happyReduce_104),- (105 , happyReduce_105),- (106 , happyReduce_106),- (107 , happyReduce_107),- (108 , happyReduce_108),- (109 , happyReduce_109),- (110 , happyReduce_110),- (111 , happyReduce_111),- (112 , happyReduce_112),- (113 , happyReduce_113),- (114 , happyReduce_114),- (115 , happyReduce_115),- (116 , happyReduce_116),- (117 , happyReduce_117),- (118 , happyReduce_118),- (119 , happyReduce_119),- (120 , happyReduce_120),- (121 , happyReduce_121),- (122 , happyReduce_122),- (123 , happyReduce_123),- (124 , happyReduce_124),- (125 , happyReduce_125),- (126 , happyReduce_126),- (127 , happyReduce_127),- (128 , happyReduce_128),- (129 , happyReduce_129),- (130 , happyReduce_130),- (131 , happyReduce_131),- (132 , happyReduce_132),- (133 , happyReduce_133),- (134 , happyReduce_134),- (135 , happyReduce_135),- (136 , happyReduce_136),- (137 , happyReduce_137),- (138 , happyReduce_138),- (139 , happyReduce_139),- (140 , happyReduce_140),- (141 , happyReduce_141),- (142 , happyReduce_142),- (143 , happyReduce_143),- (144 , happyReduce_144),- (145 , happyReduce_145),- (146 , happyReduce_146),- (147 , happyReduce_147),- (148 , happyReduce_148),- (149 , happyReduce_149),- (150 , happyReduce_150),- (151 , happyReduce_151),- (152 , happyReduce_152),- (153 , happyReduce_153),- (154 , happyReduce_154),- (155 , happyReduce_155),- (156 , happyReduce_156),- (157 , happyReduce_157),- (158 , happyReduce_158),- (159 , happyReduce_159),- (160 , happyReduce_160),- (161 , happyReduce_161),- (162 , happyReduce_162),- (163 , happyReduce_163),- (164 , happyReduce_164),- (165 , happyReduce_165),- (166 , happyReduce_166),- (167 , happyReduce_167),- (168 , happyReduce_168),- (169 , happyReduce_169),- (170 , happyReduce_170),- (171 , happyReduce_171),- (172 , happyReduce_172),- (173 , happyReduce_173),- (174 , happyReduce_174),- (175 , happyReduce_175),- (176 , happyReduce_176),- (177 , happyReduce_177),- (178 , happyReduce_178),- (179 , happyReduce_179),- (180 , happyReduce_180),- (181 , happyReduce_181),- (182 , happyReduce_182),- (183 , happyReduce_183),- (184 , happyReduce_184),- (185 , happyReduce_185),- (186 , happyReduce_186),- (187 , happyReduce_187),- (188 , happyReduce_188),- (189 , happyReduce_189),- (190 , happyReduce_190),- (191 , happyReduce_191),- (192 , happyReduce_192),- (193 , happyReduce_193),- (194 , happyReduce_194),- (195 , happyReduce_195),- (196 , happyReduce_196),- (197 , happyReduce_197),- (198 , happyReduce_198),- (199 , happyReduce_199),- (200 , happyReduce_200),- (201 , happyReduce_201),- (202 , happyReduce_202),- (203 , happyReduce_203),- (204 , happyReduce_204),- (205 , happyReduce_205),- (206 , happyReduce_206),- (207 , happyReduce_207),- (208 , happyReduce_208),- (209 , happyReduce_209),- (210 , happyReduce_210),- (211 , happyReduce_211),- (212 , happyReduce_212),- (213 , happyReduce_213),- (214 , happyReduce_214),- (215 , happyReduce_215),- (216 , happyReduce_216),- (217 , happyReduce_217),- (218 , happyReduce_218),- (219 , happyReduce_219),- (220 , happyReduce_220),- (221 , happyReduce_221),- (222 , happyReduce_222),- (223 , happyReduce_223),- (224 , happyReduce_224),- (225 , happyReduce_225),- (226 , happyReduce_226),- (227 , happyReduce_227),- (228 , happyReduce_228),- (229 , happyReduce_229),- (230 , happyReduce_230),- (231 , happyReduce_231),- (232 , happyReduce_232),- (233 , happyReduce_233),- (234 , happyReduce_234),- (235 , happyReduce_235),- (236 , happyReduce_236),- (237 , happyReduce_237),- (238 , happyReduce_238),- (239 , happyReduce_239),- (240 , happyReduce_240),- (241 , happyReduce_241),- (242 , happyReduce_242),- (243 , happyReduce_243),- (244 , happyReduce_244),- (245 , happyReduce_245),- (246 , happyReduce_246),- (247 , happyReduce_247),- (248 , happyReduce_248),- (249 , happyReduce_249),- (250 , happyReduce_250),- (251 , happyReduce_251),- (252 , happyReduce_252),- (253 , happyReduce_253),- (254 , happyReduce_254),- (255 , happyReduce_255),- (256 , happyReduce_256),- (257 , happyReduce_257),- (258 , happyReduce_258),- (259 , happyReduce_259),- (260 , happyReduce_260),- (261 , happyReduce_261),- (262 , happyReduce_262),- (263 , happyReduce_263),- (264 , happyReduce_264),- (265 , happyReduce_265),- (266 , happyReduce_266),- (267 , happyReduce_267),- (268 , happyReduce_268),- (269 , happyReduce_269),- (270 , happyReduce_270),- (271 , happyReduce_271),- (272 , happyReduce_272),- (273 , happyReduce_273),- (274 , happyReduce_274),- (275 , happyReduce_275),- (276 , happyReduce_276),- (277 , happyReduce_277),- (278 , happyReduce_278),- (279 , happyReduce_279),- (280 , happyReduce_280),- (281 , happyReduce_281),- (282 , happyReduce_282),- (283 , happyReduce_283),- (284 , happyReduce_284),- (285 , happyReduce_285),- (286 , happyReduce_286),- (287 , happyReduce_287),- (288 , happyReduce_288),- (289 , happyReduce_289),- (290 , happyReduce_290),- (291 , happyReduce_291),- (292 , happyReduce_292),- (293 , happyReduce_293),- (294 , happyReduce_294),- (295 , happyReduce_295),- (296 , happyReduce_296),- (297 , happyReduce_297),- (298 , happyReduce_298),- (299 , happyReduce_299),- (300 , happyReduce_300),- (301 , happyReduce_301),- (302 , happyReduce_302),- (303 , happyReduce_303),- (304 , happyReduce_304),- (305 , happyReduce_305),- (306 , happyReduce_306),- (307 , happyReduce_307),- (308 , happyReduce_308),- (309 , happyReduce_309),- (310 , happyReduce_310),- (311 , happyReduce_311),- (312 , happyReduce_312),- (313 , happyReduce_313),- (314 , happyReduce_314),- (315 , happyReduce_315),- (316 , happyReduce_316),- (317 , happyReduce_317),- (318 , happyReduce_318),- (319 , happyReduce_319),- (320 , happyReduce_320),- (321 , happyReduce_321),- (322 , happyReduce_322),- (323 , happyReduce_323),- (324 , happyReduce_324),- (325 , happyReduce_325),- (326 , happyReduce_326),- (327 , happyReduce_327),- (328 , happyReduce_328),- (329 , happyReduce_329),- (330 , happyReduce_330),- (331 , happyReduce_331),- (332 , happyReduce_332),- (333 , happyReduce_333),- (334 , happyReduce_334),- (335 , happyReduce_335),- (336 , happyReduce_336),- (337 , happyReduce_337),- (338 , happyReduce_338),- (339 , happyReduce_339),- (340 , happyReduce_340),- (341 , happyReduce_341),- (342 , happyReduce_342),- (343 , happyReduce_343),- (344 , happyReduce_344),- (345 , happyReduce_345),- (346 , happyReduce_346),- (347 , happyReduce_347),- (348 , happyReduce_348),- (349 , happyReduce_349),- (350 , happyReduce_350),- (351 , happyReduce_351),- (352 , happyReduce_352),- (353 , happyReduce_353),- (354 , happyReduce_354),- (355 , happyReduce_355),- (356 , happyReduce_356),- (357 , happyReduce_357),- (358 , happyReduce_358),- (359 , happyReduce_359),- (360 , happyReduce_360),- (361 , happyReduce_361),- (362 , happyReduce_362),- (363 , happyReduce_363),- (364 , happyReduce_364),- (365 , happyReduce_365),- (366 , happyReduce_366),- (367 , happyReduce_367),- (368 , happyReduce_368),- (369 , happyReduce_369),- (370 , happyReduce_370),- (371 , happyReduce_371),- (372 , happyReduce_372),- (373 , happyReduce_373),- (374 , happyReduce_374),- (375 , happyReduce_375),- (376 , happyReduce_376),- (377 , happyReduce_377),- (378 , happyReduce_378),- (379 , happyReduce_379),- (380 , happyReduce_380),- (381 , happyReduce_381),- (382 , happyReduce_382),- (383 , happyReduce_383),- (384 , happyReduce_384),- (385 , happyReduce_385),- (386 , happyReduce_386),- (387 , happyReduce_387),- (388 , happyReduce_388),- (389 , happyReduce_389),- (390 , happyReduce_390),- (391 , happyReduce_391),- (392 , happyReduce_392),- (393 , happyReduce_393),- (394 , happyReduce_394),- (395 , happyReduce_395),- (396 , happyReduce_396),- (397 , happyReduce_397),- (398 , happyReduce_398),- (399 , happyReduce_399),- (400 , happyReduce_400),- (401 , happyReduce_401),- (402 , happyReduce_402),- (403 , happyReduce_403),- (404 , happyReduce_404),- (405 , happyReduce_405),- (406 , happyReduce_406),- (407 , happyReduce_407),- (408 , happyReduce_408),- (409 , happyReduce_409),- (410 , happyReduce_410),- (411 , happyReduce_411),- (412 , happyReduce_412),- (413 , happyReduce_413),- (414 , happyReduce_414),- (415 , happyReduce_415),- (416 , happyReduce_416),- (417 , happyReduce_417),- (418 , happyReduce_418),- (419 , happyReduce_419),- (420 , happyReduce_420),- (421 , happyReduce_421),- (422 , happyReduce_422),- (423 , happyReduce_423),- (424 , happyReduce_424),- (425 , happyReduce_425),- (426 , happyReduce_426),- (427 , happyReduce_427),- (428 , happyReduce_428),- (429 , happyReduce_429),- (430 , happyReduce_430),- (431 , happyReduce_431),- (432 , happyReduce_432),- (433 , happyReduce_433),- (434 , happyReduce_434),- (435 , happyReduce_435),- (436 , happyReduce_436),- (437 , happyReduce_437),- (438 , happyReduce_438),- (439 , happyReduce_439),- (440 , happyReduce_440),- (441 , happyReduce_441),- (442 , happyReduce_442),- (443 , happyReduce_443),- (444 , happyReduce_444),- (445 , happyReduce_445),- (446 , happyReduce_446),- (447 , happyReduce_447),- (448 , happyReduce_448),- (449 , happyReduce_449),- (450 , happyReduce_450),- (451 , happyReduce_451),- (452 , happyReduce_452),- (453 , happyReduce_453),- (454 , happyReduce_454),- (455 , happyReduce_455),- (456 , happyReduce_456),- (457 , happyReduce_457),- (458 , happyReduce_458),- (459 , happyReduce_459),- (460 , happyReduce_460),- (461 , happyReduce_461),- (462 , happyReduce_462),- (463 , happyReduce_463),- (464 , happyReduce_464),- (465 , happyReduce_465),- (466 , happyReduce_466),- (467 , happyReduce_467),- (468 , happyReduce_468),- (469 , happyReduce_469),- (470 , happyReduce_470),- (471 , happyReduce_471),- (472 , happyReduce_472),- (473 , happyReduce_473),- (474 , happyReduce_474),- (475 , happyReduce_475),- (476 , happyReduce_476),- (477 , happyReduce_477),- (478 , happyReduce_478),- (479 , happyReduce_479),- (480 , happyReduce_480),- (481 , happyReduce_481),- (482 , happyReduce_482),- (483 , happyReduce_483),- (484 , happyReduce_484),- (485 , happyReduce_485),- (486 , happyReduce_486),- (487 , happyReduce_487),- (488 , happyReduce_488),- (489 , happyReduce_489),- (490 , happyReduce_490),- (491 , happyReduce_491)- ]--happy_n_terms = 114 :: Int-happy_n_nonterms = 131 :: Int--happyReduce_4 = happyMonadReduce 1# 0# happyReduction_4-happyReduction_4 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut8 happy_x_1 of { happy_var_1 -> - ( let decls = reverse happy_var_1 in- case decls of- [] -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) }- (d:ds) -> withNodeInfo d $ CTranslUnit decls)}- ) (\r -> happyReturn (happyIn7 r))--happyReduce_5 = happySpecReduce_0 1# happyReduction_5-happyReduction_5 = happyIn8- (empty- )--happyReduce_6 = happySpecReduce_2 1# happyReduction_6-happyReduction_6 happy_x_2- happy_x_1- = case happyOut8 happy_x_1 of { happy_var_1 -> - happyIn8- (happy_var_1- )}--happyReduce_7 = happySpecReduce_2 1# happyReduction_7-happyReduction_7 happy_x_2- happy_x_1- = case happyOut8 happy_x_1 of { happy_var_1 -> - case happyOut9 happy_x_2 of { happy_var_2 -> - happyIn8- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_8 = happySpecReduce_1 2# happyReduction_8-happyReduction_8 happy_x_1- = case happyOut10 happy_x_1 of { happy_var_1 -> - happyIn9- (CFDefExt happy_var_1- )}--happyReduce_9 = happySpecReduce_1 2# happyReduction_9-happyReduction_9 happy_x_1- = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn9- (CDeclExt happy_var_1- )}--happyReduce_10 = happySpecReduce_2 2# happyReduction_10-happyReduction_10 happy_x_2- happy_x_1- = case happyOut9 happy_x_2 of { happy_var_2 -> - happyIn9- (happy_var_2- )}--happyReduce_11 = happyMonadReduce 5# 2# happyReduction_11-happyReduction_11 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CAsmExt happy_var_3)}}- ) (\r -> happyReturn (happyIn9 r))--happyReduce_12 = happyMonadReduce 2# 3# happyReduction_12-happyReduction_12 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut11 happy_x_1 of { happy_var_1 -> - case happyOut14 happy_x_2 of { happy_var_2 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 [] happy_var_2))}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_13 = happyMonadReduce 3# 3# happyReduction_13-happyReduction_13 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_14 = happyMonadReduce 3# 3# happyReduction_14-happyReduction_14 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_15 = happyMonadReduce 3# 3# happyReduction_15-happyReduction_15 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_16 = happyMonadReduce 3# 3# happyReduction_16-happyReduction_16 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_17 = happyMonadReduce 3# 3# happyReduction_17-happyReduction_17 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_18 = happyMonadReduce 4# 3# happyReduction_18-happyReduction_18 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut11 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_19 = happyMonadReduce 3# 3# happyReduction_19-happyReduction_19 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut79 happy_x_1 of { happy_var_1 -> - case happyOut33 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CFunDef [] happy_var_1 (reverse happy_var_2) happy_var_3)}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_20 = happyMonadReduce 4# 3# happyReduction_20-happyReduction_20 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOut79 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ CFunDef (liftCAttrs happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_21 = happyMonadReduce 4# 3# happyReduction_21-happyReduction_21 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut79 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_22 = happyMonadReduce 4# 3# happyReduction_22-happyReduction_22 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut79 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_23 = happyMonadReduce 4# 3# happyReduction_23-happyReduction_23 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut79 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_24 = happyMonadReduce 4# 3# happyReduction_24-happyReduction_24 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut79 happy_x_2 of { happy_var_2 -> - case happyOut33 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 (reverse happy_var_3) happy_var_4)}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_25 = happyMonadReduce 5# 3# happyReduction_25-happyReduction_25 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut79 happy_x_3 of { happy_var_3 -> - case happyOut33 happy_x_4 of { happy_var_4 -> - case happyOut14 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 (reverse happy_var_4) happy_var_5)}}}}}- ) (\r -> happyReturn (happyIn10 r))--happyReduce_26 = happyMonadReduce 1# 4# happyReduction_26-happyReduction_26 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut75 happy_x_1 of { happy_var_1 -> - ( let declr = reverseDeclr happy_var_1 in- enterScope >> doFuncParamDeclIdent declr >> return declr)}- ) (\r -> happyReturn (happyIn11 r))--happyReduce_27 = happySpecReduce_1 5# happyReduction_27-happyReduction_27 happy_x_1- = case happyOut13 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_28 = happySpecReduce_1 5# happyReduction_28-happyReduction_28 happy_x_1- = case happyOut14 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_29 = happySpecReduce_1 5# happyReduction_29-happyReduction_29 happy_x_1- = case happyOut22 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_30 = happySpecReduce_1 5# happyReduction_30-happyReduction_30 happy_x_1- = case happyOut23 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_31 = happySpecReduce_1 5# happyReduction_31-happyReduction_31 happy_x_1- = case happyOut24 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_32 = happySpecReduce_1 5# happyReduction_32-happyReduction_32 happy_x_1- = case happyOut25 happy_x_1 of { happy_var_1 -> - happyIn12- (happy_var_1- )}--happyReduce_33 = happyMonadReduce 1# 5# happyReduction_33-happyReduction_33 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut26 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 (CAsm happy_var_1))}- ) (\r -> happyReturn (happyIn12 r))--happyReduce_34 = happyMonadReduce 4# 6# happyReduction_34-happyReduction_34 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut131 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CLabel happy_var_1 happy_var_4 happy_var_3)}}}- ) (\r -> happyReturn (happyIn13 r))--happyReduce_35 = happyMonadReduce 4# 6# happyReduction_35-happyReduction_35 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut12 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CCase happy_var_2 happy_var_4)}}}- ) (\r -> happyReturn (happyIn13 r))--happyReduce_36 = happyMonadReduce 3# 6# happyReduction_36-happyReduction_36 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut12 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDefault happy_var_3)}}- ) (\r -> happyReturn (happyIn13 r))--happyReduce_37 = happyMonadReduce 6# 6# happyReduction_37-happyReduction_37 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_4 of { happy_var_4 -> - case happyOut12 happy_x_6 of { happy_var_6 -> - ( withNodeInfo happy_var_1 $ CCases happy_var_2 happy_var_4 happy_var_6)}}}}- ) (\r -> happyReturn (happyIn13 r))--happyReduce_38 = happyMonadReduce 5# 7# happyReduction_38-happyReduction_38 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut17 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CCompound [] (reverse happy_var_3))}}- ) (\r -> happyReturn (happyIn14 r))--happyReduce_39 = happyMonadReduce 6# 7# happyReduction_39-happyReduction_39 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut21 happy_x_3 of { happy_var_3 -> - case happyOut17 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CCompound (reverse happy_var_3) (reverse happy_var_4))}}}- ) (\r -> happyReturn (happyIn14 r))--happyReduce_40 = happyMonadReduce 0# 8# happyReduction_40-happyReduction_40 (happyRest) tk- = happyThen (( enterScope)- ) (\r -> happyReturn (happyIn15 r))--happyReduce_41 = happyMonadReduce 0# 9# happyReduction_41-happyReduction_41 (happyRest) tk- = happyThen (( leaveScope)- ) (\r -> happyReturn (happyIn16 r))--happyReduce_42 = happySpecReduce_0 10# happyReduction_42-happyReduction_42 = happyIn17- (empty- )--happyReduce_43 = happySpecReduce_2 10# happyReduction_43-happyReduction_43 happy_x_2- happy_x_1- = case happyOut17 happy_x_1 of { happy_var_1 -> - case happyOut18 happy_x_2 of { happy_var_2 -> - happyIn17- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_44 = happySpecReduce_1 11# happyReduction_44-happyReduction_44 happy_x_1- = case happyOut12 happy_x_1 of { happy_var_1 -> - happyIn18- (CBlockStmt happy_var_1- )}--happyReduce_45 = happySpecReduce_1 11# happyReduction_45-happyReduction_45 happy_x_1- = case happyOut19 happy_x_1 of { happy_var_1 -> - happyIn18- (happy_var_1- )}--happyReduce_46 = happySpecReduce_1 12# happyReduction_46-happyReduction_46 happy_x_1- = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn19- (CBlockDecl happy_var_1- )}--happyReduce_47 = happySpecReduce_1 12# happyReduction_47-happyReduction_47 happy_x_1- = case happyOut20 happy_x_1 of { happy_var_1 -> - happyIn19- (CNestedFunDef happy_var_1- )}--happyReduce_48 = happySpecReduce_2 12# happyReduction_48-happyReduction_48 happy_x_2- happy_x_1- = case happyOut19 happy_x_2 of { happy_var_2 -> - happyIn19- (happy_var_2- )}--happyReduce_49 = happyMonadReduce 3# 13# happyReduction_49-happyReduction_49 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_50 = happyMonadReduce 3# 13# happyReduction_50-happyReduction_50 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef happy_var_1 happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_51 = happyMonadReduce 3# 13# happyReduction_51-happyReduction_51 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (reverse happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_52 = happyMonadReduce 3# 13# happyReduction_52-happyReduction_52 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut11 happy_x_2 of { happy_var_2 -> - case happyOut14 happy_x_3 of { happy_var_3 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1) happy_var_2 [] happy_var_3))}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_53 = happyMonadReduce 4# 13# happyReduction_53-happyReduction_53 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut11 happy_x_3 of { happy_var_3 -> - case happyOut14 happy_x_4 of { happy_var_4 -> - ( leaveScope >> (withNodeInfo happy_var_1 $ CFunDef (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) happy_var_3 [] happy_var_4))}}}}- ) (\r -> happyReturn (happyIn20 r))--happyReduce_54 = happySpecReduce_3 14# happyReduction_54-happyReduction_54 happy_x_3- happy_x_2- happy_x_1- = case happyOut85 happy_x_2 of { happy_var_2 -> - happyIn21- (happy_var_2- )}--happyReduce_55 = happyReduce 4# 14# happyReduction_55-happyReduction_55 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut21 happy_x_1 of { happy_var_1 -> - case happyOut85 happy_x_3 of { happy_var_3 -> - happyIn21- (happy_var_1 `rappendr` happy_var_3- ) `HappyStk` happyRest}}--happyReduce_56 = happyMonadReduce 1# 15# happyReduction_56-happyReduction_56 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CExpr Nothing)}- ) (\r -> happyReturn (happyIn22 r))--happyReduce_57 = happyMonadReduce 2# 15# happyReduction_57-happyReduction_57 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut122 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CExpr (Just happy_var_1))}- ) (\r -> happyReturn (happyIn22 r))--happyReduce_58 = happyMonadReduce 5# 16# happyReduction_58-happyReduction_58 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 Nothing)}}}- ) (\r -> happyReturn (happyIn23 r))--happyReduce_59 = happyMonadReduce 7# 16# happyReduction_59-happyReduction_59 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_5 of { happy_var_5 -> - case happyOut12 happy_x_7 of { happy_var_7 -> - ( withNodeInfo happy_var_1 $ CIf happy_var_3 happy_var_5 (Just happy_var_7))}}}}- ) (\r -> happyReturn (happyIn23 r))--happyReduce_60 = happyMonadReduce 5# 16# happyReduction_60-happyReduction_60 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CSwitch happy_var_3 happy_var_5)}}}- ) (\r -> happyReturn (happyIn23 r))--happyReduce_61 = happyMonadReduce 5# 17# happyReduction_61-happyReduction_61 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - case happyOut12 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CWhile happy_var_3 happy_var_5 False)}}}- ) (\r -> happyReturn (happyIn24 r))--happyReduce_62 = happyMonadReduce 7# 17# happyReduction_62-happyReduction_62 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut12 happy_x_2 of { happy_var_2 -> - case happyOut122 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CWhile happy_var_5 happy_var_2 True)}}}- ) (\r -> happyReturn (happyIn24 r))--happyReduce_63 = happyMonadReduce 9# 17# happyReduction_63-happyReduction_63 (happy_x_9 `HappyStk`- happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut124 happy_x_3 of { happy_var_3 -> - case happyOut124 happy_x_5 of { happy_var_5 -> - case happyOut124 happy_x_7 of { happy_var_7 -> - case happyOut12 happy_x_9 of { happy_var_9 -> - ( withNodeInfo happy_var_1 $ CFor (Left happy_var_3) happy_var_5 happy_var_7 happy_var_9)}}}}}- ) (\r -> happyReturn (happyIn24 r))--happyReduce_64 = happyMonadReduce 10# 17# happyReduction_64-happyReduction_64 (happy_x_10 `HappyStk`- happy_x_9 `HappyStk`- happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut32 happy_x_4 of { happy_var_4 -> - case happyOut124 happy_x_5 of { happy_var_5 -> - case happyOut124 happy_x_7 of { happy_var_7 -> - case happyOut12 happy_x_9 of { happy_var_9 -> - ( withNodeInfo happy_var_1 $ CFor (Right happy_var_4) happy_var_5 happy_var_7 happy_var_9)}}}}}- ) (\r -> happyReturn (happyIn24 r))--happyReduce_65 = happyMonadReduce 3# 18# happyReduction_65-happyReduction_65 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut131 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CGoto happy_var_2)}}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_66 = happyMonadReduce 4# 18# happyReduction_66-happyReduction_66 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CGotoPtr happy_var_3)}}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_67 = happyMonadReduce 2# 18# happyReduction_67-happyReduction_67 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CCont)}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_68 = happyMonadReduce 2# 18# happyReduction_68-happyReduction_68 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CBreak)}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_69 = happyMonadReduce 3# 18# happyReduction_69-happyReduction_69 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut124 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CReturn happy_var_2)}}- ) (\r -> happyReturn (happyIn25 r))--happyReduce_70 = happyMonadReduce 6# 19# happyReduction_70-happyReduction_70 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut27 happy_x_2 of { happy_var_2 -> - case happyOut128 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 [] [] [])}}}- ) (\r -> happyReturn (happyIn26 r))--happyReduce_71 = happyMonadReduce 8# 19# happyReduction_71-happyReduction_71 (happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut27 happy_x_2 of { happy_var_2 -> - case happyOut128 happy_x_4 of { happy_var_4 -> - case happyOut28 happy_x_6 of { happy_var_6 -> - ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 [] [])}}}}- ) (\r -> happyReturn (happyIn26 r))--happyReduce_72 = happyMonadReduce 10# 19# happyReduction_72-happyReduction_72 (happy_x_10 `HappyStk`- happy_x_9 `HappyStk`- happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut27 happy_x_2 of { happy_var_2 -> - case happyOut128 happy_x_4 of { happy_var_4 -> - case happyOut28 happy_x_6 of { happy_var_6 -> - case happyOut28 happy_x_8 of { happy_var_8 -> - ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 [])}}}}}- ) (\r -> happyReturn (happyIn26 r))--happyReduce_73 = happyMonadReduce 12# 19# happyReduction_73-happyReduction_73 (happy_x_12 `HappyStk`- happy_x_11 `HappyStk`- happy_x_10 `HappyStk`- happy_x_9 `HappyStk`- happy_x_8 `HappyStk`- happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut27 happy_x_2 of { happy_var_2 -> - case happyOut128 happy_x_4 of { happy_var_4 -> - case happyOut28 happy_x_6 of { happy_var_6 -> - case happyOut28 happy_x_8 of { happy_var_8 -> - case happyOut31 happy_x_10 of { happy_var_10 -> - ( withNodeInfo happy_var_1 $ CAsmStmt happy_var_2 happy_var_4 happy_var_6 happy_var_8 (reverse happy_var_10))}}}}}}- ) (\r -> happyReturn (happyIn26 r))--happyReduce_74 = happySpecReduce_0 20# happyReduction_74-happyReduction_74 = happyIn27- (Nothing- )--happyReduce_75 = happySpecReduce_1 20# happyReduction_75-happyReduction_75 happy_x_1- = case happyOut64 happy_x_1 of { happy_var_1 -> - happyIn27- (Just happy_var_1- )}--happyReduce_76 = happySpecReduce_0 21# happyReduction_76-happyReduction_76 = happyIn28- ([]- )--happyReduce_77 = happySpecReduce_1 21# happyReduction_77-happyReduction_77 happy_x_1- = case happyOut29 happy_x_1 of { happy_var_1 -> - happyIn28- (reverse happy_var_1- )}--happyReduce_78 = happySpecReduce_1 22# happyReduction_78-happyReduction_78 happy_x_1- = case happyOut30 happy_x_1 of { happy_var_1 -> - happyIn29- (singleton happy_var_1- )}--happyReduce_79 = happySpecReduce_3 22# happyReduction_79-happyReduction_79 happy_x_3- happy_x_2- happy_x_1- = case happyOut29 happy_x_1 of { happy_var_1 -> - case happyOut30 happy_x_3 of { happy_var_3 -> - happyIn29- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_80 = happyMonadReduce 4# 23# happyReduction_80-happyReduction_80 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut128 happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CAsmOperand Nothing happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn30 r))--happyReduce_81 = happyMonadReduce 7# 23# happyReduction_81-happyReduction_81 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (CTokIdent _ happy_var_2) -> - case happyOut128 happy_x_4 of { happy_var_4 -> - case happyOut122 happy_x_6 of { happy_var_6 -> - ( withNodeInfo happy_var_1 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}}- ) (\r -> happyReturn (happyIn30 r))--happyReduce_82 = happyMonadReduce 7# 23# happyReduction_82-happyReduction_82 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> - case happyOut128 happy_x_4 of { happy_var_4 -> - case happyOut122 happy_x_6 of { happy_var_6 -> - ( withNodeInfo happy_var_1 $ CAsmOperand (Just happy_var_2) happy_var_4 happy_var_6)}}}}- ) (\r -> happyReturn (happyIn30 r))--happyReduce_83 = happySpecReduce_1 24# happyReduction_83-happyReduction_83 happy_x_1- = case happyOut128 happy_x_1 of { happy_var_1 -> - happyIn31- (singleton happy_var_1- )}--happyReduce_84 = happySpecReduce_3 24# happyReduction_84-happyReduction_84 happy_x_3- happy_x_2- happy_x_1- = case happyOut31 happy_x_1 of { happy_var_1 -> - case happyOut128 happy_x_3 of { happy_var_3 -> - happyIn31- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_85 = happyMonadReduce 2# 25# happyReduction_85-happyReduction_85 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut48 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}- ) (\r -> happyReturn (happyIn32 r))--happyReduce_86 = happyMonadReduce 2# 25# happyReduction_86-happyReduction_86 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut49 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}- ) (\r -> happyReturn (happyIn32 r))--happyReduce_87 = happyMonadReduce 2# 25# happyReduction_87-happyReduction_87 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> - ( case happy_var_1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)))}- ) (\r -> happyReturn (happyIn32 r))--happyReduce_88 = happyMonadReduce 2# 25# happyReduction_88-happyReduction_88 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut34 happy_x_1 of { happy_var_1 -> - ( case happy_var_1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)))}- ) (\r -> happyReturn (happyIn32 r))--happyReduce_89 = happyMonadReduce 7# 25# happyReduction_89-happyReduction_89 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - case happyOut128 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CStaticAssert happy_var_3 happy_var_5)}}}- ) (\r -> happyReturn (happyIn32 r))--happyReduce_90 = happySpecReduce_0 26# happyReduction_90-happyReduction_90 = happyIn33- (empty- )--happyReduce_91 = happySpecReduce_2 26# happyReduction_91-happyReduction_91 happy_x_2- happy_x_1- = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOut32 happy_x_2 of { happy_var_2 -> - happyIn33- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_92 = happyMonadReduce 4# 27# happyReduction_92-happyReduction_92 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut75 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut94 happy_x_4 of { happy_var_4 -> - ( let declspecs = reverse happy_var_1 in- do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2- ; doDeclIdent declspecs declr- ; withNodeInfo happy_var_1 $- CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_93 = happyMonadReduce 4# 27# happyReduction_93-happyReduction_93 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut75 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut94 happy_x_4 of { happy_var_4 -> - ( let declspecs = liftTypeQuals happy_var_1 in- do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2- ; doDeclIdent declspecs declr- ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_94 = happyMonadReduce 5# 27# happyReduction_94-happyReduction_94 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut75 happy_x_3 of { happy_var_3 -> - case happyOut35 happy_x_4 of { happy_var_4 -> - case happyOut94 happy_x_5 of { happy_var_5 -> - ( let declspecs = liftTypeQuals happy_var_1 in- do{ declr <- withAsmNameAttrs happy_var_4 happy_var_3- ; doDeclIdent declspecs declr- ; withNodeInfo happy_var_1 $ CDecl (declspecs ++ liftCAttrs happy_var_2) [(Just (reverseDeclr declr), happy_var_5, Nothing)] })}}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_95 = happyMonadReduce 4# 27# happyReduction_95-happyReduction_95 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOut75 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut94 happy_x_4 of { happy_var_4 -> - ( let declspecs = liftCAttrs happy_var_1 in- do{ declr <- withAsmNameAttrs happy_var_3 happy_var_2- ; doDeclIdent declspecs declr- ; withNodeInfo happy_var_1 $ CDecl declspecs [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_96 = happyMonadReduce 6# 27# happyReduction_96-happyReduction_96 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut34 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - case happyOut75 happy_x_4 of { happy_var_4 -> - case happyOut35 happy_x_5 of { happy_var_5 -> - case happyOut94 happy_x_6 of { happy_var_6 -> - ( case happy_var_1 of- CDecl declspecs dies at -> do- declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4- doDeclIdent declspecs declr- withLength at $ CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies))}}}}}- ) (\r -> happyReturn (happyIn34 r))--happyReduce_97 = happySpecReduce_2 28# happyReduction_97-happyReduction_97 happy_x_2- happy_x_1- = case happyOut67 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - happyIn35- ((happy_var_1,happy_var_2)- )}}--happyReduce_98 = happyMonadReduce 4# 29# happyReduction_98-happyReduction_98 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut66 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut94 happy_x_4 of { happy_var_4 -> - ( do{- declr <- withAsmNameAttrs happy_var_3 happy_var_2;- doDeclIdent happy_var_1 declr;- withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn36 r))--happyReduce_99 = happyMonadReduce 4# 29# happyReduction_99-happyReduction_99 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut66 happy_x_2 of { happy_var_2 -> - case happyOut35 happy_x_3 of { happy_var_3 -> - case happyOut94 happy_x_4 of { happy_var_4 -> - ( do{- declr <- withAsmNameAttrs happy_var_3 happy_var_2;- doDeclIdent happy_var_1 declr;- withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr declr), happy_var_4, Nothing)] })}}}}- ) (\r -> happyReturn (happyIn36 r))--happyReduce_100 = happyMonadReduce 6# 29# happyReduction_100-happyReduction_100 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut36 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - case happyOut66 happy_x_4 of { happy_var_4 -> - case happyOut35 happy_x_5 of { happy_var_5 -> - case happyOut94 happy_x_6 of { happy_var_6 -> - ( case happy_var_1 of- CDecl declspecs dies at -> do- declr <- withAsmNameAttrs (fst happy_var_5, snd happy_var_5 ++ happy_var_3) happy_var_4- doDeclIdent declspecs declr- return (CDecl declspecs ((Just (reverseDeclr declr), happy_var_6, Nothing) : dies) at))}}}}}- ) (\r -> happyReturn (happyIn36 r))--happyReduce_101 = happySpecReduce_1 30# happyReduction_101-happyReduction_101 happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - happyIn37- (reverse happy_var_1- )}--happyReduce_102 = happySpecReduce_1 30# happyReduction_102-happyReduction_102 happy_x_1- = case happyOut48 happy_x_1 of { happy_var_1 -> - happyIn37- (reverse happy_var_1- )}--happyReduce_103 = happySpecReduce_1 30# happyReduction_103-happyReduction_103 happy_x_1- = case happyOut50 happy_x_1 of { happy_var_1 -> - happyIn37- (reverse happy_var_1- )}--happyReduce_104 = happySpecReduce_1 31# happyReduction_104-happyReduction_104 happy_x_1- = case happyOut40 happy_x_1 of { happy_var_1 -> - happyIn38- (singleton happy_var_1- )}--happyReduce_105 = happySpecReduce_2 31# happyReduction_105-happyReduction_105 happy_x_2- happy_x_1- = case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn38- (reverseList (liftCAttrs happy_var_1) `snoc` happy_var_2- )}}--happyReduce_106 = happySpecReduce_2 31# happyReduction_106-happyReduction_106 happy_x_2- happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn38- (rmap CTypeQual happy_var_1 `snoc` happy_var_2- )}}--happyReduce_107 = happySpecReduce_3 31# happyReduction_107-happyReduction_107 happy_x_3- happy_x_2- happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut40 happy_x_3 of { happy_var_3 -> - happyIn38- ((rmap CTypeQual happy_var_1 `rappend` liftCAttrs happy_var_2) `snoc` happy_var_3- )}}}--happyReduce_108 = happySpecReduce_2 31# happyReduction_108-happyReduction_108 happy_x_2- happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn38- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_109 = happySpecReduce_2 31# happyReduction_109-happyReduction_109 happy_x_2- happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn38- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_110 = happySpecReduce_1 32# happyReduction_110-happyReduction_110 happy_x_1- = case happyOut41 happy_x_1 of { happy_var_1 -> - happyIn39- (CStorageSpec happy_var_1- )}--happyReduce_111 = happySpecReduce_1 32# happyReduction_111-happyReduction_111 happy_x_1- = case happyOut64 happy_x_1 of { happy_var_1 -> - happyIn39- (CTypeQual happy_var_1- )}--happyReduce_112 = happySpecReduce_1 32# happyReduction_112-happyReduction_112 happy_x_1- = case happyOut42 happy_x_1 of { happy_var_1 -> - happyIn39- (CFunSpec happy_var_1- )}--happyReduce_113 = happySpecReduce_1 32# happyReduction_113-happyReduction_113 happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - happyIn39- (CAlignSpec happy_var_1- )}--happyReduce_114 = happySpecReduce_1 33# happyReduction_114-happyReduction_114 happy_x_1- = case happyOut41 happy_x_1 of { happy_var_1 -> - happyIn40- (CStorageSpec happy_var_1- )}--happyReduce_115 = happySpecReduce_1 33# happyReduction_115-happyReduction_115 happy_x_1- = case happyOut42 happy_x_1 of { happy_var_1 -> - happyIn40- (CFunSpec happy_var_1- )}--happyReduce_116 = happySpecReduce_1 33# happyReduction_116-happyReduction_116 happy_x_1- = case happyOut43 happy_x_1 of { happy_var_1 -> - happyIn40- (CAlignSpec happy_var_1- )}--happyReduce_117 = happyMonadReduce 1# 34# happyReduction_117-happyReduction_117 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CTypedef)}- ) (\r -> happyReturn (happyIn41 r))--happyReduce_118 = happyMonadReduce 1# 34# happyReduction_118-happyReduction_118 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CExtern)}- ) (\r -> happyReturn (happyIn41 r))--happyReduce_119 = happyMonadReduce 1# 34# happyReduction_119-happyReduction_119 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CStatic)}- ) (\r -> happyReturn (happyIn41 r))--happyReduce_120 = happyMonadReduce 1# 34# happyReduction_120-happyReduction_120 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CAuto)}- ) (\r -> happyReturn (happyIn41 r))--happyReduce_121 = happyMonadReduce 1# 34# happyReduction_121-happyReduction_121 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CRegister)}- ) (\r -> happyReturn (happyIn41 r))--happyReduce_122 = happyMonadReduce 1# 34# happyReduction_122-happyReduction_122 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CThread)}- ) (\r -> happyReturn (happyIn41 r))--happyReduce_123 = happyMonadReduce 1# 35# happyReduction_123-happyReduction_123 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CInlineQual)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_124 = happyMonadReduce 1# 35# happyReduction_124-happyReduction_124 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CNoreturnQual)}- ) (\r -> happyReturn (happyIn42 r))--happyReduce_125 = happyMonadReduce 4# 36# happyReduction_125-happyReduction_125 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut86 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CAlignAsType happy_var_3)}}- ) (\r -> happyReturn (happyIn43 r))--happyReduce_126 = happyMonadReduce 4# 36# happyReduction_126-happyReduction_126 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CAlignAsExpr happy_var_3)}}- ) (\r -> happyReturn (happyIn43 r))--happyReduce_127 = happySpecReduce_1 37# happyReduction_127-happyReduction_127 happy_x_1- = case happyOut47 happy_x_1 of { happy_var_1 -> - happyIn44- (reverse happy_var_1- )}--happyReduce_128 = happySpecReduce_1 37# happyReduction_128-happyReduction_128 happy_x_1- = case happyOut49 happy_x_1 of { happy_var_1 -> - happyIn44- (reverse happy_var_1- )}--happyReduce_129 = happySpecReduce_1 37# happyReduction_129-happyReduction_129 happy_x_1- = case happyOut51 happy_x_1 of { happy_var_1 -> - happyIn44- (reverse happy_var_1- )}--happyReduce_130 = happyMonadReduce 1# 38# happyReduction_130-happyReduction_130 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CVoidType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_131 = happyMonadReduce 1# 38# happyReduction_131-happyReduction_131 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CCharType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_132 = happyMonadReduce 1# 38# happyReduction_132-happyReduction_132 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CShortType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_133 = happyMonadReduce 1# 38# happyReduction_133-happyReduction_133 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CIntType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_134 = happyMonadReduce 1# 38# happyReduction_134-happyReduction_134 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CLongType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_135 = happyMonadReduce 1# 38# happyReduction_135-happyReduction_135 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CFloatType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_136 = happyMonadReduce 1# 38# happyReduction_136-happyReduction_136 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDoubleType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_137 = happyMonadReduce 1# 38# happyReduction_137-happyReduction_137 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CSignedType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_138 = happyMonadReduce 1# 38# happyReduction_138-happyReduction_138 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CUnsigType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_139 = happyMonadReduce 1# 38# happyReduction_139-happyReduction_139 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CBoolType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_140 = happyMonadReduce 1# 38# happyReduction_140-happyReduction_140 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CComplexType)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_141 = happyMonadReduce 1# 38# happyReduction_141-happyReduction_141 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CInt128Type)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_142 = happyMonadReduce 1# 38# happyReduction_142-happyReduction_142 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CFloat128Type)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_143 = happyMonadReduce 1# 38# happyReduction_143-happyReduction_143 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CFloat128Type)}- ) (\r -> happyReturn (happyIn45 r))--happyReduce_144 = happySpecReduce_2 39# happyReduction_144-happyReduction_144 happy_x_2- happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut45 happy_x_2 of { happy_var_2 -> - happyIn46- (happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_145 = happySpecReduce_2 39# happyReduction_145-happyReduction_145 happy_x_2- happy_x_1- = case happyOut47 happy_x_1 of { happy_var_1 -> - case happyOut41 happy_x_2 of { happy_var_2 -> - happyIn46- (happy_var_1 `snoc` CStorageSpec happy_var_2- )}}--happyReduce_146 = happySpecReduce_2 39# happyReduction_146-happyReduction_146 happy_x_2- happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn46- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_147 = happySpecReduce_2 39# happyReduction_147-happyReduction_147 happy_x_2- happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - case happyOut45 happy_x_2 of { happy_var_2 -> - happyIn46- (happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_148 = happySpecReduce_2 39# happyReduction_148-happyReduction_148 happy_x_2- happy_x_1- = case happyOut46 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn46- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_149 = happySpecReduce_1 40# happyReduction_149-happyReduction_149 happy_x_1- = case happyOut45 happy_x_1 of { happy_var_1 -> - happyIn47- (singleton (CTypeSpec happy_var_1)- )}--happyReduce_150 = happySpecReduce_2 40# happyReduction_150-happyReduction_150 happy_x_2- happy_x_1- = case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOut45 happy_x_2 of { happy_var_2 -> - happyIn47- ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)- )}}--happyReduce_151 = happySpecReduce_2 40# happyReduction_151-happyReduction_151 happy_x_2- happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut45 happy_x_2 of { happy_var_2 -> - happyIn47- (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_152 = happySpecReduce_3 40# happyReduction_152-happyReduction_152 happy_x_3- happy_x_2- happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut45 happy_x_3 of { happy_var_3 -> - happyIn47- (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3- )}}}--happyReduce_153 = happySpecReduce_2 40# happyReduction_153-happyReduction_153 happy_x_2- happy_x_1- = case happyOut47 happy_x_1 of { happy_var_1 -> - case happyOut64 happy_x_2 of { happy_var_2 -> - happyIn47- (happy_var_1 `snoc` CTypeQual happy_var_2- )}}--happyReduce_154 = happySpecReduce_2 40# happyReduction_154-happyReduction_154 happy_x_2- happy_x_1- = case happyOut47 happy_x_1 of { happy_var_1 -> - case happyOut45 happy_x_2 of { happy_var_2 -> - happyIn47- (happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_155 = happySpecReduce_2 40# happyReduction_155-happyReduction_155 happy_x_2- happy_x_1- = case happyOut47 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn47- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_156 = happySpecReduce_2 41# happyReduction_156-happyReduction_156 happy_x_2- happy_x_1- = case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut52 happy_x_2 of { happy_var_2 -> - happyIn48- (happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_157 = happySpecReduce_2 41# happyReduction_157-happyReduction_157 happy_x_2- happy_x_1- = case happyOut49 happy_x_1 of { happy_var_1 -> - case happyOut41 happy_x_2 of { happy_var_2 -> - happyIn48- (happy_var_1 `snoc` CStorageSpec happy_var_2- )}}--happyReduce_158 = happySpecReduce_2 41# happyReduction_158-happyReduction_158 happy_x_2- happy_x_1- = case happyOut48 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn48- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_159 = happySpecReduce_2 41# happyReduction_159-happyReduction_159 happy_x_2- happy_x_1- = case happyOut48 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn48- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_160 = happySpecReduce_1 42# happyReduction_160-happyReduction_160 happy_x_1- = case happyOut52 happy_x_1 of { happy_var_1 -> - happyIn49- (singleton (CTypeSpec happy_var_1)- )}--happyReduce_161 = happySpecReduce_2 42# happyReduction_161-happyReduction_161 happy_x_2- happy_x_1- = case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOut52 happy_x_2 of { happy_var_2 -> - happyIn49- ((reverseList $ liftCAttrs happy_var_1) `snoc` (CTypeSpec happy_var_2)- )}}--happyReduce_162 = happySpecReduce_2 42# happyReduction_162-happyReduction_162 happy_x_2- happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut52 happy_x_2 of { happy_var_2 -> - happyIn49- (rmap CTypeQual happy_var_1 `snoc` CTypeSpec happy_var_2- )}}--happyReduce_163 = happySpecReduce_3 42# happyReduction_163-happyReduction_163 happy_x_3- happy_x_2- happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut52 happy_x_3 of { happy_var_3 -> - happyIn49- (rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec happy_var_3- )}}}--happyReduce_164 = happySpecReduce_2 42# happyReduction_164-happyReduction_164 happy_x_2- happy_x_1- = case happyOut49 happy_x_1 of { happy_var_1 -> - case happyOut64 happy_x_2 of { happy_var_2 -> - happyIn49- (happy_var_1 `snoc` CTypeQual happy_var_2- )}}--happyReduce_165 = happySpecReduce_2 42# happyReduction_165-happyReduction_165 happy_x_2- happy_x_1- = case happyOut49 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn49- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_166 = happySpecReduce_2 43# happyReduction_166-happyReduction_166 happy_x_2- happy_x_1- = case happyOut51 happy_x_1 of { happy_var_1 -> - case happyOut41 happy_x_2 of { happy_var_2 -> - happyIn50- (happy_var_1 `snoc` CStorageSpec happy_var_2- )}}--happyReduce_167 = happyMonadReduce 2# 43# happyReduction_167-happyReduction_167 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> - ( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}- ) (\r -> happyReturn (happyIn50 r))--happyReduce_168 = happyMonadReduce 5# 43# happyReduction_168-happyReduction_168 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut122 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}}- ) (\r -> happyReturn (happyIn50 r))--happyReduce_169 = happyMonadReduce 5# 43# happyReduction_169-happyReduction_169 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut86 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ \at -> happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}}- ) (\r -> happyReturn (happyIn50 r))--happyReduce_170 = happySpecReduce_2 43# happyReduction_170-happyReduction_170 happy_x_2- happy_x_1- = case happyOut50 happy_x_1 of { happy_var_1 -> - case happyOut39 happy_x_2 of { happy_var_2 -> - happyIn50- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_171 = happySpecReduce_2 43# happyReduction_171-happyReduction_171 happy_x_2- happy_x_1- = case happyOut50 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn50- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_172 = happyMonadReduce 1# 44# happyReduction_172-happyReduction_172 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeDef happy_var_1 at)))}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_173 = happyMonadReduce 4# 44# happyReduction_173-happyReduction_173 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfExpr happy_var_3 at)))}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_174 = happyMonadReduce 4# 44# happyReduction_174-happyReduction_174 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut86 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ \at -> singleton (CTypeSpec (CTypeOfType happy_var_3 at)))}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_175 = happyMonadReduce 2# 44# happyReduction_175-happyReduction_175 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> - ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `snoc` CTypeSpec (CTypeDef happy_var_2 at))}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_176 = happyMonadReduce 5# 44# happyReduction_176-happyReduction_176 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut122 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `snoc` CTypeSpec (CTypeOfExpr happy_var_4 at))}}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_177 = happyMonadReduce 5# 44# happyReduction_177-happyReduction_177 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut86 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ \at -> rmap CTypeQual happy_var_1 `snoc` CTypeSpec (CTypeOfType happy_var_4 at))}}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_178 = happyMonadReduce 2# 44# happyReduction_178-happyReduction_178 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { (CTokTyIdent _ happy_var_2) -> - ( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeDef happy_var_2 at)))}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_179 = happyMonadReduce 5# 44# happyReduction_179-happyReduction_179 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeOfExpr happy_var_4 at)))}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_180 = happyMonadReduce 5# 44# happyReduction_180-happyReduction_180 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut86 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_2 $ \at -> reverseList (liftCAttrs happy_var_1) `snoc` (CTypeSpec (CTypeOfType happy_var_4 at)))}}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_181 = happyMonadReduce 3# 44# happyReduction_181-happyReduction_181 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { (CTokTyIdent _ happy_var_3) -> - ( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeDef happy_var_3 at))}}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_182 = happyMonadReduce 6# 44# happyReduction_182-happyReduction_182 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - case happyOut122 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfExpr happy_var_5 at))}}}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_183 = happyMonadReduce 6# 44# happyReduction_183-happyReduction_183 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - case happyOut86 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_3 $ \at -> rmap CTypeQual happy_var_1 `rappend` (liftCAttrs happy_var_2) `snoc` CTypeSpec (CTypeOfType happy_var_5 at))}}}}- ) (\r -> happyReturn (happyIn51 r))--happyReduce_184 = happySpecReduce_2 44# happyReduction_184-happyReduction_184 happy_x_2- happy_x_1- = case happyOut51 happy_x_1 of { happy_var_1 -> - case happyOut64 happy_x_2 of { happy_var_2 -> - happyIn51- (happy_var_1 `snoc` CTypeQual happy_var_2- )}}--happyReduce_185 = happySpecReduce_2 44# happyReduction_185-happyReduction_185 happy_x_2- happy_x_1- = case happyOut51 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn51- (addTrailingAttrs happy_var_1 happy_var_2- )}}--happyReduce_186 = happyMonadReduce 1# 45# happyReduction_186-happyReduction_186 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut53 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CSUType happy_var_1)}- ) (\r -> happyReturn (happyIn52 r))--happyReduce_187 = happyMonadReduce 1# 45# happyReduction_187-happyReduction_187 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut61 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CEnumType happy_var_1)}- ) (\r -> happyReturn (happyIn52 r))--happyReduce_188 = happyMonadReduce 6# 46# happyReduction_188-happyReduction_188 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut54 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - case happyOut131 happy_x_3 of { happy_var_3 -> - case happyOut55 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}- ) (\r -> happyReturn (happyIn53 r))--happyReduce_189 = happyMonadReduce 5# 46# happyReduction_189-happyReduction_189 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut54 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - case happyOut55 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) Nothing (Just$ reverse happy_var_4) happy_var_2)}}}- ) (\r -> happyReturn (happyIn53 r))--happyReduce_190 = happyMonadReduce 3# 46# happyReduction_190-happyReduction_190 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut54 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - case happyOut131 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CStruct (unL happy_var_1) (Just happy_var_3) Nothing happy_var_2)}}}- ) (\r -> happyReturn (happyIn53 r))--happyReduce_191 = happySpecReduce_1 47# happyReduction_191-happyReduction_191 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn54- (L CStructTag (posOf happy_var_1)- )}--happyReduce_192 = happySpecReduce_1 47# happyReduction_192-happyReduction_192 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn54- (L CUnionTag (posOf happy_var_1)- )}--happyReduce_193 = happySpecReduce_0 48# happyReduction_193-happyReduction_193 = happyIn55- (empty- )--happyReduce_194 = happySpecReduce_2 48# happyReduction_194-happyReduction_194 happy_x_2- happy_x_1- = case happyOut55 happy_x_1 of { happy_var_1 -> - happyIn55- (happy_var_1- )}--happyReduce_195 = happySpecReduce_2 48# happyReduction_195-happyReduction_195 happy_x_2- happy_x_1- = case happyOut55 happy_x_1 of { happy_var_1 -> - case happyOut56 happy_x_2 of { happy_var_2 -> - happyIn55- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_196 = happySpecReduce_2 49# happyReduction_196-happyReduction_196 happy_x_2- happy_x_1- = case happyOut58 happy_x_1 of { happy_var_1 -> - happyIn56- (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at- )}--happyReduce_197 = happySpecReduce_2 49# happyReduction_197-happyReduction_197 happy_x_2- happy_x_1- = case happyOut57 happy_x_1 of { happy_var_1 -> - happyIn56- (case happy_var_1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at- )}--happyReduce_198 = happySpecReduce_2 49# happyReduction_198-happyReduction_198 happy_x_2- happy_x_1- = case happyOut56 happy_x_2 of { happy_var_2 -> - happyIn56- (happy_var_2- )}--happyReduce_199 = happyMonadReduce 3# 50# happyReduction_199-happyReduction_199 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - case happyOut60 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ case happy_var_3 of (d,s) -> CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [(d,Nothing,s)])}}}- ) (\r -> happyReturn (happyIn57 r))--happyReduce_200 = happyMonadReduce 2# 50# happyReduction_200-happyReduction_200 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOut60 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ case happy_var_2 of (d,s) -> CDecl (liftCAttrs happy_var_1) [(d,Nothing,s)])}}- ) (\r -> happyReturn (happyIn57 r))--happyReduce_201 = happyReduce 4# 50# happyReduction_201-happyReduction_201 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut57 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - case happyOut60 happy_x_4 of { happy_var_4 -> - happyIn57- (case happy_var_1 of- CDecl declspecs dies at ->- case happy_var_4 of- (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs happy_var_3 d,Nothing,s) : dies) at- (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at- ) `HappyStk` happyRest}}}--happyReduce_202 = happyMonadReduce 3# 51# happyReduction_202-happyReduction_202 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut59 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ case happy_var_2 of { (Just d,s) -> CDecl happy_var_1 [(Just $! appendObjAttrs happy_var_3 d,Nothing,s)]- ; (Nothing,s) -> CDecl happy_var_1 [(Nothing,Nothing,s)] })}}}- ) (\r -> happyReturn (happyIn58 r))--happyReduce_203 = happyReduce 5# 51# happyReduction_203-happyReduction_203 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut58 happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - case happyOut59 happy_x_4 of { happy_var_4 -> - case happyOut132 happy_x_5 of { happy_var_5 -> - happyIn58- (case happy_var_1 of- CDecl declspecs dies attr ->- case happy_var_4 of- (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs (happy_var_3++happy_var_5) d,Nothing,s) : dies) attr- (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr- ) `HappyStk` happyRest}}}}--happyReduce_204 = happyMonadReduce 1# 51# happyReduction_204-happyReduction_204 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}- ) (\r -> happyReturn (happyIn58 r))--happyReduce_205 = happySpecReduce_1 52# happyReduction_205-happyReduction_205 happy_x_1- = case happyOut66 happy_x_1 of { happy_var_1 -> - happyIn59- ((Just (reverseDeclr happy_var_1), Nothing)- )}--happyReduce_206 = happySpecReduce_2 52# happyReduction_206-happyReduction_206 happy_x_2- happy_x_1- = case happyOut126 happy_x_2 of { happy_var_2 -> - happyIn59- ((Nothing, Just happy_var_2)- )}--happyReduce_207 = happySpecReduce_3 52# happyReduction_207-happyReduction_207 happy_x_3- happy_x_2- happy_x_1- = case happyOut66 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - happyIn59- ((Just (reverseDeclr happy_var_1), Just happy_var_3)- )}}--happyReduce_208 = happySpecReduce_1 53# happyReduction_208-happyReduction_208 happy_x_1- = case happyOut75 happy_x_1 of { happy_var_1 -> - happyIn60- ((Just (reverseDeclr happy_var_1), Nothing)- )}--happyReduce_209 = happySpecReduce_2 53# happyReduction_209-happyReduction_209 happy_x_2- happy_x_1- = case happyOut126 happy_x_2 of { happy_var_2 -> - happyIn60- ((Nothing, Just happy_var_2)- )}--happyReduce_210 = happySpecReduce_3 53# happyReduction_210-happyReduction_210 happy_x_3- happy_x_2- happy_x_1- = case happyOut75 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - happyIn60- ((Just (reverseDeclr happy_var_1), Just happy_var_3)- )}}--happyReduce_211 = happySpecReduce_2 53# happyReduction_211-happyReduction_211 happy_x_2- happy_x_1- = case happyOut60 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn60- (case happy_var_1 of { (Nothing,expr) -> (Nothing,expr) {- FIXME -}- ; (Just (CDeclr name derived asmname attrs node), bsz) ->- (Just (CDeclr name derived asmname (attrs++happy_var_2) node),bsz)- }- )}}--happyReduce_212 = happyMonadReduce 5# 54# happyReduction_212-happyReduction_212 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - case happyOut62 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CEnum Nothing (Just$ reverse happy_var_4) happy_var_2)}}}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_213 = happyMonadReduce 6# 54# happyReduction_213-happyReduction_213 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - case happyOut62 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CEnum Nothing (Just$ reverse happy_var_4) happy_var_2)}}}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_214 = happyMonadReduce 6# 54# happyReduction_214-happyReduction_214 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - case happyOut131 happy_x_3 of { happy_var_3 -> - case happyOut62 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_215 = happyMonadReduce 7# 54# happyReduction_215-happyReduction_215 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - case happyOut131 happy_x_3 of { happy_var_3 -> - case happyOut62 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) (Just$ reverse happy_var_5) happy_var_2)}}}}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_216 = happyMonadReduce 3# 54# happyReduction_216-happyReduction_216 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_2 of { happy_var_2 -> - case happyOut131 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CEnum (Just happy_var_3) Nothing happy_var_2)}}}- ) (\r -> happyReturn (happyIn61 r))--happyReduce_217 = happySpecReduce_1 55# happyReduction_217-happyReduction_217 happy_x_1- = case happyOut63 happy_x_1 of { happy_var_1 -> - happyIn62- (singleton happy_var_1- )}--happyReduce_218 = happySpecReduce_3 55# happyReduction_218-happyReduction_218 happy_x_3- happy_x_2- happy_x_1- = case happyOut62 happy_x_1 of { happy_var_1 -> - case happyOut63 happy_x_3 of { happy_var_3 -> - happyIn62- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_219 = happySpecReduce_1 56# happyReduction_219-happyReduction_219 happy_x_1- = case happyOut131 happy_x_1 of { happy_var_1 -> - happyIn63- ((happy_var_1, Nothing)- )}--happyReduce_220 = happySpecReduce_2 56# happyReduction_220-happyReduction_220 happy_x_2- happy_x_1- = case happyOut131 happy_x_1 of { happy_var_1 -> - happyIn63- ((happy_var_1, Nothing)- )}--happyReduce_221 = happyReduce 4# 56# happyReduction_221-happyReduction_221 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut131 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_4 of { happy_var_4 -> - happyIn63- ((happy_var_1, Just happy_var_4)- ) `HappyStk` happyRest}}--happyReduce_222 = happySpecReduce_3 56# happyReduction_222-happyReduction_222 happy_x_3- happy_x_2- happy_x_1- = case happyOut131 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - happyIn63- ((happy_var_1, Just happy_var_3)- )}}--happyReduce_223 = happyMonadReduce 1# 57# happyReduction_223-happyReduction_223 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CConstQual)}- ) (\r -> happyReturn (happyIn64 r))--happyReduce_224 = happyMonadReduce 1# 57# happyReduction_224-happyReduction_224 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CVolatQual)}- ) (\r -> happyReturn (happyIn64 r))--happyReduce_225 = happyMonadReduce 1# 57# happyReduction_225-happyReduction_225 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CRestrQual)}- ) (\r -> happyReturn (happyIn64 r))--happyReduce_226 = happyMonadReduce 1# 57# happyReduction_226-happyReduction_226 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CNullableQual)}- ) (\r -> happyReturn (happyIn64 r))--happyReduce_227 = happyMonadReduce 1# 57# happyReduction_227-happyReduction_227 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CNonnullQual)}- ) (\r -> happyReturn (happyIn64 r))--happyReduce_228 = happyMonadReduce 1# 57# happyReduction_228-happyReduction_228 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CAtomicQual)}- ) (\r -> happyReturn (happyIn64 r))--happyReduce_229 = happySpecReduce_2 58# happyReduction_229-happyReduction_229 happy_x_2- happy_x_1- = case happyOut132 happy_x_1 of { happy_var_1 -> - case happyOut64 happy_x_2 of { happy_var_2 -> - happyIn65- (reverseList (map CAttrQual happy_var_1) `snoc` happy_var_2- )}}--happyReduce_230 = happySpecReduce_2 58# happyReduction_230-happyReduction_230 happy_x_2- happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut64 happy_x_2 of { happy_var_2 -> - happyIn65- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_231 = happySpecReduce_3 58# happyReduction_231-happyReduction_231 happy_x_3- happy_x_2- happy_x_1- = case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut64 happy_x_3 of { happy_var_3 -> - happyIn65- ((happy_var_1 `rappend` map CAttrQual happy_var_2) `snoc` happy_var_3- )}}}--happyReduce_232 = happySpecReduce_1 59# happyReduction_232-happyReduction_232 happy_x_1- = case happyOut75 happy_x_1 of { happy_var_1 -> - happyIn66- (happy_var_1- )}--happyReduce_233 = happySpecReduce_1 59# happyReduction_233-happyReduction_233 happy_x_1- = case happyOut68 happy_x_1 of { happy_var_1 -> - happyIn66- (happy_var_1- )}--happyReduce_234 = happySpecReduce_0 60# happyReduction_234-happyReduction_234 = happyIn67- (Nothing- )--happyReduce_235 = happyReduce 4# 60# happyReduction_235-happyReduction_235 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut128 happy_x_3 of { happy_var_3 -> - happyIn67- (Just happy_var_3- ) `HappyStk` happyRest}--happyReduce_236 = happySpecReduce_1 61# happyReduction_236-happyReduction_236 happy_x_1- = case happyOut72 happy_x_1 of { happy_var_1 -> - happyIn68- (happy_var_1- )}--happyReduce_237 = happySpecReduce_1 61# happyReduction_237-happyReduction_237 happy_x_1- = case happyOut69 happy_x_1 of { happy_var_1 -> - happyIn68- (happy_var_1- )}--happyReduce_238 = happyMonadReduce 1# 62# happyReduction_238-happyReduction_238 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}- ) (\r -> happyReturn (happyIn69 r))--happyReduce_239 = happyMonadReduce 2# 62# happyReduction_239-happyReduction_239 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - case happyOut88 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ \at -> happy_var_2 (mkVarDeclr happy_var_1 at))}}- ) (\r -> happyReturn (happyIn69 r))--happyReduce_240 = happySpecReduce_1 62# happyReduction_240-happyReduction_240 happy_x_1- = case happyOut70 happy_x_1 of { happy_var_1 -> - happyIn69- (happy_var_1- )}--happyReduce_241 = happySpecReduce_1 63# happyReduction_241-happyReduction_241 happy_x_1- = case happyOut71 happy_x_1 of { happy_var_1 -> - happyIn70- (happy_var_1- )}--happyReduce_242 = happyMonadReduce 2# 63# happyReduction_242-happyReduction_242 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut69 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn70 r))--happyReduce_243 = happyMonadReduce 3# 63# happyReduction_243-happyReduction_243 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut69 happy_x_3 of { happy_var_3 -> - ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}- ) (\r -> happyReturn (happyIn70 r))--happyReduce_244 = happyMonadReduce 3# 63# happyReduction_244-happyReduction_244 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut69 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn70 r))--happyReduce_245 = happyMonadReduce 4# 63# happyReduction_245-happyReduction_245 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut133 happy_x_3 of { happy_var_3 -> - case happyOut69 happy_x_4 of { happy_var_4 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}- ) (\r -> happyReturn (happyIn70 r))--happyReduce_246 = happySpecReduce_3 64# happyReduction_246-happyReduction_246 happy_x_3- happy_x_2- happy_x_1- = case happyOut70 happy_x_2 of { happy_var_2 -> - happyIn71- (happy_var_2- )}--happyReduce_247 = happyReduce 4# 64# happyReduction_247-happyReduction_247 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut70 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_4 of { happy_var_4 -> - happyIn71- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_248 = happyReduce 4# 64# happyReduction_248-happyReduction_248 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - happyIn71- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_249 = happyReduce 5# 64# happyReduction_249-happyReduction_249 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut70 happy_x_3 of { happy_var_3 -> - case happyOut88 happy_x_5 of { happy_var_5 -> - happyIn71- (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_250 = happySpecReduce_1 65# happyReduction_250-happyReduction_250 happy_x_1- = case happyOut73 happy_x_1 of { happy_var_1 -> - happyIn72- (happy_var_1- )}--happyReduce_251 = happyMonadReduce 4# 65# happyReduction_251-happyReduction_251 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut74 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 [])}}- ) (\r -> happyReturn (happyIn72 r))--happyReduce_252 = happyMonadReduce 5# 65# happyReduction_252-happyReduction_252 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut74 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn72 r))--happyReduce_253 = happyMonadReduce 6# 65# happyReduction_253-happyReduction_253 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut133 happy_x_3 of { happy_var_3 -> - case happyOut74 happy_x_5 of { happy_var_5 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_5 (reverse happy_var_2))}}}}- ) (\r -> happyReturn (happyIn72 r))--happyReduce_254 = happyMonadReduce 2# 65# happyReduction_254-happyReduction_254 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut72 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn72 r))--happyReduce_255 = happyMonadReduce 3# 65# happyReduction_255-happyReduction_255 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut72 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn72 r))--happyReduce_256 = happyMonadReduce 4# 65# happyReduction_256-happyReduction_256 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut133 happy_x_3 of { happy_var_3 -> - case happyOut72 happy_x_4 of { happy_var_4 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}- ) (\r -> happyReturn (happyIn72 r))--happyReduce_257 = happySpecReduce_3 66# happyReduction_257-happyReduction_257 happy_x_3- happy_x_2- happy_x_1- = case happyOut72 happy_x_2 of { happy_var_2 -> - happyIn73- (happy_var_2- )}--happyReduce_258 = happyReduce 4# 66# happyReduction_258-happyReduction_258 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut74 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_3 of { happy_var_3 -> - happyIn73- (happy_var_3 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_259 = happyReduce 4# 66# happyReduction_259-happyReduction_259 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut72 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_4 of { happy_var_4 -> - happyIn73- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_260 = happyMonadReduce 1# 67# happyReduction_260-happyReduction_260 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}- ) (\r -> happyReturn (happyIn74 r))--happyReduce_261 = happySpecReduce_3 67# happyReduction_261-happyReduction_261 happy_x_3- happy_x_2- happy_x_1- = case happyOut74 happy_x_2 of { happy_var_2 -> - happyIn74- (happy_var_2- )}--happyReduce_262 = happySpecReduce_1 68# happyReduction_262-happyReduction_262 happy_x_1- = case happyOut76 happy_x_1 of { happy_var_1 -> - happyIn75- (happy_var_1- )}--happyReduce_263 = happySpecReduce_1 68# happyReduction_263-happyReduction_263 happy_x_1- = case happyOut78 happy_x_1 of { happy_var_1 -> - happyIn75- (happy_var_1- )}--happyReduce_264 = happySpecReduce_1 69# happyReduction_264-happyReduction_264 happy_x_1- = case happyOut77 happy_x_1 of { happy_var_1 -> - happyIn76- (happy_var_1- )}--happyReduce_265 = happyMonadReduce 2# 69# happyReduction_265-happyReduction_265 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut75 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn76 r))--happyReduce_266 = happyMonadReduce 3# 69# happyReduction_266-happyReduction_266 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut75 happy_x_3 of { happy_var_3 -> - ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}- ) (\r -> happyReturn (happyIn76 r))--happyReduce_267 = happyMonadReduce 3# 69# happyReduction_267-happyReduction_267 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut75 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn76 r))--happyReduce_268 = happyMonadReduce 4# 69# happyReduction_268-happyReduction_268 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut133 happy_x_3 of { happy_var_3 -> - case happyOut75 happy_x_4 of { happy_var_4 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr happy_var_4 (reverse happy_var_2))}}}}- ) (\r -> happyReturn (happyIn76 r))--happyReduce_269 = happySpecReduce_2 70# happyReduction_269-happyReduction_269 happy_x_2- happy_x_1- = case happyOut78 happy_x_1 of { happy_var_1 -> - case happyOut88 happy_x_2 of { happy_var_2 -> - happyIn77- (happy_var_2 happy_var_1- )}}--happyReduce_270 = happySpecReduce_3 70# happyReduction_270-happyReduction_270 happy_x_3- happy_x_2- happy_x_1- = case happyOut76 happy_x_2 of { happy_var_2 -> - happyIn77- (happy_var_2- )}--happyReduce_271 = happyReduce 4# 70# happyReduction_271-happyReduction_271 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut76 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_4 of { happy_var_4 -> - happyIn77- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_272 = happyReduce 4# 70# happyReduction_272-happyReduction_272 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut76 happy_x_3 of { happy_var_3 -> - happyIn77- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_273 = happyReduce 5# 70# happyReduction_273-happyReduction_273 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut76 happy_x_3 of { happy_var_3 -> - case happyOut88 happy_x_5 of { happy_var_5 -> - happyIn77- (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_274 = happyMonadReduce 1# 71# happyReduction_274-happyReduction_274 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ mkVarDeclr happy_var_1)}- ) (\r -> happyReturn (happyIn78 r))--happyReduce_275 = happySpecReduce_3 71# happyReduction_275-happyReduction_275 happy_x_3- happy_x_2- happy_x_1- = case happyOut78 happy_x_2 of { happy_var_2 -> - happyIn78- (happy_var_2- )}--happyReduce_276 = happyReduce 4# 71# happyReduction_276-happyReduction_276 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut78 happy_x_3 of { happy_var_3 -> - happyIn78- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_277 = happySpecReduce_1 72# happyReduction_277-happyReduction_277 happy_x_1- = case happyOut80 happy_x_1 of { happy_var_1 -> - happyIn79- (reverseDeclr happy_var_1- )}--happyReduce_278 = happySpecReduce_1 73# happyReduction_278-happyReduction_278 happy_x_1- = case happyOut81 happy_x_1 of { happy_var_1 -> - happyIn80- (happy_var_1- )}--happyReduce_279 = happyMonadReduce 2# 73# happyReduction_279-happyReduction_279 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut80 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn80 r))--happyReduce_280 = happyMonadReduce 3# 73# happyReduction_280-happyReduction_280 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut80 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn80 r))--happyReduce_281 = happyMonadReduce 4# 74# happyReduction_281-happyReduction_281 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut78 happy_x_1 of { happy_var_1 -> - case happyOut85 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ funDeclr happy_var_1 (Left $ reverse happy_var_3) [])}}- ) (\r -> happyReturn (happyIn81 r))--happyReduce_282 = happySpecReduce_3 74# happyReduction_282-happyReduction_282 happy_x_3- happy_x_2- happy_x_1- = case happyOut80 happy_x_2 of { happy_var_2 -> - happyIn81- (happy_var_2- )}--happyReduce_283 = happyReduce 4# 74# happyReduction_283-happyReduction_283 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut80 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_4 of { happy_var_4 -> - happyIn81- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_284 = happySpecReduce_0 75# happyReduction_284-happyReduction_284 = happyIn82- (([], False)- )--happyReduce_285 = happySpecReduce_1 75# happyReduction_285-happyReduction_285 happy_x_1- = case happyOut83 happy_x_1 of { happy_var_1 -> - happyIn82- ((reverse happy_var_1, False)- )}--happyReduce_286 = happySpecReduce_3 75# happyReduction_286-happyReduction_286 happy_x_3- happy_x_2- happy_x_1- = case happyOut83 happy_x_1 of { happy_var_1 -> - happyIn82- ((reverse happy_var_1, True)- )}--happyReduce_287 = happySpecReduce_1 76# happyReduction_287-happyReduction_287 happy_x_1- = case happyOut84 happy_x_1 of { happy_var_1 -> - happyIn83- (singleton happy_var_1- )}--happyReduce_288 = happySpecReduce_3 76# happyReduction_288-happyReduction_288 happy_x_3- happy_x_2- happy_x_1- = case happyOut83 happy_x_1 of { happy_var_1 -> - case happyOut84 happy_x_3 of { happy_var_3 -> - happyIn83- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_289 = happyMonadReduce 1# 77# happyReduction_289-happyReduction_289 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_290 = happyMonadReduce 2# 77# happyReduction_290-happyReduction_290 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut87 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_291 = happyMonadReduce 3# 77# happyReduction_291-happyReduction_291 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut75 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_292 = happyMonadReduce 3# 77# happyReduction_292-happyReduction_292 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut37 happy_x_1 of { happy_var_1 -> - case happyOut69 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_293 = happyMonadReduce 1# 77# happyReduction_293-happyReduction_293 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [])}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_294 = happyMonadReduce 2# 77# happyReduction_294-happyReduction_294 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut87 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_295 = happyMonadReduce 3# 77# happyReduction_295-happyReduction_295 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut38 happy_x_1 of { happy_var_1 -> - case happyOut75 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl (reverse happy_var_1) [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_296 = happyMonadReduce 1# 77# happyReduction_296-happyReduction_296 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_297 = happyMonadReduce 2# 77# happyReduction_297-happyReduction_297 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut87 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_298 = happyMonadReduce 3# 77# happyReduction_298-happyReduction_298 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut75 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_299 = happyMonadReduce 3# 77# happyReduction_299-happyReduction_299 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut69 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr $! appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_300 = happyMonadReduce 1# 77# happyReduction_300-happyReduction_300 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [])}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_301 = happyMonadReduce 2# 77# happyReduction_301-happyReduction_301 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_302 = happyMonadReduce 2# 77# happyReduction_302-happyReduction_302 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut87 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_303 = happyMonadReduce 3# 77# happyReduction_303-happyReduction_303 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut75 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr$ appendDeclrAttrs happy_var_3 happy_var_2), Nothing, Nothing)])}}}- ) (\r -> happyReturn (happyIn84 r))--happyReduce_304 = happySpecReduce_1 78# happyReduction_304-happyReduction_304 happy_x_1- = case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - happyIn85- (singleton happy_var_1- )}--happyReduce_305 = happySpecReduce_3 78# happyReduction_305-happyReduction_305 happy_x_3- happy_x_2- happy_x_1- = case happyOut85 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_3 of { (CTokIdent _ happy_var_3) -> - happyIn85- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_306 = happyMonadReduce 1# 79# happyReduction_306-happyReduction_306 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [])}- ) (\r -> happyReturn (happyIn86 r))--happyReduce_307 = happyMonadReduce 2# 79# happyReduction_307-happyReduction_307 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOut87 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl happy_var_1 [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn86 r))--happyReduce_308 = happyMonadReduce 2# 79# happyReduction_308-happyReduction_308 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1 ++ liftCAttrs happy_var_2) [])}}- ) (\r -> happyReturn (happyIn86 r))--happyReduce_309 = happyMonadReduce 2# 79# happyReduction_309-happyReduction_309 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut65 happy_x_1 of { happy_var_1 -> - case happyOut87 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CDecl (liftTypeQuals happy_var_1) [(Just (reverseDeclr happy_var_2), Nothing, Nothing)])}}- ) (\r -> happyReturn (happyIn86 r))--happyReduce_310 = happySpecReduce_1 80# happyReduction_310-happyReduction_310 happy_x_1- = case happyOut91 happy_x_1 of { happy_var_1 -> - happyIn87- (happy_var_1- )}--happyReduce_311 = happySpecReduce_1 80# happyReduction_311-happyReduction_311 happy_x_1- = case happyOut92 happy_x_1 of { happy_var_1 -> - happyIn87- (happy_var_1- )}--happyReduce_312 = happySpecReduce_1 80# happyReduction_312-happyReduction_312 happy_x_1- = case happyOut88 happy_x_1 of { happy_var_1 -> - happyIn87- (happy_var_1 emptyDeclr- )}--happyReduce_313 = happySpecReduce_1 81# happyReduction_313-happyReduction_313 happy_x_1- = case happyOut89 happy_x_1 of { happy_var_1 -> - happyIn88- (happy_var_1- )}--happyReduce_314 = happyMonadReduce 3# 81# happyReduction_314-happyReduction_314 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut82 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ \at declr -> case happy_var_2 of- (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at)}}- ) (\r -> happyReturn (happyIn88 r))--happyReduce_315 = happySpecReduce_1 82# happyReduction_315-happyReduction_315 happy_x_1- = case happyOut90 happy_x_1 of { happy_var_1 -> - happyIn89- (happy_var_1- )}--happyReduce_316 = happySpecReduce_2 82# happyReduction_316-happyReduction_316 happy_x_2- happy_x_1- = case happyOut89 happy_x_1 of { happy_var_1 -> - case happyOut90 happy_x_2 of { happy_var_2 -> - happyIn89- (\decl -> happy_var_2 (happy_var_1 decl)- )}}--happyReduce_317 = happyMonadReduce 3# 83# happyReduction_317-happyReduction_317 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut125 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr [] False False happy_var_2 at)}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_318 = happyMonadReduce 4# 83# happyReduction_318-happyReduction_318 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - ( withAttributePF happy_var_1 happy_var_2 $ \at declr -> arrDeclr declr [] False False happy_var_3 at)}}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_319 = happyMonadReduce 4# 83# happyReduction_319-happyReduction_319 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut125 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_3 at)}}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_320 = happyMonadReduce 5# 83# happyReduction_320-happyReduction_320 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut133 happy_x_3 of { happy_var_3 -> - case happyOut125 happy_x_4 of { happy_var_4 -> - ( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr (reverse happy_var_2) False False happy_var_4 at)}}}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_321 = happyMonadReduce 5# 83# happyReduction_321-happyReduction_321 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - case happyOut120 happy_x_4 of { happy_var_4 -> - ( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] False True (Just happy_var_4) at)}}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_322 = happyMonadReduce 6# 83# happyReduction_322-happyReduction_322 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_3 of { happy_var_3 -> - case happyOut132 happy_x_4 of { happy_var_4 -> - case happyOut120 happy_x_5 of { happy_var_5 -> - ( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_3) False True (Just happy_var_5) at)}}}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_323 = happyMonadReduce 7# 83# happyReduction_323-happyReduction_323 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - case happyOut132 happy_x_5 of { happy_var_5 -> - case happyOut120 happy_x_6 of { happy_var_6 -> - ( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) False True (Just happy_var_6) at)}}}}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_324 = happyMonadReduce 4# 83# happyReduction_324-happyReduction_324 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - ( withAttributePF happy_var_1 happy_var_3 $ \at declr -> arrDeclr declr [] True False Nothing at)}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_325 = happyMonadReduce 5# 83# happyReduction_325-happyReduction_325 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_4 of { happy_var_4 -> - ( withAttributePF happy_var_1 (happy_var_2 ++ happy_var_4) $ \at declr -> arrDeclr declr [] True False Nothing at)}}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_326 = happyMonadReduce 5# 83# happyReduction_326-happyReduction_326 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_4 of { happy_var_4 -> - ( withAttributePF happy_var_1 happy_var_4 $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_327 = happyMonadReduce 6# 83# happyReduction_327-happyReduction_327 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut133 happy_x_3 of { happy_var_3 -> - case happyOut132 happy_x_5 of { happy_var_5 -> - ( withAttributePF happy_var_1 (happy_var_3 ++ happy_var_5) $ \at declr -> arrDeclr declr (reverse happy_var_2) True False Nothing at)}}}}- ) (\r -> happyReturn (happyIn90 r))--happyReduce_328 = happyMonadReduce 1# 84# happyReduction_328-happyReduction_328 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ ptrDeclr emptyDeclr [])}- ) (\r -> happyReturn (happyIn91 r))--happyReduce_329 = happyMonadReduce 3# 84# happyReduction_329-happyReduction_329 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut132 happy_x_3 of { happy_var_3 -> - ( withAttribute happy_var_1 happy_var_3 $ ptrDeclr emptyDeclr (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn91 r))--happyReduce_330 = happyMonadReduce 2# 84# happyReduction_330-happyReduction_330 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut87 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_2 [])}}- ) (\r -> happyReturn (happyIn91 r))--happyReduce_331 = happyMonadReduce 3# 84# happyReduction_331-happyReduction_331 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut65 happy_x_2 of { happy_var_2 -> - case happyOut87 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ ptrDeclr happy_var_3 (reverse happy_var_2))}}}- ) (\r -> happyReturn (happyIn91 r))--happyReduce_332 = happyMonadReduce 2# 84# happyReduction_332-happyReduction_332 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr emptyDeclr [])}}- ) (\r -> happyReturn (happyIn91 r))--happyReduce_333 = happyMonadReduce 3# 84# happyReduction_333-happyReduction_333 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut87 happy_x_3 of { happy_var_3 -> - ( withAttribute happy_var_1 happy_var_2 $ ptrDeclr happy_var_3 [])}}}- ) (\r -> happyReturn (happyIn91 r))--happyReduce_334 = happySpecReduce_3 85# happyReduction_334-happyReduction_334 happy_x_3- happy_x_2- happy_x_1- = case happyOut91 happy_x_2 of { happy_var_2 -> - happyIn92- (happy_var_2- )}--happyReduce_335 = happySpecReduce_3 85# happyReduction_335-happyReduction_335 happy_x_3- happy_x_2- happy_x_1- = case happyOut92 happy_x_2 of { happy_var_2 -> - happyIn92- (happy_var_2- )}--happyReduce_336 = happySpecReduce_3 85# happyReduction_336-happyReduction_336 happy_x_3- happy_x_2- happy_x_1- = case happyOut88 happy_x_2 of { happy_var_2 -> - happyIn92- (happy_var_2 emptyDeclr- )}--happyReduce_337 = happyReduce 4# 85# happyReduction_337-happyReduction_337 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut91 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_4 of { happy_var_4 -> - happyIn92- (happy_var_4 happy_var_2- ) `HappyStk` happyRest}}--happyReduce_338 = happyReduce 4# 85# happyReduction_338-happyReduction_338 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut91 happy_x_3 of { happy_var_3 -> - happyIn92- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_339 = happyReduce 4# 85# happyReduction_339-happyReduction_339 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut92 happy_x_3 of { happy_var_3 -> - happyIn92- (appendDeclrAttrs happy_var_2 happy_var_3- ) `HappyStk` happyRest}}--happyReduce_340 = happyReduce 4# 85# happyReduction_340-happyReduction_340 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut88 happy_x_3 of { happy_var_3 -> - happyIn92- (appendDeclrAttrs happy_var_2 (happy_var_3 emptyDeclr)- ) `HappyStk` happyRest}}--happyReduce_341 = happyReduce 5# 85# happyReduction_341-happyReduction_341 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut133 happy_x_2 of { happy_var_2 -> - case happyOut91 happy_x_3 of { happy_var_3 -> - case happyOut88 happy_x_5 of { happy_var_5 -> - happyIn92- (appendDeclrAttrs happy_var_2 (happy_var_5 happy_var_3)- ) `HappyStk` happyRest}}}--happyReduce_342 = happySpecReduce_2 85# happyReduction_342-happyReduction_342 happy_x_2- happy_x_1- = case happyOut92 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn92- (appendDeclrAttrs happy_var_2 happy_var_1- )}}--happyReduce_343 = happyMonadReduce 1# 86# happyReduction_343-happyReduction_343 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut120 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CInitExpr happy_var_1)}- ) (\r -> happyReturn (happyIn93 r))--happyReduce_344 = happyMonadReduce 3# 86# happyReduction_344-happyReduction_344 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut95 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}- ) (\r -> happyReturn (happyIn93 r))--happyReduce_345 = happyMonadReduce 4# 86# happyReduction_345-happyReduction_345 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut95 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CInitList (reverse happy_var_2))}}- ) (\r -> happyReturn (happyIn93 r))--happyReduce_346 = happySpecReduce_0 87# happyReduction_346-happyReduction_346 = happyIn94- (Nothing- )--happyReduce_347 = happySpecReduce_2 87# happyReduction_347-happyReduction_347 happy_x_2- happy_x_1- = case happyOut93 happy_x_2 of { happy_var_2 -> - happyIn94- (Just happy_var_2- )}--happyReduce_348 = happySpecReduce_0 88# happyReduction_348-happyReduction_348 = happyIn95- (empty- )--happyReduce_349 = happySpecReduce_1 88# happyReduction_349-happyReduction_349 happy_x_1- = case happyOut93 happy_x_1 of { happy_var_1 -> - happyIn95- (singleton ([],happy_var_1)- )}--happyReduce_350 = happySpecReduce_2 88# happyReduction_350-happyReduction_350 happy_x_2- happy_x_1- = case happyOut96 happy_x_1 of { happy_var_1 -> - case happyOut93 happy_x_2 of { happy_var_2 -> - happyIn95- (singleton (happy_var_1,happy_var_2)- )}}--happyReduce_351 = happySpecReduce_3 88# happyReduction_351-happyReduction_351 happy_x_3- happy_x_2- happy_x_1- = case happyOut95 happy_x_1 of { happy_var_1 -> - case happyOut93 happy_x_3 of { happy_var_3 -> - happyIn95- (happy_var_1 `snoc` ([],happy_var_3)- )}}--happyReduce_352 = happyReduce 4# 88# happyReduction_352-happyReduction_352 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut95 happy_x_1 of { happy_var_1 -> - case happyOut96 happy_x_3 of { happy_var_3 -> - case happyOut93 happy_x_4 of { happy_var_4 -> - happyIn95- (happy_var_1 `snoc` (happy_var_3,happy_var_4)- ) `HappyStk` happyRest}}}--happyReduce_353 = happySpecReduce_2 89# happyReduction_353-happyReduction_353 happy_x_2- happy_x_1- = case happyOut97 happy_x_1 of { happy_var_1 -> - happyIn96- (reverse happy_var_1- )}--happyReduce_354 = happyMonadReduce 2# 89# happyReduction_354-happyReduction_354 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut131 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ \at -> [CMemberDesig happy_var_1 at])}- ) (\r -> happyReturn (happyIn96 r))--happyReduce_355 = happySpecReduce_1 89# happyReduction_355-happyReduction_355 happy_x_1- = case happyOut99 happy_x_1 of { happy_var_1 -> - happyIn96- ([happy_var_1]- )}--happyReduce_356 = happySpecReduce_1 90# happyReduction_356-happyReduction_356 happy_x_1- = case happyOut98 happy_x_1 of { happy_var_1 -> - happyIn97- (singleton happy_var_1- )}--happyReduce_357 = happySpecReduce_2 90# happyReduction_357-happyReduction_357 happy_x_2- happy_x_1- = case happyOut97 happy_x_1 of { happy_var_1 -> - case happyOut98 happy_x_2 of { happy_var_2 -> - happyIn97- (happy_var_1 `snoc` happy_var_2- )}}--happyReduce_358 = happyMonadReduce 3# 91# happyReduction_358-happyReduction_358 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CArrDesig happy_var_2)}}- ) (\r -> happyReturn (happyIn98 r))--happyReduce_359 = happyMonadReduce 2# 91# happyReduction_359-happyReduction_359 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut131 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CMemberDesig happy_var_2)}}- ) (\r -> happyReturn (happyIn98 r))--happyReduce_360 = happySpecReduce_1 91# happyReduction_360-happyReduction_360 happy_x_1- = case happyOut99 happy_x_1 of { happy_var_1 -> - happyIn98- (happy_var_1- )}--happyReduce_361 = happyMonadReduce 5# 92# happyReduction_361-happyReduction_361 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_2 of { happy_var_2 -> - case happyOut126 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CRangeDesig happy_var_2 happy_var_4)}}}- ) (\r -> happyReturn (happyIn99 r))--happyReduce_362 = happyMonadReduce 1# 93# happyReduction_362-happyReduction_362 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ CVar happy_var_1)}- ) (\r -> happyReturn (happyIn100 r))--happyReduce_363 = happySpecReduce_1 93# happyReduction_363-happyReduction_363 happy_x_1- = case happyOut127 happy_x_1 of { happy_var_1 -> - happyIn100- (CConst happy_var_1- )}--happyReduce_364 = happySpecReduce_1 93# happyReduction_364-happyReduction_364 happy_x_1- = case happyOut128 happy_x_1 of { happy_var_1 -> - happyIn100- (CConst (liftStrLit happy_var_1)- )}--happyReduce_365 = happySpecReduce_3 93# happyReduction_365-happyReduction_365 happy_x_3- happy_x_2- happy_x_1- = case happyOut122 happy_x_2 of { happy_var_2 -> - happyIn100- (happy_var_2- )}--happyReduce_366 = happyMonadReduce 6# 93# happyReduction_366-happyReduction_366 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut120 happy_x_3 of { happy_var_3 -> - case happyOut101 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CGenericSelection happy_var_3 (reverse happy_var_5))}}}- ) (\r -> happyReturn (happyIn100 r))--happyReduce_367 = happyMonadReduce 3# 93# happyReduction_367-happyReduction_367 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut14 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CStatExpr happy_var_2)}}- ) (\r -> happyReturn (happyIn100 r))--happyReduce_368 = happyMonadReduce 6# 93# happyReduction_368-happyReduction_368 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut120 happy_x_3 of { happy_var_3 -> - case happyOut86 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinVaArg happy_var_3 happy_var_5)}}}- ) (\r -> happyReturn (happyIn100 r))--happyReduce_369 = happyMonadReduce 6# 93# happyReduction_369-happyReduction_369 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut86 happy_x_3 of { happy_var_3 -> - case happyOut103 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinOffsetOf happy_var_3 (reverse happy_var_5))}}}- ) (\r -> happyReturn (happyIn100 r))--happyReduce_370 = happyMonadReduce 6# 93# happyReduction_370-happyReduction_370 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut86 happy_x_3 of { happy_var_3 -> - case happyOut86 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinTypesCompatible happy_var_3 happy_var_5)}}}- ) (\r -> happyReturn (happyIn100 r))--happyReduce_371 = happyMonadReduce 6# 93# happyReduction_371-happyReduction_371 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut120 happy_x_3 of { happy_var_3 -> - case happyOut86 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CBuiltinExpr . CBuiltinConvertVector happy_var_3 happy_var_5)}}}- ) (\r -> happyReturn (happyIn100 r))--happyReduce_372 = happySpecReduce_3 94# happyReduction_372-happyReduction_372 happy_x_3- happy_x_2- happy_x_1- = case happyOut101 happy_x_1 of { happy_var_1 -> - case happyOut102 happy_x_3 of { happy_var_3 -> - happyIn101- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_373 = happySpecReduce_1 94# happyReduction_373-happyReduction_373 happy_x_1- = case happyOut102 happy_x_1 of { happy_var_1 -> - happyIn101- (singleton happy_var_1- )}--happyReduce_374 = happySpecReduce_3 95# happyReduction_374-happyReduction_374 happy_x_3- happy_x_2- happy_x_1- = case happyOut86 happy_x_1 of { happy_var_1 -> - case happyOut120 happy_x_3 of { happy_var_3 -> - happyIn102- ((Just happy_var_1, happy_var_3)- )}}--happyReduce_375 = happySpecReduce_3 95# happyReduction_375-happyReduction_375 happy_x_3- happy_x_2- happy_x_1- = case happyOut120 happy_x_3 of { happy_var_3 -> - happyIn102- ((Nothing, happy_var_3)- )}--happyReduce_376 = happyMonadReduce 1# 96# happyReduction_376-happyReduction_376 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut131 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ singleton . CMemberDesig happy_var_1)}- ) (\r -> happyReturn (happyIn103 r))--happyReduce_377 = happyMonadReduce 3# 96# happyReduction_377-happyReduction_377 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> - case happyOut131 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CMemberDesig happy_var_3)}}- ) (\r -> happyReturn (happyIn103 r))--happyReduce_378 = happyMonadReduce 4# 96# happyReduction_378-happyReduction_378 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut103 happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_3 $ (happy_var_1 `snoc`) . CArrDesig happy_var_3)}}- ) (\r -> happyReturn (happyIn103 r))--happyReduce_379 = happySpecReduce_1 97# happyReduction_379-happyReduction_379 happy_x_1- = case happyOut100 happy_x_1 of { happy_var_1 -> - happyIn104- (happy_var_1- )}--happyReduce_380 = happyMonadReduce 4# 97# happyReduction_380-happyReduction_380 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CIndex happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_381 = happyMonadReduce 3# 97# happyReduction_381-happyReduction_381 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CCall happy_var_1 [])}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_382 = happyMonadReduce 4# 97# happyReduction_382-happyReduction_382 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - case happyOut105 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CCall happy_var_1 (reverse happy_var_3))}}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_383 = happyMonadReduce 3# 97# happyReduction_383-happyReduction_383 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - case happyOut131 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CMember happy_var_1 happy_var_3 False)}}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_384 = happyMonadReduce 3# 97# happyReduction_384-happyReduction_384 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - case happyOut131 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CMember happy_var_1 happy_var_3 True)}}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_385 = happyMonadReduce 2# 97# happyReduction_385-happyReduction_385 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CUnary CPostIncOp happy_var_1)}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_386 = happyMonadReduce 2# 97# happyReduction_386-happyReduction_386 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut104 happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ CUnary CPostDecOp happy_var_1)}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_387 = happyMonadReduce 6# 97# happyReduction_387-happyReduction_387 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut86 happy_x_2 of { happy_var_2 -> - case happyOut95 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_388 = happyMonadReduce 7# 97# happyReduction_388-happyReduction_388 (happy_x_7 `HappyStk`- happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut86 happy_x_2 of { happy_var_2 -> - case happyOut95 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CCompoundLit happy_var_2 (reverse happy_var_5))}}}- ) (\r -> happyReturn (happyIn104 r))--happyReduce_389 = happySpecReduce_1 98# happyReduction_389-happyReduction_389 happy_x_1- = case happyOut120 happy_x_1 of { happy_var_1 -> - happyIn105- (singleton happy_var_1- )}--happyReduce_390 = happySpecReduce_3 98# happyReduction_390-happyReduction_390 happy_x_3- happy_x_2- happy_x_1- = case happyOut105 happy_x_1 of { happy_var_1 -> - case happyOut120 happy_x_3 of { happy_var_3 -> - happyIn105- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_391 = happySpecReduce_1 99# happyReduction_391-happyReduction_391 happy_x_1- = case happyOut104 happy_x_1 of { happy_var_1 -> - happyIn106- (happy_var_1- )}--happyReduce_392 = happyMonadReduce 2# 99# happyReduction_392-happyReduction_392 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut106 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CUnary CPreIncOp happy_var_2)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_393 = happyMonadReduce 2# 99# happyReduction_393-happyReduction_393 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut106 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CUnary CPreDecOp happy_var_2)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_394 = happySpecReduce_2 99# happyReduction_394-happyReduction_394 happy_x_2- happy_x_1- = case happyOut108 happy_x_2 of { happy_var_2 -> - happyIn106- (happy_var_2- )}--happyReduce_395 = happyMonadReduce 2# 99# happyReduction_395-happyReduction_395 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut107 happy_x_1 of { happy_var_1 -> - case happyOut108 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CUnary (unL happy_var_1) happy_var_2)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_396 = happyMonadReduce 2# 99# happyReduction_396-happyReduction_396 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut106 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CSizeofExpr happy_var_2)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_397 = happyMonadReduce 4# 99# happyReduction_397-happyReduction_397 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut86 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CSizeofType happy_var_3)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_398 = happyMonadReduce 2# 99# happyReduction_398-happyReduction_398 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut106 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CAlignofExpr happy_var_2)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_399 = happyMonadReduce 4# 99# happyReduction_399-happyReduction_399 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut86 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CAlignofType happy_var_3)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_400 = happyMonadReduce 2# 99# happyReduction_400-happyReduction_400 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut106 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CComplexReal happy_var_2)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_401 = happyMonadReduce 2# 99# happyReduction_401-happyReduction_401 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut106 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CComplexImag happy_var_2)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_402 = happyMonadReduce 2# 99# happyReduction_402-happyReduction_402 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut131 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ CLabAddrExpr happy_var_2)}}- ) (\r -> happyReturn (happyIn106 r))--happyReduce_403 = happySpecReduce_1 100# happyReduction_403-happyReduction_403 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn107- (L CAdrOp (posOf happy_var_1)- )}--happyReduce_404 = happySpecReduce_1 100# happyReduction_404-happyReduction_404 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn107- (L CIndOp (posOf happy_var_1)- )}--happyReduce_405 = happySpecReduce_1 100# happyReduction_405-happyReduction_405 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn107- (L CPlusOp (posOf happy_var_1)- )}--happyReduce_406 = happySpecReduce_1 100# happyReduction_406-happyReduction_406 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn107- (L CMinOp (posOf happy_var_1)- )}--happyReduce_407 = happySpecReduce_1 100# happyReduction_407-happyReduction_407 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn107- (L CCompOp (posOf happy_var_1)- )}--happyReduce_408 = happySpecReduce_1 100# happyReduction_408-happyReduction_408 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn107- (L CNegOp (posOf happy_var_1)- )}--happyReduce_409 = happySpecReduce_1 101# happyReduction_409-happyReduction_409 happy_x_1- = case happyOut106 happy_x_1 of { happy_var_1 -> - happyIn108- (happy_var_1- )}--happyReduce_410 = happyMonadReduce 4# 101# happyReduction_410-happyReduction_410 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut86 happy_x_2 of { happy_var_2 -> - case happyOut108 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CCast happy_var_2 happy_var_4)}}}- ) (\r -> happyReturn (happyIn108 r))--happyReduce_411 = happySpecReduce_1 102# happyReduction_411-happyReduction_411 happy_x_1- = case happyOut108 happy_x_1 of { happy_var_1 -> - happyIn109- (happy_var_1- )}--happyReduce_412 = happyMonadReduce 3# 102# happyReduction_412-happyReduction_412 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> - case happyOut108 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CMulOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn109 r))--happyReduce_413 = happyMonadReduce 3# 102# happyReduction_413-happyReduction_413 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> - case happyOut108 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CDivOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn109 r))--happyReduce_414 = happyMonadReduce 3# 102# happyReduction_414-happyReduction_414 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut109 happy_x_1 of { happy_var_1 -> - case happyOut108 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CRmdOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn109 r))--happyReduce_415 = happySpecReduce_1 103# happyReduction_415-happyReduction_415 happy_x_1- = case happyOut109 happy_x_1 of { happy_var_1 -> - happyIn110- (happy_var_1- )}--happyReduce_416 = happyMonadReduce 3# 103# happyReduction_416-happyReduction_416 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut110 happy_x_1 of { happy_var_1 -> - case happyOut109 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CAddOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn110 r))--happyReduce_417 = happyMonadReduce 3# 103# happyReduction_417-happyReduction_417 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut110 happy_x_1 of { happy_var_1 -> - case happyOut109 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CSubOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn110 r))--happyReduce_418 = happySpecReduce_1 104# happyReduction_418-happyReduction_418 happy_x_1- = case happyOut110 happy_x_1 of { happy_var_1 -> - happyIn111- (happy_var_1- )}--happyReduce_419 = happyMonadReduce 3# 104# happyReduction_419-happyReduction_419 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut111 happy_x_1 of { happy_var_1 -> - case happyOut110 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CShlOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn111 r))--happyReduce_420 = happyMonadReduce 3# 104# happyReduction_420-happyReduction_420 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut111 happy_x_1 of { happy_var_1 -> - case happyOut110 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CShrOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn111 r))--happyReduce_421 = happySpecReduce_1 105# happyReduction_421-happyReduction_421 happy_x_1- = case happyOut111 happy_x_1 of { happy_var_1 -> - happyIn112- (happy_var_1- )}--happyReduce_422 = happyMonadReduce 3# 105# happyReduction_422-happyReduction_422 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> - case happyOut111 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CLeOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn112 r))--happyReduce_423 = happyMonadReduce 3# 105# happyReduction_423-happyReduction_423 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> - case happyOut111 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CGrOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn112 r))--happyReduce_424 = happyMonadReduce 3# 105# happyReduction_424-happyReduction_424 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> - case happyOut111 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CLeqOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn112 r))--happyReduce_425 = happyMonadReduce 3# 105# happyReduction_425-happyReduction_425 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut112 happy_x_1 of { happy_var_1 -> - case happyOut111 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CGeqOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn112 r))--happyReduce_426 = happySpecReduce_1 106# happyReduction_426-happyReduction_426 happy_x_1- = case happyOut112 happy_x_1 of { happy_var_1 -> - happyIn113- (happy_var_1- )}--happyReduce_427 = happyMonadReduce 3# 106# happyReduction_427-happyReduction_427 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> - case happyOut112 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CEqOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn113 r))--happyReduce_428 = happyMonadReduce 3# 106# happyReduction_428-happyReduction_428 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut113 happy_x_1 of { happy_var_1 -> - case happyOut112 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CNeqOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn113 r))--happyReduce_429 = happySpecReduce_1 107# happyReduction_429-happyReduction_429 happy_x_1- = case happyOut113 happy_x_1 of { happy_var_1 -> - happyIn114- (happy_var_1- )}--happyReduce_430 = happyMonadReduce 3# 107# happyReduction_430-happyReduction_430 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut114 happy_x_1 of { happy_var_1 -> - case happyOut113 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CAndOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn114 r))--happyReduce_431 = happySpecReduce_1 108# happyReduction_431-happyReduction_431 happy_x_1- = case happyOut114 happy_x_1 of { happy_var_1 -> - happyIn115- (happy_var_1- )}--happyReduce_432 = happyMonadReduce 3# 108# happyReduction_432-happyReduction_432 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut115 happy_x_1 of { happy_var_1 -> - case happyOut114 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CXorOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn115 r))--happyReduce_433 = happySpecReduce_1 109# happyReduction_433-happyReduction_433 happy_x_1- = case happyOut115 happy_x_1 of { happy_var_1 -> - happyIn116- (happy_var_1- )}--happyReduce_434 = happyMonadReduce 3# 109# happyReduction_434-happyReduction_434 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut116 happy_x_1 of { happy_var_1 -> - case happyOut115 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary COrOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn116 r))--happyReduce_435 = happySpecReduce_1 110# happyReduction_435-happyReduction_435 happy_x_1- = case happyOut116 happy_x_1 of { happy_var_1 -> - happyIn117- (happy_var_1- )}--happyReduce_436 = happyMonadReduce 3# 110# happyReduction_436-happyReduction_436 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut117 happy_x_1 of { happy_var_1 -> - case happyOut116 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CLndOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn117 r))--happyReduce_437 = happySpecReduce_1 111# happyReduction_437-happyReduction_437 happy_x_1- = case happyOut117 happy_x_1 of { happy_var_1 -> - happyIn118- (happy_var_1- )}--happyReduce_438 = happyMonadReduce 3# 111# happyReduction_438-happyReduction_438 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut118 happy_x_1 of { happy_var_1 -> - case happyOut117 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CBinary CLorOp happy_var_1 happy_var_3)}}- ) (\r -> happyReturn (happyIn118 r))--happyReduce_439 = happySpecReduce_1 112# happyReduction_439-happyReduction_439 happy_x_1- = case happyOut118 happy_x_1 of { happy_var_1 -> - happyIn119- (happy_var_1- )}--happyReduce_440 = happyMonadReduce 5# 112# happyReduction_440-happyReduction_440 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut118 happy_x_1 of { happy_var_1 -> - case happyOut122 happy_x_3 of { happy_var_3 -> - case happyOut119 happy_x_5 of { happy_var_5 -> - ( withNodeInfo happy_var_1 $ CCond happy_var_1 (Just happy_var_3) happy_var_5)}}}- ) (\r -> happyReturn (happyIn119 r))--happyReduce_441 = happyMonadReduce 4# 112# happyReduction_441-happyReduction_441 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut118 happy_x_1 of { happy_var_1 -> - case happyOut119 happy_x_4 of { happy_var_4 -> - ( withNodeInfo happy_var_1 $ CCond happy_var_1 Nothing happy_var_4)}}- ) (\r -> happyReturn (happyIn119 r))--happyReduce_442 = happySpecReduce_1 113# happyReduction_442-happyReduction_442 happy_x_1- = case happyOut119 happy_x_1 of { happy_var_1 -> - happyIn120- (happy_var_1- )}--happyReduce_443 = happyMonadReduce 3# 113# happyReduction_443-happyReduction_443 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut106 happy_x_1 of { happy_var_1 -> - case happyOut121 happy_x_2 of { happy_var_2 -> - case happyOut120 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ CAssign (unL happy_var_2) happy_var_1 happy_var_3)}}}- ) (\r -> happyReturn (happyIn120 r))--happyReduce_444 = happySpecReduce_1 114# happyReduction_444-happyReduction_444 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CAssignOp (posOf happy_var_1)- )}--happyReduce_445 = happySpecReduce_1 114# happyReduction_445-happyReduction_445 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CMulAssOp (posOf happy_var_1)- )}--happyReduce_446 = happySpecReduce_1 114# happyReduction_446-happyReduction_446 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CDivAssOp (posOf happy_var_1)- )}--happyReduce_447 = happySpecReduce_1 114# happyReduction_447-happyReduction_447 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CRmdAssOp (posOf happy_var_1)- )}--happyReduce_448 = happySpecReduce_1 114# happyReduction_448-happyReduction_448 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CAddAssOp (posOf happy_var_1)- )}--happyReduce_449 = happySpecReduce_1 114# happyReduction_449-happyReduction_449 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CSubAssOp (posOf happy_var_1)- )}--happyReduce_450 = happySpecReduce_1 114# happyReduction_450-happyReduction_450 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CShlAssOp (posOf happy_var_1)- )}--happyReduce_451 = happySpecReduce_1 114# happyReduction_451-happyReduction_451 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CShrAssOp (posOf happy_var_1)- )}--happyReduce_452 = happySpecReduce_1 114# happyReduction_452-happyReduction_452 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CAndAssOp (posOf happy_var_1)- )}--happyReduce_453 = happySpecReduce_1 114# happyReduction_453-happyReduction_453 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L CXorAssOp (posOf happy_var_1)- )}--happyReduce_454 = happySpecReduce_1 114# happyReduction_454-happyReduction_454 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn121- (L COrAssOp (posOf happy_var_1)- )}--happyReduce_455 = happySpecReduce_1 115# happyReduction_455-happyReduction_455 happy_x_1- = case happyOut120 happy_x_1 of { happy_var_1 -> - happyIn122- (happy_var_1- )}--happyReduce_456 = happyMonadReduce 3# 115# happyReduction_456-happyReduction_456 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOut120 happy_x_1 of { happy_var_1 -> - case happyOut123 happy_x_3 of { happy_var_3 -> - ( let es = reverse happy_var_3 in withNodeInfo es $ CComma (happy_var_1:es))}}- ) (\r -> happyReturn (happyIn122 r))--happyReduce_457 = happySpecReduce_1 116# happyReduction_457-happyReduction_457 happy_x_1- = case happyOut120 happy_x_1 of { happy_var_1 -> - happyIn123- (singleton happy_var_1- )}--happyReduce_458 = happySpecReduce_3 116# happyReduction_458-happyReduction_458 happy_x_3- happy_x_2- happy_x_1- = case happyOut123 happy_x_1 of { happy_var_1 -> - case happyOut120 happy_x_3 of { happy_var_3 -> - happyIn123- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_459 = happySpecReduce_0 117# happyReduction_459-happyReduction_459 = happyIn124- (Nothing- )--happyReduce_460 = happySpecReduce_1 117# happyReduction_460-happyReduction_460 happy_x_1- = case happyOut122 happy_x_1 of { happy_var_1 -> - happyIn124- (Just happy_var_1- )}--happyReduce_461 = happySpecReduce_0 118# happyReduction_461-happyReduction_461 = happyIn125- (Nothing- )--happyReduce_462 = happySpecReduce_1 118# happyReduction_462-happyReduction_462 happy_x_1- = case happyOut120 happy_x_1 of { happy_var_1 -> - happyIn125- (Just happy_var_1- )}--happyReduce_463 = happySpecReduce_1 119# happyReduction_463-happyReduction_463 happy_x_1- = case happyOut119 happy_x_1 of { happy_var_1 -> - happyIn126- (happy_var_1- )}--happyReduce_464 = happyMonadReduce 1# 120# happyReduction_464-happyReduction_464 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokILit _ i -> CIntConst i)}- ) (\r -> happyReturn (happyIn127 r))--happyReduce_465 = happyMonadReduce 1# 120# happyReduction_465-happyReduction_465 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokCLit _ c -> CCharConst c)}- ) (\r -> happyReturn (happyIn127 r))--happyReduce_466 = happyMonadReduce 1# 120# happyReduction_466-happyReduction_466 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokFLit _ f -> CFloatConst f)}- ) (\r -> happyReturn (happyIn127 r))--happyReduce_467 = happyMonadReduce 1# 121# happyReduction_467-happyReduction_467 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit s)}- ) (\r -> happyReturn (happyIn128 r))--happyReduce_468 = happyMonadReduce 2# 121# happyReduction_468-happyReduction_468 (happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut129 happy_x_2 of { happy_var_2 -> - ( withNodeInfo happy_var_1 $ case happy_var_1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse happy_var_2)))}}- ) (\r -> happyReturn (happyIn128 r))--happyReduce_469 = happySpecReduce_1 122# happyReduction_469-happyReduction_469 happy_x_1- = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn129- (case happy_var_1 of CTokSLit _ s -> singleton s- )}--happyReduce_470 = happySpecReduce_2 122# happyReduction_470-happyReduction_470 happy_x_2- happy_x_1- = case happyOut129 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - happyIn129- (case happy_var_2 of CTokSLit _ s -> happy_var_1 `snoc` s- )}}--happyReduce_471 = happySpecReduce_1 123# happyReduction_471-happyReduction_471 happy_x_1- = case happyOutTok happy_x_1 of { (CTokClangC _ (ClangCVersionTok happy_var_1)) -> - happyIn130- (happy_var_1- )}--happyReduce_472 = happySpecReduce_1 124# happyReduction_472-happyReduction_472 happy_x_1- = case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - happyIn131- (happy_var_1- )}--happyReduce_473 = happySpecReduce_1 124# happyReduction_473-happyReduction_473 happy_x_1- = case happyOutTok happy_x_1 of { (CTokTyIdent _ happy_var_1) -> - happyIn131- (happy_var_1- )}--happyReduce_474 = happySpecReduce_0 125# happyReduction_474-happyReduction_474 = happyIn132- ([]- )--happyReduce_475 = happySpecReduce_1 125# happyReduction_475-happyReduction_475 happy_x_1- = case happyOut133 happy_x_1 of { happy_var_1 -> - happyIn132- (happy_var_1- )}--happyReduce_476 = happySpecReduce_1 126# happyReduction_476-happyReduction_476 happy_x_1- = case happyOut134 happy_x_1 of { happy_var_1 -> - happyIn133- (happy_var_1- )}--happyReduce_477 = happySpecReduce_2 126# happyReduction_477-happyReduction_477 happy_x_2- happy_x_1- = case happyOut133 happy_x_1 of { happy_var_1 -> - case happyOut134 happy_x_2 of { happy_var_2 -> - happyIn133- (happy_var_1 ++ happy_var_2- )}}--happyReduce_478 = happyReduce 6# 127# happyReduction_478-happyReduction_478 (happy_x_6 `HappyStk`- happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut135 happy_x_4 of { happy_var_4 -> - happyIn134- (reverse happy_var_4- ) `HappyStk` happyRest}--happyReduce_479 = happySpecReduce_1 128# happyReduction_479-happyReduction_479 happy_x_1- = case happyOut136 happy_x_1 of { happy_var_1 -> - happyIn135- (case happy_var_1 of Nothing -> empty; Just attr -> singleton attr- )}--happyReduce_480 = happySpecReduce_3 128# happyReduction_480-happyReduction_480 happy_x_3- happy_x_2- happy_x_1- = case happyOut135 happy_x_1 of { happy_var_1 -> - case happyOut136 happy_x_3 of { happy_var_3 -> - happyIn135- ((maybe id (flip snoc) happy_var_3) happy_var_1- )}}--happyReduce_481 = happySpecReduce_0 129# happyReduction_481-happyReduction_481 = happyIn136- (Nothing- )--happyReduce_482 = happyMonadReduce 1# 129# happyReduction_482-happyReduction_482 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 [])}- ) (\r -> happyReturn (happyIn136 r))--happyReduce_483 = happyMonadReduce 1# 129# happyReduction_483-happyReduction_483 (happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { happy_var_1 -> - ( withNodeInfo happy_var_1 $ Just . CAttr (internalIdent "const") [])}- ) (\r -> happyReturn (happyIn136 r))--happyReduce_484 = happyMonadReduce 4# 129# happyReduction_484-happyReduction_484 (happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - case happyOut137 happy_x_3 of { happy_var_3 -> - ( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 (reverse happy_var_3))}}- ) (\r -> happyReturn (happyIn136 r))--happyReduce_485 = happyMonadReduce 3# 129# happyReduction_485-happyReduction_485 (happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest) tk- = happyThen (case happyOutTok happy_x_1 of { (CTokIdent _ happy_var_1) -> - ( withNodeInfo happy_var_1 $ Just . CAttr happy_var_1 [])}- ) (\r -> happyReturn (happyIn136 r))--happyReduce_486 = happySpecReduce_1 130# happyReduction_486-happyReduction_486 happy_x_1- = case happyOut126 happy_x_1 of { happy_var_1 -> - happyIn137- (singleton happy_var_1- )}--happyReduce_487 = happySpecReduce_3 130# happyReduction_487-happyReduction_487 happy_x_3- happy_x_2- happy_x_1- = happyIn137- (Reversed []- )--happyReduce_488 = happySpecReduce_3 130# happyReduction_488-happyReduction_488 happy_x_3- happy_x_2- happy_x_1- = happyIn137- (Reversed []- )--happyReduce_489 = happySpecReduce_3 130# happyReduction_489-happyReduction_489 happy_x_3- happy_x_2- happy_x_1- = case happyOut137 happy_x_1 of { happy_var_1 -> - case happyOut126 happy_x_3 of { happy_var_3 -> - happyIn137- (happy_var_1 `snoc` happy_var_3- )}}--happyReduce_490 = happyReduce 5# 130# happyReduction_490-happyReduction_490 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut137 happy_x_1 of { happy_var_1 -> - happyIn137- (happy_var_1- ) `HappyStk` happyRest}--happyReduce_491 = happyReduce 5# 130# happyReduction_491-happyReduction_491 (happy_x_5 `HappyStk`- happy_x_4 `HappyStk`- happy_x_3 `HappyStk`- happy_x_2 `HappyStk`- happy_x_1 `HappyStk`- happyRest)- = case happyOut137 happy_x_1 of { happy_var_1 -> - happyIn137- (happy_var_1- ) `HappyStk` happyRest}--happyNewToken action sts stk- = lexC(\tk -> - let cont i = happyDoAction i tk action sts stk in- case tk of {- CTokEof -> happyDoAction 113# tk action sts stk;- CTokLParen _ -> cont 1#;- CTokRParen _ -> cont 2#;- CTokLBracket _ -> cont 3#;- CTokRBracket _ -> cont 4#;- CTokArrow _ -> cont 5#;- CTokDot _ -> cont 6#;- CTokExclam _ -> cont 7#;- CTokTilde _ -> cont 8#;- CTokInc _ -> cont 9#;- CTokDec _ -> cont 10#;- CTokPlus _ -> cont 11#;- CTokMinus _ -> cont 12#;- CTokStar _ -> cont 13#;- CTokSlash _ -> cont 14#;- CTokPercent _ -> cont 15#;- CTokAmper _ -> cont 16#;- CTokShiftL _ -> cont 17#;- CTokShiftR _ -> cont 18#;- CTokLess _ -> cont 19#;- CTokLessEq _ -> cont 20#;- CTokHigh _ -> cont 21#;- CTokHighEq _ -> cont 22#;- CTokEqual _ -> cont 23#;- CTokUnequal _ -> cont 24#;- CTokHat _ -> cont 25#;- CTokBar _ -> cont 26#;- CTokAnd _ -> cont 27#;- CTokOr _ -> cont 28#;- CTokQuest _ -> cont 29#;- CTokColon _ -> cont 30#;- CTokAssign _ -> cont 31#;- CTokPlusAss _ -> cont 32#;- CTokMinusAss _ -> cont 33#;- CTokStarAss _ -> cont 34#;- CTokSlashAss _ -> cont 35#;- CTokPercAss _ -> cont 36#;- CTokAmpAss _ -> cont 37#;- CTokHatAss _ -> cont 38#;- CTokBarAss _ -> cont 39#;- CTokSLAss _ -> cont 40#;- CTokSRAss _ -> cont 41#;- CTokComma _ -> cont 42#;- CTokSemic _ -> cont 43#;- CTokLBrace _ -> cont 44#;- CTokRBrace _ -> cont 45#;- CTokEllipsis _ -> cont 46#;- CTokAlignof _ -> cont 47#;- CTokAlignas _ -> cont 48#;- CTokAtomic _ -> cont 49#;- CTokAsm _ -> cont 50#;- CTokAuto _ -> cont 51#;- CTokBreak _ -> cont 52#;- CTokBool _ -> cont 53#;- CTokCase _ -> cont 54#;- CTokChar _ -> cont 55#;- CTokConst _ -> cont 56#;- CTokContinue _ -> cont 57#;- CTokComplex _ -> cont 58#;- CTokDefault _ -> cont 59#;- CTokDo _ -> cont 60#;- CTokDouble _ -> cont 61#;- CTokElse _ -> cont 62#;- CTokEnum _ -> cont 63#;- CTokExtern _ -> cont 64#;- CTokFloat _ -> cont 65#;- CTokFloat128 _ -> cont 66#;- CTokFloat128 _ -> cont 67#;- CTokFor _ -> cont 68#;- CTokGeneric _ -> cont 69#;- CTokGoto _ -> cont 70#;- CTokIf _ -> cont 71#;- CTokInline _ -> cont 72#;- CTokInt _ -> cont 73#;- CTokInt128 _ -> cont 74#;- CTokLong _ -> cont 75#;- CTokLabel _ -> cont 76#;- CTokNoreturn _ -> cont 77#;- CTokNullable _ -> cont 78#;- CTokNonnull _ -> cont 79#;- CTokRegister _ -> cont 80#;- CTokRestrict _ -> cont 81#;- CTokReturn _ -> cont 82#;- CTokShort _ -> cont 83#;- CTokSigned _ -> cont 84#;- CTokSizeof _ -> cont 85#;- CTokStatic _ -> cont 86#;- CTokStaticAssert _ -> cont 87#;- CTokStruct _ -> cont 88#;- CTokSwitch _ -> cont 89#;- CTokTypedef _ -> cont 90#;- CTokTypeof _ -> cont 91#;- CTokThread _ -> cont 92#;- CTokUnion _ -> cont 93#;- CTokUnsigned _ -> cont 94#;- CTokVoid _ -> cont 95#;- CTokVolatile _ -> cont 96#;- CTokWhile _ -> cont 97#;- CTokCLit _ _ -> cont 98#;- CTokILit _ _ -> cont 99#;- CTokFLit _ _ -> cont 100#;- CTokSLit _ _ -> cont 101#;- CTokIdent _ happy_dollar_dollar -> cont 102#;- CTokTyIdent _ happy_dollar_dollar -> cont 103#;- CTokGnuC GnuCAttrTok _ -> cont 104#;- CTokGnuC GnuCExtTok _ -> cont 105#;- CTokGnuC GnuCComplexReal _ -> cont 106#;- CTokGnuC GnuCComplexImag _ -> cont 107#;- CTokGnuC GnuCVaArg _ -> cont 108#;- CTokGnuC GnuCOffsetof _ -> cont 109#;- CTokGnuC GnuCTyCompat _ -> cont 110#;- CTokClangC _ ClangBuiltinConvertVector -> cont 111#;- CTokClangC _ (ClangCVersionTok happy_dollar_dollar) -> cont 112#;- _ -> happyError' tk- })--happyError_ 113# tk = happyError' tk-happyError_ _ tk = happyError' tk--happyThen :: () => P a -> (a -> P b) -> P b-happyThen = (>>=)-happyReturn :: () => a -> P a-happyReturn = (return)-happyThen1 = happyThen-happyReturn1 :: () => a -> P a-happyReturn1 = happyReturn-happyError' :: () => (CToken) -> P a-happyError' tk = (\token -> happyError) tk--translation_unit = happySomeParser where- happySomeParser = happyThen (happyParse 0#) (\x -> happyReturn (happyOut7 x))--external_declaration = happySomeParser where- happySomeParser = happyThen (happyParse 1#) (\x -> happyReturn (happyOut9 x))--statement = happySomeParser where- happySomeParser = happyThen (happyParse 2#) (\x -> happyReturn (happyOut12 x))--expression = happySomeParser where- happySomeParser = happyThen (happyParse 3#) (\x -> happyReturn (happyOut122 x))--happySeq = happyDontSeq----- sometimes it is neccessary to reverse an unreversed list-reverseList :: [a] -> Reversed [a]-reverseList = Reversed . List.reverse---- We occasionally need things to have a location when they don't naturally--- have one built in as tokens and most AST elements do.----data Located a = L !a !Position--unL :: Located a -> a-unL (L a pos) = a--instance Pos (Located a) where- posOf (L _ pos) = pos---- FIXME: the next 3 inlines here increase the object file size by 70%--- Check whether the speed win is worth it-{-# INLINE withNodeInfo #-}-withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a-withNodeInfo node mkAttrNode = do- name <- getNewName- lastTok <- getSavedToken- let firstPos = posOf node- let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name- attrs `seq` return (mkAttrNode attrs)--{-# INLINE withLength #-}-withLength :: NodeInfo -> (NodeInfo -> a) -> P a-withLength nodeinfo mkAttrNode = do- lastTok <- getSavedToken- let firstPos = posOfNode nodeinfo- let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok)- (maybe (error "nameOfNode") id (nameOfNode nodeinfo))- attrs `seq` return (mkAttrNode attrs)--data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo-reverseDeclr :: CDeclrR -> CDeclr-reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)- = CDeclr ide (reverse reversedDDs) asmname cattrs at-instance CNode (CDeclrR) where- nodeInfo (CDeclrR _ _ _ _ n) = n-instance Pos (CDeclrR) where- posOf (CDeclrR _ _ _ _ n) = posOf n--{-# INLINE withAttribute #-}-withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR-withAttribute node cattrs mkDeclrNode = do- name <- getNewName- let attrs = mkNodeInfo (posOf node) name- let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs- attrs `seq` newDeclr `seq` return newDeclr---- postfixing variant-{-# INLINE withAttributePF #-}-withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)-withAttributePF node cattrs mkDeclrCtor = do- name <- getNewName- let attrs = mkNodeInfo (posOf node) name- let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs- attrs `seq` newDeclr `seq` return newDeclr---- add top level attributes for a declarator.------ In the following example------ > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));------ the attributes `a1' and `a3' are top-level attributes for y.--- The (pseudo)-AST for the second declarator is------ > CDeclr "y"--- > [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]--- > (asm "$y")--- > [__attribute__((a1)), __attribute__((a3)) ]------ So assembler names and preceeding and trailing attributes are recorded in object declarator.----appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr-appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)- = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at-appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR-appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)- = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at--setAsmName :: Maybe CStrLit -> CDeclrR -> P CDeclrR-setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =- case combineName mAsmName oldName of- Left (n1,n2) -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]- Right newName -> return $ CDeclrR ident indirections newName cattrs at- where- combineName Nothing Nothing = Right Nothing- combineName Nothing oldname@(Just _) = Right oldname- combineName newname@(Just _) Nothing = Right newname- combineName (Just n1) (Just n2) = Left (n1,n2)- showName (CStrLit cstr _) = show cstr--withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR-withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)--appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)- = CDeclrR ident empty asmname (cattrs ++ newAttrs) at-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)- = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where- appendAttrs (CPtrDeclr typeQuals at) = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at- appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at- appendAttrs (CFunDeclr parameters cattrs at) = CFunDeclr parameters (cattrs ++ newAttrs) at--ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR-ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at- = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat-funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR-funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at- = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat-arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR-arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at- = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )- where- arr_sz = case size_expr_opt of- Just e -> CArrSize static_size e- Nothing -> CNoArrSize var_sized--liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]-liftTypeQuals = map CTypeQual . reverse---- lift CAttrs to DeclSpecs----liftCAttrs :: [CAttr] -> [CDeclSpec]-liftCAttrs = map (CTypeQual . CAttrQual)---- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list--- needs special care when @decl_spec_n@ is a SUE definition-addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]-addTrailingAttrs declspecs new_attrs =- case viewr declspecs of- (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))- -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))- (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))- -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))- _ -> declspecs `rappend` (liftCAttrs new_attrs)---- convenient instance, the position of a list of things is the position of--- the first thing in the list----instance Pos a => Pos [a] where- posOf (x:_) = posOf x--instance Pos a => Pos (Reversed a) where- posOf (Reversed x) = posOf x--emptyDeclr :: CDeclrR-emptyDeclr = CDeclrR Nothing empty Nothing [] undefNode-mkVarDeclr :: Ident -> NodeInfo -> CDeclrR-mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []---- Take the identifiers and use them to update the typedef'ed identifier set--- if the decl is defining a typedef then we add it to the set,--- if it's a var decl then that shadows typedefed identifiers----doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()-doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =- case mIdent of- Nothing -> return ()- Just ident | any iypedef declspecs -> addTypedef ident- | otherwise -> shadowTypedef ident-- where iypedef (CStorageSpec (CTypedef _)) = True- iypedef _ = False--doFuncParamDeclIdent :: CDeclr -> P ()-doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =- sequence_- [ case getCDeclrIdent declr of- Nothing -> return ()- Just ident -> shadowTypedef ident- | CDecl _ dle _ <- either (const []) fst params- , (Just declr, _, _) <- dle ]-doFuncParamDeclIdent _ = return ()---- extract all identifiers-getCDeclrIdent :: CDeclr -> Maybe Ident-getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent--happyError :: P a-happyError = parseError---- * public interface---- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.-parseC :: InputStream -> Position -> Either ParseError CTranslUnit-parseC input initialPosition =- fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0)---- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations.-translUnitP :: P CTranslUnit-translUnitP = translation_unit--- | @extDeclP@ provides a parser for an external (file-scope) declaration-extDeclP :: P CExtDecl-extDeclP = external_declaration--- | @statementP@ provides a parser for C statements-statementP :: P CStat-statementP = statement--- | @expressionP@ provides a parser for C expressions-expressionP :: P CExpr-expressionP = expression-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}-{-# LINE 1 "<built-in>" #-}-{-# LINE 1 "<command-line>" #-}-{-# LINE 8 "<command-line>" #-}-# 1 "/usr/include/stdc-predef.h" 1 3 4--# 17 "/usr/include/stdc-predef.h" 3 4-------------------------------------------{-# LINE 8 "<command-line>" #-}-{-# LINE 1 "templates/GenericTemplate.hs" #-}--- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp --{-# LINE 13 "templates/GenericTemplate.hs" #-}-------- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.-#if __GLASGOW_HASKELL__ > 706-#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)-#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)-#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)-#else-#define LT(n,m) (n Happy_GHC_Exts.<# m)-#define GTE(n,m) (n Happy_GHC_Exts.>=# m)-#define EQ(n,m) (n Happy_GHC_Exts.==# m)-#endif-{-# LINE 46 "templates/GenericTemplate.hs" #-}---data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList------{-# LINE 67 "templates/GenericTemplate.hs" #-}--{-# LINE 77 "templates/GenericTemplate.hs" #-}--{-# LINE 86 "templates/GenericTemplate.hs" #-}--infixr 9 `HappyStk`-data HappyStk a = HappyStk a (HappyStk a)---------------------------------------------------------------------------------- starting the parse--happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll---------------------------------------------------------------------------------- Accepting the parse---- If the current token is 0#, it means we've just accepted a partial--- parse (a %partial parser). We must ignore the saved token on the top of--- the stack in this case.-happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =- happyReturn1 ans-happyAccept j tk st sts (HappyStk ans _) = - (happyTcHack j (happyTcHack st)) (happyReturn1 ans)---------------------------------------------------------------------------------- Arrays only: do the next action----happyDoAction i tk st- = {- nothing -}--- case action of- 0# -> {- nothing -}- happyFail i tk st- -1# -> {- nothing -}- happyAccept i tk st- n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}-- (happyReduceArr Happy_Data_Array.! rule) i tk st- where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))- n -> {- nothing -}--- happyShift new_state i tk st- where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))- where off = indexShortOffAddr happyActOffsets st- off_i = (off Happy_GHC_Exts.+# i)- check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))- then EQ(indexShortOffAddr happyCheck off_i, i)- else False- action- | check = indexShortOffAddr happyTable off_i- | otherwise = indexShortOffAddr happyDefActions st---indexShortOffAddr (HappyA# arr) off =- Happy_GHC_Exts.narrow16Int# i- where- i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)- high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))- low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))- off' = off Happy_GHC_Exts.*# 2#------data HappyAddr = HappyA# Happy_GHC_Exts.Addr#------------------------------------------------------------------------------------- HappyState data type (not arrays)--{-# LINE 170 "templates/GenericTemplate.hs" #-}---------------------------------------------------------------------------------- Shifting a token--happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =- let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in--- trace "shifting the error token" $- happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)--happyShift new_state i tk st sts stk =- happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)---- happyReduce is specialised for the common cases.--happySpecReduce_0 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_0 nt fn j tk st@((action)) sts stk- = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)--happySpecReduce_1 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')- = let r = fn v1 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_2 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')- = let r = fn v1 v2 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happySpecReduce_3 i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')- = let r = fn v1 v2 v3 in- happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))--happyReduce k i fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyReduce k nt fn j tk st sts stk- = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of- sts1@((HappyCons (st1@(action)) (_))) ->- let r = fn stk in -- it doesn't hurt to always seq here...- happyDoSeq r (happyGoto nt j tk st1 sts1 r)--happyMonadReduce k nt fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyMonadReduce k nt fn j tk st sts stk =- case happyDrop k (HappyCons (st) (sts)) of- sts1@((HappyCons (st1@(action)) (_))) ->- let drop_stk = happyDropStk k stk in- happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))--happyMonad2Reduce k nt fn 0# tk st sts stk- = happyFail 0# tk st sts stk-happyMonad2Reduce k nt fn j tk st sts stk =- case happyDrop k (HappyCons (st) (sts)) of- sts1@((HappyCons (st1@(action)) (_))) ->- let drop_stk = happyDropStk k stk-- off = indexShortOffAddr happyGotoOffsets st1- off_i = (off Happy_GHC_Exts.+# nt)- new_state = indexShortOffAddr happyTable off_i---- in- happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))--happyDrop 0# l = l-happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t--happyDropStk 0# l = l-happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs---------------------------------------------------------------------------------- Moving to a new state after a reduction---happyGoto nt j tk st = - {- nothing -}- happyDoAction j tk new_state- where off = indexShortOffAddr happyGotoOffsets st- off_i = (off Happy_GHC_Exts.+# nt)- new_state = indexShortOffAddr happyTable off_i------------------------------------------------------------------------------------- Error recovery (0# is the error token)---- parse error if we are in recovery and we fail again-happyFail 0# tk old_st _ stk@(x `HappyStk` _) =- let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in--- trace "failing" $ - happyError_ i tk--{- We don't need state discarding for our restricted implementation of- "error". In fact, it can cause some bogus parses, so I've disabled it- for now --SDM---- discard a state-happyFail 0# tk old_st (HappyCons ((action)) (sts)) - (saved_tok `HappyStk` _ `HappyStk` stk) =--- trace ("discarding state, depth " ++ show (length stk)) $- happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))--}---- Enter error recovery: generate an error token,--- save the old token and carry on.-happyFail i tk (action) sts stk =--- trace "entering error recovery" $- happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)---- Internal happy errors:--notHappyAtAll :: a-notHappyAtAll = error "Internal Happy error\n"---------------------------------------------------------------------------------- Hack to get the typechecker to accept our action functions---happyTcHack :: Happy_GHC_Exts.Int# -> a -> a-happyTcHack x y = y-{-# INLINE happyTcHack #-}----------------------------------------------------------------------------------- Seq-ing. If the --strict flag is given, then Happy emits --- happySeq = happyDoSeq--- otherwise it emits--- happySeq = happyDontSeq--happyDoSeq, happyDontSeq :: a -> b -> b-happyDoSeq a b = a `seq` b-happyDontSeq a b = b---------------------------------------------------------------------------------- Don't inline any functions from the template. GHC has a nasty habit--- of deciding to inline happyGoto everywhere, which increases the size of--- the generated parser quite a bit.---{-# NOINLINE happyDoAction #-}-{-# NOINLINE happyTable #-}-{-# NOINLINE happyCheck #-}-{-# NOINLINE happyActOffsets #-}-{-# NOINLINE happyGotoOffsets #-}-{-# NOINLINE happyDefActions #-}--{-# NOINLINE happyShift #-}-{-# NOINLINE happySpecReduce_0 #-}-{-# NOINLINE happySpecReduce_1 #-}-{-# NOINLINE happySpecReduce_2 #-}-{-# NOINLINE happySpecReduce_3 #-}-{-# NOINLINE happyReduce #-}-{-# NOINLINE happyMonadReduce #-}-{-# NOINLINE happyGoto #-}-{-# NOINLINE happyFail #-}---- end of Happy Template.
language-c.cabal view
@@ -1,121 +1,121 @@-Name: language-c-Version: 0.7.1-Cabal-Version: >= 1.8-Build-Type: Simple-License: BSD3-License-File: LICENSE-Copyright: LICENSE-Author: AUTHORS-Maintainer: benedikt.huber@gmail.com-Stability: experimental-Homepage: http://visq.github.io/language-c/-Bug-reports: https://github.com/visq/language-c/issues/--Synopsis: Analysis and generation of C code-Description: Language C is a haskell library for the analysis and generation of C code.- It features a complete, well tested parser and pretty printer for all of C99 and a large- set of C11 and clang/GNU extensions.-Category: Language-Tested-With: GHC == 7.8.*, GHC == 7.10.*, GHC == 8.0.*, GHC == 8.2.1--Extra-Source-Files: AUTHORS AUTHORS.c2hs ChangeLog README- src/Language/C/Parser/Lexer.x- src/Language/C/Parser/Parser.y--Source-Repository head- type: git- location: https://github.com/visq/language-c.git--Flag splitBase- Description: Choose the new smaller, split-up base package.-Flag useByteStrings- Description: Use ByteString as InputStream datatype- Default: True-Flag separateSYB- description: Data.Generics available in separate package.-Flag allWarnings- Description: Turn on all warnings for building (development)- Default: False-Library- Extensions: CPP, DeriveDataTypeable, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables- Build-Depends: filepath- if flag(allWarnings)- if impl(ghc >= 8.0)- ghc-options: -Wall -Wno-redundant-constraints- else- ghc-options: -Wall- if flag(splitBase)- Build-Depends: base >= 3 && < 5, process, directory, array, containers, pretty-- If flag(separateSYB)- Build-Depends:- base >=4 && <5,- syb- Else- Build-Depends:- base <4- else- Build-Depends: base < 3-- if flag(useByteStrings)- Build-Depends: bytestring >= 0.9.0- else- cpp-options: -DNO_BYTESTRING- Build-Tools: happy, alex-- Hs-Source-Dirs: src- Exposed-Modules:- -- top-level- Language.C- -- data- Language.C.Data- Language.C.Data.Position- Language.C.Data.Ident- Language.C.Data.Error- Language.C.Data.Name- Language.C.Data.Node- Language.C.Data.InputStream- -- syntax- Language.C.Syntax- Language.C.Syntax.AST- Language.C.Syntax.Constants- Language.C.Syntax.Ops- Language.C.Syntax.Utils- -- parser- Language.C.Parser- -- pretty printer- Language.C.Pretty- -- system- Language.C.System.Preprocess- Language.C.System.GCC- -- analysis [experimental]- Language.C.Analysis- Language.C.Analysis.ConstEval- Language.C.Analysis.Builtins- Language.C.Analysis.SemError- Language.C.Analysis.SemRep- Language.C.Analysis.DefTable- Language.C.Analysis.TravMonad- Language.C.Analysis.AstAnalysis- Language.C.Analysis.DeclAnalysis- Language.C.Analysis.Debug- Language.C.Analysis.TypeCheck- Language.C.Analysis.TypeConversions- Language.C.Analysis.TypeUtils- Language.C.Analysis.NameSpaceMap- -- semrep -> code [alpha]- Language.C.Analysis.Export- Other-Modules:- Language.C.Data.RList- -- parser implementation- Language.C.Parser.Builtin- Language.C.Parser.Lexer- Language.C.Parser.ParserMonad- Language.C.Parser.Tokens- Language.C.Parser.Parser---- test description-Test-Suite language-c-harness- type: exitcode-stdio-1.0- main-is: test/harness/run-harness.hs+Name: language-c +Version: 0.7.2 +Cabal-Version: >= 1.8 +Build-Type: Simple +License: BSD3 +License-File: LICENSE +Copyright: LICENSE +Author: AUTHORS +Maintainer: benedikt.huber@gmail.com +Stability: experimental +Homepage: http://visq.github.io/language-c/ +Bug-reports: https://github.com/visq/language-c/issues/ + +Synopsis: Analysis and generation of C code +Description: Language C is a haskell library for the analysis and generation of C code. + It features a complete, well tested parser and pretty printer for all of C99 and a large + set of C11 and clang/GNU extensions. +Category: Language +Tested-With: GHC == 7.8.*, GHC == 7.10.*, GHC == 8.0.*, GHC == 8.2.1 + +Extra-Source-Files: AUTHORS AUTHORS.c2hs ChangeLog README + src/Language/C/Parser/Lexer.x + src/Language/C/Parser/Parser.y + +Source-Repository head + type: git + location: https://github.com/visq/language-c.git + +Flag splitBase + Description: Choose the new smaller, split-up base package. +Flag useByteStrings + Description: Use ByteString as InputStream datatype + Default: True +Flag separateSYB + description: Data.Generics available in separate package. +Flag allWarnings + Description: Turn on all warnings for building (development) + Default: False +Library + Extensions: CPP, DeriveDataTypeable, PatternGuards, BangPatterns, ExistentialQuantification, GeneralizedNewtypeDeriving, ScopedTypeVariables + Build-Depends: filepath + if flag(allWarnings) + if impl(ghc >= 8.0) + ghc-options: -Wall -Wno-redundant-constraints + else + ghc-options: -Wall + if flag(splitBase) + Build-Depends: base >= 3 && < 5, process, directory, array, containers, pretty < 1.2.0 + + If flag(separateSYB) + Build-Depends: + base >=4 && <5, + syb + Else + Build-Depends: + base <4 + else + Build-Depends: base < 3 + + if flag(useByteStrings) + Build-Depends: bytestring >= 0.9.0 + else + cpp-options: -DNO_BYTESTRING + Build-Tools: happy, alex + + Hs-Source-Dirs: src + Exposed-Modules: + -- top-level + Language.C + -- data + Language.C.Data + Language.C.Data.Position + Language.C.Data.Ident + Language.C.Data.Error + Language.C.Data.Name + Language.C.Data.Node + Language.C.Data.InputStream + -- syntax + Language.C.Syntax + Language.C.Syntax.AST + Language.C.Syntax.Constants + Language.C.Syntax.Ops + Language.C.Syntax.Utils + -- parser + Language.C.Parser + -- pretty printer + Language.C.Pretty + -- system + Language.C.System.Preprocess + Language.C.System.GCC + -- analysis [experimental] + Language.C.Analysis + Language.C.Analysis.ConstEval + Language.C.Analysis.Builtins + Language.C.Analysis.SemError + Language.C.Analysis.SemRep + Language.C.Analysis.DefTable + Language.C.Analysis.TravMonad + Language.C.Analysis.AstAnalysis + Language.C.Analysis.DeclAnalysis + Language.C.Analysis.Debug + Language.C.Analysis.TypeCheck + Language.C.Analysis.TypeConversions + Language.C.Analysis.TypeUtils + Language.C.Analysis.NameSpaceMap + -- semrep -> code [alpha] + Language.C.Analysis.Export + Other-Modules: + Language.C.Data.RList + -- parser implementation + Language.C.Parser.Builtin + Language.C.Parser.Lexer + Language.C.Parser.ParserMonad + Language.C.Parser.Tokens + Language.C.Parser.Parser + +-- test description +Test-Suite language-c-harness + type: exitcode-stdio-1.0 + main-is: test/harness/run-harness.hs build-depends: base, language-c, directory, process, filepath
src/Language/C.hs view
@@ -1,53 +1,53 @@--------------------------------------------------------------------------------- |--- Module : Language.C--- Copyright : (c) 2008 Benedikt Huber--- [1995..2007]--- Manuel M. T. Chakravarty--- Duncan Coutts--- Betram Felgenhauer--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Library for analysing and generating C code.------ See <http://www.sivity.net/projects/language.c>-------------------------------------------------------------------------------module Language.C (- parseCFile, parseCFilePre, -- maybe change ?- module Language.C.Data,- module Language.C.Syntax,- module Language.C.Pretty,- module Language.C.Parser,-)-where-import Language.C.Data-import Language.C.Syntax-import Language.C.Pretty-import Language.C.Parser-import Language.C.System.Preprocess---- | preprocess (if necessary) and parse a C source file------ > Synopsis: parseCFile preprocesssor tmp-dir? cpp-opts file--- > Example: parseCFile (newGCC "gcc") Nothing ["-I/usr/include/gtk-2.0"] my-gtk-exts.c-parseCFile :: (Preprocessor cpp) => cpp -> Maybe FilePath -> [String] -> FilePath -> IO (Either ParseError CTranslUnit)-parseCFile cpp tmp_dir_opt args input_file = do- input_stream <- if not (isPreprocessed input_file)- then let cpp_args = (rawCppArgs args input_file) { cppTmpDir = tmp_dir_opt }- in runPreprocessor cpp cpp_args >>= handleCppError- else readInputStream input_file- return$ parseC input_stream (initPos input_file)- where- handleCppError (Left exitCode) = fail $ "Preprocessor failed with " ++ show exitCode- handleCppError (Right ok) = return ok---- | parse an already preprocessed C file------ > Synopsis: parseCFilePre file.i-parseCFilePre :: FilePath -> IO (Either ParseError CTranslUnit)-parseCFilePre file = do- input_stream <- readInputStream file- return $ parseC input_stream (initPos file)+----------------------------------------------------------------------------- +-- | +-- Module : Language.C +-- Copyright : (c) 2008 Benedikt Huber +-- [1995..2007] +-- Manuel M. T. Chakravarty +-- Duncan Coutts +-- Betram Felgenhauer +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Library for analysing and generating C code. +-- +-- See <http://www.sivity.net/projects/language.c> +----------------------------------------------------------------------------- +module Language.C ( + parseCFile, parseCFilePre, -- maybe change ? + module Language.C.Data, + module Language.C.Syntax, + module Language.C.Pretty, + module Language.C.Parser, +) +where +import Language.C.Data +import Language.C.Syntax +import Language.C.Pretty +import Language.C.Parser +import Language.C.System.Preprocess + +-- | preprocess (if necessary) and parse a C source file +-- +-- > Synopsis: parseCFile preprocesssor tmp-dir? cpp-opts file +-- > Example: parseCFile (newGCC "gcc") Nothing ["-I/usr/include/gtk-2.0"] my-gtk-exts.c +parseCFile :: (Preprocessor cpp) => cpp -> Maybe FilePath -> [String] -> FilePath -> IO (Either ParseError CTranslUnit) +parseCFile cpp tmp_dir_opt args input_file = do + input_stream <- if not (isPreprocessed input_file) + then let cpp_args = (rawCppArgs args input_file) { cppTmpDir = tmp_dir_opt } + in runPreprocessor cpp cpp_args >>= handleCppError + else readInputStream input_file + return$ parseC input_stream (initPos input_file) + where + handleCppError (Left exitCode) = fail $ "Preprocessor failed with " ++ show exitCode + handleCppError (Right ok) = return ok + +-- | parse an already preprocessed C file +-- +-- > Synopsis: parseCFilePre file.i +parseCFilePre :: FilePath -> IO (Either ParseError CTranslUnit) +parseCFilePre file = do + input_stream <- readInputStream file + return $ parseC input_stream (initPos file)
src/Language/C/Analysis.hs view
@@ -1,69 +1,69 @@--------------------------------------------------------------------------------- |--- Module : Language.C.Analysis--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : alpha--- Portability : ghc------ Analysis of the AST.------ Currently, we provide a monad for analysis and analyze declarations and types.--- Especially note that there is no direct support for analyzing function bodies and--- constant expressions.------ /NOTE/ This is an experimental interface, and therefore the API will change in the--- future.------ DONE:------ * Name analysis framework------ * File-scope analysis------ * Declaration analysis------ TODO:------ * Type checking expressions------ * Constant expression evaluation (CEE)------ * Typed representation of attributes (depends on CEE)------ * Normalized representation of initializers------ * Support for analyzing function bodies (depends on CEE)------ * Normalizing expressions and statements------ * Formal rules how to link back to the AST using NodeInfo fields------ * Typed assembler representation--------------------------------------------------------------------------------module Language.C.Analysis (- -- * Semantic representation- module Language.C.Analysis.SemRep,- -- * Error datatypes for the analysis- module Language.C.Analysis.SemError,- -- * Traversal monad- module Language.C.Analysis.TravMonad,- -- * Top level analysis- module Language.C.Analysis.AstAnalysis,- -- * Analyzing declarations- module Language.C.Analysis.DeclAnalysis,- -- * Debug print- module Language.C.Analysis.Debug,-)-where-import Language.C.Analysis.SemError-import Language.C.Analysis.SemRep--import Language.C.Analysis.TravMonad--import Language.C.Analysis.AstAnalysis-import Language.C.Analysis.DeclAnalysis--import Language.C.Analysis.Debug+----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Analysis +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : alpha +-- Portability : ghc +-- +-- Analysis of the AST. +-- +-- Currently, we provide a monad for analysis and analyze declarations and types. +-- Especially note that there is no direct support for analyzing function bodies and +-- constant expressions. +-- +-- /NOTE/ This is an experimental interface, and therefore the API will change in the +-- future. +-- +-- DONE: +-- +-- * Name analysis framework +-- +-- * File-scope analysis +-- +-- * Declaration analysis +-- +-- TODO: +-- +-- * Type checking expressions +-- +-- * Constant expression evaluation (CEE) +-- +-- * Typed representation of attributes (depends on CEE) +-- +-- * Normalized representation of initializers +-- +-- * Support for analyzing function bodies (depends on CEE) +-- +-- * Normalizing expressions and statements +-- +-- * Formal rules how to link back to the AST using NodeInfo fields +-- +-- * Typed assembler representation + +----------------------------------------------------------------------------- +module Language.C.Analysis ( + -- * Semantic representation + module Language.C.Analysis.SemRep, + -- * Error datatypes for the analysis + module Language.C.Analysis.SemError, + -- * Traversal monad + module Language.C.Analysis.TravMonad, + -- * Top level analysis + module Language.C.Analysis.AstAnalysis, + -- * Analyzing declarations + module Language.C.Analysis.DeclAnalysis, + -- * Debug print + module Language.C.Analysis.Debug, +) +where +import Language.C.Analysis.SemError +import Language.C.Analysis.SemRep + +import Language.C.Analysis.TravMonad + +import Language.C.Analysis.AstAnalysis +import Language.C.Analysis.DeclAnalysis + +import Language.C.Analysis.Debug
src/Language/C/Analysis/AstAnalysis.hs view
@@ -1,777 +1,777 @@-{-# LANGUAGE ScopedTypeVariables, PatternGuards #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Parser.Translation--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : alpha--- Portability : ghc------ Analyse the parse tree------ Traverses the AST, analyses declarations and invokes handlers.-------------------------------------------------------------------------------module Language.C.Analysis.AstAnalysis (- -- * Top-level analysis- analyseAST,- analyseExt,analyseFunDef,analyseDecl,- -- * Building blocks for additional analyses- analyseFunctionBody,- defineParams,- -- * Type checking- tExpr, ExprSide(..),- tStmt, StmtCtx(..),- tDesignator,- defaultMD-)-where-import Language.C.Analysis.SemError-import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad-import Language.C.Analysis.ConstEval-import Language.C.Analysis.DefTable (globalDefs, defineLabel, inFileScope,- lookupLabel, insertType, lookupType)-import Language.C.Analysis.DeclAnalysis-import Language.C.Analysis.TypeUtils-import Language.C.Analysis.TypeCheck--import Language.C.Data-import Language.C.Pretty-import Language.C.Syntax.AST-import Language.C.Syntax.Constants-import Language.C.Syntax.Ops-import Language.C.Syntax.Utils-import Text.PrettyPrint.HughesPJ---import Prelude hiding (mapM, mapM_, reverse)-import Control.Monad hiding (mapM, mapM_)-import qualified Data.Map as Map-import Data.Maybe-import Data.Traversable (mapM)-import Data.Foldable (mapM_)---- * analysis---- | Analyse the given AST------ @analyseAST ast@ results in global declaration dictionaries.--- If you want to perform specific actions on declarations or definitions, you may provide--- callbacks in the @MonadTrav@ @m@.------ Returns the set of global declarations and definitions which where successfully translated.--- It is the users responsibility to check whether any hard errors occurred (@runTrav@ does this for you).-analyseAST :: (MonadTrav m) => CTranslUnit -> m GlobalDecls-analyseAST (CTranslUnit decls _file_node) = do- -- analyse all declarations, but recover from errors- mapRecoverM_ analyseExt decls- -- check we are in global scope afterwards- getDefTable >>= \dt -> unless (inFileScope dt) $- error "Internal Error: Not in filescope after analysis"- -- get the global definition table (XXX: remove ?)- liftM globalDefs getDefTable- where- mapRecoverM_ f = mapM_ (handleTravError . f)---- | Analyse an top-level declaration-analyseExt :: (MonadTrav m) => CExtDecl -> m ()-analyseExt (CAsmExt asm _)- = handleAsmBlock asm-analyseExt (CFDefExt fundef)- = analyseFunDef fundef-analyseExt (CDeclExt decl)- = analyseDecl False decl---- | Analyse a function definition-analyseFunDef :: (MonadTrav m) => CFunDef -> m ()-analyseFunDef (CFunDef declspecs declr oldstyle_decls stmt node_info) = do- -- analyse the declarator- var_decl_info <- analyseVarDecl' True declspecs declr oldstyle_decls Nothing- let (VarDeclInfo name fun_spec storage_spec attrs ty _declr_node) = var_decl_info- when (isNoName name) $ astError node_info "NoName in analyseFunDef"- let ident = identOfVarName name- -- improve incomplete type- ty' <- improveFunDefType ty- -- compute storage- fun_storage <- computeFunDefStorage ident storage_spec- let var_decl = VarDecl name (DeclAttrs fun_spec fun_storage attrs) ty'- -- callback for declaration- handleVarDecl False (Decl var_decl node_info)- -- process body- stmt' <- analyseFunctionBody node_info var_decl stmt- -- callback for definition- handleFunDef ident (FunDef var_decl stmt' node_info)- where- improveFunDefType (FunctionType (FunTypeIncomplete return_ty) attrs) =- return $ FunctionType (FunType return_ty [] False) attrs- improveFunDefType ty = return ty--voidM :: Monad m => m a -> m ()-voidM m = m >> return ()---- | Analyse a declaration other than a function definition------ Note: static assertions are not analysed-analyseDecl :: (MonadTrav m) => Bool -> CDecl -> m ()-analyseDecl _is_local (CStaticAssert _expr _strlit _annot) = return () -- TODO-analyseDecl is_local decl@(CDecl declspecs declrs node)- | null declrs =- case typedef_spec of Just _ -> astError node "bad typedef declaration: missing declarator"- Nothing -> voidM$ analyseTypeDecl decl- | (Just declspecs') <- typedef_spec = mapM_ (uncurry (analyseTyDef declspecs')) declr_list- | otherwise = do let (storage_specs, attrs, typequals, typespecs, funspecs, _alignspecs) =- partitionDeclSpecs declspecs- canonTySpecs <- canonicalTypeSpec typespecs- -- TODO: alignspecs not yet processed- let specs =- (storage_specs, attrs, typequals, canonTySpecs, funspecs)- mapM_ (uncurry (analyseVarDeclr specs)) declr_list- where- declr_list = zip (True : repeat False) declrs- typedef_spec = hasTypeDef declspecs-- analyseTyDef declspecs' handle_sue_def declr =- case declr of- (Just tydeclr, Nothing , Nothing) -> analyseTypeDef handle_sue_def declspecs' tydeclr node- _ -> astError node "bad typdef declaration: bitfieldsize or initializer present"-- analyseVarDeclr specs handle_sue_def (Just declr, init_opt, Nothing) = do- -- analyse the declarator- let (storage_specs, attrs, typequals, canonTySpecs, inline) = specs- vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <-- analyseVarDecl handle_sue_def storage_specs attrs typequals canonTySpecs inline- declr [] Nothing- -- declare / define the object- if isFunctionType typ- then extFunProto vardeclInfo- else (if is_local then localVarDecl else extVarDecl)- -- XXX: if Initializer becomes different from CInit, this- -- will have to change.- vardeclInfo init_opt- _init_opt' <- mapMaybeM init_opt (tInit typ)- return ()- analyseVarDeclr _ _ (Nothing,_,_) = astError node "abstract declarator in object declaration"- analyseVarDeclr _ _ (_,_,Just _bitfieldSz) = astError node "bitfield size in object declaration"---- | Analyse a typedef-analyseTypeDef :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> NodeInfo -> m ()-analyseTypeDef handle_sue_def declspecs declr node_info = do- -- analyse the declarator- (VarDeclInfo name fun_attrs storage_spec attrs ty _node) <- analyseVarDecl' handle_sue_def declspecs declr [] Nothing- checkValidTypeDef fun_attrs storage_spec attrs- when (isNoName name) $ astError node_info "NoName in analyseTypeDef"- let ident = identOfVarName name- handleTypeDef (TypeDef ident ty attrs node_info)- where- checkValidTypeDef fun_attrs _ _ | fun_attrs /= noFunctionAttrs =- astError node_info "inline specifier for typeDef"- checkValidTypeDef _ NoStorageSpec _ = return ()- checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage---- | compute storage of a function definition------ a function definition has static storage with internal linkage if specified `static`,--- the previously declared linkage if any if 'extern' or no specifier are present. (See C99 6.2.2, clause 5)------ This function won't raise an Trav error if the declaration is incompatible with the existing one,--- this case is handled in 'handleFunDef'.-computeFunDefStorage :: (MonadTrav m) => Ident -> StorageSpec -> m Storage-computeFunDefStorage _ (StaticSpec _) = return$ FunLinkage InternalLinkage-computeFunDefStorage ident other_spec = do- obj_opt <- lookupObject ident- let defaultSpec = FunLinkage ExternalLinkage- case other_spec of- NoStorageSpec -> return$ maybe defaultSpec declStorage obj_opt- (ExternSpec False) -> return$ maybe defaultSpec declStorage obj_opt- bad_spec -> throwTravError $ badSpecifierError (nodeInfo ident)- $ "unexpected function storage specifier (only static or extern is allowed)" ++ show bad_spec---- (private) Get parameters of a function type-getParams :: Type -> Maybe [ParamDecl]-getParams (FunctionType (FunType _ params _) _) = Just params-getParams _ = Nothing---- | handle a function prototype-extFunProto :: (MonadTrav m) => VarDeclInfo -> m ()-extFunProto (VarDeclInfo var_name fun_spec storage_spec attrs ty node_info) =- do when (isNoName var_name) $ astError node_info "NoName in extFunProto"- old_fun <- lookupObject (identOfVarName var_name)- checkValidSpecs- let decl = VarDecl var_name (DeclAttrs fun_spec (funDeclLinkage old_fun) attrs) ty- handleVarDecl False (Decl decl node_info)- -- XXX: structs should be handled in 'function prototype scope' too- enterPrototypeScope- maybe (return ()) (mapM_ handleParamDecl) (getParams ty)- leavePrototypeScope- where- funDeclLinkage old_fun =- case storage_spec of- NoStorageSpec -> FunLinkage ExternalLinkage -- prototype declaration / external linkage- StaticSpec False -> FunLinkage InternalLinkage -- prototype declaration / internal linkage- ExternSpec False -> case old_fun of- Nothing -> FunLinkage ExternalLinkage- Just f -> declStorage f- _ -> error $ "funDeclLinkage: " ++ show storage_spec- checkValidSpecs- | hasThreadLocalSpec storage_spec = astError node_info "thread local storage specified for function"- | RegSpec <- storage_spec = astError node_info "invalid `register' storage specified for function"- | otherwise = return ()---- | handle a object declaration \/ definition------ We have to check the storage specifiers here, as they determine wheter we're dealing with decalartions--- or definitions--- see [http://www.sivity.net/projects/language.c/wiki/ExternalDefinitions]-extVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()-extVarDecl (VarDeclInfo var_name fun_spec storage_spec attrs typ node_info) init_opt =- do when (isNoName var_name) $ astError node_info "NoName in extVarDecl"- (storage,is_def) <- globalStorage storage_spec- let vardecl = VarDecl var_name (DeclAttrs fun_spec storage attrs) typ- if is_def- then handleObjectDef False ident $ ObjDef vardecl init_opt node_info- else handleVarDecl False $ Decl vardecl node_info- where- ident = identOfVarName var_name- globalStorage _ | fun_spec /= noFunctionAttrs =- astError node_info "invalid function specifier for external variable"- globalStorage AutoSpec = astError node_info "file-scope declaration specifies storage `auto'"- globalStorage RegSpec =- do when (isJust init_opt) $ astError node_info "initializer given for global register variable"- case var_name of- NoName -> astError node_info "global register variable has no name"- VarName _ Nothing -> astError node_info "no register specified for global register variable"- _ -> return ()- dt <- getDefTable- when (hasFunDef dt) $ astError node_info "global register variable appears after a function definition"- return (Static InternalLinkage False, False)- -- tentative if there is no initializer, external- globalStorage NoStorageSpec = return (Static ExternalLinkage False, True)- globalStorage ThreadSpec = return (Static ExternalLinkage True, True)- -- tentative if there is no initializer, internal- globalStorage (StaticSpec thread_local) = return (Static InternalLinkage thread_local, True)- globalStorage (ExternSpec thread_local) =- case init_opt of- -- declaration with either external or old storage- Nothing -> do old_decl <- lookupObject ident- return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)- -- warning, external definition- Just _ -> do warn $ badSpecifierError node_info "Both initializer and `extern` specifier given - treating as definition"- return (Static ExternalLinkage thread_local, True)- hasFunDef dt = any (isFuncDef . snd) (Map.toList $ gObjs $ globalDefs dt)- isFuncDef (FunctionDef fd) = not $ (isInline . functionAttrs) fd- isFuncDef _ = False---- | handle a function-scope object declaration \/ definition--- see [http://www.sivity.net/projects/language.c/wiki/LocalDefinitions]-localVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m ()-localVarDecl (VarDeclInfo var_name fun_attrs storage_spec attrs typ node_info) init_opt =- do when (isNoName var_name) $ astError node_info "NoName in localVarDecl"- (storage,is_def) <- localStorage storage_spec- let vardecl = VarDecl var_name (DeclAttrs fun_attrs storage attrs) typ- if is_def- then handleObjectDef True ident (ObjDef vardecl init_opt node_info)- else handleVarDecl True (Decl vardecl node_info)- where- ident = identOfVarName var_name- localStorage NoStorageSpec = return (Auto False,True)- localStorage ThreadSpec = return (Auto True,True)- localStorage RegSpec = return (Auto True,True)- -- static no linkage- localStorage (StaticSpec thread_local) =- return (Static NoLinkage thread_local,True)- localStorage (ExternSpec thread_local)- | isJust init_opt = astError node_info "extern keyword and initializer for local"- | otherwise =- do old_decl <- lookupObject ident- return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False)- localStorage _ = astError node_info "bad storage specifier for local"--defineParams :: MonadTrav m => NodeInfo -> VarDecl -> m ()-defineParams ni decl =- case getParams (declType decl) of- Nothing -> astError ni- "expecting complete function type in function definition"- Just params -> mapM_ handleParamDecl params--analyseFunctionBody :: (MonadTrav m) => NodeInfo -> VarDecl -> CStat -> m Stmt-analyseFunctionBody node_info decl s@(CCompound localLabels items _) =- do enterFunctionScope- mapM_ (withDefTable . defineLabel) (localLabels ++ getLabels s)- defineParams node_info decl- -- record parameters- mapM_ (tBlockItem [FunCtx decl]) items- leaveFunctionScope- return s -- XXX: bogus--analyseFunctionBody _ _ s = astError (nodeInfo s) "Function body is no compound statement"--data StmtCtx = FunCtx VarDecl- | LoopCtx- | SwitchCtx---- | Given a context, determine the type declaration for the enclosing--- function, if possible, given a context.-enclosingFunctionType :: [StmtCtx] -> Maybe Type-enclosingFunctionType [] = Nothing-enclosingFunctionType (FunCtx vd : _) = Just $ declType vd-enclosingFunctionType (_ : cs) = enclosingFunctionType cs--inLoop :: [StmtCtx] -> Bool-inLoop c = any isLoop c- where isLoop LoopCtx = True- isLoop _ = False--inSwitch :: [StmtCtx] -> Bool-inSwitch c = any isSwitch c- where isSwitch SwitchCtx = True- isSwitch _ = False--data ExprSide = LValue | RValue- deriving (Eq, Show)---- | Typecheck a statement, given a statement context. The type of a--- statement is usually @void@, but expression statements and blocks--- can sometimes have other types.-tStmt :: MonadTrav m => [StmtCtx] -> CStat -> m Type-tStmt c (CLabel _ s _ _) = tStmt c s-tStmt c (CExpr e _) =- maybe (return voidType) (tExpr c RValue) e-tStmt c (CCompound ls body _) =- do enterBlockScope- mapM_ (withDefTable . defineLabel) ls- t <- foldM (const $ tBlockItem c) voidType body- leaveBlockScope- return t-tStmt c (CIf e sthen selse _) =- checkGuard c e >> tStmt c sthen- >> maybe (return ()) (voidM . tStmt c) selse- >> return voidType-tStmt c (CSwitch e s ni) =- tExpr c RValue e >>= checkIntegral' ni >>- tStmt (SwitchCtx : c) s-tStmt c (CWhile e s _ _) =- checkGuard c e >> tStmt (LoopCtx : c) s-tStmt _ (CGoto l ni) =- do dt <- getDefTable- case lookupLabel l dt of- Just _ -> return voidType- Nothing -> typeError ni $ "undefined label in goto: " ++ identToString l-tStmt c (CCont ni) =- do unless (inLoop c) $ astError ni "continue statement outside of loop"- return voidType-tStmt c (CBreak ni) =- do unless (inLoop c || inSwitch c) $- astError ni "break statement outside of loop or switch statement"- return voidType-tStmt c (CReturn (Just e) ni) =- do t <- tExpr c RValue e- rt <- case enclosingFunctionType c of- Just (FunctionType (FunType rt _ _) _) -> return rt- Just (FunctionType (FunTypeIncomplete rt) _) -> return rt- Just ft -> astError ni $ "bad function type: " ++ pType ft- Nothing -> astError ni "return statement outside function"- case (rt, t) of- -- apparently it's ok to return void from a void function?- (DirectType TyVoid _ _, DirectType TyVoid _ _) -> return ()- _ -> assignCompatible' ni CAssignOp rt t- return voidType-tStmt _ (CReturn Nothing _) = return voidType--- XXX: anything to do for assembly?-tStmt _ (CAsm _ _) = return voidType-tStmt c (CCase e s ni) =- do unless (inSwitch c) $- astError ni "case statement outside of switch statement"- tExpr c RValue e >>= checkIntegral' ni- tStmt c s-tStmt c (CCases e1 e2 s ni) =- do unless (inSwitch c) $- astError ni "case statement outside of switch statement"- tExpr c RValue e1 >>= checkIntegral' ni- tExpr c RValue e2 >>= checkIntegral' ni- tStmt c s-tStmt c (CDefault s ni) =- do unless (inSwitch c) $- astError ni "default statement outside of switch statement"- tStmt c s-tStmt c (CFor i g inc s _) =- do enterBlockScope- either (maybe (return ()) checkExpr) (analyseDecl True) i- maybe (return ()) (checkGuard c) g- maybe (return ()) checkExpr inc- _ <- tStmt (LoopCtx : c) s- leaveBlockScope- return voidType- where checkExpr e = voidM$ tExpr c RValue e-tStmt c (CGotoPtr e ni) =- do t <- tExpr c RValue e- case t of- (PtrType _ _ _) -> return voidType- _ -> typeError ni "can't goto non-pointer"---- | Typecheck a block item. When statement expressions are blocks,--- they have the type of their last expression statement, so this--- needs to return a type.-tBlockItem :: MonadTrav m => [StmtCtx] -> CBlockItem -> m Type-tBlockItem c (CBlockStmt s) = tStmt c s-tBlockItem _ (CBlockDecl d) = analyseDecl True d >> return voidType--- TODO: fixup analyseFunDef to handle nested functions-tBlockItem _ (CNestedFunDef fd) = analyseFunDef fd >> return voidType--checkGuard :: MonadTrav m => [StmtCtx] -> CExpr -> m ()-checkGuard c e = tExpr c RValue e >>= checkScalar' (nodeInfo e)---- XXX: this is bogus, correct only for IA32. We should eventually--- have a collection of these and allow people to choose one.-defaultMD :: MachineDesc-defaultMD =- MachineDesc- { iSize = \it ->- case it of- TyBool -> 1- TyChar -> 1- TySChar -> 1- TyUChar -> 1- TyShort -> 2- TyUShort -> 2- TyInt -> 4- TyUInt -> 4- TyLong -> 4- TyULong -> 4- TyLLong -> 8- TyULLong -> 8- TyInt128 -> 16- TyUInt128 -> 16- , fSize = \ft ->- case ft of- TyFloat -> 4- TyDouble -> 8- TyLDouble -> 16- , builtinSize = \bt ->- case bt of- TyVaList -> 4- TyAny -> 4- , ptrSize = 4- , voidSize = 1- , iAlign = \it ->- case it of- TyBool -> 1- TyChar -> 1- TySChar -> 1- TyUChar -> 1- TyShort -> 2- TyUShort -> 2- TyInt -> 4- TyUInt -> 4- TyLong -> 4- TyULong -> 4- TyLLong -> 8- TyULLong -> 8- TyInt128 -> 16- TyUInt128 -> 16- , fAlign = \ft ->- case ft of- TyFloat -> 4- TyDouble -> 8- TyLDouble -> 16- , builtinAlign = \bt ->- case bt of- TyVaList -> 4- TyAny -> 4- , ptrAlign = 4- , voidAlign = 1- }--tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type-tExpr c side e =- case nameOfNode (nodeInfo e) of- Just n ->- do dt <- getDefTable- case lookupType dt n of- Just t -> return t- Nothing ->- do t <- tExpr' c side e- withDefTable (\dt' -> (t, insertType dt' n t))- Nothing -> tExpr' c side e---- | Typecheck an expression, with information about whether it--- appears as an lvalue or an rvalue.-tExpr' :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type-tExpr' c side (CBinary op le re ni) =- do when (side == LValue) $ typeError ni "binary operator as lvalue"- lt <- tExpr c RValue le- rt <- tExpr c RValue re- binopType' ni op lt rt-tExpr' c side (CUnary CAdrOp e ni) =- do when (side == LValue) $- typeError ni "address-of operator as lvalue"- case e of- CCompoundLit _ _ _ -> simplePtr `liftM` tExpr c RValue e- CVar i _ -> lookupObject i >>=- typeErrorOnLeft ni . maybe (notFound i) varAddrType- _ -> simplePtr `liftM` tExpr c LValue e-tExpr' c _ (CUnary CIndOp e ni) =- tExpr c RValue e >>= (typeErrorOnLeft ni . derefType)-tExpr' c _ (CUnary CCompOp e ni) =- do t <- tExpr c RValue e- checkIntegral' ni t- return t-tExpr' c side (CUnary CNegOp e ni) =- do when (side == LValue) $- typeError ni "logical negation used as lvalue"- tExpr c RValue e >>= checkScalar' ni- return boolType-tExpr' c side (CUnary op e _) =- tExpr c (if isEffectfulOp op then LValue else side) e-tExpr' c _ (CIndex b i ni) =- do bt <- tExpr c RValue b- it <- tExpr c RValue i- addrTy <- binopType' ni CAddOp bt it- typeErrorOnLeft ni $ derefType addrTy-tExpr' c side (CCond e1 me2 e3 ni) =- do t1 <- tExpr c RValue e1- checkScalar' (nodeInfo e1) t1- t3 <- tExpr c side e3- case me2 of- Just e2 ->- do t2 <- tExpr c side e2- conditionalType' ni t2 t3- Nothing -> conditionalType' ni t1 t3-tExpr' c _ (CMember e m deref ni) =- do t <- tExpr c RValue e- bt <- if deref then typeErrorOnLeft ni (derefType t) else return t- fieldType ni m bt-tExpr' c side (CComma es _) =- mapM (tExpr c side) es >>= return . last-tExpr' c side (CCast d e ni) =- do dt <- analyseTypeDecl d- et <- tExpr c side e- typeErrorOnLeft ni $ castCompatible dt et- return dt-tExpr' c side (CSizeofExpr e ni) =- do when (side == LValue) $ typeError ni "sizeof as lvalue"- _ <- tExpr c RValue e- return size_tType-tExpr' c side (CAlignofExpr e ni) =- do when (side == LValue) $ typeError ni "alignof as lvalue"- _ <- tExpr c RValue e- return size_tType-tExpr' c side (CComplexReal e ni) = complexBaseType ni c side e-tExpr' c side (CComplexImag e ni) = complexBaseType ni c side e-tExpr' _ side (CLabAddrExpr _ ni) =- do when (side == LValue) $ typeError ni "label address as lvalue"- return $ PtrType voidType noTypeQuals []-tExpr' _ side (CCompoundLit d initList ni) =- do when (side == LValue) $ typeError ni "compound literal as lvalue"- lt <- analyseTypeDecl d- tInitList ni (canonicalType lt) initList- return lt-tExpr' _ RValue (CAlignofType _ _) = return size_tType-tExpr' _ RValue (CSizeofType _ _) = return size_tType-tExpr' _ LValue (CAlignofType _ ni) =- typeError ni "alignoftype as lvalue"-tExpr' _ LValue (CSizeofType _ ni) =- typeError ni "sizeoftype as lvalue"-tExpr' ctx side (CGenericSelection expr list ni) = do- ty_sel <- tExpr ctx side expr- ty_list <- mapM analyseAssoc list- def_expr_ty <-- case dropWhile (isJust . fst) ty_list of- [(Nothing,tExpr'')] -> return (Just tExpr'')- [] -> return Nothing- _ -> astError ni "more than one default clause in generic selection"- case dropWhile (maybe True (not . typesMatch ty_sel) . fst) ty_list of- ((_,expr_ty) : _ ) -> return expr_ty- [] -> case def_expr_ty of- (Just expr_ty) -> return expr_ty- Nothing -> astError ni ("no clause matches for generic selection (not fully supported) - selector type is " ++ show (pretty ty_sel) ++- ", available types are " ++ show (map (pretty.fromJust.fst) (filter (isJust.fst) ty_list)))- where- analyseAssoc (mdecl,expr') = do- tDecl <- mapM analyseTypeDecl mdecl- tExpr'' <- tExpr ctx side expr'- return (tDecl, tExpr'')- typesMatch (DirectType tn1 _ _) (DirectType tn2 _ _) = directTypesMatch tn1 tn2- typesMatch _ _ = False -- not fully supported- directTypesMatch TyVoid TyVoid = True- directTypesMatch (TyIntegral t1) (TyIntegral t2) = t1 == t2- directTypesMatch (TyFloating t1) (TyFloating t2) = t1 == t2- directTypesMatch (TyComplex t1) (TyComplex t2) = t1 == t2- directTypesMatch _ _ = False -- TODO: not fully supported-tExpr' _ _ (CVar i ni) =- lookupObject i >>=- maybe (typeErrorOnLeft ni $ notFound i) (return . declType)-tExpr' _ _ (CConst c) = constType c-tExpr' _ _ (CBuiltinExpr b) = builtinType b-tExpr' c side (CCall (CVar i _) args ni)- | identToString i == "__builtin_choose_expr" =- case args of- [g, e1, e2] ->- -- XXX: the MachineDesc parameter below should be configurable- do b <- constEval defaultMD Map.empty g- case boolValue b of- Just True -> tExpr c side e1- Just False -> tExpr c side e2- Nothing ->- astError ni "non-constant argument to __builtin_choose_expr"- _ -> astError ni "wrong number of arguments to __builtin_choose_expr"-tExpr' c _ (CCall fe args ni) =- do let defType = FunctionType- (FunTypeIncomplete- (DirectType (TyIntegral TyInt) noTypeQuals noAttributes))- noAttributes- fallback i = do warn $ invalidAST ni $- "unknown function: " ++ identToString i- return defType- t <- case fe of- CVar i _ -> lookupObject i >>=- maybe (fallback i) (const $ tExpr c RValue fe)- _ -> tExpr c RValue fe- atys <- mapM (tExpr c RValue) args- -- XXX: we don't actually want to return the canonical return type here- case canonicalType t of- PtrType (FunctionType (FunType rt pdecls varargs) _) _ _ ->- do let ptys = map declType pdecls- mapM_ checkArg $ zip3 ptys atys args- unless varargs $ when (length atys /= length ptys) $- typeError ni "incorrect number of arguments"- return $ canonicalType rt- PtrType (FunctionType (FunTypeIncomplete rt) _) _ _ ->- do -- warn $ invalidAST ni "incomplete function type"- return $ canonicalType rt- _ -> typeError ni $ "attempt to call non-function of type " ++ pType t- where checkArg (pty, aty, arg) =- do attrs <- deepTypeAttrs pty- if isTransparentUnion attrs- then- case canonicalType pty of- DirectType (TyComp ctr) _ _ ->- do td <- lookupSUE (nodeInfo arg) (sueRef ctr)- _ms <- tagMembers (nodeInfo arg) td- {-- when (null $ rights $ matches ms) $- astError (nodeInfo arg) $- "argument matches none of the elements " ++- "of transparent union"- -}- return ()- -- where matches =- -- map (\d -> assignCompatible- -- CAssignOp- -- (snd d)- -- aty- -- )- _ -> astError (nodeInfo arg)- "non-composite has __transparent_union__ attribute"- else- assignCompatible' (nodeInfo arg) CAssignOp pty aty- isTransparentUnion =- any (\(Attr n _ _) -> identToString n == "__transparent_union__")-tExpr' c _ (CAssign op le re ni) =- do lt <- tExpr c LValue le- rt <- tExpr c RValue re- when (constant $ typeQuals lt) $- typeError ni $ "assignment to lvalue with `constant' qualifier: "- ++ (render . pretty) le- case (canonicalType lt, re) of- (lt', CConst (CIntConst i _))- | isPointerType lt' && getCInteger i == 0 -> return ()- (_, _) -> assignCompatible' ni op lt rt- return lt-tExpr' c _ (CStatExpr s _) =- do enterBlockScope- mapM_ (withDefTable . defineLabel) (getLabels s)- t <- tStmt c s- leaveBlockScope- return t--tInitList :: MonadTrav m => NodeInfo -> Type -> CInitList -> m ()-tInitList _ (ArrayType (DirectType (TyIntegral TyChar) _ _) _ _ _)- [([], CInitExpr e@(CConst (CStrConst _ _)) _)] =- tExpr [] RValue e >> return ()-tInitList ni t@(ArrayType _ _ _ _) initList =- do let default_ds =- repeat (CArrDesig (CConst (CIntConst (cInteger 0) ni)) ni)- checkInits t default_ds initList-tInitList ni t@(DirectType (TyComp ctr) _ _) initList =- do td <- lookupSUE ni (sueRef ctr)- ms <- tagMembers ni td- let default_ds = map (\m -> CMemberDesig (fst m) ni) ms- checkInits t default_ds initList-tInitList _ (PtrType (DirectType TyVoid _ _) _ _ ) _ =- return () -- XXX: more checking-tInitList _ t [([], i)] = voidM$ tInit t i-tInitList ni t _ = typeError ni $ "initializer list for type: " ++ pType t--checkInits :: MonadTrav m => Type -> [CDesignator] -> CInitList -> m ()-checkInits _ _ [] = return ()-checkInits t dds ((ds, i) : is) =- do (dds', ds') <- case (dds, ds) of- ([], []) ->- typeError (nodeInfo i) "excess elements in initializer"- (dd' : rest, []) -> return (rest, [dd'])- (_, d : _) -> return (advanceDesigList dds d, ds)- t' <- tDesignator t ds'- _ <- tInit t' i- checkInits t dds' is--advanceDesigList :: [CDesignator] -> CDesignator -> [CDesignator]-advanceDesigList ds d = drop 1 $ dropWhile (not . matchDesignator d) ds--matchDesignator :: CDesignator -> CDesignator -> Bool-matchDesignator (CMemberDesig m1 _) (CMemberDesig m2 _) = m1 == m2-matchDesignator _ _ = True -- XXX: for now, array ranges aren't checked--tDesignator :: MonadTrav m => Type -> [CDesignator] -> m Type--- XXX: check that initializers are within array size-tDesignator (ArrayType bt _ _ _) (CArrDesig e ni : ds) =- do tExpr [] RValue e >>= checkIntegral' ni- tDesignator bt ds-tDesignator (ArrayType bt _ _ _) (CRangeDesig e1 e2 ni : ds) =- do tExpr [] RValue e1 >>= checkIntegral' ni- tExpr [] RValue e2 >>= checkIntegral' ni- tDesignator bt ds-tDesignator (ArrayType _ _ _ _) (d : _) =- typeError (nodeInfo d) "member designator in array initializer"-tDesignator t@(DirectType (TyComp _) _ _) (CMemberDesig m ni : ds) =- do mt <- fieldType ni m t- tDesignator (canonicalType mt) ds-tDesignator (DirectType (TyComp _) _ _) (d : _) =- typeError (nodeInfo d) "array designator in compound initializer"-tDesignator t [] = return t-tDesignator _t _ =- error "unepxected type with designator"--tInit :: MonadTrav m => Type -> CInit -> m Initializer-tInit t i@(CInitExpr e ni) =- do it <- tExpr [] RValue e- assignCompatible' ni CAssignOp t it- return i-tInit t i@(CInitList initList ni) =- tInitList ni (canonicalType t) initList >> return i--complexBaseType :: MonadTrav m => NodeInfo -> [StmtCtx] -> ExprSide -> CExpr -> m Type-complexBaseType ni c side e =- do t <- tExpr c side e- case canonicalType t of- DirectType (TyComplex ft) quals attrs ->- return $ DirectType (TyFloating ft) quals attrs- _ -> typeError ni $ "expected complex type, got: " ++ pType t----- | Return the type of a builtin.-builtinType :: MonadTrav m => CBuiltin -> m Type-builtinType (CBuiltinVaArg _ d _) = analyseTypeDecl d-builtinType (CBuiltinOffsetOf _ _ _) = return size_tType-builtinType (CBuiltinTypesCompatible _ _ _) = return boolType-builtinType (CBuiltinConvertVector _expr ty _) = analyseTypeDecl ty---- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@-hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec]-hasTypeDef declspecs =- case foldr hasTypeDefSpec (False,[]) declspecs of- (True,specs') -> Just specs'- (False,_) -> Nothing- where- hasTypeDefSpec (CStorageSpec (CTypedef _)) (_,specs) = (True, specs)- hasTypeDefSpec spec (b,specs) = (b,spec:specs)+{-# LANGUAGE ScopedTypeVariables, PatternGuards #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Parser.Translation +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : alpha +-- Portability : ghc +-- +-- Analyse the parse tree +-- +-- Traverses the AST, analyses declarations and invokes handlers. +----------------------------------------------------------------------------- +module Language.C.Analysis.AstAnalysis ( + -- * Top-level analysis + analyseAST, + analyseExt,analyseFunDef,analyseDecl, + -- * Building blocks for additional analyses + analyseFunctionBody, + defineParams, + -- * Type checking + tExpr, ExprSide(..), + tStmt, StmtCtx(..), + tDesignator, + defaultMD +) +where +import Language.C.Analysis.SemError +import Language.C.Analysis.SemRep +import Language.C.Analysis.TravMonad +import Language.C.Analysis.ConstEval +import Language.C.Analysis.DefTable (globalDefs, defineLabel, inFileScope, + lookupLabel, insertType, lookupType) +import Language.C.Analysis.DeclAnalysis +import Language.C.Analysis.TypeUtils +import Language.C.Analysis.TypeCheck + +import Language.C.Data +import Language.C.Pretty +import Language.C.Syntax.AST +import Language.C.Syntax.Constants +import Language.C.Syntax.Ops +import Language.C.Syntax.Utils +import Text.PrettyPrint.HughesPJ + + +import Prelude hiding (mapM, mapM_, reverse) +import Control.Monad hiding (mapM, mapM_) +import qualified Data.Map as Map +import Data.Maybe +import Data.Traversable (mapM) +import Data.Foldable (mapM_) + +-- * analysis + +-- | Analyse the given AST +-- +-- @analyseAST ast@ results in global declaration dictionaries. +-- If you want to perform specific actions on declarations or definitions, you may provide +-- callbacks in the @MonadTrav@ @m@. +-- +-- Returns the set of global declarations and definitions which where successfully translated. +-- It is the users responsibility to check whether any hard errors occurred (@runTrav@ does this for you). +analyseAST :: (MonadTrav m) => CTranslUnit -> m GlobalDecls +analyseAST (CTranslUnit decls _file_node) = do + -- analyse all declarations, but recover from errors + mapRecoverM_ analyseExt decls + -- check we are in global scope afterwards + getDefTable >>= \dt -> unless (inFileScope dt) $ + error "Internal Error: Not in filescope after analysis" + -- get the global definition table (XXX: remove ?) + liftM globalDefs getDefTable + where + mapRecoverM_ f = mapM_ (handleTravError . f) + +-- | Analyse an top-level declaration +analyseExt :: (MonadTrav m) => CExtDecl -> m () +analyseExt (CAsmExt asm _) + = handleAsmBlock asm +analyseExt (CFDefExt fundef) + = analyseFunDef fundef +analyseExt (CDeclExt decl) + = analyseDecl False decl + +-- | Analyse a function definition +analyseFunDef :: (MonadTrav m) => CFunDef -> m () +analyseFunDef (CFunDef declspecs declr oldstyle_decls stmt node_info) = do + -- analyse the declarator + var_decl_info <- analyseVarDecl' True declspecs declr oldstyle_decls Nothing + let (VarDeclInfo name fun_spec storage_spec attrs ty _declr_node) = var_decl_info + when (isNoName name) $ astError node_info "NoName in analyseFunDef" + let ident = identOfVarName name + -- improve incomplete type + ty' <- improveFunDefType ty + -- compute storage + fun_storage <- computeFunDefStorage ident storage_spec + let var_decl = VarDecl name (DeclAttrs fun_spec fun_storage attrs) ty' + -- callback for declaration + handleVarDecl False (Decl var_decl node_info) + -- process body + stmt' <- analyseFunctionBody node_info var_decl stmt + -- callback for definition + handleFunDef ident (FunDef var_decl stmt' node_info) + where + improveFunDefType (FunctionType (FunTypeIncomplete return_ty) attrs) = + return $ FunctionType (FunType return_ty [] False) attrs + improveFunDefType ty = return ty + +voidM :: Monad m => m a -> m () +voidM m = m >> return () + +-- | Analyse a declaration other than a function definition +-- +-- Note: static assertions are not analysed +analyseDecl :: (MonadTrav m) => Bool -> CDecl -> m () +analyseDecl _is_local (CStaticAssert _expr _strlit _annot) = return () -- TODO +analyseDecl is_local decl@(CDecl declspecs declrs node) + | null declrs = + case typedef_spec of Just _ -> astError node "bad typedef declaration: missing declarator" + Nothing -> voidM$ analyseTypeDecl decl + | (Just declspecs') <- typedef_spec = mapM_ (uncurry (analyseTyDef declspecs')) declr_list + | otherwise = do let (storage_specs, attrs, typequals, typespecs, funspecs, _alignspecs) = + partitionDeclSpecs declspecs + canonTySpecs <- canonicalTypeSpec typespecs + -- TODO: alignspecs not yet processed + let specs = + (storage_specs, attrs, typequals, canonTySpecs, funspecs) + mapM_ (uncurry (analyseVarDeclr specs)) declr_list + where + declr_list = zip (True : repeat False) declrs + typedef_spec = hasTypeDef declspecs + + analyseTyDef declspecs' handle_sue_def declr = + case declr of + (Just tydeclr, Nothing , Nothing) -> analyseTypeDef handle_sue_def declspecs' tydeclr node + _ -> astError node "bad typdef declaration: bitfieldsize or initializer present" + + analyseVarDeclr specs handle_sue_def (Just declr, init_opt, Nothing) = do + -- analyse the declarator + let (storage_specs, attrs, typequals, canonTySpecs, inline) = specs + vardeclInfo@(VarDeclInfo _ _ _ _ typ _) <- + analyseVarDecl handle_sue_def storage_specs attrs typequals canonTySpecs inline + declr [] Nothing + -- declare / define the object + if isFunctionType typ + then extFunProto vardeclInfo + else (if is_local then localVarDecl else extVarDecl) + -- XXX: if Initializer becomes different from CInit, this + -- will have to change. + vardeclInfo init_opt + _init_opt' <- mapMaybeM init_opt (tInit typ) + return () + analyseVarDeclr _ _ (Nothing,_,_) = astError node "abstract declarator in object declaration" + analyseVarDeclr _ _ (_,_,Just _bitfieldSz) = astError node "bitfield size in object declaration" + +-- | Analyse a typedef +analyseTypeDef :: (MonadTrav m) => Bool -> [CDeclSpec] -> CDeclr -> NodeInfo -> m () +analyseTypeDef handle_sue_def declspecs declr node_info = do + -- analyse the declarator + (VarDeclInfo name fun_attrs storage_spec attrs ty _node) <- analyseVarDecl' handle_sue_def declspecs declr [] Nothing + checkValidTypeDef fun_attrs storage_spec attrs + when (isNoName name) $ astError node_info "NoName in analyseTypeDef" + let ident = identOfVarName name + handleTypeDef (TypeDef ident ty attrs node_info) + where + checkValidTypeDef fun_attrs _ _ | fun_attrs /= noFunctionAttrs = + astError node_info "inline specifier for typeDef" + checkValidTypeDef _ NoStorageSpec _ = return () + checkValidTypeDef _ bad_storage _ = astError node_info $ "storage specified for typeDef: " ++ show bad_storage + +-- | compute storage of a function definition +-- +-- a function definition has static storage with internal linkage if specified `static`, +-- the previously declared linkage if any if 'extern' or no specifier are present. (See C99 6.2.2, clause 5) +-- +-- This function won't raise an Trav error if the declaration is incompatible with the existing one, +-- this case is handled in 'handleFunDef'. +computeFunDefStorage :: (MonadTrav m) => Ident -> StorageSpec -> m Storage +computeFunDefStorage _ (StaticSpec _) = return$ FunLinkage InternalLinkage +computeFunDefStorage ident other_spec = do + obj_opt <- lookupObject ident + let defaultSpec = FunLinkage ExternalLinkage + case other_spec of + NoStorageSpec -> return$ maybe defaultSpec declStorage obj_opt + (ExternSpec False) -> return$ maybe defaultSpec declStorage obj_opt + bad_spec -> throwTravError $ badSpecifierError (nodeInfo ident) + $ "unexpected function storage specifier (only static or extern is allowed)" ++ show bad_spec + +-- (private) Get parameters of a function type +getParams :: Type -> Maybe [ParamDecl] +getParams (FunctionType (FunType _ params _) _) = Just params +getParams _ = Nothing + +-- | handle a function prototype +extFunProto :: (MonadTrav m) => VarDeclInfo -> m () +extFunProto (VarDeclInfo var_name fun_spec storage_spec attrs ty node_info) = + do when (isNoName var_name) $ astError node_info "NoName in extFunProto" + old_fun <- lookupObject (identOfVarName var_name) + checkValidSpecs + let decl = VarDecl var_name (DeclAttrs fun_spec (funDeclLinkage old_fun) attrs) ty + handleVarDecl False (Decl decl node_info) + -- XXX: structs should be handled in 'function prototype scope' too + enterPrototypeScope + maybe (return ()) (mapM_ handleParamDecl) (getParams ty) + leavePrototypeScope + where + funDeclLinkage old_fun = + case storage_spec of + NoStorageSpec -> FunLinkage ExternalLinkage -- prototype declaration / external linkage + StaticSpec False -> FunLinkage InternalLinkage -- prototype declaration / internal linkage + ExternSpec False -> case old_fun of + Nothing -> FunLinkage ExternalLinkage + Just f -> declStorage f + _ -> error $ "funDeclLinkage: " ++ show storage_spec + checkValidSpecs + | hasThreadLocalSpec storage_spec = astError node_info "thread local storage specified for function" + | RegSpec <- storage_spec = astError node_info "invalid `register' storage specified for function" + | otherwise = return () + +-- | handle a object declaration \/ definition +-- +-- We have to check the storage specifiers here, as they determine wheter we're dealing with decalartions +-- or definitions +-- see [http://www.sivity.net/projects/language.c/wiki/ExternalDefinitions] +extVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m () +extVarDecl (VarDeclInfo var_name fun_spec storage_spec attrs typ node_info) init_opt = + do when (isNoName var_name) $ astError node_info "NoName in extVarDecl" + (storage,is_def) <- globalStorage storage_spec + let vardecl = VarDecl var_name (DeclAttrs fun_spec storage attrs) typ + if is_def + then handleObjectDef False ident $ ObjDef vardecl init_opt node_info + else handleVarDecl False $ Decl vardecl node_info + where + ident = identOfVarName var_name + globalStorage _ | fun_spec /= noFunctionAttrs = + astError node_info "invalid function specifier for external variable" + globalStorage AutoSpec = astError node_info "file-scope declaration specifies storage `auto'" + globalStorage RegSpec = + do when (isJust init_opt) $ astError node_info "initializer given for global register variable" + case var_name of + NoName -> astError node_info "global register variable has no name" + VarName _ Nothing -> astError node_info "no register specified for global register variable" + _ -> return () + dt <- getDefTable + when (hasFunDef dt) $ astError node_info "global register variable appears after a function definition" + return (Static InternalLinkage False, False) + -- tentative if there is no initializer, external + globalStorage NoStorageSpec = return (Static ExternalLinkage False, True) + globalStorage ThreadSpec = return (Static ExternalLinkage True, True) + -- tentative if there is no initializer, internal + globalStorage (StaticSpec thread_local) = return (Static InternalLinkage thread_local, True) + globalStorage (ExternSpec thread_local) = + case init_opt of + -- declaration with either external or old storage + Nothing -> do old_decl <- lookupObject ident + return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False) + -- warning, external definition + Just _ -> do warn $ badSpecifierError node_info "Both initializer and `extern` specifier given - treating as definition" + return (Static ExternalLinkage thread_local, True) + hasFunDef dt = any (isFuncDef . snd) (Map.toList $ gObjs $ globalDefs dt) + isFuncDef (FunctionDef fd) = not $ (isInline . functionAttrs) fd + isFuncDef _ = False + +-- | handle a function-scope object declaration \/ definition +-- see [http://www.sivity.net/projects/language.c/wiki/LocalDefinitions] +localVarDecl :: (MonadTrav m) => VarDeclInfo -> Maybe Initializer -> m () +localVarDecl (VarDeclInfo var_name fun_attrs storage_spec attrs typ node_info) init_opt = + do when (isNoName var_name) $ astError node_info "NoName in localVarDecl" + (storage,is_def) <- localStorage storage_spec + let vardecl = VarDecl var_name (DeclAttrs fun_attrs storage attrs) typ + if is_def + then handleObjectDef True ident (ObjDef vardecl init_opt node_info) + else handleVarDecl True (Decl vardecl node_info) + where + ident = identOfVarName var_name + localStorage NoStorageSpec = return (Auto False,True) + localStorage ThreadSpec = return (Auto True,True) + localStorage RegSpec = return (Auto True,True) + -- static no linkage + localStorage (StaticSpec thread_local) = + return (Static NoLinkage thread_local,True) + localStorage (ExternSpec thread_local) + | isJust init_opt = astError node_info "extern keyword and initializer for local" + | otherwise = + do old_decl <- lookupObject ident + return (maybe (Static ExternalLinkage thread_local) declStorage old_decl,False) + localStorage _ = astError node_info "bad storage specifier for local" + +defineParams :: MonadTrav m => NodeInfo -> VarDecl -> m () +defineParams ni decl = + case getParams (declType decl) of + Nothing -> astError ni + "expecting complete function type in function definition" + Just params -> mapM_ handleParamDecl params + +analyseFunctionBody :: (MonadTrav m) => NodeInfo -> VarDecl -> CStat -> m Stmt +analyseFunctionBody node_info decl s@(CCompound localLabels items _) = + do enterFunctionScope + mapM_ (withDefTable . defineLabel) (localLabels ++ getLabels s) + defineParams node_info decl + -- record parameters + mapM_ (tBlockItem [FunCtx decl]) items + leaveFunctionScope + return s -- XXX: bogus + +analyseFunctionBody _ _ s = astError (nodeInfo s) "Function body is no compound statement" + +data StmtCtx = FunCtx VarDecl + | LoopCtx + | SwitchCtx + +-- | Given a context, determine the type declaration for the enclosing +-- function, if possible, given a context. +enclosingFunctionType :: [StmtCtx] -> Maybe Type +enclosingFunctionType [] = Nothing +enclosingFunctionType (FunCtx vd : _) = Just $ declType vd +enclosingFunctionType (_ : cs) = enclosingFunctionType cs + +inLoop :: [StmtCtx] -> Bool +inLoop c = any isLoop c + where isLoop LoopCtx = True + isLoop _ = False + +inSwitch :: [StmtCtx] -> Bool +inSwitch c = any isSwitch c + where isSwitch SwitchCtx = True + isSwitch _ = False + +data ExprSide = LValue | RValue + deriving (Eq, Show) + +-- | Typecheck a statement, given a statement context. The type of a +-- statement is usually @void@, but expression statements and blocks +-- can sometimes have other types. +tStmt :: MonadTrav m => [StmtCtx] -> CStat -> m Type +tStmt c (CLabel _ s _ _) = tStmt c s +tStmt c (CExpr e _) = + maybe (return voidType) (tExpr c RValue) e +tStmt c (CCompound ls body _) = + do enterBlockScope + mapM_ (withDefTable . defineLabel) ls + t <- foldM (const $ tBlockItem c) voidType body + leaveBlockScope + return t +tStmt c (CIf e sthen selse _) = + checkGuard c e >> tStmt c sthen + >> maybe (return ()) (voidM . tStmt c) selse + >> return voidType +tStmt c (CSwitch e s ni) = + tExpr c RValue e >>= checkIntegral' ni >> + tStmt (SwitchCtx : c) s +tStmt c (CWhile e s _ _) = + checkGuard c e >> tStmt (LoopCtx : c) s +tStmt _ (CGoto l ni) = + do dt <- getDefTable + case lookupLabel l dt of + Just _ -> return voidType + Nothing -> typeError ni $ "undefined label in goto: " ++ identToString l +tStmt c (CCont ni) = + do unless (inLoop c) $ astError ni "continue statement outside of loop" + return voidType +tStmt c (CBreak ni) = + do unless (inLoop c || inSwitch c) $ + astError ni "break statement outside of loop or switch statement" + return voidType +tStmt c (CReturn (Just e) ni) = + do t <- tExpr c RValue e + rt <- case enclosingFunctionType c of + Just (FunctionType (FunType rt _ _) _) -> return rt + Just (FunctionType (FunTypeIncomplete rt) _) -> return rt + Just ft -> astError ni $ "bad function type: " ++ pType ft + Nothing -> astError ni "return statement outside function" + case (rt, t) of + -- apparently it's ok to return void from a void function? + (DirectType TyVoid _ _, DirectType TyVoid _ _) -> return () + _ -> assignCompatible' ni CAssignOp rt t + return voidType +tStmt _ (CReturn Nothing _) = return voidType +-- XXX: anything to do for assembly? +tStmt _ (CAsm _ _) = return voidType +tStmt c (CCase e s ni) = + do unless (inSwitch c) $ + astError ni "case statement outside of switch statement" + tExpr c RValue e >>= checkIntegral' ni + tStmt c s +tStmt c (CCases e1 e2 s ni) = + do unless (inSwitch c) $ + astError ni "case statement outside of switch statement" + tExpr c RValue e1 >>= checkIntegral' ni + tExpr c RValue e2 >>= checkIntegral' ni + tStmt c s +tStmt c (CDefault s ni) = + do unless (inSwitch c) $ + astError ni "default statement outside of switch statement" + tStmt c s +tStmt c (CFor i g inc s _) = + do enterBlockScope + either (maybe (return ()) checkExpr) (analyseDecl True) i + maybe (return ()) (checkGuard c) g + maybe (return ()) checkExpr inc + _ <- tStmt (LoopCtx : c) s + leaveBlockScope + return voidType + where checkExpr e = voidM$ tExpr c RValue e +tStmt c (CGotoPtr e ni) = + do t <- tExpr c RValue e + case t of + (PtrType _ _ _) -> return voidType + _ -> typeError ni "can't goto non-pointer" + +-- | Typecheck a block item. When statement expressions are blocks, +-- they have the type of their last expression statement, so this +-- needs to return a type. +tBlockItem :: MonadTrav m => [StmtCtx] -> CBlockItem -> m Type +tBlockItem c (CBlockStmt s) = tStmt c s +tBlockItem _ (CBlockDecl d) = analyseDecl True d >> return voidType +-- TODO: fixup analyseFunDef to handle nested functions +tBlockItem _ (CNestedFunDef fd) = analyseFunDef fd >> return voidType + +checkGuard :: MonadTrav m => [StmtCtx] -> CExpr -> m () +checkGuard c e = tExpr c RValue e >>= checkScalar' (nodeInfo e) + +-- XXX: this is bogus, correct only for IA32. We should eventually +-- have a collection of these and allow people to choose one. +defaultMD :: MachineDesc +defaultMD = + MachineDesc + { iSize = \it -> + case it of + TyBool -> 1 + TyChar -> 1 + TySChar -> 1 + TyUChar -> 1 + TyShort -> 2 + TyUShort -> 2 + TyInt -> 4 + TyUInt -> 4 + TyLong -> 4 + TyULong -> 4 + TyLLong -> 8 + TyULLong -> 8 + TyInt128 -> 16 + TyUInt128 -> 16 + , fSize = \ft -> + case ft of + TyFloat -> 4 + TyDouble -> 8 + TyLDouble -> 16 + , builtinSize = \bt -> + case bt of + TyVaList -> 4 + TyAny -> 4 + , ptrSize = 4 + , voidSize = 1 + , iAlign = \it -> + case it of + TyBool -> 1 + TyChar -> 1 + TySChar -> 1 + TyUChar -> 1 + TyShort -> 2 + TyUShort -> 2 + TyInt -> 4 + TyUInt -> 4 + TyLong -> 4 + TyULong -> 4 + TyLLong -> 8 + TyULLong -> 8 + TyInt128 -> 16 + TyUInt128 -> 16 + , fAlign = \ft -> + case ft of + TyFloat -> 4 + TyDouble -> 8 + TyLDouble -> 16 + , builtinAlign = \bt -> + case bt of + TyVaList -> 4 + TyAny -> 4 + , ptrAlign = 4 + , voidAlign = 1 + } + +tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type +tExpr c side e = + case nameOfNode (nodeInfo e) of + Just n -> + do dt <- getDefTable + case lookupType dt n of + Just t -> return t + Nothing -> + do t <- tExpr' c side e + withDefTable (\dt' -> (t, insertType dt' n t)) + Nothing -> tExpr' c side e + +-- | Typecheck an expression, with information about whether it +-- appears as an lvalue or an rvalue. +tExpr' :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type +tExpr' c side (CBinary op le re ni) = + do when (side == LValue) $ typeError ni "binary operator as lvalue" + lt <- tExpr c RValue le + rt <- tExpr c RValue re + binopType' ni op lt rt +tExpr' c side (CUnary CAdrOp e ni) = + do when (side == LValue) $ + typeError ni "address-of operator as lvalue" + case e of + CCompoundLit _ _ _ -> simplePtr `liftM` tExpr c RValue e + CVar i _ -> lookupObject i >>= + typeErrorOnLeft ni . maybe (notFound i) varAddrType + _ -> simplePtr `liftM` tExpr c LValue e +tExpr' c _ (CUnary CIndOp e ni) = + tExpr c RValue e >>= (typeErrorOnLeft ni . derefType) +tExpr' c _ (CUnary CCompOp e ni) = + do t <- tExpr c RValue e + checkIntegral' ni t + return t +tExpr' c side (CUnary CNegOp e ni) = + do when (side == LValue) $ + typeError ni "logical negation used as lvalue" + tExpr c RValue e >>= checkScalar' ni + return boolType +tExpr' c side (CUnary op e _) = + tExpr c (if isEffectfulOp op then LValue else side) e +tExpr' c _ (CIndex b i ni) = + do bt <- tExpr c RValue b + it <- tExpr c RValue i + addrTy <- binopType' ni CAddOp bt it + typeErrorOnLeft ni $ derefType addrTy +tExpr' c side (CCond e1 me2 e3 ni) = + do t1 <- tExpr c RValue e1 + checkScalar' (nodeInfo e1) t1 + t3 <- tExpr c side e3 + case me2 of + Just e2 -> + do t2 <- tExpr c side e2 + conditionalType' ni t2 t3 + Nothing -> conditionalType' ni t1 t3 +tExpr' c _ (CMember e m deref ni) = + do t <- tExpr c RValue e + bt <- if deref then typeErrorOnLeft ni (derefType t) else return t + fieldType ni m bt +tExpr' c side (CComma es _) = + mapM (tExpr c side) es >>= return . last +tExpr' c side (CCast d e ni) = + do dt <- analyseTypeDecl d + et <- tExpr c side e + typeErrorOnLeft ni $ castCompatible dt et + return dt +tExpr' c side (CSizeofExpr e ni) = + do when (side == LValue) $ typeError ni "sizeof as lvalue" + _ <- tExpr c RValue e + return size_tType +tExpr' c side (CAlignofExpr e ni) = + do when (side == LValue) $ typeError ni "alignof as lvalue" + _ <- tExpr c RValue e + return size_tType +tExpr' c side (CComplexReal e ni) = complexBaseType ni c side e +tExpr' c side (CComplexImag e ni) = complexBaseType ni c side e +tExpr' _ side (CLabAddrExpr _ ni) = + do when (side == LValue) $ typeError ni "label address as lvalue" + return $ PtrType voidType noTypeQuals [] +tExpr' _ side (CCompoundLit d initList ni) = + do when (side == LValue) $ typeError ni "compound literal as lvalue" + lt <- analyseTypeDecl d + tInitList ni (canonicalType lt) initList + return lt +tExpr' _ RValue (CAlignofType _ _) = return size_tType +tExpr' _ RValue (CSizeofType _ _) = return size_tType +tExpr' _ LValue (CAlignofType _ ni) = + typeError ni "alignoftype as lvalue" +tExpr' _ LValue (CSizeofType _ ni) = + typeError ni "sizeoftype as lvalue" +tExpr' ctx side (CGenericSelection expr list ni) = do + ty_sel <- tExpr ctx side expr + ty_list <- mapM analyseAssoc list + def_expr_ty <- + case dropWhile (isJust . fst) ty_list of + [(Nothing,tExpr'')] -> return (Just tExpr'') + [] -> return Nothing + _ -> astError ni "more than one default clause in generic selection" + case dropWhile (maybe True (not . typesMatch ty_sel) . fst) ty_list of + ((_,expr_ty) : _ ) -> return expr_ty + [] -> case def_expr_ty of + (Just expr_ty) -> return expr_ty + Nothing -> astError ni ("no clause matches for generic selection (not fully supported) - selector type is " ++ show (pretty ty_sel) ++ + ", available types are " ++ show (map (pretty.fromJust.fst) (filter (isJust.fst) ty_list))) + where + analyseAssoc (mdecl,expr') = do + tDecl <- mapM analyseTypeDecl mdecl + tExpr'' <- tExpr ctx side expr' + return (tDecl, tExpr'') + typesMatch (DirectType tn1 _ _) (DirectType tn2 _ _) = directTypesMatch tn1 tn2 + typesMatch _ _ = False -- not fully supported + directTypesMatch TyVoid TyVoid = True + directTypesMatch (TyIntegral t1) (TyIntegral t2) = t1 == t2 + directTypesMatch (TyFloating t1) (TyFloating t2) = t1 == t2 + directTypesMatch (TyComplex t1) (TyComplex t2) = t1 == t2 + directTypesMatch _ _ = False -- TODO: not fully supported +tExpr' _ _ (CVar i ni) = + lookupObject i >>= + maybe (typeErrorOnLeft ni $ notFound i) (return . declType) +tExpr' _ _ (CConst c) = constType c +tExpr' _ _ (CBuiltinExpr b) = builtinType b +tExpr' c side (CCall (CVar i _) args ni) + | identToString i == "__builtin_choose_expr" = + case args of + [g, e1, e2] -> + -- XXX: the MachineDesc parameter below should be configurable + do b <- constEval defaultMD Map.empty g + case boolValue b of + Just True -> tExpr c side e1 + Just False -> tExpr c side e2 + Nothing -> + astError ni "non-constant argument to __builtin_choose_expr" + _ -> astError ni "wrong number of arguments to __builtin_choose_expr" +tExpr' c _ (CCall fe args ni) = + do let defType = FunctionType + (FunTypeIncomplete + (DirectType (TyIntegral TyInt) noTypeQuals noAttributes)) + noAttributes + fallback i = do warn $ invalidAST ni $ + "unknown function: " ++ identToString i + return defType + t <- case fe of + CVar i _ -> lookupObject i >>= + maybe (fallback i) (const $ tExpr c RValue fe) + _ -> tExpr c RValue fe + atys <- mapM (tExpr c RValue) args + -- XXX: we don't actually want to return the canonical return type here + case canonicalType t of + PtrType (FunctionType (FunType rt pdecls varargs) _) _ _ -> + do let ptys = map declType pdecls + mapM_ checkArg $ zip3 ptys atys args + unless varargs $ when (length atys /= length ptys) $ + typeError ni "incorrect number of arguments" + return $ canonicalType rt + PtrType (FunctionType (FunTypeIncomplete rt) _) _ _ -> + do -- warn $ invalidAST ni "incomplete function type" + return $ canonicalType rt + _ -> typeError ni $ "attempt to call non-function of type " ++ pType t + where checkArg (pty, aty, arg) = + do attrs <- deepTypeAttrs pty + if isTransparentUnion attrs + then + case canonicalType pty of + DirectType (TyComp ctr) _ _ -> + do td <- lookupSUE (nodeInfo arg) (sueRef ctr) + _ms <- tagMembers (nodeInfo arg) td + {- + when (null $ rights $ matches ms) $ + astError (nodeInfo arg) $ + "argument matches none of the elements " ++ + "of transparent union" + -} + return () + -- where matches = + -- map (\d -> assignCompatible + -- CAssignOp + -- (snd d) + -- aty + -- ) + _ -> astError (nodeInfo arg) + "non-composite has __transparent_union__ attribute" + else + assignCompatible' (nodeInfo arg) CAssignOp pty aty + isTransparentUnion = + any (\(Attr n _ _) -> identToString n == "__transparent_union__") +tExpr' c _ (CAssign op le re ni) = + do lt <- tExpr c LValue le + rt <- tExpr c RValue re + when (constant $ typeQuals lt) $ + typeError ni $ "assignment to lvalue with `constant' qualifier: " + ++ (render . pretty) le + case (canonicalType lt, re) of + (lt', CConst (CIntConst i _)) + | isPointerType lt' && getCInteger i == 0 -> return () + (_, _) -> assignCompatible' ni op lt rt + return lt +tExpr' c _ (CStatExpr s _) = + do enterBlockScope + mapM_ (withDefTable . defineLabel) (getLabels s) + t <- tStmt c s + leaveBlockScope + return t + +tInitList :: MonadTrav m => NodeInfo -> Type -> CInitList -> m () +tInitList _ (ArrayType (DirectType (TyIntegral TyChar) _ _) _ _ _) + [([], CInitExpr e@(CConst (CStrConst _ _)) _)] = + tExpr [] RValue e >> return () +tInitList ni t@(ArrayType _ _ _ _) initList = + do let default_ds = + repeat (CArrDesig (CConst (CIntConst (cInteger 0) ni)) ni) + checkInits t default_ds initList +tInitList ni t@(DirectType (TyComp ctr) _ _) initList = + do td <- lookupSUE ni (sueRef ctr) + ms <- tagMembers ni td + let default_ds = map (\m -> CMemberDesig (fst m) ni) ms + checkInits t default_ds initList +tInitList _ (PtrType (DirectType TyVoid _ _) _ _ ) _ = + return () -- XXX: more checking +tInitList _ t [([], i)] = voidM$ tInit t i +tInitList ni t _ = typeError ni $ "initializer list for type: " ++ pType t + +checkInits :: MonadTrav m => Type -> [CDesignator] -> CInitList -> m () +checkInits _ _ [] = return () +checkInits t dds ((ds, i) : is) = + do (dds', ds') <- case (dds, ds) of + ([], []) -> + typeError (nodeInfo i) "excess elements in initializer" + (dd' : rest, []) -> return (rest, [dd']) + (_, d : _) -> return (advanceDesigList dds d, ds) + t' <- tDesignator t ds' + _ <- tInit t' i + checkInits t dds' is + +advanceDesigList :: [CDesignator] -> CDesignator -> [CDesignator] +advanceDesigList ds d = drop 1 $ dropWhile (not . matchDesignator d) ds + +matchDesignator :: CDesignator -> CDesignator -> Bool +matchDesignator (CMemberDesig m1 _) (CMemberDesig m2 _) = m1 == m2 +matchDesignator _ _ = True -- XXX: for now, array ranges aren't checked + +tDesignator :: MonadTrav m => Type -> [CDesignator] -> m Type +-- XXX: check that initializers are within array size +tDesignator (ArrayType bt _ _ _) (CArrDesig e ni : ds) = + do tExpr [] RValue e >>= checkIntegral' ni + tDesignator bt ds +tDesignator (ArrayType bt _ _ _) (CRangeDesig e1 e2 ni : ds) = + do tExpr [] RValue e1 >>= checkIntegral' ni + tExpr [] RValue e2 >>= checkIntegral' ni + tDesignator bt ds +tDesignator (ArrayType _ _ _ _) (d : _) = + typeError (nodeInfo d) "member designator in array initializer" +tDesignator t@(DirectType (TyComp _) _ _) (CMemberDesig m ni : ds) = + do mt <- fieldType ni m t + tDesignator (canonicalType mt) ds +tDesignator (DirectType (TyComp _) _ _) (d : _) = + typeError (nodeInfo d) "array designator in compound initializer" +tDesignator t [] = return t +tDesignator _t _ = + error "unepxected type with designator" + +tInit :: MonadTrav m => Type -> CInit -> m Initializer +tInit t i@(CInitExpr e ni) = + do it <- tExpr [] RValue e + assignCompatible' ni CAssignOp t it + return i +tInit t i@(CInitList initList ni) = + tInitList ni (canonicalType t) initList >> return i + +complexBaseType :: MonadTrav m => NodeInfo -> [StmtCtx] -> ExprSide -> CExpr -> m Type +complexBaseType ni c side e = + do t <- tExpr c side e + case canonicalType t of + DirectType (TyComplex ft) quals attrs -> + return $ DirectType (TyFloating ft) quals attrs + _ -> typeError ni $ "expected complex type, got: " ++ pType t + + +-- | Return the type of a builtin. +builtinType :: MonadTrav m => CBuiltin -> m Type +builtinType (CBuiltinVaArg _ d _) = analyseTypeDecl d +builtinType (CBuiltinOffsetOf _ _ _) = return size_tType +builtinType (CBuiltinTypesCompatible _ _ _) = return boolType +builtinType (CBuiltinConvertVector _expr ty _) = analyseTypeDecl ty + +-- return @Just declspecs@ without @CTypedef@ if the declaration specifier contain @typedef@ +hasTypeDef :: [CDeclSpec] -> Maybe [CDeclSpec] +hasTypeDef declspecs = + case foldr hasTypeDefSpec (False,[]) declspecs of + (True,specs') -> Just specs' + (False,_) -> Nothing + where + hasTypeDefSpec (CStorageSpec (CTypedef _)) (_,specs) = (True, specs) + hasTypeDefSpec spec (b,specs) = (b,spec:specs)
src/Language/C/Analysis/AstAnalysis.hs-boot view
@@ -1,13 +1,13 @@-module Language.C.Analysis.AstAnalysis where--import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad-import Language.C.Syntax.AST--data StmtCtx = FunCtx VarDecl- | LoopCtx- | SwitchCtx--data ExprSide = LValue | RValue--tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type+module Language.C.Analysis.AstAnalysis where + +import Language.C.Analysis.SemRep +import Language.C.Analysis.TravMonad +import Language.C.Syntax.AST + +data StmtCtx = FunCtx VarDecl + | LoopCtx + | SwitchCtx + +data ExprSide = LValue | RValue + +tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type
src/Language/C/Analysis/Builtins.hs view
@@ -1,226 +1,226 @@-module Language.C.Analysis.Builtins (builtins) where--import Language.C.Analysis.DefTable-import Language.C.Analysis.SemRep-import Language.C.Analysis.TypeUtils-import Language.C.Data.Ident-import Language.C.Data.Node--builtins :: DefTable-builtins = foldr doIdent (foldr doTypeDef emptyDefTable typedefs) idents- where doTypeDef d = snd . defineTypeDef (identOfTypeDef d) d- doIdent d = snd . defineGlobalIdent (declIdent d) d- dName s = VarName (builtinIdent s) Nothing- param ty = ParamDecl (VarDecl- NoName- (DeclAttrs noFunctionAttrs (Auto False) [])- ty) undefNode- fnAttrs = DeclAttrs noFunctionAttrs (FunLinkage ExternalLinkage) []- varAttrs = DeclAttrs noFunctionAttrs (Static InternalLinkage False) []- fnType r as = FunctionType (FunType r (map param as) False) noAttributes- fnType' r as = FunctionType (FunType r (map param as) True) noAttributes- func n r as = Declaration- (Decl- (VarDecl (dName n) fnAttrs (fnType r as))- undefNode)- func' n r as = Declaration- (Decl- (VarDecl (dName n) fnAttrs (fnType' r as))- undefNode)- var n t = Declaration- (Decl (VarDecl (dName n) varAttrs t) undefNode)- typedef n t = TypeDef (builtinIdent n) t [] undefNode- typedefs = [ typedef "__builtin_va_list"- valistType- ]- idents = [ func "__builtin_expect"- (integral TyLong)- [integral TyLong, integral TyLong]- , func "__builtin_bswap16"- uint16_tType- [uint16_tType]- , func "__builtin_bswap32"- uint32_tType- [uint32_tType]- , func "__builtin_bswap64"- uint64_tType- [uint64_tType]- , func "__builtin_fabs"- (floating TyDouble)- [floating TyDouble]- , func "__builtin_fabsf"- (floating TyFloat)- [floating TyFloat]- , func "__builtin_fabsl"- (floating TyLDouble)- [floating TyLDouble]- , func "__builtin_inf" (floating TyDouble) []- , func "__builtin_inff" (floating TyFloat) []- , func "__builtin_infl" (floating TyLDouble) []- , func "__builtin_huge_val" (floating TyDouble) []- , func "__builtin_huge_valf" (floating TyFloat) []- , func "__builtin_huge_vall" (floating TyLDouble) []- , func "__builtin_copysign"- (floating TyDouble)- [ floating TyDouble, floating TyDouble ]- , func "__builtin_va_start"- voidType- [ valistType , voidPtr ]- , func "__builtin_va_end"- voidType- [valistType]- , func "__builtin_va_copy"- voidType- [ valistType, valistType ]- , func "__builtin_va_arg_pack" (integral TyInt) []- , func "__builtin_va_arg_pack_len" (integral TyInt) []- , func "__builtin_alloca"- voidPtr- [ size_tType ]- , func "__builtin_memcpy"- voidPtr- [ voidPtr- , constVoidPtr- , size_tType- ]- , func "__builtin_strspn"- size_tType- [ constCharPtr, constCharPtr ]- , func "__builtin_strcspn"- size_tType- [ constCharPtr, constCharPtr ]- , func "__builtin_strchr"- charPtr- [ constCharPtr, integral TyInt]- , func "__builtin_strncpy"- charPtr- [ constCharPtr -- XXX: restrict- , constCharPtr -- XXX: restrict- , size_tType- ]- , func "__builtin_strncat"- charPtr- [ constCharPtr -- XXX: restrict- , constCharPtr -- XXX: restrict- , size_tType- ]- , func "__builtin_strcmp"- (integral TyInt)- [ constCharPtr, constCharPtr ]- , func "__builtin_strpbrk"- charPtr- [ constCharPtr, constCharPtr ]- , func "__builtin_bzero"- voidType- [ voidPtr, size_tType ]- , func "__builtin_clz"- (integral TyInt)- [ integral TyUInt ]- , func "__builtin_constant_p"- (integral TyInt)- [DirectType (TyBuiltin TyAny) noTypeQuals noAttributes]- -- XXX: I don't know if the following has the- -- correct type. It doesn't seem to be- -- documented.- , func "__builtin_extract_return_addr"- voidPtr- [ voidPtr ]- , func "__builtin_return_address"- voidPtr- [ integral TyUInt ]- , func "__builtin_frame_address"- voidPtr- [ integral TyUInt ]- , func "__builtin_expect"- (integral TyLong)- [ integral TyLong, integral TyLong ]- , func "__builtin_prefetch"- voidType- [ constVoidPtr ]- , var "__func__"- stringType- , var "__PRETTY_FUNCTION__"- stringType- , var "__FUNCTION__"- stringType- -- Builtin GCC error checking functions- , func "__builtin_object_size"- size_tType- [ voidPtr, integral TyInt ]- , func "__builtin___memcpy_chk"- voidPtr- [ voidPtr, constVoidPtr, size_tType, size_tType ]- , func "__builtin___mempcpy_chk"- voidPtr- [ voidPtr, constVoidPtr, size_tType, size_tType ]- , func "__builtin___memmove_chk"- voidPtr- [ voidPtr, constVoidPtr, size_tType, size_tType ]- , func "__builtin___memset_chk"- voidPtr- [ voidPtr, integral TyInt, size_tType, size_tType ]- , func "__builtin___strcpy_chk"- charPtr- [ constCharPtr -- XXX: restrict- , constCharPtr -- XXX: restrict- , size_tType- ]- , func "__builtin___stpcpy_chk"- charPtr- [ constCharPtr -- XXX: restrict- , constCharPtr -- XXX: restrict- , size_tType- ]- , func "__builtin___strncpy_chk"- charPtr- [ constCharPtr -- XXX: restrict- , constCharPtr -- XXX: restrict- , size_tType- , size_tType- ]- , func "__builtin___strcat_chk"- charPtr- [ constCharPtr -- XXX: restrict- , constCharPtr -- XXX: restrict- , size_tType- ]- , func "__builtin___strncat_chk"- charPtr- [ constCharPtr -- XXX: restrict- , constCharPtr -- XXX: restrict- , size_tType- , size_tType- ]- , func' "__builtin___sprintf_chk"- (integral TyInt)- [ charPtr- , integral TyInt- , size_tType- , constCharPtr- ]- , func' "__builtin___snprintf_chk"- (integral TyInt)- [ charPtr- , size_tType- , integral TyInt- , size_tType- , constCharPtr- ]- , func "__builtin___vsprintf_chk"- (integral TyInt)- [ charPtr- , integral TyInt- , size_tType- , constCharPtr- , valistType- ]- , func "__builtin___vsnprintf_chk"- (integral TyInt)- [ charPtr- , size_tType- , integral TyInt- , size_tType- , constCharPtr- , valistType- ]- ]+module Language.C.Analysis.Builtins (builtins) where + +import Language.C.Analysis.DefTable +import Language.C.Analysis.SemRep +import Language.C.Analysis.TypeUtils +import Language.C.Data.Ident +import Language.C.Data.Node + +builtins :: DefTable +builtins = foldr doIdent (foldr doTypeDef emptyDefTable typedefs) idents + where doTypeDef d = snd . defineTypeDef (identOfTypeDef d) d + doIdent d = snd . defineGlobalIdent (declIdent d) d + dName s = VarName (builtinIdent s) Nothing + param ty = ParamDecl (VarDecl + NoName + (DeclAttrs noFunctionAttrs (Auto False) []) + ty) undefNode + fnAttrs = DeclAttrs noFunctionAttrs (FunLinkage ExternalLinkage) [] + varAttrs = DeclAttrs noFunctionAttrs (Static InternalLinkage False) [] + fnType r as = FunctionType (FunType r (map param as) False) noAttributes + fnType' r as = FunctionType (FunType r (map param as) True) noAttributes + func n r as = Declaration + (Decl + (VarDecl (dName n) fnAttrs (fnType r as)) + undefNode) + func' n r as = Declaration + (Decl + (VarDecl (dName n) fnAttrs (fnType' r as)) + undefNode) + var n t = Declaration + (Decl (VarDecl (dName n) varAttrs t) undefNode) + typedef n t = TypeDef (builtinIdent n) t [] undefNode + typedefs = [ typedef "__builtin_va_list" + valistType + ] + idents = [ func "__builtin_expect" + (integral TyLong) + [integral TyLong, integral TyLong] + , func "__builtin_bswap16" + uint16_tType + [uint16_tType] + , func "__builtin_bswap32" + uint32_tType + [uint32_tType] + , func "__builtin_bswap64" + uint64_tType + [uint64_tType] + , func "__builtin_fabs" + (floating TyDouble) + [floating TyDouble] + , func "__builtin_fabsf" + (floating TyFloat) + [floating TyFloat] + , func "__builtin_fabsl" + (floating TyLDouble) + [floating TyLDouble] + , func "__builtin_inf" (floating TyDouble) [] + , func "__builtin_inff" (floating TyFloat) [] + , func "__builtin_infl" (floating TyLDouble) [] + , func "__builtin_huge_val" (floating TyDouble) [] + , func "__builtin_huge_valf" (floating TyFloat) [] + , func "__builtin_huge_vall" (floating TyLDouble) [] + , func "__builtin_copysign" + (floating TyDouble) + [ floating TyDouble, floating TyDouble ] + , func "__builtin_va_start" + voidType + [ valistType , voidPtr ] + , func "__builtin_va_end" + voidType + [valistType] + , func "__builtin_va_copy" + voidType + [ valistType, valistType ] + , func "__builtin_va_arg_pack" (integral TyInt) [] + , func "__builtin_va_arg_pack_len" (integral TyInt) [] + , func "__builtin_alloca" + voidPtr + [ size_tType ] + , func "__builtin_memcpy" + voidPtr + [ voidPtr + , constVoidPtr + , size_tType + ] + , func "__builtin_strspn" + size_tType + [ constCharPtr, constCharPtr ] + , func "__builtin_strcspn" + size_tType + [ constCharPtr, constCharPtr ] + , func "__builtin_strchr" + charPtr + [ constCharPtr, integral TyInt] + , func "__builtin_strncpy" + charPtr + [ constCharPtr -- XXX: restrict + , constCharPtr -- XXX: restrict + , size_tType + ] + , func "__builtin_strncat" + charPtr + [ constCharPtr -- XXX: restrict + , constCharPtr -- XXX: restrict + , size_tType + ] + , func "__builtin_strcmp" + (integral TyInt) + [ constCharPtr, constCharPtr ] + , func "__builtin_strpbrk" + charPtr + [ constCharPtr, constCharPtr ] + , func "__builtin_bzero" + voidType + [ voidPtr, size_tType ] + , func "__builtin_clz" + (integral TyInt) + [ integral TyUInt ] + , func "__builtin_constant_p" + (integral TyInt) + [DirectType (TyBuiltin TyAny) noTypeQuals noAttributes] + -- XXX: I don't know if the following has the + -- correct type. It doesn't seem to be + -- documented. + , func "__builtin_extract_return_addr" + voidPtr + [ voidPtr ] + , func "__builtin_return_address" + voidPtr + [ integral TyUInt ] + , func "__builtin_frame_address" + voidPtr + [ integral TyUInt ] + , func "__builtin_expect" + (integral TyLong) + [ integral TyLong, integral TyLong ] + , func "__builtin_prefetch" + voidType + [ constVoidPtr ] + , var "__func__" + stringType + , var "__PRETTY_FUNCTION__" + stringType + , var "__FUNCTION__" + stringType + -- Builtin GCC error checking functions + , func "__builtin_object_size" + size_tType + [ voidPtr, integral TyInt ] + , func "__builtin___memcpy_chk" + voidPtr + [ voidPtr, constVoidPtr, size_tType, size_tType ] + , func "__builtin___mempcpy_chk" + voidPtr + [ voidPtr, constVoidPtr, size_tType, size_tType ] + , func "__builtin___memmove_chk" + voidPtr + [ voidPtr, constVoidPtr, size_tType, size_tType ] + , func "__builtin___memset_chk" + voidPtr + [ voidPtr, integral TyInt, size_tType, size_tType ] + , func "__builtin___strcpy_chk" + charPtr + [ constCharPtr -- XXX: restrict + , constCharPtr -- XXX: restrict + , size_tType + ] + , func "__builtin___stpcpy_chk" + charPtr + [ constCharPtr -- XXX: restrict + , constCharPtr -- XXX: restrict + , size_tType + ] + , func "__builtin___strncpy_chk" + charPtr + [ constCharPtr -- XXX: restrict + , constCharPtr -- XXX: restrict + , size_tType + , size_tType + ] + , func "__builtin___strcat_chk" + charPtr + [ constCharPtr -- XXX: restrict + , constCharPtr -- XXX: restrict + , size_tType + ] + , func "__builtin___strncat_chk" + charPtr + [ constCharPtr -- XXX: restrict + , constCharPtr -- XXX: restrict + , size_tType + , size_tType + ] + , func' "__builtin___sprintf_chk" + (integral TyInt) + [ charPtr + , integral TyInt + , size_tType + , constCharPtr + ] + , func' "__builtin___snprintf_chk" + (integral TyInt) + [ charPtr + , size_tType + , integral TyInt + , size_tType + , constCharPtr + ] + , func "__builtin___vsprintf_chk" + (integral TyInt) + [ charPtr + , integral TyInt + , size_tType + , constCharPtr + , valistType + ] + , func "__builtin___vsnprintf_chk" + (integral TyInt) + [ charPtr + , size_tType + , integral TyInt + , size_tType + , constCharPtr + , valistType + ] + ]
src/Language/C/Analysis/ConstEval.hs view
@@ -1,209 +1,209 @@-{-# LANGUAGE RelaxedPolyRec #-}-module Language.C.Analysis.ConstEval where--import Control.Monad-import Data.Bits-import Data.Maybe-import qualified Data.Map as Map-import Language.C.Syntax.AST-import Language.C.Syntax.Constants-import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))-import Language.C.Analysis.Debug ()-import Language.C.Analysis.DeclAnalysis-import Language.C.Analysis.DefTable-import Language.C.Data-import Language.C.Pretty-import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad-import Language.C.Analysis.TypeUtils-import Text.PrettyPrint.HughesPJ--data MachineDesc =- MachineDesc- { iSize :: IntType -> Integer- , fSize :: FloatType -> Integer- , builtinSize :: BuiltinType -> Integer- , ptrSize :: Integer- , voidSize :: Integer- , iAlign :: IntType -> Integer- , fAlign :: FloatType -> Integer- , builtinAlign :: BuiltinType -> Integer- , ptrAlign :: Integer- , voidAlign :: Integer- }--intExpr :: (Pos n, MonadName m) => n -> Integer -> m CExpr-intExpr n i =- genName >>= \name ->- return $ CConst $ CIntConst (cInteger i) (mkNodeInfo (posOf n) name)--sizeofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer-sizeofType md _ (DirectType TyVoid _ _) = return $ voidSize md-sizeofType md _ (DirectType (TyIntegral it) _ _) = return $ iSize md it-sizeofType md _ (DirectType (TyFloating ft) _ _) = return $ fSize md ft-sizeofType md _ (DirectType (TyComplex ft) _ _) = return $ 2 * fSize md ft-sizeofType md _ (DirectType (TyComp ctr) _ _) = compSize md ctr-sizeofType md _ (DirectType (TyEnum _) _ _) = return $ iSize md TyInt-sizeofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinSize md b-sizeofType md _ (PtrType _ _ _) = return $ ptrSize md-sizeofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrSize md-sizeofType md n (ArrayType bt (ArraySize _ sz) _ _) =- do sz' <- constEval md Map.empty sz- case sz' of- CConst (CIntConst i _) ->- do s <- sizeofType md n bt- return $ getCInteger i * s- _ -> return $ ptrSize md- {-- astError (nodeInfo sz) $- "array size is not a constant: " ++ (render . pretty) sz- -}-sizeofType md n (TypeDefType (TypeDefRef _ t _) _ _) = sizeofType md n t-sizeofType md _ (FunctionType _ _) = return $ ptrSize md--alignofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer-alignofType md _ (DirectType TyVoid _ _) = return $ voidAlign md-alignofType md _ (DirectType (TyIntegral it) _ _) = return $ iAlign md it-alignofType md _ (DirectType (TyFloating ft) _ _) = return $ fAlign md ft-alignofType md _ (DirectType (TyComplex ft) _ _) = return $ fAlign md ft-alignofType md _ (DirectType (TyEnum _) _ _) = return $ iAlign md TyInt-alignofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinAlign md b-alignofType md _ (PtrType _ _ _) = return $ ptrAlign md-alignofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrAlign md-alignofType md n (ArrayType bt (ArraySize _ _) _ _) = alignofType md n bt-alignofType md n (TypeDefType (TypeDefRef _ t _) _ _) = alignofType md n t-alignofType _ n t = astError (nodeInfo n) $- "can't find alignment of type: " ++ (render . pretty) t--compSize :: MonadTrav m => MachineDesc -> CompTypeRef -> m Integer-compSize md ctr =- do dt <- getDefTable- case lookupTag (sueRef ctr) dt of- Just (Left _) -> astError (nodeInfo ctr)- "composite declared but not defined"- Just (Right (CompDef (CompType _ tag ms _ ni))) ->- do let ts = map declType ms- sizes <- mapM (sizeofType md ni) ts- -- XXX: handle padding- case tag of- StructTag -> return $ sum sizes- UnionTag -> return $ maximum sizes- Just (Right (EnumDef _)) -> return $ iSize md TyInt- Nothing -> astError (nodeInfo ctr) "unknown composite"---{- Expression evaluation -}---- Use the withWordBytes function to wrap the results around to the--- correct word size-intOp :: CBinaryOp -> Integer -> Integer -> Integer-intOp CAddOp i1 i2 = i1 + i2-intOp CSubOp i1 i2 = i1 - i2-intOp CMulOp i1 i2 = i1 * i2-intOp CDivOp i1 i2 = i1 `div` i2-intOp CRmdOp i1 i2 = i1 `mod` i2-intOp CShlOp i1 i2 = i1 `shiftL` fromInteger i2-intOp CShrOp i1 i2 = i1 `shiftR` fromInteger i2-intOp CLeOp i1 i2 = toInteger $ fromEnum $ i1 < i2-intOp CGrOp i1 i2 = toInteger $ fromEnum $ i1 > i2-intOp CLeqOp i1 i2 = toInteger $ fromEnum $ i1 <= i2-intOp CGeqOp i1 i2 = toInteger $ fromEnum $ i1 >= i2-intOp CEqOp i1 i2 = toInteger $ fromEnum $ i1 == i2-intOp CNeqOp i1 i2 = toInteger $ fromEnum $ i1 /= i2-intOp CAndOp i1 i2 = i1 .&. i2-intOp CXorOp i1 i2 = i1 `xor` i2-intOp COrOp i1 i2 = i1 .|. i2-intOp CLndOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) && (i2 /= 0)-intOp CLorOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) || (i2 /= 0)---- Use the withWordBytes function to wrap the results around to the--- correct word size-intUnOp :: CUnaryOp -> Integer -> Maybe Integer-intUnOp CPlusOp i = Just i-intUnOp CMinOp i = Just $ -i-intUnOp CCompOp i = Just $ complement i-intUnOp CNegOp i = Just $ toInteger $ fromEnum $ i == 0-intUnOp _ _ = Nothing--withWordBytes :: Int -> Integer -> Integer-withWordBytes bytes n = n `rem` (1 `shiftL` (bytes `shiftL` 3))--boolValue :: CExpr -> Maybe Bool-boolValue (CConst (CIntConst i _)) = Just $ getCInteger i /= 0-boolValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c /= 0-boolValue (CConst (CStrConst _ _)) = Just True-boolValue _ = Nothing--intValue :: CExpr -> Maybe Integer-intValue (CConst (CIntConst i _)) = Just $ getCInteger i-intValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c-intValue _ = Nothing--constEval :: (MonadTrav m) =>- MachineDesc -> Map.Map Ident CExpr -> CExpr -> m CExpr-constEval md env (CCond e1 me2 e3 ni) =- do e1' <- constEval md env e1- me2' <- maybe (return Nothing) (\e -> Just `liftM` constEval md env e) me2- e3' <- constEval md env e3- case boolValue e1' of- Just True -> return $ fromMaybe e1' me2'- Just False -> return e3'- Nothing -> return $ CCond e1' me2' e3' ni-constEval md env e@(CBinary op e1 e2 ni) =- do e1' <- constEval md env e1- e2' <- constEval md env e2- t <- tExpr [] RValue e- bytes <- fromIntegral `liftM` sizeofType md e t- case (intValue e1', intValue e2') of- (Just i1, Just i2) -> intExpr ni (withWordBytes bytes (intOp op i1 i2))- (_, _) -> return $ CBinary op e1' e2' ni-constEval md env (CUnary op e ni) =- do e' <- constEval md env e- t <- tExpr [] RValue e- bytes <- fromIntegral `liftM` sizeofType md e t- case intValue e' of- Just i -> case intUnOp op i of- Just i' -> intExpr ni (withWordBytes bytes i')- Nothing -> astError ni- "invalid unary operator applied to constant"- Nothing -> return $ CUnary op e' ni-constEval md env (CCast d e ni) =- do e' <- constEval md env e- t <- analyseTypeDecl d- bytes <- fromIntegral `liftM` sizeofType md d t- case intValue e' of- Just i -> intExpr ni (withWordBytes bytes i)- Nothing -> return $ CCast d e' ni-constEval md _ (CSizeofExpr e ni) =- do t <- tExpr [] RValue e- sz <- sizeofType md e t- intExpr ni sz-constEval md _ (CSizeofType d ni) =- do t <- analyseTypeDecl d- sz <- sizeofType md d t- intExpr ni sz-constEval md _ (CAlignofExpr e ni) =- do t <- tExpr [] RValue e- sz <- alignofType md e t- intExpr ni sz-constEval md _ (CAlignofType d ni) =- do t <- analyseTypeDecl d- sz <- alignofType md d t- intExpr ni sz-constEval _ env e@(CVar i _) | Map.member i env =- return $ fromMaybe e $ Map.lookup i env-constEval md env e@(CVar i _) =- do t <- tExpr [] RValue e- case derefTypeDef t of- DirectType (TyEnum etr) _ _ ->- do dt <- getDefTable- case lookupTag (sueRef etr) dt of- Just (Right (EnumDef (EnumType _ es _ _))) ->- do env' <- foldM enumConst env es- return $ fromMaybe e $ Map.lookup i env'- _ -> return e- _ -> return e- where enumConst env' (Enumerator n e' _ _) =- do c <- constEval md env' e'- return $ Map.insert n c env'-constEval _ _ e = return e+{-# LANGUAGE RelaxedPolyRec #-} +module Language.C.Analysis.ConstEval where + +import Control.Monad +import Data.Bits +import Data.Maybe +import qualified Data.Map as Map +import Language.C.Syntax.AST +import Language.C.Syntax.Constants +import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..)) +import Language.C.Analysis.Debug () +import Language.C.Analysis.DeclAnalysis +import Language.C.Analysis.DefTable +import Language.C.Data +import Language.C.Pretty +import Language.C.Analysis.SemRep +import Language.C.Analysis.TravMonad +import Language.C.Analysis.TypeUtils +import Text.PrettyPrint.HughesPJ + +data MachineDesc = + MachineDesc + { iSize :: IntType -> Integer + , fSize :: FloatType -> Integer + , builtinSize :: BuiltinType -> Integer + , ptrSize :: Integer + , voidSize :: Integer + , iAlign :: IntType -> Integer + , fAlign :: FloatType -> Integer + , builtinAlign :: BuiltinType -> Integer + , ptrAlign :: Integer + , voidAlign :: Integer + } + +intExpr :: (Pos n, MonadName m) => n -> Integer -> m CExpr +intExpr n i = + genName >>= \name -> + return $ CConst $ CIntConst (cInteger i) (mkNodeInfo (posOf n) name) + +sizeofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer +sizeofType md _ (DirectType TyVoid _ _) = return $ voidSize md +sizeofType md _ (DirectType (TyIntegral it) _ _) = return $ iSize md it +sizeofType md _ (DirectType (TyFloating ft) _ _) = return $ fSize md ft +sizeofType md _ (DirectType (TyComplex ft) _ _) = return $ 2 * fSize md ft +sizeofType md _ (DirectType (TyComp ctr) _ _) = compSize md ctr +sizeofType md _ (DirectType (TyEnum _) _ _) = return $ iSize md TyInt +sizeofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinSize md b +sizeofType md _ (PtrType _ _ _) = return $ ptrSize md +sizeofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrSize md +sizeofType md n (ArrayType bt (ArraySize _ sz) _ _) = + do sz' <- constEval md Map.empty sz + case sz' of + CConst (CIntConst i _) -> + do s <- sizeofType md n bt + return $ getCInteger i * s + _ -> return $ ptrSize md + {- + astError (nodeInfo sz) $ + "array size is not a constant: " ++ (render . pretty) sz + -} +sizeofType md n (TypeDefType (TypeDefRef _ t _) _ _) = sizeofType md n t +sizeofType md _ (FunctionType _ _) = return $ ptrSize md + +alignofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer +alignofType md _ (DirectType TyVoid _ _) = return $ voidAlign md +alignofType md _ (DirectType (TyIntegral it) _ _) = return $ iAlign md it +alignofType md _ (DirectType (TyFloating ft) _ _) = return $ fAlign md ft +alignofType md _ (DirectType (TyComplex ft) _ _) = return $ fAlign md ft +alignofType md _ (DirectType (TyEnum _) _ _) = return $ iAlign md TyInt +alignofType md _ (DirectType (TyBuiltin b) _ _) = return $ builtinAlign md b +alignofType md _ (PtrType _ _ _) = return $ ptrAlign md +alignofType md _ (ArrayType _ (UnknownArraySize _) _ _) = return $ ptrAlign md +alignofType md n (ArrayType bt (ArraySize _ _) _ _) = alignofType md n bt +alignofType md n (TypeDefType (TypeDefRef _ t _) _ _) = alignofType md n t +alignofType _ n t = astError (nodeInfo n) $ + "can't find alignment of type: " ++ (render . pretty) t + +compSize :: MonadTrav m => MachineDesc -> CompTypeRef -> m Integer +compSize md ctr = + do dt <- getDefTable + case lookupTag (sueRef ctr) dt of + Just (Left _) -> astError (nodeInfo ctr) + "composite declared but not defined" + Just (Right (CompDef (CompType _ tag ms _ ni))) -> + do let ts = map declType ms + sizes <- mapM (sizeofType md ni) ts + -- XXX: handle padding + case tag of + StructTag -> return $ sum sizes + UnionTag -> return $ maximum sizes + Just (Right (EnumDef _)) -> return $ iSize md TyInt + Nothing -> astError (nodeInfo ctr) "unknown composite" + + +{- Expression evaluation -} + +-- Use the withWordBytes function to wrap the results around to the +-- correct word size +intOp :: CBinaryOp -> Integer -> Integer -> Integer +intOp CAddOp i1 i2 = i1 + i2 +intOp CSubOp i1 i2 = i1 - i2 +intOp CMulOp i1 i2 = i1 * i2 +intOp CDivOp i1 i2 = i1 `div` i2 +intOp CRmdOp i1 i2 = i1 `mod` i2 +intOp CShlOp i1 i2 = i1 `shiftL` fromInteger i2 +intOp CShrOp i1 i2 = i1 `shiftR` fromInteger i2 +intOp CLeOp i1 i2 = toInteger $ fromEnum $ i1 < i2 +intOp CGrOp i1 i2 = toInteger $ fromEnum $ i1 > i2 +intOp CLeqOp i1 i2 = toInteger $ fromEnum $ i1 <= i2 +intOp CGeqOp i1 i2 = toInteger $ fromEnum $ i1 >= i2 +intOp CEqOp i1 i2 = toInteger $ fromEnum $ i1 == i2 +intOp CNeqOp i1 i2 = toInteger $ fromEnum $ i1 /= i2 +intOp CAndOp i1 i2 = i1 .&. i2 +intOp CXorOp i1 i2 = i1 `xor` i2 +intOp COrOp i1 i2 = i1 .|. i2 +intOp CLndOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) && (i2 /= 0) +intOp CLorOp i1 i2 = toInteger $ fromEnum $ (i1 /= 0) || (i2 /= 0) + +-- Use the withWordBytes function to wrap the results around to the +-- correct word size +intUnOp :: CUnaryOp -> Integer -> Maybe Integer +intUnOp CPlusOp i = Just i +intUnOp CMinOp i = Just $ -i +intUnOp CCompOp i = Just $ complement i +intUnOp CNegOp i = Just $ toInteger $ fromEnum $ i == 0 +intUnOp _ _ = Nothing + +withWordBytes :: Int -> Integer -> Integer +withWordBytes bytes n = n `rem` (1 `shiftL` (bytes `shiftL` 3)) + +boolValue :: CExpr -> Maybe Bool +boolValue (CConst (CIntConst i _)) = Just $ getCInteger i /= 0 +boolValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c /= 0 +boolValue (CConst (CStrConst _ _)) = Just True +boolValue _ = Nothing + +intValue :: CExpr -> Maybe Integer +intValue (CConst (CIntConst i _)) = Just $ getCInteger i +intValue (CConst (CCharConst c _)) = Just $ getCCharAsInt c +intValue _ = Nothing + +constEval :: (MonadTrav m) => + MachineDesc -> Map.Map Ident CExpr -> CExpr -> m CExpr +constEval md env (CCond e1 me2 e3 ni) = + do e1' <- constEval md env e1 + me2' <- maybe (return Nothing) (\e -> Just `liftM` constEval md env e) me2 + e3' <- constEval md env e3 + case boolValue e1' of + Just True -> return $ fromMaybe e1' me2' + Just False -> return e3' + Nothing -> return $ CCond e1' me2' e3' ni +constEval md env e@(CBinary op e1 e2 ni) = + do e1' <- constEval md env e1 + e2' <- constEval md env e2 + t <- tExpr [] RValue e + bytes <- fromIntegral `liftM` sizeofType md e t + case (intValue e1', intValue e2') of + (Just i1, Just i2) -> intExpr ni (withWordBytes bytes (intOp op i1 i2)) + (_, _) -> return $ CBinary op e1' e2' ni +constEval md env (CUnary op e ni) = + do e' <- constEval md env e + t <- tExpr [] RValue e + bytes <- fromIntegral `liftM` sizeofType md e t + case intValue e' of + Just i -> case intUnOp op i of + Just i' -> intExpr ni (withWordBytes bytes i') + Nothing -> astError ni + "invalid unary operator applied to constant" + Nothing -> return $ CUnary op e' ni +constEval md env (CCast d e ni) = + do e' <- constEval md env e + t <- analyseTypeDecl d + bytes <- fromIntegral `liftM` sizeofType md d t + case intValue e' of + Just i -> intExpr ni (withWordBytes bytes i) + Nothing -> return $ CCast d e' ni +constEval md _ (CSizeofExpr e ni) = + do t <- tExpr [] RValue e + sz <- sizeofType md e t + intExpr ni sz +constEval md _ (CSizeofType d ni) = + do t <- analyseTypeDecl d + sz <- sizeofType md d t + intExpr ni sz +constEval md _ (CAlignofExpr e ni) = + do t <- tExpr [] RValue e + sz <- alignofType md e t + intExpr ni sz +constEval md _ (CAlignofType d ni) = + do t <- analyseTypeDecl d + sz <- alignofType md d t + intExpr ni sz +constEval _ env e@(CVar i _) | Map.member i env = + return $ fromMaybe e $ Map.lookup i env +constEval md env e@(CVar i _) = + do t <- tExpr [] RValue e + case derefTypeDef t of + DirectType (TyEnum etr) _ _ -> + do dt <- getDefTable + case lookupTag (sueRef etr) dt of + Just (Right (EnumDef (EnumType _ es _ _))) -> + do env' <- foldM enumConst env es + return $ fromMaybe e $ Map.lookup i env' + _ -> return e + _ -> return e + where enumConst env' (Enumerator n e' _ _) = + do c <- constEval md env' e' + return $ Map.insert n c env' +constEval _ _ e = return e
src/Language/C/Analysis/Debug.hs view
@@ -1,191 +1,192 @@-{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-}-{-# OPTIONS -fno-warn-orphans #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Analysis.Debug--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : prototype--- Portability : ghc------ Pretty printing the semantic analysis representation.--- This is currently only intended for debugging purposes.-------------------------------------------------------------------------------module Language.C.Analysis.Debug (-globalDeclStats,-prettyAssocs, prettyAssocsWith,--- and many pretty instances-)-where-import Language.C.Analysis.SemRep-import Language.C.Analysis.Export-import Language.C.Analysis.DefTable-import Language.C.Analysis.NameSpaceMap--import Language.C.Data-import Language.C.Pretty--import Text.PrettyPrint.HughesPJ-import Data.Map (Map) ; import qualified Data.Map as Map--prettyAssocs :: (Pretty k, Pretty v) => String -> [(k,v)] -> Doc-prettyAssocs label = prettyAssocsWith label pretty pretty-prettyAssocsWith :: String -> (k -> Doc) -> (v -> Doc) -> [(k,v)] -> Doc-prettyAssocsWith label prettyKey prettyVal theMap =- text label $$ nest 8 (vcat $ map prettyEntry theMap)- where- prettyEntry (k,v) = prettyKey k <+> text " ~> " <+> prettyVal v--instance Pretty DefTable where- pretty dt = text "DefTable" $$ nest 4 (vcat defMaps)- where- defMaps = [ prettyNSMap "idents" identDecls- , prettyNSMap "tags" tagDecls- , prettyNSMap "labels" labelDefs- , prettyNSMap "members" memberDecls- ]- prettyNSMap label f = prettyAssocs label . nsMapToList $ f dt--instance Pretty GlobalDecls where- pretty gd = text "Global Declarations" $$ (nest 4 $ vcat declMaps)- where- declMaps = [ prettyMap "enumerators" theEnums, prettyMap "declarations" theDecls,- prettyMap "objects" theObjs, prettyMap "functions" theFuns,- prettyMap "tags" $ gTags gd, prettyMap "typeDefs" $ gTypeDefs gd ]- prettyMap :: (Pretty t, Pretty k) => String -> Map k t -> Doc- prettyMap label = prettyAssocs label . Map.assocs- (theDecls, (theEnums, theObjs, theFuns)) = splitIdentDecls False (gObjs gd)--globalDeclStats :: (FilePath -> Bool) -> GlobalDecls -> [(String,Int)]-globalDeclStats file_filter gmap =- [ ("Enumeration Constants",Map.size enumerators),- ("Total Object/Function Declarations",Map.size all_decls),- ("Object definitions", Map.size objDefs),- ("Function Definitions", Map.size funDefs),- ("Tag definitions", Map.size tagDefs),- ("TypeDefs", Map.size typeDefs)- ]- where- gmap' = filterGlobalDecls filterFile gmap- (all_decls,(enumerators,objDefs,funDefs)) = splitIdentDecls True (gObjs gmap')- (tagDefs,typeDefs) = (gTags gmap', gTypeDefs gmap')- filterFile :: (CNode n) => n -> Bool- filterFile = maybe True file_filter . fileOfNode . nodeInfo--instance (Pretty a, Pretty b) => Pretty (Either a b) where- pretty = either pretty pretty-instance Pretty TagFwdDecl where- pretty (CompDecl ct) = pretty ct- pretty (EnumDecl et) = pretty et-instance Pretty CompTyKind where- pretty StructTag = text "struct"- pretty UnionTag = text "union"-instance Pretty CompTypeRef where- pretty (CompTypeRef sue kind _) = pretty kind <+> pretty sue-instance Pretty EnumTypeRef where- pretty (EnumTypeRef sue _ ) = text "enum" <+> pretty sue-instance Pretty Ident where- pretty = text . identToString-instance Pretty SUERef where- pretty (AnonymousRef name) = text $ "$" ++ show (nameId name)- pretty (NamedRef ident) = pretty ident-instance Pretty TagDef where- pretty (CompDef compty) = pretty compty- pretty (EnumDef enumty) = pretty enumty-instance Pretty IdentDecl where- pretty (Declaration decl) = pretty decl- pretty (ObjectDef odef) = pretty odef- pretty (FunctionDef fdef) = pretty fdef- pretty (EnumeratorDef enumerator) = pretty enumerator-instance Pretty Decl where- pretty (Decl vardecl _) =- text "declaration" <+>- pretty vardecl-instance Pretty TypeDef where- pretty (TypeDef ident ty attrs _) =- text "typedef" <+> pretty ident <+> text "as" <+>- pretty attrs <+> pretty ty-instance Pretty ObjDef where- pretty (ObjDef vardecl init_opt _) =- text "object" <+>- pretty vardecl <+> maybe empty (((text "=") <+>) . pretty) init_opt-instance Pretty FunDef where- pretty (FunDef vardecl _stmt _) =- text "function" <+>- pretty vardecl-instance Pretty VarDecl where- pretty (VarDecl name attrs ty) =- ((hsep . punctuate (text " |")) [pretty name, pretty attrs, pretty ty])-instance Pretty ParamDecl where- pretty (ParamDecl (VarDecl name declattrs ty) _) =- pretty declattrs <+> pretty name <+> text "::" <+> pretty ty- pretty (AbstractParamDecl (VarDecl name declattrs ty) _) =- text "abstract" <+> pretty declattrs <+> pretty name <+>- text "::" <+> pretty ty-instance Pretty DeclAttrs where- pretty (DeclAttrs fun_attrs storage attrs) =- hsep [ pretty fun_attrs, pretty storage, pretty attrs]--instance Pretty Type where- pretty ty = pretty (exportTypeDecl ty)-instance Pretty TypeQuals where- pretty tyQuals = hsep $ map showAttr [ ("const",constant),("volatile",volatile),("restrict",restrict) ]- where showAttr (str,select) | select tyQuals = text str- | otherwise = empty--instance Pretty CompType where- pretty (CompType sue_ref tag members attrs _node) =- (text.show) tag <+> pretty sue_ref <+>- braces (terminateSemi members) <+>- pretty attrs--instance Pretty MemberDecl where- pretty (MemberDecl (VarDecl name declattrs ty) bitfield _) =- pretty declattrs <+> pretty name <+> text "::" <+> pretty ty <+>- (maybe empty (\bf -> text ":" <+> pretty bf) bitfield)- pretty (AnonBitField ty bitfield_sz _) =- pretty ty <+> text ":" <+> pretty bitfield_sz--instance Pretty EnumType where- pretty (EnumType sue_ref enumerators attrs _) =- text "enum" <+> pretty sue_ref <+> braces (terminateSemi_ $ map prettyEnr enumerators) <+> pretty attrs- where- prettyEnr (Enumerator ident expr _enumty _) = pretty ident <+> text " = " <+> pretty expr--instance Pretty Enumerator where- pretty (Enumerator ident expr enumty _) = text "<" <> text "econst" <+> pretty (sueRef enumty) <> text ">" <+>- pretty ident <+> text " = " <+> pretty expr--instance Pretty FunctionAttrs where- pretty fattrs = hsep [pIf isInline "inline", pIf isNoreturn "_Noreturn"]- where- pIf isMatch txt = if isMatch fattrs then text txt else empty--instance Pretty Storage where- pretty NoStorage = empty- pretty (Auto reg) = text$ if reg then "auto/register" else "auto"- pretty (Static linkage thread_local) =- (hcat . punctuate (text "/") $ [ text "static",pretty linkage ])- <+> (if thread_local then text ", __thread" else empty)- pretty (FunLinkage linkage) = text "function/" <> pretty linkage-instance Pretty Linkage where- pretty InternalLinkage = text "internal"- pretty ExternalLinkage = text "external"- pretty NoLinkage = text "local"-instance Pretty VarName where- pretty NoName = text "<anonymous>"- pretty (VarName ident asmname_opt) = pretty ident <+> (maybe empty pAsmName asmname_opt)- where pAsmName asmname = text "" <+> parens (text "asmname" <+> pretty asmname)-instance Pretty Attributes where- pretty = joinComma-instance Pretty Attr where- pretty (Attr ident es _) = pretty ident <+> (if null es then empty else text "(...)")--joinComma :: (Pretty a) => [a] -> Doc-joinComma = hsep . punctuate comma . map pretty-terminateSemi :: (Pretty a) => [a] -> Doc-terminateSemi = terminateSemi_ . map pretty-terminateSemi_ :: [Doc] -> Doc-terminateSemi_ = hsep . map (<> semi)-+{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-} +{-# OPTIONS -fno-warn-orphans #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Analysis.Debug +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : prototype +-- Portability : ghc +-- +-- Pretty printing the semantic analysis representation. +-- This is currently only intended for debugging purposes. +----------------------------------------------------------------------------- +module Language.C.Analysis.Debug ( +globalDeclStats, +prettyAssocs, prettyAssocsWith, +-- and many pretty instances +) +where +import Language.C.Analysis.SemRep +import Language.C.Analysis.Export +import Language.C.Analysis.DefTable +import Language.C.Analysis.NameSpaceMap + +import Language.C.Data +import Language.C.Pretty + +import Prelude hiding ((<>)) +import Text.PrettyPrint.HughesPJ +import Data.Map (Map) ; import qualified Data.Map as Map + +prettyAssocs :: (Pretty k, Pretty v) => String -> [(k,v)] -> Doc +prettyAssocs label = prettyAssocsWith label pretty pretty +prettyAssocsWith :: String -> (k -> Doc) -> (v -> Doc) -> [(k,v)] -> Doc +prettyAssocsWith label prettyKey prettyVal theMap = + text label $$ nest 8 (vcat $ map prettyEntry theMap) + where + prettyEntry (k,v) = prettyKey k <+> text " ~> " <+> prettyVal v + +instance Pretty DefTable where + pretty dt = text "DefTable" $$ nest 4 (vcat defMaps) + where + defMaps = [ prettyNSMap "idents" identDecls + , prettyNSMap "tags" tagDecls + , prettyNSMap "labels" labelDefs + , prettyNSMap "members" memberDecls + ] + prettyNSMap label f = prettyAssocs label . nsMapToList $ f dt + +instance Pretty GlobalDecls where + pretty gd = text "Global Declarations" $$ (nest 4 $ vcat declMaps) + where + declMaps = [ prettyMap "enumerators" theEnums, prettyMap "declarations" theDecls, + prettyMap "objects" theObjs, prettyMap "functions" theFuns, + prettyMap "tags" $ gTags gd, prettyMap "typeDefs" $ gTypeDefs gd ] + prettyMap :: (Pretty t, Pretty k) => String -> Map k t -> Doc + prettyMap label = prettyAssocs label . Map.assocs + (theDecls, (theEnums, theObjs, theFuns)) = splitIdentDecls False (gObjs gd) + +globalDeclStats :: (FilePath -> Bool) -> GlobalDecls -> [(String,Int)] +globalDeclStats file_filter gmap = + [ ("Enumeration Constants",Map.size enumerators), + ("Total Object/Function Declarations",Map.size all_decls), + ("Object definitions", Map.size objDefs), + ("Function Definitions", Map.size funDefs), + ("Tag definitions", Map.size tagDefs), + ("TypeDefs", Map.size typeDefs) + ] + where + gmap' = filterGlobalDecls filterFile gmap + (all_decls,(enumerators,objDefs,funDefs)) = splitIdentDecls True (gObjs gmap') + (tagDefs,typeDefs) = (gTags gmap', gTypeDefs gmap') + filterFile :: (CNode n) => n -> Bool + filterFile = maybe True file_filter . fileOfNode . nodeInfo + +instance (Pretty a, Pretty b) => Pretty (Either a b) where + pretty = either pretty pretty +instance Pretty TagFwdDecl where + pretty (CompDecl ct) = pretty ct + pretty (EnumDecl et) = pretty et +instance Pretty CompTyKind where + pretty StructTag = text "struct" + pretty UnionTag = text "union" +instance Pretty CompTypeRef where + pretty (CompTypeRef sue kind _) = pretty kind <+> pretty sue +instance Pretty EnumTypeRef where + pretty (EnumTypeRef sue _ ) = text "enum" <+> pretty sue +instance Pretty Ident where + pretty = text . identToString +instance Pretty SUERef where + pretty (AnonymousRef name) = text $ "$" ++ show (nameId name) + pretty (NamedRef ident) = pretty ident +instance Pretty TagDef where + pretty (CompDef compty) = pretty compty + pretty (EnumDef enumty) = pretty enumty +instance Pretty IdentDecl where + pretty (Declaration decl) = pretty decl + pretty (ObjectDef odef) = pretty odef + pretty (FunctionDef fdef) = pretty fdef + pretty (EnumeratorDef enumerator) = pretty enumerator +instance Pretty Decl where + pretty (Decl vardecl _) = + text "declaration" <+> + pretty vardecl +instance Pretty TypeDef where + pretty (TypeDef ident ty attrs _) = + text "typedef" <+> pretty ident <+> text "as" <+> + pretty attrs <+> pretty ty +instance Pretty ObjDef where + pretty (ObjDef vardecl init_opt _) = + text "object" <+> + pretty vardecl <+> maybe empty (((text "=") <+>) . pretty) init_opt +instance Pretty FunDef where + pretty (FunDef vardecl _stmt _) = + text "function" <+> + pretty vardecl +instance Pretty VarDecl where + pretty (VarDecl name attrs ty) = + ((hsep . punctuate (text " |")) [pretty name, pretty attrs, pretty ty]) +instance Pretty ParamDecl where + pretty (ParamDecl (VarDecl name declattrs ty) _) = + pretty declattrs <+> pretty name <+> text "::" <+> pretty ty + pretty (AbstractParamDecl (VarDecl name declattrs ty) _) = + text "abstract" <+> pretty declattrs <+> pretty name <+> + text "::" <+> pretty ty +instance Pretty DeclAttrs where + pretty (DeclAttrs fun_attrs storage attrs) = + hsep [ pretty fun_attrs, pretty storage, pretty attrs] + +instance Pretty Type where + pretty ty = pretty (exportTypeDecl ty) +instance Pretty TypeQuals where + pretty tyQuals = hsep $ map showAttr [ ("const",constant),("volatile",volatile),("restrict",restrict) ] + where showAttr (str,select) | select tyQuals = text str + | otherwise = empty + +instance Pretty CompType where + pretty (CompType sue_ref tag members attrs _node) = + (text.show) tag <+> pretty sue_ref <+> + braces (terminateSemi members) <+> + pretty attrs + +instance Pretty MemberDecl where + pretty (MemberDecl (VarDecl name declattrs ty) bitfield _) = + pretty declattrs <+> pretty name <+> text "::" <+> pretty ty <+> + (maybe empty (\bf -> text ":" <+> pretty bf) bitfield) + pretty (AnonBitField ty bitfield_sz _) = + pretty ty <+> text ":" <+> pretty bitfield_sz + +instance Pretty EnumType where + pretty (EnumType sue_ref enumerators attrs _) = + text "enum" <+> pretty sue_ref <+> braces (terminateSemi_ $ map prettyEnr enumerators) <+> pretty attrs + where + prettyEnr (Enumerator ident expr _enumty _) = pretty ident <+> text " = " <+> pretty expr + +instance Pretty Enumerator where + pretty (Enumerator ident expr enumty _) = text "<" <> text "econst" <+> pretty (sueRef enumty) <> text ">" <+> + pretty ident <+> text " = " <+> pretty expr + +instance Pretty FunctionAttrs where + pretty fattrs = hsep [pIf isInline "inline", pIf isNoreturn "_Noreturn"] + where + pIf isMatch txt = if isMatch fattrs then text txt else empty + +instance Pretty Storage where + pretty NoStorage = empty + pretty (Auto reg) = text$ if reg then "auto/register" else "auto" + pretty (Static linkage thread_local) = + (hcat . punctuate (text "/") $ [ text "static",pretty linkage ]) + <+> (if thread_local then text ", __thread" else empty) + pretty (FunLinkage linkage) = text "function/" <> pretty linkage +instance Pretty Linkage where + pretty InternalLinkage = text "internal" + pretty ExternalLinkage = text "external" + pretty NoLinkage = text "local" +instance Pretty VarName where + pretty NoName = text "<anonymous>" + pretty (VarName ident asmname_opt) = pretty ident <+> (maybe empty pAsmName asmname_opt) + where pAsmName asmname = text "" <+> parens (text "asmname" <+> pretty asmname) +instance Pretty Attributes where + pretty = joinComma +instance Pretty Attr where + pretty (Attr ident es _) = pretty ident <+> (if null es then empty else text "(...)") + +joinComma :: (Pretty a) => [a] -> Doc +joinComma = hsep . punctuate comma . map pretty +terminateSemi :: (Pretty a) => [a] -> Doc +terminateSemi = terminateSemi_ . map pretty +terminateSemi_ :: [Doc] -> Doc +terminateSemi_ = hsep . map (<> semi) +
src/Language/C/Analysis/DeclAnalysis.hs view
@@ -1,586 +1,589 @@-{-# LANGUAGE PatternGuards, FlexibleContexts #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Analysis.DeclAnalysis--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : alpha--- Portability : ghc------ This module performs the analysis of declarations and the translation of--- type specifications in the AST.-------------------------------------------------------------------------------module Language.C.Analysis.DeclAnalysis (- -- * Translating types- analyseTypeDecl,- tType,tDirectType,tNumType,tArraySize,tTypeQuals,- mergeOldStyle,- -- * Dissecting type specs- canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..),- canonicalStorageSpec, StorageSpec(..), hasThreadLocalSpec, isTypeDef,- -- * Helpers- VarDeclInfo(..),- tAttr,mkVarName,getOnlyDeclr,nameOfDecl,analyseVarDecl,analyseVarDecl'-)-where-import Language.C.Data.Error-import Language.C.Data.Node-import Language.C.Data.Ident-import Language.C.Pretty-import Language.C.Syntax-import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..))-import Language.C.Analysis.DefTable (TagFwdDecl(..), insertType)-import Language.C.Analysis.SemError-import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad--import Data.Foldable as F (foldrM)-import Control.Monad (liftM,when,ap,unless,zipWithM)-import Data.List (intercalate, mapAccumL)-import qualified Data.Map as Map-import Text.PrettyPrint.HughesPJ----- * handling declarations---- | analyse and translate a parameter declaration--- Should be called in either prototype or block scope-tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl-tParamDecl (CStaticAssert _ _ node) =- astError node "expected parameter, not static assertion"-tParamDecl (CDecl declspecs declrs node) =- do declr <- getParamDeclr- -- analyse the variable declaration- (VarDeclInfo name fun_spec storage_spec attrs ty declr_node) <- analyseVarDecl' True declspecs declr [] Nothing- when (isInline fun_spec || isNoreturn fun_spec) $- throwTravError (badSpecifierError node "parameter declaration with function specifier")- -- compute storage of parameter (NoStorage, but might have a register specifier)- storage <- throwOnLeft $ computeParamStorage node storage_spec- let paramDecl = mkParamDecl name storage attrs ty declr_node- -- XXX: we shouldn't modify the deftable here, just analyse and build representation- return paramDecl- where- getParamDeclr =- case declrs of- [] -> return (emptyDeclr node)- [(Just declr,Nothing,Nothing)] -> return declr- _ -> astError node "bad parameter declaration: multiple decls / bitfield or initializer present"- mkParamDecl name storage attrs ty declr_node =- let vd = VarDecl name (DeclAttrs noFunctionAttrs storage attrs) ty in- case name of- NoName -> AbstractParamDecl vd declr_node- _ -> ParamDecl vd declr_node---- | a parameter declaration has no linkage and either auto or register storage-computeParamStorage :: NodeInfo -> StorageSpec -> Either BadSpecifierError Storage-computeParamStorage _ NoStorageSpec = Right (Auto False)-computeParamStorage _ RegSpec = Right (Auto True)-computeParamStorage node spec = Left . badSpecifierError node $ "Bad storage specified for parameter: " ++ show spec---- | analyse and translate a member declaration-tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl]--- Anonymous struct or union members--- TODO storage specs, align specs and attributes are ignored-tMemberDecls (CStaticAssert _ _ node) =- astError node "expected struct or union member, found static assertion"-tMemberDecls (CDecl declspecs [] node) =- do let (_storage_specs, _attrs, typequals, typespecs, funspecs, _alignspecs) =- partitionDeclSpecs declspecs- unless (null funspecs) $ astError node "member declaration with function specifier"- canonTySpecs <- canonicalTypeSpec typespecs- ty <- tType True node typequals canonTySpecs [] []- case ty of- DirectType (TyComp _) _ _ ->- return $ [MemberDecl- -- XXX: are these DeclAttrs correct?- (VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty)- Nothing node]- _ -> astError node "anonymous member has a non-composite type"--- Named members-tMemberDecls (CDecl declspecs declrs node) = zipWithM tMemberDecl (True:repeat False) declrs- where- tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) =- -- TODO: use analyseVarDecl here, not analyseVarDecl'- do var_decl <- analyseVarDecl' handle_sue_def declspecs member_declr [] Nothing- let (VarDeclInfo name fun_spec storage_spec attrs ty _node_info) = var_decl- --- checkValidMemberSpec fun_spec storage_spec- return $ MemberDecl (VarDecl name (DeclAttrs noFunctionAttrs NoStorage attrs) ty)- bit_field_size_opt node- tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) =- do let (storage_specs, _attrs, typequals, typespecs, _funspecs, _alignspecs) = partitionDeclSpecs declspecs- -- TODO: funspecs/alignspecs not yet processed- _storage_spec <- canonicalStorageSpec storage_specs- -- TODO: storage_spec not used- canonTySpecs <- canonicalTypeSpec typespecs- typ <- tType handle_sue_def node typequals canonTySpecs [] []- --- return $ AnonBitField typ bit_field_size node- tMemberDecl _ _ = astError node "Bad member declaration"- checkValidMemberSpec fun_spec storage_spec =- do when (fun_spec /= noFunctionAttrs) $ astError node "member declaration with inline specifier"- when (storage_spec /= NoStorageSpec) $ astError node "storage specifier for member"- return ()--data StorageSpec = NoStorageSpec | AutoSpec | RegSpec | ThreadSpec | StaticSpec Bool | ExternSpec Bool- deriving (Eq,Ord,Show,Read)--hasThreadLocalSpec :: StorageSpec -> Bool-hasThreadLocalSpec ThreadSpec = True-hasThreadLocalSpec (StaticSpec b) = b-hasThreadLocalSpec (ExternSpec b) = b-hasThreadLocalSpec _ = False--data VarDeclInfo = VarDeclInfo VarName FunctionAttrs StorageSpec Attributes Type NodeInfo--analyseVarDecl' :: (MonadTrav m) =>- Bool -> [CDeclSpec] ->- CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo-analyseVarDecl' handle_sue_def declspecs declr oldstyle init_opt =- do let (storage_specs, attrs, type_quals, type_specs, funspecs, _alignspecs) =- partitionDeclSpecs declspecs- canonTySpecs <- canonicalTypeSpec type_specs- -- TODO: alignspecs not yet processed- analyseVarDecl handle_sue_def storage_specs attrs type_quals canonTySpecs funspecs- declr oldstyle init_opt---- | analyse declarators-analyseVarDecl :: (MonadTrav m) =>- Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] ->- TypeSpecAnalysis -> [CFunSpec] ->- CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo-analyseVarDecl handle_sue_def storage_specs decl_attrs typequals canonTySpecs fun_specs- (CDeclr name_opt derived_declrs asmname_opt declr_attrs node)- oldstyle_params _init_opt- = do -- analyse the storage specifiers- storage_spec <- canonicalStorageSpec storage_specs- -- translate the type into semantic representation- typ <- tType handle_sue_def node typequals canonTySpecs derived_declrs oldstyle_params- -- translate attributes- attrs' <- mapM tAttr (decl_attrs ++ declr_attrs)- -- make name- name <- mkVarName node name_opt asmname_opt- return $ VarDeclInfo name function_spec storage_spec attrs' typ node- where- updateFunSpec (CInlineQual _) f = f { isInline = True }- updateFunSpec (CNoreturnQual _) f = f { isNoreturn = True }- function_spec = foldr updateFunSpec noFunctionAttrs fun_specs---- return @True@ if the declarations is a type def-isTypeDef :: [CDeclSpec] -> Bool-isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ]---- * translation---- | get the type of a /type declaration/------ A type declaration @T@ may appear in thre forms:------ * @typeof(T)@------ * as abstract declarator in a function prototype, as in @f(int)@------ * in a declaration without declarators, as in @struct x { int a } ;@------ Currently, @analyseTypeDecl@ is exlusively used for analysing types for GNU's @typeof(T)@.------ We move attributes to the type, as they have no meaning for the abstract declarator-analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type-analyseTypeDecl (CStaticAssert _ _ node) =- astError node "Expected type declaration, found static assert"-analyseTypeDecl (CDecl declspecs declrs node)- | [] <- declrs = analyseTyDeclr (emptyDeclr node)- | [(Just declr,Nothing,Nothing)] <- declrs = analyseTyDeclr declr- | otherwise = astError node "Bad declarator for type declaration"- where- analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode)- | (not (null storagespec) || not (null funspecs) || not (null alignspecs)) =- astError node "storage, function or alignment specifier for type declaration"- | otherwise =- do canonTySpecs <- canonicalTypeSpec typespecs- t <- tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals)- canonTySpecs derived_declrs []- case nameOfNode node of- Just n -> withDefTable (\dt -> (t, insertType dt n t))- Nothing -> return t- where- (storagespec, attrs_decl, typequals, typespecs, funspecs, alignspecs) = partitionDeclSpecs declspecs- analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration"----- | translate a type-tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m Type-tType handle_sue_def top_node typequals canonTySpecs derived_declrs oldstyle_params- = mergeOldStyle top_node oldstyle_params derived_declrs >>= buildType- where- buildType [] =- tDirectType handle_sue_def top_node typequals canonTySpecs- buildType (CPtrDeclr ptrquals node : dds) =- buildType dds >>= buildPointerType ptrquals node- buildType (CArrDeclr arrquals size node : dds)- = buildType dds >>= buildArrayType arrquals size node- buildType (CFunDeclr (Right (params, isVariadic)) attrs node : dds)- = buildType dds >>= (liftM (uncurry FunctionType) . buildFunctionType params isVariadic attrs node)- buildType (CFunDeclr (Left _) _ _ : _)- -- /FIXME/: this is really an internal error, not an AST error.- = astError top_node "old-style parameters remaining after mergeOldStyle"- buildPointerType ptrquals _node inner_ty- = liftM (\(quals,attrs) -> PtrType inner_ty quals attrs) (tTypeQuals ptrquals)- buildArrayType arr_quals size _node inner_ty- = do (quals,attrs) <- tTypeQuals arr_quals- arr_sz <- tArraySize size- return$ ArrayType inner_ty arr_sz quals attrs- -- We build functions in function prototype scope.- -- When analyzing the the function body, we push parameters in function body scope.- buildFunctionType params is_variadic attrs _node return_ty- = do enterPrototypeScope- params' <- mapM tParamDecl params- leavePrototypeScope- attrs' <- mapM tAttr attrs- return $ (\t -> (t,attrs')) $- case (map declType params',is_variadic) of- ([],False) -> FunTypeIncomplete return_ty -- may be improved later on- ([DirectType TyVoid _ _],False) -> FunType return_ty [] False- _ -> FunType return_ty params' is_variadic---- | translate a type without (syntactic) indirections--- Due to the GNU @typeof@ extension and typeDefs, this can be an arbitrary type-tDirectType :: (MonadTrav m) =>- Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type-tDirectType handle_sue_def node ty_quals canonTySpec = do- (quals,attrs) <- tTypeQuals ty_quals- let baseType ty_name = DirectType ty_name quals attrs- case canonTySpec of- TSNone -> return$ baseType (TyIntegral TyInt)- TSVoid -> return$ baseType TyVoid- TSBool -> return$ baseType (TyIntegral TyBool)- TSNum tsnum -> do- numType <- tNumType tsnum- return . baseType $- case numType of- Left (floatType,iscomplex) | iscomplex -> TyComplex floatType- | otherwise -> TyFloating floatType- Right intType -> TyIntegral intType- TSTypeDef tdr -> return$ TypeDefType tdr quals attrs- TSNonBasic (CSUType su _tnode) -> liftM (baseType . TyComp) $ tCompTypeDecl handle_sue_def su- TSNonBasic (CEnumType enum _tnode) -> liftM (baseType . TyEnum) $ tEnumTypeDecl handle_sue_def enum- TSType t -> mergeTypeAttributes node quals attrs t- TSNonBasic t -> astError node ("Unexpected typespec: " ++ show t)---- | Merge type attributes------ This handles for example the form------ > /* tyqual attr typeof(type) */--- > const typeof(char volatile) x;-mergeTypeAttributes :: (MonadCError m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type-mergeTypeAttributes node_info quals attrs typ =- case typ of- DirectType ty_name quals' attrs' -> merge quals' attrs' $ DirectType ty_name- PtrType ty quals' attrs' -> merge quals' attrs' $ PtrType ty- ArrayType ty array_sz quals' attrs' -> merge quals' attrs' $ ArrayType ty array_sz- FunctionType fty attrs'- | quals /= noTypeQuals -> astError node_info "type qualifiers for function type"- | otherwise -> return$ FunctionType fty (attrs' ++ attrs)- TypeDefType tdr quals' attrs'- -> merge quals' attrs' $ TypeDefType tdr- where- merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs)--typeDefRef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m TypeDefRef-typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name ty t_node)---- extract a struct\/union--- we emit @declStructUnion@ and @defStructUnion@ actions------ TODO: should attributes be part of declarartions too ?-tCompTypeDecl :: (MonadTrav m) => Bool -> CStructUnion -> m CompTypeRef-tCompTypeDecl handle_def (CStruct tag ident_opt member_decls_opt attrs node_info) = do- -- create reference- sue_ref <- createSUERef node_info ident_opt- let tag' = tTag tag- attrs' <- mapM tAttr attrs- -- record tag name- let decl = CompTypeRef sue_ref tag' node_info- handleTagDecl (CompDecl decl)- -- when handle_def is true, enter the definition- when handle_def $- maybeM member_decls_opt $ \decls ->- tCompType sue_ref tag' decls attrs' node_info- >>= (handleTagDef.CompDef)- return decl--tTag :: CStructTag -> CompTyKind-tTag CStructTag = StructTag-tTag CUnionTag = UnionTag--tCompType :: (MonadTrav m) => SUERef -> CompTyKind -> [CDecl] -> Attributes -> NodeInfo -> m CompType-tCompType tag sue_ref member_decls attrs node- = return (CompType tag sue_ref) `ap`- (concatMapM tMemberDecls member_decls) `ap`- (return attrs) `ap`- (return node)---- | translate a enum type decl------ > enum my_enum--- > enum your_enum { x, y=3 }----tEnumTypeDecl :: (MonadTrav m) => Bool -> CEnum -> m EnumTypeRef-tEnumTypeDecl handle_def (CEnum ident_opt enumerators_opt attrs node_info)- | (Nothing, Nothing) <- (ident_opt, enumerators_opt) = astError node_info "both definition and name of enum missing"- | Just [] <- enumerators_opt = astError node_info "empty enumerator list"- | otherwise- = do sue_ref <- createSUERef node_info ident_opt- attrs' <- mapM tAttr attrs- let decl = EnumTypeRef sue_ref node_info- when handle_def $- maybeM enumerators_opt $ \enumerators ->- tEnumType sue_ref enumerators attrs' node_info- >>= (handleTagDef . EnumDef)- return decl---- | translate and analyse an enumeration type-tEnumType :: (MonadCError m, MonadSymtab m) =>- SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType-tEnumType sue_ref enumerators attrs node = do- mapM_ handleEnumeratorDef enumerators'- return ty- where- ty = EnumType sue_ref enumerators' attrs node- (_,enumerators') = mapAccumL nextEnumerator (Left 0) enumerators- nextEnumerator memo (ident,e) =- let (memo',expr) = nextEnrExpr memo e in- (memo', Enumerator ident expr ty (nodeInfo ident))- nextEnrExpr :: Either Integer (Expr,Integer) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr)- nextEnrExpr (Left i) Nothing = (Left (succ i), intExpr i)- nextEnrExpr (Right (e,offs)) Nothing = (Right (e, succ offs), offsExpr e offs)- nextEnrExpr _ (Just e) = (Right (e,1), e)- intExpr i = CConst (CIntConst (cInteger i) undefNode)- offsExpr e offs = CBinary CAddOp e (intExpr offs) undefNode---- | Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier.-tNumType :: (MonadCError m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType)-tNumType (NumTypeSpec basetype sgn sz iscomplex) =- case (basetype,sgn,sz) of- (BaseChar,_,NoSizeMod) | Signed <- sgn -> intType TySChar- | Unsigned <- sgn -> intType TyUChar- | otherwise -> intType TyChar- (intbase, _, NoSizeMod) | optBase BaseInt intbase ->- intType$ case sgn of- Unsigned -> TyUInt- _ -> TyInt- (intbase, _, NoSizeMod) | optBase BaseInt128 intbase ->- intType$ case sgn of- Unsigned -> TyUInt128- _ -> TyInt128- (intbase, signed, sizemod) | optBase BaseInt intbase, optSign Signed signed ->- intType$ case sizemod of ShortMod -> TyShort- LongMod -> TyLong- LongLongMod -> TyLLong- _ -> internalErr "numTypeMapping: unexpected pattern matching error"- (intbase, Unsigned, sizemod) | optBase BaseInt intbase ->- intType$ case sizemod of ShortMod -> TyUShort- LongMod -> TyULong- LongLongMod -> TyULLong- _ -> internalErr "numTypeMapping: unexpected pattern matching error"- (BaseFloat, NoSignSpec, NoSizeMod) -> floatType TyFloat- (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble- (BaseDouble, NoSignSpec, LongMod) -> floatType TyLDouble- -- TODO: error analysis- (_,_,_) -> error "Bad AST analysis"- where- optBase _ NoBaseType = True- optBase expect baseTy = expect == baseTy- optSign _ NoSignSpec = True- optSign expect sign = expect == sign- intType = return . Right- floatType ft = return (Left (ft,iscomplex))---- TODO: currently bogus-tArraySize :: (MonadTrav m) => CArrSize -> m ArraySize-tArraySize (CNoArrSize False) = return (UnknownArraySize False)-tArraySize (CNoArrSize True) = return (UnknownArraySize True)-tArraySize (CArrSize static szexpr) = liftM (ArraySize static) (return szexpr)--tTypeQuals :: (MonadTrav m) => [CTypeQual] -> m (TypeQuals,Attributes)-tTypeQuals = foldrM go (noTypeQuals,[]) where- go (CConstQual _) (tq,attrs) = return (tq { constant = True },attrs)- go (CVolatQual _) (tq,attrs) = return (tq { volatile = True },attrs)- go (CRestrQual _) (tq,attrs) = return (tq { restrict = True },attrs)- go (CAtomicQual _) (tq,attrs) = return (tq { atomic = True },attrs)- go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr)- go (CNullableQual _) (tq,attrs) = return (tq { nullable = True }, attrs)- go (CNonnullQual _) (tq,attrs) = return (tq { nonnull = True }, attrs)---- * analysis---{--To canoicalize type specifiers, we define a canonical form:-void | bool | (char|int|int128|float|double)? (signed|unsigned)? (long long?)? complex? | othertype--}-data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseInt128 | BaseFloat | BaseDouble deriving (Eq,Ord)-data SignSpec = NoSignSpec | Signed | Unsigned deriving (Eq,Ord)-data SizeMod = NoSizeMod | ShortMod | LongMod | LongLongMod deriving (Eq,Ord)-data NumTypeSpec = NumTypeSpec { base :: NumBaseType, signSpec :: SignSpec, sizeMod :: SizeMod, isComplex :: Bool }-emptyNumTypeSpec :: NumTypeSpec-emptyNumTypeSpec = NumTypeSpec { base = NoBaseType, signSpec = NoSignSpec, sizeMod = NoSizeMod, isComplex = False }-data TypeSpecAnalysis =- TSNone | TSVoid | TSBool | TSNum NumTypeSpec |- TSTypeDef TypeDefRef | TSType Type | TSNonBasic CTypeSpec--canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis-canonicalTypeSpec = foldrM go TSNone where- getNTS TSNone = Just emptyNumTypeSpec- getNTS (TSNum nts) = Just nts- getNTS _ = Nothing- updLongMod NoSizeMod = Just LongMod- updLongMod LongMod = Just LongLongMod- updLongMod _ = Nothing- go :: (MonadTrav m) => CTypeSpec -> TypeSpecAnalysis -> m TypeSpecAnalysis- go (CVoidType _) TSNone = return TSVoid- go (CBoolType _) TSNone = return TSBool- go (CCharType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa- = return$ TSNum$ nts { base = BaseChar }- go (CIntType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa- = return$ TSNum$ nts { base = BaseInt }- go (CInt128Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa- = return$ TSNum$ nts { base = BaseInt128 }- go (CFloatType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa- = return$ TSNum$ nts { base = BaseFloat }- go (CDoubleType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa- = return$ TSNum$ nts { base = BaseDouble }- go (CShortType _) tsa | (Just nts@(NumTypeSpec { sizeMod = NoSizeMod })) <- getNTS tsa- = return$ TSNum$nts { sizeMod = ShortMod }- go (CLongType _) tsa | (Just nts@(NumTypeSpec { sizeMod = szMod })) <- getNTS tsa,- (Just szMod') <- updLongMod szMod- = return$ TSNum$ nts { sizeMod = szMod' }- go (CSignedType _) tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa- = return$ TSNum$ nts { signSpec = Signed }- go (CUnsigType _) tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa- = return$ TSNum$ nts { signSpec = Unsigned }- go (CComplexType _) tsa | (Just nts@(NumTypeSpec { isComplex = False })) <- getNTS tsa- = return$ TSNum$ nts { isComplex = True }- go (CTypeDef i ni) TSNone = liftM TSTypeDef $ typeDefRef ni i- go (CTypeOfType d _ni) TSNone = liftM TSType $ analyseTypeDecl d- go (CTypeOfExpr e _) TSNone = liftM TSType $ tExpr [] RValue e- -- todo: atomic qualifier discarded- go (CAtomicType d _ni) TSNone = liftM TSType $ analyseTypeDecl d- go otherType TSNone = return$ TSNonBasic otherType- go ty _ts = astError (nodeInfo ty) "Invalid type specifier"---- compute storage given storage specifiers-canonicalStorageSpec :: (MonadCError m) =>[CStorageSpec] -> m StorageSpec-canonicalStorageSpec storagespecs = liftM elideAuto $ foldrM updStorage NoStorageSpec storagespecs where- updStorage (CAuto _) NoStorageSpec = return AutoSpec- updStorage (CRegister _) NoStorageSpec = return RegSpec- updStorage (CThread _) NoStorageSpec = return ThreadSpec- updStorage (CThread _) (StaticSpec _) = return$ StaticSpec True- updStorage (CThread _) (ExternSpec _) = return$ ExternSpec True- updStorage (CStatic _) NoStorageSpec = return$ StaticSpec False- updStorage (CExtern _) NoStorageSpec = return$ ExternSpec False- updStorage (CStatic _) ThreadSpec = return$ StaticSpec True- updStorage (CExtern _) ThreadSpec = return$ ExternSpec True- updStorage badSpec old- = astError (nodeInfo badSpec) $ "Invalid storage specifier "++render (pretty badSpec)++" in combination with "++show old- elideAuto AutoSpec = NoStorageSpec- elideAuto spec = spec---- | convert old style parameters------ This requires matching parameter names and declarations, as in the following example:------ > int f(d,c,a,b)--- > char a,*b;--- > int c;--- > { }------ is converted to------ > int f(int d, int c, char a, char* b)------ TODO: This could be moved to syntax, as it operates on the AST only-mergeOldStyle :: (MonadCError m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr]-mergeOldStyle _node [] declrs = return declrs-mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) =- case params of- Left list -> do- -- FIXME: This translation doesn't work in the following example- -- [| int f(b,a) struct x { }; int b,a; { struct x local; return local.x } |]- oldstyle_params' <- liftM concat $ mapM splitCDecl oldstyle_params- param_map <- liftM Map.fromList $ mapM attachNameOfDecl oldstyle_params'- (newstyle_params,param_map') <- foldrM insertParamDecl ([],param_map) list- unless (Map.null param_map') $- astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter"- return (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds)- Right _newstyle -> astError node "oldstyle parameter list, but newstyle function declaration"- where- attachNameOfDecl decl = nameOfDecl decl >>= \n -> return (n,decl)- insertParamDecl param_name (ps, param_map)- = case Map.lookup param_name param_map of- Just p -> return (p:ps, Map.delete param_name param_map)- Nothing -> return (implicitIntParam param_name : ps, param_map)- implicitIntParam param_name =- let nInfo = nodeInfo param_name in- CDecl [CTypeSpec (CIntType nInfo)] [(Just (CDeclr (Just param_name) [] Nothing [] nInfo),Nothing,Nothing)] nInfo- showParamMap = intercalate ", " . map identToString . Map.keys-mergeOldStyle node _ _ = astError node "oldstyle parameter list, but not function type"---- | split a CDecl into declarators, hereby eliding SUE defs from the second declarator on.------ There are several reasons why this isn't the preferred way for handling multiple-declarator declarations,--- but it can be convinient some times.------ > splitCDecl [d| struct x { int z; } a,*b; |]--- > [ [d| struct x { int z; } a, struct x *b; |] ]------ /TODO/: This could be moved to syntax, as it operates on the AST only-splitCDecl :: (MonadCError m) => CDecl -> m [CDecl]-splitCDecl decl@(CStaticAssert _ _ _) = return [decl]-splitCDecl decl@(CDecl declspecs declrs node) =- case declrs of- [] -> internalErr "splitCDecl applied to empty declaration"- -- single declarator, not need to split- [_declr] -> return [decl]- -- more than one declarator- (d1:ds) ->- let declspecs' = map elideSUEDef declspecs in- return$ (CDecl declspecs [d1] node) : [ CDecl declspecs' [declr] node | declr <- ds ]- where- elideSUEDef declspec@(CTypeSpec tyspec) =- case tyspec of- (CEnumType (CEnum name _def _attrs enum_node) node_info) ->- CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node_info)- (CSUType (CStruct tag name _def _attrs su_node) node_info) ->- CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node_info)- _ -> declspec- elideSUEDef declspec = declspec----- | translate @__attribute__@ annotations--- TODO: This is a unwrap and wrap stub-tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr-tAttr (CAttr name cexpr node) = return$ Attr name cexpr node----- | construct a name for a variable--- TODO: more or less bogus-mkVarName :: (MonadCError m, MonadSymtab m) =>- NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName-mkVarName _node Nothing _ = return NoName-mkVarName _node (Just n) asm = return $ VarName n asm---- helpers-nameOfDecl :: (MonadCError m) => CDecl -> m Ident-nameOfDecl d = getOnlyDeclr d >>= \declr ->- case declr of- (CDeclr (Just name) _ _ _ _node) -> return name- (CDeclr Nothing _ _ _ _node) -> internalErr "nameOfDecl: abstract declarator"-emptyDeclr :: NodeInfo -> CDeclr-emptyDeclr node = CDeclr Nothing [] Nothing [] node-getOnlyDeclr :: (MonadCError m) => CDecl -> m CDeclr-getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr-getOnlyDeclr (CDecl _ _ _node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator"-getOnlyDeclr (CStaticAssert _ _ _) = internalErr "getOnlyDeclr: static assertion doesn't have a unique declarator"+{-# LANGUAGE PatternGuards, FlexibleContexts #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Analysis.DeclAnalysis +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : alpha +-- Portability : ghc +-- +-- This module performs the analysis of declarations and the translation of +-- type specifications in the AST. +----------------------------------------------------------------------------- +module Language.C.Analysis.DeclAnalysis ( + -- * Translating types + analyseTypeDecl, + tType,tDirectType,tNumType,tArraySize,tTypeQuals, + mergeOldStyle, + -- * Dissecting type specs + canonicalTypeSpec, NumBaseType(..),SignSpec(..),SizeMod(..),NumTypeSpec(..),TypeSpecAnalysis(..), + canonicalStorageSpec, StorageSpec(..), hasThreadLocalSpec, isTypeDef, + -- * Helpers + VarDeclInfo(..), + tAttr,mkVarName,getOnlyDeclr,nameOfDecl,analyseVarDecl,analyseVarDecl' +) +where +import Language.C.Data.Error +import Language.C.Data.Node +import Language.C.Data.Ident +import Language.C.Pretty +import Language.C.Syntax +import {-# SOURCE #-} Language.C.Analysis.AstAnalysis (tExpr, ExprSide(..)) +import Language.C.Analysis.DefTable (TagFwdDecl(..), insertType) +import Language.C.Analysis.SemError +import Language.C.Analysis.SemRep +import Language.C.Analysis.TravMonad + +import Data.Foldable as F (foldrM) +import Control.Monad (liftM,when,ap,unless,zipWithM) +import Data.List (intercalate, mapAccumL) +import qualified Data.Map as Map +import Text.PrettyPrint.HughesPJ + + +-- * handling declarations + +-- | analyse and translate a parameter declaration +-- Should be called in either prototype or block scope +tParamDecl :: (MonadTrav m) => CDecl -> m ParamDecl +tParamDecl (CStaticAssert _ _ node) = + astError node "expected parameter, not static assertion" +tParamDecl (CDecl declspecs declrs node) = + do declr <- getParamDeclr + -- analyse the variable declaration + (VarDeclInfo name fun_spec storage_spec attrs ty declr_node) <- analyseVarDecl' True declspecs declr [] Nothing + when (isInline fun_spec || isNoreturn fun_spec) $ + throwTravError (badSpecifierError node "parameter declaration with function specifier") + -- compute storage of parameter (NoStorage, but might have a register specifier) + storage <- throwOnLeft $ computeParamStorage node storage_spec + let paramDecl = mkParamDecl name storage attrs ty declr_node + -- XXX: we shouldn't modify the deftable here, just analyse and build representation + return paramDecl + where + getParamDeclr = + case declrs of + [] -> return (emptyDeclr node) + [(Just declr,Nothing,Nothing)] -> return declr + _ -> astError node "bad parameter declaration: multiple decls / bitfield or initializer present" + mkParamDecl name storage attrs ty declr_node = + let vd = VarDecl name (DeclAttrs noFunctionAttrs storage attrs) ty in + case name of + NoName -> AbstractParamDecl vd declr_node + _ -> ParamDecl vd declr_node + +-- | a parameter declaration has no linkage and either auto or register storage +computeParamStorage :: NodeInfo -> StorageSpec -> Either BadSpecifierError Storage +computeParamStorage _ NoStorageSpec = Right (Auto False) +computeParamStorage _ RegSpec = Right (Auto True) +computeParamStorage node spec = Left . badSpecifierError node $ "Bad storage specified for parameter: " ++ show spec + +-- | analyse and translate a member declaration +tMemberDecls :: (MonadTrav m) => CDecl -> m [MemberDecl] +-- Anonymous struct or union members +-- TODO storage specs, align specs and attributes are ignored +tMemberDecls (CStaticAssert _ _ node) = + astError node "expected struct or union member, found static assertion" +tMemberDecls (CDecl declspecs [] node) = + do let (_storage_specs, _attrs, typequals, typespecs, funspecs, _alignspecs) = + partitionDeclSpecs declspecs + unless (null funspecs) $ astError node "member declaration with function specifier" + canonTySpecs <- canonicalTypeSpec typespecs + ty <- tType True node typequals canonTySpecs [] [] + case ty of + DirectType (TyComp _) _ _ -> + return $ [MemberDecl + -- XXX: are these DeclAttrs correct? + (VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty) + Nothing node] + _ -> astError node "anonymous member has a non-composite type" +-- Named members +tMemberDecls (CDecl declspecs declrs node) = zipWithM tMemberDecl (True:repeat False) declrs + where + tMemberDecl handle_sue_def (Just member_declr,Nothing,bit_field_size_opt) = + -- TODO: use analyseVarDecl here, not analyseVarDecl' + do var_decl <- analyseVarDecl' handle_sue_def declspecs member_declr [] Nothing + let (VarDeclInfo name fun_spec storage_spec attrs ty _node_info) = var_decl + -- + checkValidMemberSpec fun_spec storage_spec + return $ MemberDecl (VarDecl name (DeclAttrs noFunctionAttrs NoStorage attrs) ty) + bit_field_size_opt node + tMemberDecl handle_sue_def (Nothing,Nothing,Just bit_field_size) = + do let (storage_specs, _attrs, typequals, typespecs, _funspecs, _alignspecs) = partitionDeclSpecs declspecs + -- TODO: funspecs/alignspecs not yet processed + _storage_spec <- canonicalStorageSpec storage_specs + -- TODO: storage_spec not used + canonTySpecs <- canonicalTypeSpec typespecs + typ <- tType handle_sue_def node typequals canonTySpecs [] [] + -- + return $ AnonBitField typ bit_field_size node + tMemberDecl _ _ = astError node "Bad member declaration" + checkValidMemberSpec fun_spec storage_spec = + do when (fun_spec /= noFunctionAttrs) $ astError node "member declaration with inline specifier" + when (storage_spec /= NoStorageSpec) $ astError node "storage specifier for member" + return () + +data StorageSpec = NoStorageSpec | AutoSpec | RegSpec | ThreadSpec | StaticSpec Bool | ExternSpec Bool + deriving (Eq,Ord,Show,Read) + +hasThreadLocalSpec :: StorageSpec -> Bool +hasThreadLocalSpec ThreadSpec = True +hasThreadLocalSpec (StaticSpec b) = b +hasThreadLocalSpec (ExternSpec b) = b +hasThreadLocalSpec _ = False + +data VarDeclInfo = VarDeclInfo VarName FunctionAttrs StorageSpec Attributes Type NodeInfo + +analyseVarDecl' :: (MonadTrav m) => + Bool -> [CDeclSpec] -> + CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo +analyseVarDecl' handle_sue_def declspecs declr oldstyle init_opt = + do let (storage_specs, attrs, type_quals, type_specs, funspecs, _alignspecs) = + partitionDeclSpecs declspecs + canonTySpecs <- canonicalTypeSpec type_specs + -- TODO: alignspecs not yet processed + analyseVarDecl handle_sue_def storage_specs attrs type_quals canonTySpecs funspecs + declr oldstyle init_opt + +-- | analyse declarators +analyseVarDecl :: (MonadTrav m) => + Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] -> + TypeSpecAnalysis -> [CFunSpec] -> + CDeclr -> [CDecl] -> Maybe CInit -> m VarDeclInfo +analyseVarDecl handle_sue_def storage_specs decl_attrs typequals canonTySpecs fun_specs + (CDeclr name_opt derived_declrs asmname_opt declr_attrs node) + oldstyle_params _init_opt + = do -- analyse the storage specifiers + storage_spec <- canonicalStorageSpec storage_specs + -- translate the type into semantic representation + typ <- tType handle_sue_def node typequals canonTySpecs derived_declrs oldstyle_params + -- translate attributes + attrs' <- mapM tAttr (decl_attrs ++ declr_attrs) + -- make name + name <- mkVarName node name_opt asmname_opt + return $ VarDeclInfo name function_spec storage_spec attrs' typ node + where + updateFunSpec (CInlineQual _) f = f { isInline = True } + updateFunSpec (CNoreturnQual _) f = f { isNoreturn = True } + function_spec = foldr updateFunSpec noFunctionAttrs fun_specs + +-- return @True@ if the declarations is a type def +isTypeDef :: [CDeclSpec] -> Bool +isTypeDef declspecs = not $ null [ n | (CStorageSpec (CTypedef n)) <- declspecs ] + +-- * translation + +-- | get the type of a /type declaration/ +-- +-- A type declaration @T@ may appear in thre forms: +-- +-- * @typeof(T)@ +-- +-- * as abstract declarator in a function prototype, as in @f(int)@ +-- +-- * in a declaration without declarators, as in @struct x { int a } ;@ +-- +-- Currently, @analyseTypeDecl@ is exlusively used for analysing types for GNU's @typeof(T)@. +-- +-- We move attributes to the type, as they have no meaning for the abstract declarator +analyseTypeDecl :: (MonadTrav m) => CDecl -> m Type +analyseTypeDecl (CStaticAssert _ _ node) = + astError node "Expected type declaration, found static assert" +analyseTypeDecl (CDecl declspecs declrs node) + | [] <- declrs = analyseTyDeclr (emptyDeclr node) + | [(Just declr,Nothing,Nothing)] <- declrs = analyseTyDeclr declr + | otherwise = astError node "Bad declarator for type declaration" + where + analyseTyDeclr (CDeclr Nothing derived_declrs Nothing attrs _declrnode) + | (not (null storagespec) || not (null funspecs) || not (null alignspecs)) = + astError node "storage, function or alignment specifier for type declaration" + | otherwise = + do canonTySpecs <- canonicalTypeSpec typespecs + t <- tType True node (map CAttrQual (attrs++attrs_decl) ++ typequals) + canonTySpecs derived_declrs [] + case nameOfNode node of + Just n -> withDefTable (\dt -> (t, insertType dt n t)) + Nothing -> return t + where + (storagespec, attrs_decl, typequals, typespecs, funspecs, alignspecs) = partitionDeclSpecs declspecs + analyseTyDeclr _ = astError node "Non-abstract declarator in type declaration" + + +-- | translate a type +tType :: (MonadTrav m) => Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> [CDerivedDeclr] -> [CDecl] -> m Type +tType handle_sue_def top_node typequals canonTySpecs derived_declrs oldstyle_params + = mergeOldStyle top_node oldstyle_params derived_declrs >>= buildType + where + buildType [] = + tDirectType handle_sue_def top_node typequals canonTySpecs + buildType (CPtrDeclr ptrquals node : dds) = + buildType dds >>= buildPointerType ptrquals node + buildType (CArrDeclr arrquals size node : dds) + = buildType dds >>= buildArrayType arrquals size node + buildType (CFunDeclr (Right (params, isVariadic)) attrs node : dds) + = buildType dds >>= (liftM (uncurry FunctionType) . buildFunctionType params isVariadic attrs node) + buildType (CFunDeclr (Left _) _ _ : _) + -- /FIXME/: this is really an internal error, not an AST error. + = astError top_node "old-style parameters remaining after mergeOldStyle" + buildPointerType ptrquals _node inner_ty + = liftM (\(quals,attrs) -> PtrType inner_ty quals attrs) (tTypeQuals ptrquals) + buildArrayType arr_quals size _node inner_ty + = do (quals,attrs) <- tTypeQuals arr_quals + arr_sz <- tArraySize size + return$ ArrayType inner_ty arr_sz quals attrs + -- We build functions in function prototype scope. + -- When analyzing the the function body, we push parameters in function body scope. + buildFunctionType params is_variadic attrs _node return_ty + = do enterPrototypeScope + params' <- mapM tParamDecl params + leavePrototypeScope + attrs' <- mapM tAttr attrs + return $ (\t -> (t,attrs')) $ + case (map declType params',is_variadic) of + ([],False) -> FunTypeIncomplete return_ty -- may be improved later on + ([DirectType TyVoid _ _],False) -> FunType return_ty [] False + _ -> FunType return_ty params' is_variadic + +-- | translate a type without (syntactic) indirections +-- Due to the GNU @typeof@ extension and typeDefs, this can be an arbitrary type +tDirectType :: (MonadTrav m) => + Bool -> NodeInfo -> [CTypeQual] -> TypeSpecAnalysis -> m Type +tDirectType handle_sue_def node ty_quals canonTySpec = do + (quals,attrs) <- tTypeQuals ty_quals + let baseType ty_name = DirectType ty_name quals attrs + case canonTySpec of + TSNone -> return$ baseType (TyIntegral TyInt) + TSVoid -> return$ baseType TyVoid + TSBool -> return$ baseType (TyIntegral TyBool) + TSNum tsnum -> do + numType <- tNumType tsnum + return . baseType $ + case numType of + Left (floatType,iscomplex) | iscomplex -> TyComplex floatType + | otherwise -> TyFloating floatType + Right intType -> TyIntegral intType + TSTypeDef tdr -> return$ TypeDefType tdr quals attrs + TSNonBasic (CSUType su _tnode) -> liftM (baseType . TyComp) $ tCompTypeDecl handle_sue_def su + TSNonBasic (CEnumType enum _tnode) -> liftM (baseType . TyEnum) $ tEnumTypeDecl handle_sue_def enum + TSType t -> mergeTypeAttributes node quals attrs t + TSNonBasic t -> astError node ("Unexpected typespec: " ++ show t) + +-- | Merge type attributes +-- +-- This handles for example the form +-- +-- > /* tyqual attr typeof(type) */ +-- > const typeof(char volatile) x; +mergeTypeAttributes :: (MonadCError m) => NodeInfo -> TypeQuals -> [Attr] -> Type -> m Type +mergeTypeAttributes node_info quals attrs typ = + case typ of + DirectType ty_name quals' attrs' -> merge quals' attrs' $ DirectType ty_name + PtrType ty quals' attrs' -> merge quals' attrs' $ PtrType ty + ArrayType ty array_sz quals' attrs' -> merge quals' attrs' $ ArrayType ty array_sz + FunctionType fty attrs' + | quals /= noTypeQuals -> astError node_info "type qualifiers for function type" + | otherwise -> return$ FunctionType fty (attrs' ++ attrs) + TypeDefType tdr quals' attrs' + -> merge quals' attrs' $ TypeDefType tdr + where + merge quals' attrs' tyf = return $ tyf (mergeTypeQuals quals quals') (attrs' ++ attrs) + +typeDefRef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m TypeDefRef +typeDefRef t_node name = lookupTypeDef name >>= \ty -> return (TypeDefRef name ty t_node) + +-- extract a struct\/union +-- we emit @declStructUnion@ and @defStructUnion@ actions +-- +-- TODO: should attributes be part of declarartions too ? +tCompTypeDecl :: (MonadTrav m) => Bool -> CStructUnion -> m CompTypeRef +tCompTypeDecl handle_def (CStruct tag ident_opt member_decls_opt attrs node_info) = do + -- create reference + sue_ref <- createSUERef node_info ident_opt + let tag' = tTag tag + attrs' <- mapM tAttr attrs + -- record tag name + let decl = CompTypeRef sue_ref tag' node_info + handleTagDecl (CompDecl decl) + -- when handle_def is true, enter the definition + when handle_def $ + maybeM member_decls_opt $ \decls -> + tCompType sue_ref tag' decls attrs' node_info + >>= (handleTagDef.CompDef) + return decl + +tTag :: CStructTag -> CompTyKind +tTag CStructTag = StructTag +tTag CUnionTag = UnionTag + +tCompType :: (MonadTrav m) => SUERef -> CompTyKind -> [CDecl] -> Attributes -> NodeInfo -> m CompType +tCompType tag sue_ref member_decls attrs node + = return (CompType tag sue_ref) `ap` + (concatMapM tMemberDecls member_decls) `ap` + (return attrs) `ap` + (return node) + +-- | translate a enum type decl +-- +-- > enum my_enum +-- > enum your_enum { x, y=3 } +-- +tEnumTypeDecl :: (MonadTrav m) => Bool -> CEnum -> m EnumTypeRef +tEnumTypeDecl handle_def (CEnum ident_opt enumerators_opt attrs node_info) + | (Nothing, Nothing) <- (ident_opt, enumerators_opt) = astError node_info "both definition and name of enum missing" + | Just [] <- enumerators_opt = astError node_info "empty enumerator list" + | otherwise + = do sue_ref <- createSUERef node_info ident_opt + attrs' <- mapM tAttr attrs + let decl = EnumTypeRef sue_ref node_info + when handle_def $ + maybeM enumerators_opt $ \enumerators -> + tEnumType sue_ref enumerators attrs' node_info + >>= (handleTagDef . EnumDef) + return decl + +-- | translate and analyse an enumeration type +tEnumType :: (MonadCError m, MonadSymtab m) => + SUERef -> [(Ident, Maybe CExpr)] -> Attributes -> NodeInfo -> m EnumType +tEnumType sue_ref enumerators attrs node = do + mapM_ handleEnumeratorDef enumerators' + return ty + where + ty = EnumType sue_ref enumerators' attrs node + (_,enumerators') = mapAccumL nextEnumerator (Left 0) enumerators + nextEnumerator memo (ident,e) = + let (memo',expr) = nextEnrExpr memo e in + (memo', Enumerator ident expr ty (nodeInfo ident)) + nextEnrExpr :: Either Integer (Expr,Integer) -> Maybe CExpr -> (Either Integer (Expr,Integer), CExpr) + nextEnrExpr (Left i) Nothing = (Left (succ i), intExpr i) + nextEnrExpr (Right (e,offs)) Nothing = (Right (e, succ offs), offsExpr e offs) + nextEnrExpr _ (Just e) = (Right (e,1), e) + intExpr i = CConst (CIntConst (cInteger i) undefNode) + offsExpr e offs = CBinary CAddOp e (intExpr offs) undefNode + +-- | Mapping from num type specs to C types (C99 6.7.2-2), ignoring the complex qualifier. +tNumType :: (MonadCError m) => NumTypeSpec -> m (Either (FloatType,Bool) IntType) +tNumType (NumTypeSpec basetype sgn sz iscomplex) = + case (basetype,sgn,sz) of + (BaseChar,_,NoSizeMod) | Signed <- sgn -> intType TySChar + | Unsigned <- sgn -> intType TyUChar + | otherwise -> intType TyChar + (intbase, _, NoSizeMod) | optBase BaseInt intbase -> + intType$ case sgn of + Unsigned -> TyUInt + _ -> TyInt + (intbase, _, NoSizeMod) | optBase BaseInt128 intbase -> + intType$ case sgn of + Unsigned -> TyUInt128 + _ -> TyInt128 + (intbase, signed, sizemod) | optBase BaseInt intbase, optSign Signed signed -> + intType$ case sizemod of ShortMod -> TyShort + LongMod -> TyLong + LongLongMod -> TyLLong + _ -> internalErr "numTypeMapping: unexpected pattern matching error" + (intbase, Unsigned, sizemod) | optBase BaseInt intbase -> + intType$ case sizemod of ShortMod -> TyUShort + LongMod -> TyULong + LongLongMod -> TyULLong + _ -> internalErr "numTypeMapping: unexpected pattern matching error" + (BaseFloat, NoSignSpec, NoSizeMod) -> floatType TyFloat + (BaseDouble, NoSignSpec, NoSizeMod) -> floatType TyDouble + (BaseDouble, NoSignSpec, LongMod) -> floatType TyLDouble + (BaseFloat128, NoSignSpec, NoSizeMod) -> floatType TyFloat128 + -- TODO: error analysis + (_,_,_) -> error "Bad AST analysis" + where + optBase _ NoBaseType = True + optBase expect baseTy = expect == baseTy + optSign _ NoSignSpec = True + optSign expect sign = expect == sign + intType = return . Right + floatType ft = return (Left (ft,iscomplex)) + +-- TODO: currently bogus +tArraySize :: (MonadTrav m) => CArrSize -> m ArraySize +tArraySize (CNoArrSize False) = return (UnknownArraySize False) +tArraySize (CNoArrSize True) = return (UnknownArraySize True) +tArraySize (CArrSize static szexpr) = liftM (ArraySize static) (return szexpr) + +tTypeQuals :: (MonadTrav m) => [CTypeQual] -> m (TypeQuals,Attributes) +tTypeQuals = foldrM go (noTypeQuals,[]) where + go (CConstQual _) (tq,attrs) = return (tq { constant = True },attrs) + go (CVolatQual _) (tq,attrs) = return (tq { volatile = True },attrs) + go (CRestrQual _) (tq,attrs) = return (tq { restrict = True },attrs) + go (CAtomicQual _) (tq,attrs) = return (tq { atomic = True },attrs) + go (CAttrQual attr) (tq,attrs) = liftM (\attr' -> (tq,attr':attrs)) (tAttr attr) + go (CNullableQual _) (tq,attrs) = return (tq { nullable = True }, attrs) + go (CNonnullQual _) (tq,attrs) = return (tq { nonnull = True }, attrs) + +-- * analysis + + +{- +To canoicalize type specifiers, we define a canonical form: +void | bool | (char|int|int128|float|double|float128)? (signed|unsigned)? (long long?)? complex? | othertype +-} +data NumBaseType = NoBaseType | BaseChar | BaseInt | BaseInt128 | BaseFloat | BaseFloat128 | BaseDouble deriving (Eq,Ord) +data SignSpec = NoSignSpec | Signed | Unsigned deriving (Eq,Ord) +data SizeMod = NoSizeMod | ShortMod | LongMod | LongLongMod deriving (Eq,Ord) +data NumTypeSpec = NumTypeSpec { base :: NumBaseType, signSpec :: SignSpec, sizeMod :: SizeMod, isComplex :: Bool } +emptyNumTypeSpec :: NumTypeSpec +emptyNumTypeSpec = NumTypeSpec { base = NoBaseType, signSpec = NoSignSpec, sizeMod = NoSizeMod, isComplex = False } +data TypeSpecAnalysis = + TSNone | TSVoid | TSBool | TSNum NumTypeSpec | + TSTypeDef TypeDefRef | TSType Type | TSNonBasic CTypeSpec + +canonicalTypeSpec :: (MonadTrav m) => [CTypeSpec] -> m TypeSpecAnalysis +canonicalTypeSpec = foldrM go TSNone where + getNTS TSNone = Just emptyNumTypeSpec + getNTS (TSNum nts) = Just nts + getNTS _ = Nothing + updLongMod NoSizeMod = Just LongMod + updLongMod LongMod = Just LongLongMod + updLongMod _ = Nothing + go :: (MonadTrav m) => CTypeSpec -> TypeSpecAnalysis -> m TypeSpecAnalysis + go (CVoidType _) TSNone = return TSVoid + go (CBoolType _) TSNone = return TSBool + go (CCharType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa + = return$ TSNum$ nts { base = BaseChar } + go (CIntType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa + = return$ TSNum$ nts { base = BaseInt } + go (CInt128Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa + = return$ TSNum$ nts { base = BaseInt128 } + go (CFloatType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa + = return$ TSNum$ nts { base = BaseFloat } + go (CFloat128Type _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa + = return$ TSNum$ nts { base = BaseFloat128 } + go (CDoubleType _) tsa | (Just nts@(NumTypeSpec { base = NoBaseType })) <- getNTS tsa + = return$ TSNum$ nts { base = BaseDouble } + go (CShortType _) tsa | (Just nts@(NumTypeSpec { sizeMod = NoSizeMod })) <- getNTS tsa + = return$ TSNum$nts { sizeMod = ShortMod } + go (CLongType _) tsa | (Just nts@(NumTypeSpec { sizeMod = szMod })) <- getNTS tsa, + (Just szMod') <- updLongMod szMod + = return$ TSNum$ nts { sizeMod = szMod' } + go (CSignedType _) tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa + = return$ TSNum$ nts { signSpec = Signed } + go (CUnsigType _) tsa | (Just nts@(NumTypeSpec { signSpec = NoSignSpec })) <- getNTS tsa + = return$ TSNum$ nts { signSpec = Unsigned } + go (CComplexType _) tsa | (Just nts@(NumTypeSpec { isComplex = False })) <- getNTS tsa + = return$ TSNum$ nts { isComplex = True } + go (CTypeDef i ni) TSNone = liftM TSTypeDef $ typeDefRef ni i + go (CTypeOfType d _ni) TSNone = liftM TSType $ analyseTypeDecl d + go (CTypeOfExpr e _) TSNone = liftM TSType $ tExpr [] RValue e + -- todo: atomic qualifier discarded + go (CAtomicType d _ni) TSNone = liftM TSType $ analyseTypeDecl d + go otherType TSNone = return$ TSNonBasic otherType + go ty _ts = astError (nodeInfo ty) "Invalid type specifier" + +-- compute storage given storage specifiers +canonicalStorageSpec :: (MonadCError m) =>[CStorageSpec] -> m StorageSpec +canonicalStorageSpec storagespecs = liftM elideAuto $ foldrM updStorage NoStorageSpec storagespecs where + updStorage (CAuto _) NoStorageSpec = return AutoSpec + updStorage (CRegister _) NoStorageSpec = return RegSpec + updStorage (CThread _) NoStorageSpec = return ThreadSpec + updStorage (CThread _) (StaticSpec _) = return$ StaticSpec True + updStorage (CThread _) (ExternSpec _) = return$ ExternSpec True + updStorage (CStatic _) NoStorageSpec = return$ StaticSpec False + updStorage (CExtern _) NoStorageSpec = return$ ExternSpec False + updStorage (CStatic _) ThreadSpec = return$ StaticSpec True + updStorage (CExtern _) ThreadSpec = return$ ExternSpec True + updStorage badSpec old + = astError (nodeInfo badSpec) $ "Invalid storage specifier "++render (pretty badSpec)++" in combination with "++show old + elideAuto AutoSpec = NoStorageSpec + elideAuto spec = spec + +-- | convert old style parameters +-- +-- This requires matching parameter names and declarations, as in the following example: +-- +-- > int f(d,c,a,b) +-- > char a,*b; +-- > int c; +-- > { } +-- +-- is converted to +-- +-- > int f(int d, int c, char a, char* b) +-- +-- TODO: This could be moved to syntax, as it operates on the AST only +mergeOldStyle :: (MonadCError m) => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr] +mergeOldStyle _node [] declrs = return declrs +mergeOldStyle node oldstyle_params (CFunDeclr params attrs fdnode : dds) = + case params of + Left list -> do + -- FIXME: This translation doesn't work in the following example + -- [| int f(b,a) struct x { }; int b,a; { struct x local; return local.x } |] + oldstyle_params' <- liftM concat $ mapM splitCDecl oldstyle_params + param_map <- liftM Map.fromList $ mapM attachNameOfDecl oldstyle_params' + (newstyle_params,param_map') <- foldrM insertParamDecl ([],param_map) list + unless (Map.null param_map') $ + astError node $ "declarations for parameter(s) "++ showParamMap param_map' ++" but no such parameter" + return (CFunDeclr (Right (newstyle_params, False)) attrs fdnode : dds) + Right _newstyle -> astError node "oldstyle parameter list, but newstyle function declaration" + where + attachNameOfDecl decl = nameOfDecl decl >>= \n -> return (n,decl) + insertParamDecl param_name (ps, param_map) + = case Map.lookup param_name param_map of + Just p -> return (p:ps, Map.delete param_name param_map) + Nothing -> return (implicitIntParam param_name : ps, param_map) + implicitIntParam param_name = + let nInfo = nodeInfo param_name in + CDecl [CTypeSpec (CIntType nInfo)] [(Just (CDeclr (Just param_name) [] Nothing [] nInfo),Nothing,Nothing)] nInfo + showParamMap = intercalate ", " . map identToString . Map.keys +mergeOldStyle node _ _ = astError node "oldstyle parameter list, but not function type" + +-- | split a CDecl into declarators, hereby eliding SUE defs from the second declarator on. +-- +-- There are several reasons why this isn't the preferred way for handling multiple-declarator declarations, +-- but it can be convinient some times. +-- +-- > splitCDecl [d| struct x { int z; } a,*b; |] +-- > [ [d| struct x { int z; } a, struct x *b; |] ] +-- +-- /TODO/: This could be moved to syntax, as it operates on the AST only +splitCDecl :: (MonadCError m) => CDecl -> m [CDecl] +splitCDecl decl@(CStaticAssert _ _ _) = return [decl] +splitCDecl decl@(CDecl declspecs declrs node) = + case declrs of + [] -> internalErr "splitCDecl applied to empty declaration" + -- single declarator, not need to split + [_declr] -> return [decl] + -- more than one declarator + (d1:ds) -> + let declspecs' = map elideSUEDef declspecs in + return$ (CDecl declspecs [d1] node) : [ CDecl declspecs' [declr] node | declr <- ds ] + where + elideSUEDef declspec@(CTypeSpec tyspec) = + case tyspec of + (CEnumType (CEnum name _def _attrs enum_node) node_info) -> + CTypeSpec (CEnumType (CEnum name Nothing [] enum_node) node_info) + (CSUType (CStruct tag name _def _attrs su_node) node_info) -> + CTypeSpec (CSUType (CStruct tag name Nothing [] su_node) node_info) + _ -> declspec + elideSUEDef declspec = declspec + + +-- | translate @__attribute__@ annotations +-- TODO: This is a unwrap and wrap stub +tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr +tAttr (CAttr name cexpr node) = return$ Attr name cexpr node + + +-- | construct a name for a variable +-- TODO: more or less bogus +mkVarName :: (MonadCError m, MonadSymtab m) => + NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName +mkVarName _node Nothing _ = return NoName +mkVarName _node (Just n) asm = return $ VarName n asm + +-- helpers +nameOfDecl :: (MonadCError m) => CDecl -> m Ident +nameOfDecl d = getOnlyDeclr d >>= \declr -> + case declr of + (CDeclr (Just name) _ _ _ _node) -> return name + (CDeclr Nothing _ _ _ _node) -> internalErr "nameOfDecl: abstract declarator" +emptyDeclr :: NodeInfo -> CDeclr +emptyDeclr node = CDeclr Nothing [] Nothing [] node +getOnlyDeclr :: (MonadCError m) => CDecl -> m CDeclr +getOnlyDeclr (CDecl _ [(Just declr,_,_)] _) = return declr +getOnlyDeclr (CDecl _ _ _node) = internalErr "getOnlyDeclr: declaration doesn't have a unique declarator" +getOnlyDeclr (CStaticAssert _ _ _) = internalErr "getOnlyDeclr: static assertion doesn't have a unique declarator"
src/Language/C/Analysis/DefTable.hs view
@@ -1,331 +1,331 @@-{-# LANGUAGE PatternGuards, DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Analysis.DefTable--- Copyright : (c) 2008 Benedikt Huber--- based on code from c2hs--- (c) [1999..2001] Manuel M. T. Chakravarty--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : alpha--- Portability : ghc------ This module manages symbols in local and global scopes.------ There are four different kind of identifiers: ordinary identifiers (henceforth--- simply called `identifier'), tag names (names of struct\/union\/enum types),--- labels and structure members.-------------------------------------------------------------------------------module Language.C.Analysis.DefTable (- IdentEntry, identOfTyDecl,- TagEntry, TagFwdDecl(..),- DefTable(..),- emptyDefTable,- globalDefs,- inFileScope,- enterFunctionScope,leaveFunctionScope,enterBlockScope,leaveBlockScope,- enterMemberDecl,leaveMemberDecl,- DeclarationStatus(..),declStatusDescr,- defineTypeDef, defineGlobalIdent, defineScopedIdent, defineScopedIdentWhen,- declareTag,defineTag,defineLabel,lookupIdent,- lookupTag,lookupLabel,lookupIdentInner,lookupTagInner,- insertType, lookupType,- mergeDefTable-)-where-import Language.C.Data-import Language.C.Analysis.NameSpaceMap-import Language.C.Analysis.SemRep--import qualified Data.Map as Map-import Data.IntMap (IntMap, union)-import qualified Data.IntMap as IntMap-import Data.Generics--{- Name spaces, scopes and contexts [Scopes]-- In C, there are 4 categories of identifiers:-- * labels- * tag names (@(struct|union|enum) tag-name@), where /all/ tag names live in one namespace- * members of structures and unions- * ordinary identifiers, denoting objects, functions, typeDefs and enumeration constants-- There are 4 kind of scopes:-- * file scope: outside of parameter lists and blocks- * function prototype scope- * function scope: labels are visible within the entire function, and declared implicitely- * block scope-- While function scope is irrelevant for variable declarations, they might also appear in member declarations.- Therefore, there are also 4 kinds of contexts where a variable might be declared:-- * File Scope Context: external declaration \/ definition- * Block Scope Context: either external or local definition- * Function prototype scope context- * Member Declaration context-- See- <http://www.embedded.com/design/206901036>- C99 6--}---- | All ordinary identifiers map to 'IdenTyDecl': either a typedef or a object\/function\/enumerator-type IdentEntry = Either TypeDef IdentDecl--identOfTyDecl :: IdentEntry -> Ident-identOfTyDecl = either identOfTypeDef declIdent--data TagFwdDecl = CompDecl CompTypeRef- | EnumDecl EnumTypeRef-instance HasSUERef TagFwdDecl where- sueRef (CompDecl ctr) = sueRef ctr- sueRef (EnumDecl etr) = sueRef etr-instance CNode TagFwdDecl where- nodeInfo (CompDecl ctr) = nodeInfo ctr- nodeInfo (EnumDecl etr) = nodeInfo etr---- | Tag names map to forward declarations or definitions of struct\/union\/enum types-type TagEntry = Either TagFwdDecl TagDef---- | Table holding current definitions-data DefTable = DefTable- {- identDecls :: NameSpaceMap Ident IdentEntry, -- ^ declared `ordinary identifiers'- tagDecls :: NameSpaceMap SUERef TagEntry, -- ^ declared struct/union/enum tags- labelDefs :: NameSpaceMap Ident Ident, -- ^ defined labels- memberDecls :: NameSpaceMap Ident MemberDecl, -- ^ member declarations (only local)- refTable :: IntMap Name, -- ^ link names with definitions- typeTable :: IntMap Type- }---- | empty definition table, with all name space maps in global scope-emptyDefTable :: DefTable-emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty IntMap.empty---- | get the globally defined entries of a definition table-globalDefs :: DefTable -> GlobalDecls-globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl)- where- e = Map.empty- (_fwd_decls,gtags) = Map.mapEither id $ globalNames (tagDecls deftbl)- insertDecl ident (Left tydef) ds = ds { gTypeDefs = Map.insert ident tydef (gTypeDefs ds)}- insertDecl ident (Right obj) ds = ds { gObjs = Map.insert ident obj (gObjs ds) }--inFileScope :: DefTable -> Bool-inFileScope dt = not (hasLocalNames (identDecls dt) || hasLocalNames (labelDefs dt))--leaveScope_ :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a-leaveScope_ = fst . leaveScope--enterLocalScope :: DefTable -> DefTable-enterLocalScope deftbl = deftbl {- identDecls = enterNewScope (identDecls deftbl),- tagDecls = enterNewScope (tagDecls deftbl)- }-leaveLocalScope :: DefTable -> DefTable-leaveLocalScope deftbl = deftbl {- identDecls = leaveScope_ (identDecls deftbl),- tagDecls = leaveScope_ (tagDecls deftbl)- }---- | Enter function scope (AND the corresponding block scope)-enterFunctionScope :: DefTable -> DefTable-enterFunctionScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }---- | Leave function scope, and return the associated DefTable.--- Error if not in function scope.-leaveFunctionScope :: DefTable -> DefTable-leaveFunctionScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }---- | Enter new block scope-enterBlockScope :: DefTable -> DefTable-enterBlockScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) }---- | Leave innermost block scope-leaveBlockScope :: DefTable -> DefTable-leaveBlockScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) }---- | Enter new member declaration scope-enterMemberDecl :: DefTable -> DefTable-enterMemberDecl deftbl = deftbl { memberDecls = enterNewScope (memberDecls deftbl) }---- | Leave innermost member declaration scope-leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable)-leaveMemberDecl deftbl =- let (decls',members) = leaveScope (memberDecls deftbl)- in (,) (map snd members)- (deftbl { memberDecls = decls' })---- * declarations---- | Status of a declaration-data DeclarationStatus t =- NewDecl -- ^ new entry- | Redeclared t -- ^ old def was overwritten- | KeepDef t -- ^ new def was discarded- | Shadowed t -- ^ new def shadows one in outer scope- | KindMismatch t -- ^ kind mismatch- deriving (Data,Typeable)-declStatusDescr :: DeclarationStatus t -> String-declStatusDescr NewDecl = "new"-declStatusDescr (Redeclared _) = "redeclared"-declStatusDescr (KeepDef _) = "keep old"-declStatusDescr (Shadowed _) = "shadowed"-declStatusDescr (KindMismatch _) = "kind mismatch"--compatIdentEntry :: IdentEntry -> IdentEntry -> Bool-compatIdentEntry (Left _tydef) = either (const True) (const False)-compatIdentEntry (Right def) = either (const False) $- \other_def -> case (def,other_def) of- (EnumeratorDef _, EnumeratorDef _) -> True- (EnumeratorDef _, _) -> True- (_, EnumeratorDef _) -> True- (_,_) -> True--data TagEntryKind = CompKind CompTyKind | EnumKind- deriving (Eq,Ord)-instance Show TagEntryKind where- show (CompKind ctk) = show ctk- show EnumKind = "enum"---- | @sameTagKind ty1 ty2@ returns @True@ if @ty1,ty2@ are the same kind of tag (struct,union or enum)-tagKind :: TagEntry -> TagEntryKind-tagKind (Left (CompDecl cd)) = CompKind (compTag cd)-tagKind (Left (EnumDecl _)) = EnumKind-tagKind (Right (CompDef cd)) = CompKind (compTag cd)-tagKind (Right (EnumDef _)) = EnumKind--compatTagEntry :: TagEntry -> TagEntry -> Bool-compatTagEntry te1 te2 = tagKind te1 == tagKind te2--defRedeclStatus :: (t -> t -> Bool) -> t -> Maybe t -> DeclarationStatus t-defRedeclStatus sameKind def oldDecl =- case oldDecl of- Just def' | def `sameKind` def' -> Redeclared def'- | otherwise -> KindMismatch def'- Nothing -> NewDecl--defRedeclStatusLocal :: (Ord k) =>- (t -> t -> Bool) -> k -> t -> Maybe t -> NameSpaceMap k t -> DeclarationStatus t-defRedeclStatusLocal sameKind ident def oldDecl nsm =- case defRedeclStatus sameKind def oldDecl of- NewDecl -> case lookupName nsm ident of- Just shadowed -> Shadowed shadowed- Nothing -> NewDecl- redecl -> redecl--defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable)-defineTypeDef ident tydef deftbl =- (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' })- where- (decls', oldDecl) = defLocal (identDecls deftbl) ident (Left tydef)---- | declare\/define a global object\/function\/typeDef------ returns @Redeclared def@ if there is already an object\/function\/typeDef--- in global scope, or @DifferentKindRedec def@ if the old declaration is of a different kind.-defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)-defineGlobalIdent ident def deftbl =- (defRedeclStatus compatIdentEntry (Right def) oldDecl, deftbl { identDecls = decls' })- where- (decls',oldDecl) = defGlobal (identDecls deftbl) ident (Right def)--- | declare\/define a object\/function\/typeDef with lexical scope------ returns @Redeclared def@ or @DifferentKindRedec def@ if there is already an object\/function\/typeDef--- in the same scope.-defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable)-defineScopedIdent = defineScopedIdentWhen (const True)---- | declare\/define a object\/function\/typeDef with lexical scope, if the given predicate holds on the old--- entry.------ returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or--- @DifferentKindRedecl def@ if there is already an object\/function\/typeDef in the same scope.-defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable ->- (DeclarationStatus IdentEntry, DefTable)-defineScopedIdentWhen override_def ident def deftbl- = (redecl_status, deftbl { identDecls = decls' })- where- new_def = Right def- old_decls = identDecls deftbl- old_decl_opt = lookupInnermostScope old_decls ident- (decls',redecl_status) | (Just old_decl) <- old_decl_opt, not (old_decl `compatIdentEntry` new_def)- = (new_decls, KindMismatch old_decl)- | maybe True doOverride old_decl_opt- = (new_decls, redeclStatus' old_decl_opt)- | otherwise- = (old_decls, maybe NewDecl KeepDef old_decl_opt)- new_decls = fst (defLocal old_decls ident new_def)- doOverride (Left _) = False- doOverride (Right old_def) = override_def old_def- redeclStatus' overriden_decl = defRedeclStatusLocal compatIdentEntry ident new_def overriden_decl old_decls---- | declare a tag (fwd decl in case the struct name isn't defined yet)-declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable)-declareTag sueref decl deftbl =- case lookupTag sueref deftbl of- Nothing -> (NewDecl, deftbl { tagDecls = fst $ defLocal (tagDecls deftbl) sueref (Left decl) })- Just old_def | tagKind old_def == tagKind (Left decl) -> (KeepDef old_def, deftbl)- | otherwise -> (KindMismatch old_def, deftbl)---- | define a tag-defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable)-defineTag sueref def deftbl =- (redeclStatus, deftbl { tagDecls = decls'})- where- (decls',olddecl) = defLocal (tagDecls deftbl) sueref (Right def)- redeclStatus =- case olddecl of- Just fwd_decl@(Left _) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef- | otherwise -> KindMismatch fwd_decl- _ -> defRedeclStatusLocal compatTagEntry sueref (Right def) olddecl (tagDecls deftbl)---- | define a label--- Return the old label if it is already defined in this function's scope-defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable)-defineLabel ident deftbl =- let (labels',old_label) = defLocal (labelDefs deftbl) ident ident- in (maybe NewDecl Redeclared old_label, deftbl { labelDefs = labels' })---- | lookup identifier (object, function, typeDef, enumerator)-lookupIdent :: Ident -> DefTable -> Maybe IdentEntry-lookupIdent ident deftbl = lookupName (identDecls deftbl) ident---- | lookup tag-lookupTag :: SUERef -> DefTable -> Maybe TagEntry-lookupTag sue_ref deftbl = lookupName (tagDecls deftbl) sue_ref---- | lookup label-lookupLabel :: Ident -> DefTable -> Maybe Ident-lookupLabel ident deftbl = lookupName (labelDefs deftbl) ident---- | lookup an object in the innermost scope-lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry-lookupIdentInner ident deftbl = lookupInnermostScope (identDecls deftbl) ident---- | lookup an identifier in the innermost scope-lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry-lookupTagInner sue_ref deftbl = lookupInnermostScope (tagDecls deftbl) sue_ref---- | Record the type of a node.-insertType :: DefTable -> Name -> Type -> DefTable-insertType dt n t = dt { typeTable = IntMap.insert (nameId n) t (typeTable dt) }---- | Lookup the type of a node.-lookupType :: DefTable -> Name -> Maybe Type-lookupType dt n = IntMap.lookup (nameId n) (typeTable dt)---- | Merge two DefTables. If both tables contain an entry for a given--- key, they must agree on its value.-mergeDefTable :: DefTable -> DefTable -> DefTable-mergeDefTable (DefTable i1 t1 l1 m1 r1 tt1) (DefTable i2 t2 l2 m2 r2 tt2) =- DefTable- (mergeNameSpace i1 i2)- (mergeNameSpace t1 t2)- (mergeNameSpace l1 l2)- (mergeNameSpace m1 m2)- (union r1 r2)- (union tt1 tt2)-+{-# LANGUAGE PatternGuards, DeriveDataTypeable #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Analysis.DefTable +-- Copyright : (c) 2008 Benedikt Huber +-- based on code from c2hs +-- (c) [1999..2001] Manuel M. T. Chakravarty +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : alpha +-- Portability : ghc +-- +-- This module manages symbols in local and global scopes. +-- +-- There are four different kind of identifiers: ordinary identifiers (henceforth +-- simply called `identifier'), tag names (names of struct\/union\/enum types), +-- labels and structure members. +----------------------------------------------------------------------------- +module Language.C.Analysis.DefTable ( + IdentEntry, identOfTyDecl, + TagEntry, TagFwdDecl(..), + DefTable(..), + emptyDefTable, + globalDefs, + inFileScope, + enterFunctionScope,leaveFunctionScope,enterBlockScope,leaveBlockScope, + enterMemberDecl,leaveMemberDecl, + DeclarationStatus(..),declStatusDescr, + defineTypeDef, defineGlobalIdent, defineScopedIdent, defineScopedIdentWhen, + declareTag,defineTag,defineLabel,lookupIdent, + lookupTag,lookupLabel,lookupIdentInner,lookupTagInner, + insertType, lookupType, + mergeDefTable +) +where +import Language.C.Data +import Language.C.Analysis.NameSpaceMap +import Language.C.Analysis.SemRep + +import qualified Data.Map as Map +import Data.IntMap (IntMap, union) +import qualified Data.IntMap as IntMap +import Data.Generics + +{- Name spaces, scopes and contexts [Scopes] + + In C, there are 4 categories of identifiers: + + * labels + * tag names (@(struct|union|enum) tag-name@), where /all/ tag names live in one namespace + * members of structures and unions + * ordinary identifiers, denoting objects, functions, typeDefs and enumeration constants + + There are 4 kind of scopes: + + * file scope: outside of parameter lists and blocks + * function prototype scope + * function scope: labels are visible within the entire function, and declared implicitely + * block scope + + While function scope is irrelevant for variable declarations, they might also appear in member declarations. + Therefore, there are also 4 kinds of contexts where a variable might be declared: + + * File Scope Context: external declaration \/ definition + * Block Scope Context: either external or local definition + * Function prototype scope context + * Member Declaration context + + See + <http://www.embedded.com/design/206901036> + C99 6 +-} + +-- | All ordinary identifiers map to 'IdenTyDecl': either a typedef or a object\/function\/enumerator +type IdentEntry = Either TypeDef IdentDecl + +identOfTyDecl :: IdentEntry -> Ident +identOfTyDecl = either identOfTypeDef declIdent + +data TagFwdDecl = CompDecl CompTypeRef + | EnumDecl EnumTypeRef +instance HasSUERef TagFwdDecl where + sueRef (CompDecl ctr) = sueRef ctr + sueRef (EnumDecl etr) = sueRef etr +instance CNode TagFwdDecl where + nodeInfo (CompDecl ctr) = nodeInfo ctr + nodeInfo (EnumDecl etr) = nodeInfo etr + +-- | Tag names map to forward declarations or definitions of struct\/union\/enum types +type TagEntry = Either TagFwdDecl TagDef + +-- | Table holding current definitions +data DefTable = DefTable + { + identDecls :: NameSpaceMap Ident IdentEntry, -- ^ declared `ordinary identifiers' + tagDecls :: NameSpaceMap SUERef TagEntry, -- ^ declared struct/union/enum tags + labelDefs :: NameSpaceMap Ident Ident, -- ^ defined labels + memberDecls :: NameSpaceMap Ident MemberDecl, -- ^ member declarations (only local) + refTable :: IntMap Name, -- ^ link names with definitions + typeTable :: IntMap Type + } + +-- | empty definition table, with all name space maps in global scope +emptyDefTable :: DefTable +emptyDefTable = DefTable nameSpaceMap nameSpaceMap nameSpaceMap nameSpaceMap IntMap.empty IntMap.empty + +-- | get the globally defined entries of a definition table +globalDefs :: DefTable -> GlobalDecls +globalDefs deftbl = Map.foldWithKey insertDecl (GlobalDecls e gtags e) (globalNames $ identDecls deftbl) + where + e = Map.empty + (_fwd_decls,gtags) = Map.mapEither id $ globalNames (tagDecls deftbl) + insertDecl ident (Left tydef) ds = ds { gTypeDefs = Map.insert ident tydef (gTypeDefs ds)} + insertDecl ident (Right obj) ds = ds { gObjs = Map.insert ident obj (gObjs ds) } + +inFileScope :: DefTable -> Bool +inFileScope dt = not (hasLocalNames (identDecls dt) || hasLocalNames (labelDefs dt)) + +leaveScope_ :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a +leaveScope_ = fst . leaveScope + +enterLocalScope :: DefTable -> DefTable +enterLocalScope deftbl = deftbl { + identDecls = enterNewScope (identDecls deftbl), + tagDecls = enterNewScope (tagDecls deftbl) + } +leaveLocalScope :: DefTable -> DefTable +leaveLocalScope deftbl = deftbl { + identDecls = leaveScope_ (identDecls deftbl), + tagDecls = leaveScope_ (tagDecls deftbl) + } + +-- | Enter function scope (AND the corresponding block scope) +enterFunctionScope :: DefTable -> DefTable +enterFunctionScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) } + +-- | Leave function scope, and return the associated DefTable. +-- Error if not in function scope. +leaveFunctionScope :: DefTable -> DefTable +leaveFunctionScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) } + +-- | Enter new block scope +enterBlockScope :: DefTable -> DefTable +enterBlockScope deftbl = enterLocalScope $ deftbl { labelDefs = enterNewScope (labelDefs deftbl) } + +-- | Leave innermost block scope +leaveBlockScope :: DefTable -> DefTable +leaveBlockScope deftbl = leaveLocalScope $ deftbl { labelDefs = leaveScope_ (labelDefs deftbl) } + +-- | Enter new member declaration scope +enterMemberDecl :: DefTable -> DefTable +enterMemberDecl deftbl = deftbl { memberDecls = enterNewScope (memberDecls deftbl) } + +-- | Leave innermost member declaration scope +leaveMemberDecl :: DefTable -> ([MemberDecl], DefTable) +leaveMemberDecl deftbl = + let (decls',members) = leaveScope (memberDecls deftbl) + in (,) (map snd members) + (deftbl { memberDecls = decls' }) + +-- * declarations + +-- | Status of a declaration +data DeclarationStatus t = + NewDecl -- ^ new entry + | Redeclared t -- ^ old def was overwritten + | KeepDef t -- ^ new def was discarded + | Shadowed t -- ^ new def shadows one in outer scope + | KindMismatch t -- ^ kind mismatch + deriving (Data,Typeable) +declStatusDescr :: DeclarationStatus t -> String +declStatusDescr NewDecl = "new" +declStatusDescr (Redeclared _) = "redeclared" +declStatusDescr (KeepDef _) = "keep old" +declStatusDescr (Shadowed _) = "shadowed" +declStatusDescr (KindMismatch _) = "kind mismatch" + +compatIdentEntry :: IdentEntry -> IdentEntry -> Bool +compatIdentEntry (Left _tydef) = either (const True) (const False) +compatIdentEntry (Right def) = either (const False) $ + \other_def -> case (def,other_def) of + (EnumeratorDef _, EnumeratorDef _) -> True + (EnumeratorDef _, _) -> True + (_, EnumeratorDef _) -> True + (_,_) -> True + +data TagEntryKind = CompKind CompTyKind | EnumKind + deriving (Eq,Ord) +instance Show TagEntryKind where + show (CompKind ctk) = show ctk + show EnumKind = "enum" + +-- | @sameTagKind ty1 ty2@ returns @True@ if @ty1,ty2@ are the same kind of tag (struct,union or enum) +tagKind :: TagEntry -> TagEntryKind +tagKind (Left (CompDecl cd)) = CompKind (compTag cd) +tagKind (Left (EnumDecl _)) = EnumKind +tagKind (Right (CompDef cd)) = CompKind (compTag cd) +tagKind (Right (EnumDef _)) = EnumKind + +compatTagEntry :: TagEntry -> TagEntry -> Bool +compatTagEntry te1 te2 = tagKind te1 == tagKind te2 + +defRedeclStatus :: (t -> t -> Bool) -> t -> Maybe t -> DeclarationStatus t +defRedeclStatus sameKind def oldDecl = + case oldDecl of + Just def' | def `sameKind` def' -> Redeclared def' + | otherwise -> KindMismatch def' + Nothing -> NewDecl + +defRedeclStatusLocal :: (Ord k) => + (t -> t -> Bool) -> k -> t -> Maybe t -> NameSpaceMap k t -> DeclarationStatus t +defRedeclStatusLocal sameKind ident def oldDecl nsm = + case defRedeclStatus sameKind def oldDecl of + NewDecl -> case lookupName nsm ident of + Just shadowed -> Shadowed shadowed + Nothing -> NewDecl + redecl -> redecl + +defineTypeDef :: Ident -> TypeDef -> DefTable -> (DeclarationStatus IdentEntry, DefTable) +defineTypeDef ident tydef deftbl = + (defRedeclStatus compatIdentEntry (Left tydef) oldDecl, deftbl { identDecls = decls' }) + where + (decls', oldDecl) = defLocal (identDecls deftbl) ident (Left tydef) + +-- | declare\/define a global object\/function\/typeDef +-- +-- returns @Redeclared def@ if there is already an object\/function\/typeDef +-- in global scope, or @DifferentKindRedec def@ if the old declaration is of a different kind. +defineGlobalIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable) +defineGlobalIdent ident def deftbl = + (defRedeclStatus compatIdentEntry (Right def) oldDecl, deftbl { identDecls = decls' }) + where + (decls',oldDecl) = defGlobal (identDecls deftbl) ident (Right def) +-- | declare\/define a object\/function\/typeDef with lexical scope +-- +-- returns @Redeclared def@ or @DifferentKindRedec def@ if there is already an object\/function\/typeDef +-- in the same scope. +defineScopedIdent :: Ident -> IdentDecl -> DefTable -> (DeclarationStatus IdentEntry, DefTable) +defineScopedIdent = defineScopedIdentWhen (const True) + +-- | declare\/define a object\/function\/typeDef with lexical scope, if the given predicate holds on the old +-- entry. +-- +-- returns @Keep old_def@ if the old definition shouldn't be overwritten, and otherwise @Redeclared def@ or +-- @DifferentKindRedecl def@ if there is already an object\/function\/typeDef in the same scope. +defineScopedIdentWhen :: (IdentDecl -> Bool) -> Ident -> IdentDecl -> DefTable -> + (DeclarationStatus IdentEntry, DefTable) +defineScopedIdentWhen override_def ident def deftbl + = (redecl_status, deftbl { identDecls = decls' }) + where + new_def = Right def + old_decls = identDecls deftbl + old_decl_opt = lookupInnermostScope old_decls ident + (decls',redecl_status) | (Just old_decl) <- old_decl_opt, not (old_decl `compatIdentEntry` new_def) + = (new_decls, KindMismatch old_decl) + | maybe True doOverride old_decl_opt + = (new_decls, redeclStatus' old_decl_opt) + | otherwise + = (old_decls, maybe NewDecl KeepDef old_decl_opt) + new_decls = fst (defLocal old_decls ident new_def) + doOverride (Left _) = False + doOverride (Right old_def) = override_def old_def + redeclStatus' overriden_decl = defRedeclStatusLocal compatIdentEntry ident new_def overriden_decl old_decls + +-- | declare a tag (fwd decl in case the struct name isn't defined yet) +declareTag :: SUERef -> TagFwdDecl -> DefTable -> (DeclarationStatus TagEntry, DefTable) +declareTag sueref decl deftbl = + case lookupTag sueref deftbl of + Nothing -> (NewDecl, deftbl { tagDecls = fst $ defLocal (tagDecls deftbl) sueref (Left decl) }) + Just old_def | tagKind old_def == tagKind (Left decl) -> (KeepDef old_def, deftbl) + | otherwise -> (KindMismatch old_def, deftbl) + +-- | define a tag +defineTag :: SUERef -> TagDef -> DefTable -> (DeclarationStatus TagEntry, DefTable) +defineTag sueref def deftbl = + (redeclStatus, deftbl { tagDecls = decls'}) + where + (decls',olddecl) = defLocal (tagDecls deftbl) sueref (Right def) + redeclStatus = + case olddecl of + Just fwd_decl@(Left _) | tagKind fwd_decl == tagKind (Right def) -> NewDecl -- should be NewDef + | otherwise -> KindMismatch fwd_decl + _ -> defRedeclStatusLocal compatTagEntry sueref (Right def) olddecl (tagDecls deftbl) + +-- | define a label +-- Return the old label if it is already defined in this function's scope +defineLabel :: Ident -> DefTable -> (DeclarationStatus Ident, DefTable) +defineLabel ident deftbl = + let (labels',old_label) = defLocal (labelDefs deftbl) ident ident + in (maybe NewDecl Redeclared old_label, deftbl { labelDefs = labels' }) + +-- | lookup identifier (object, function, typeDef, enumerator) +lookupIdent :: Ident -> DefTable -> Maybe IdentEntry +lookupIdent ident deftbl = lookupName (identDecls deftbl) ident + +-- | lookup tag +lookupTag :: SUERef -> DefTable -> Maybe TagEntry +lookupTag sue_ref deftbl = lookupName (tagDecls deftbl) sue_ref + +-- | lookup label +lookupLabel :: Ident -> DefTable -> Maybe Ident +lookupLabel ident deftbl = lookupName (labelDefs deftbl) ident + +-- | lookup an object in the innermost scope +lookupIdentInner :: Ident -> DefTable -> Maybe IdentEntry +lookupIdentInner ident deftbl = lookupInnermostScope (identDecls deftbl) ident + +-- | lookup an identifier in the innermost scope +lookupTagInner :: SUERef -> DefTable -> Maybe TagEntry +lookupTagInner sue_ref deftbl = lookupInnermostScope (tagDecls deftbl) sue_ref + +-- | Record the type of a node. +insertType :: DefTable -> Name -> Type -> DefTable +insertType dt n t = dt { typeTable = IntMap.insert (nameId n) t (typeTable dt) } + +-- | Lookup the type of a node. +lookupType :: DefTable -> Name -> Maybe Type +lookupType dt n = IntMap.lookup (nameId n) (typeTable dt) + +-- | Merge two DefTables. If both tables contain an entry for a given +-- key, they must agree on its value. +mergeDefTable :: DefTable -> DefTable -> DefTable +mergeDefTable (DefTable i1 t1 l1 m1 r1 tt1) (DefTable i2 t2 l2 m2 r2 tt2) = + DefTable + (mergeNameSpace i1 i2) + (mergeNameSpace t1 t2) + (mergeNameSpace l1 l2) + (mergeNameSpace m1 m2) + (union r1 r2) + (union tt1 tt2) +
src/Language/C/Analysis/Export.hs view
@@ -1,232 +1,233 @@--------------------------------------------------------------------------------- |--- Module : Language.C.Analysis.Export--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : prototype--- Portability : ghc------ /WARNING/ : This is just an implementation sketch and not very well tested.------ Export 'SemRep' entities to 'AST' nodes.-------------------------------------------------------------------------------module Language.C.Analysis.Export (-exportDeclr,-exportType, exportTypeDecl, exportTypeSpec,-exportTypeDef,-exportCompType, exportCompTypeDecl, exportCompTypeRef,-exportEnumType, exportEnumTypeDecl, exportEnumTypeRef,-)-where-import Language.C.Data.Ident-import Language.C.Data.Name (nameId)-import Language.C.Data.Node-import Language.C.Syntax.AST-import Language.C.Analysis.SemRep-import Data.Maybe---- |Export Declarator------ Synopsis: @exportDeclr other_specs type attributes variable-name@-exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec],CDeclr)-exportDeclr other_specs ty attrs name =- (other_specs ++ specs, CDeclr ident derived asmname (exportAttrs attrs) ni)- where- (specs,derived) = exportType ty- (ident,asmname) = case name of (VarName vident asmname_opt) -> (Just vident, asmname_opt)- _ -> (Nothing,Nothing)--exportTypeDecl :: Type -> CDecl-exportTypeDecl ty =- CDecl declspecs declrs ni- where- (declspecs,derived) = exportType ty- declrs | null derived = []- | otherwise = [(Just $ CDeclr Nothing derived Nothing [] ni,Nothing,Nothing)]--exportTypeDef :: TypeDef -> CDecl-exportTypeDef (TypeDef ident ty attrs node_info) =- CDecl (CStorageSpec (CTypedef ni) : declspecs) [declr] node_info- where- (declspecs,derived) = exportType ty- declr = (Just $ CDeclr (Just ident) derived Nothing (exportAttrs attrs) ni, Nothing, Nothing)---- |Export a type to syntax-exportType :: Type -> ([CDeclSpec],[CDerivedDeclr])-exportType ty = exportTy [] ty- where- exportTy dd (PtrType ity tyquals attrs) =- let ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni- in exportTy (ptr_declr : dd) ity- exportTy dd (ArrayType ity array_sz tyquals attrs) =- let arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni- in exportTy (arr_declr : dd) ity- exportTy dd (FunctionType (FunType ity params variadic) attrs) =- let fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni- in exportTy (fun_declr : dd) ity- exportTy dd (FunctionType (FunTypeIncomplete ity) attrs) =- let fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni- in exportTy (fun_declr : dd) ity- exportTy dd (TypeDefType (TypeDefRef ty_ident _ node) quals attrs) =- let declspecs = CTypeSpec (CTypeDef ty_ident node)- : map CTypeQual (exportTypeQualsAttrs quals attrs)- in (declspecs, reverse dd)- exportTy dd (DirectType ity quals attrs) =- let declspecs = map CTypeQual (exportTypeQualsAttrs quals attrs)- ++ map CTypeSpec (exportTypeSpec ity)- in (declspecs, reverse dd)--exportTypeQuals :: TypeQuals -> [CTypeQual]-exportTypeQuals quals = mapMaybe select [(constant,CConstQual ni),(volatile,CVolatQual ni),(restrict,CRestrQual ni)]- where- select (predicate,tyqual) | predicate quals = Just tyqual- | otherwise = Nothing--exportTypeQualsAttrs :: TypeQuals -> Attributes -> [CTypeQual]-exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs))--exportArraySize :: ArraySize -> CArrSize-exportArraySize (ArraySize static e) = CArrSize static e-exportArraySize (UnknownArraySize complete) = CNoArrSize complete--exportTypeSpec :: TypeName -> [CTypeSpec]-exportTypeSpec tyname =- case tyname of- TyVoid -> [CVoidType ni]- TyIntegral ity -> exportIntType ity- TyFloating fty -> exportFloatType fty- TyComplex fty -> exportComplexType fty- TyComp comp -> exportCompTypeDecl comp- TyEnum enum -> exportEnumTypeDecl enum- TyBuiltin TyVaList -> [CTypeDef (internalIdent "va_list") ni]- TyBuiltin TyAny -> [CTypeDef (internalIdent "__ty_any") ni]--exportIntType :: IntType -> [CTypeSpec]-exportIntType ty =- case ty of- TyBool -> [CBoolType ni]- TyChar -> [CCharType ni]- TySChar -> [CSignedType ni,CCharType ni]- TyUChar -> [CUnsigType ni,CCharType ni]- TyShort -> [CShortType ni]- TyUShort -> [CUnsigType ni, CShortType ni]- TyInt -> [CIntType ni]- TyUInt -> [CUnsigType ni, CIntType ni]- TyInt128 -> [CInt128Type ni]- TyUInt128 -> [CUnsigType ni, CInt128Type ni]- TyLong -> [CLongType ni]- TyULong -> [CUnsigType ni,CLongType ni]- TyLLong -> [CLongType ni, CLongType ni]- TyULLong -> [CUnsigType ni, CLongType ni, CLongType ni]--exportFloatType :: FloatType -> [CTypeSpec]-exportFloatType ty =- case ty of- TyFloat -> [CFloatType ni]- TyDouble -> [CDoubleType ni]- TyLDouble -> [CLongType ni, CDoubleType ni]--exportComplexType :: FloatType -> [CTypeSpec]-exportComplexType ty = (CComplexType ni) : exportFloatType ty--exportCompTypeDecl :: CompTypeRef -> [CTypeSpec]-exportCompTypeDecl ty = [CSUType (exportComp ty) ni]- where- exportComp (CompTypeRef sue_ref comp_tag _n) =- CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)- (exportSUERef sue_ref) Nothing [] ni--exportEnumTypeDecl :: EnumTypeRef -> [CTypeSpec]-exportEnumTypeDecl ty = [CEnumType (exportEnum ty) ni]- where- exportEnum (EnumTypeRef sue_ref _n) =- CEnum (exportSUERef sue_ref) Nothing [] ni--exportCompType :: CompType -> [CTypeSpec]-exportCompType (CompType sue_ref comp_tag members attrs node_info) = [CSUType comp ni]- where- comp = CStruct (if comp_tag == StructTag then CStructTag else CUnionTag)- (exportSUERef sue_ref)- (Just (map exportMemberDecl members))- (exportAttrs attrs)- node_info-exportCompTypeRef :: CompType -> [CTypeSpec]-exportCompTypeRef (CompType sue_ref com_tag _ _ node_info) = exportCompTypeDecl (CompTypeRef sue_ref com_tag node_info)--exportEnumType :: EnumType -> [CTypeSpec]-exportEnumType (EnumType sue_ref enumerators attrs node_info) = [CEnumType enum ni]- where- enum = CEnum (exportSUERef sue_ref)- (Just (map exportEnumerator enumerators))- (exportAttrs attrs)- node_info- exportEnumerator (Enumerator ident val _ty _) = (ident,Just val)--exportEnumTypeRef :: EnumType -> [CTypeSpec]-exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info)---- XXX: relies on a the source program not having any $'s in it-exportSUERef :: SUERef -> Maybe Ident-exportSUERef (AnonymousRef name) = Just (internalIdent $ "$" ++ show (nameId name))-exportSUERef (NamedRef ident) = Just ident--exportMemberDecl :: MemberDecl -> CDecl-exportMemberDecl (AnonBitField ty expr node_info) =- CDecl (map CTypeSpec $ exportTypeSpec $ fromDirectType ty) [(Nothing,Nothing,Just expr)] node_info-exportMemberDecl (MemberDecl vardecl bitfieldsz node_info) =- let (specs,declarator) = exportVarDecl vardecl- in CDecl specs [(Just declarator, Nothing, bitfieldsz)] node_info-exportVarDecl :: VarDecl -> ([CDeclSpec],CDeclr)---- NOTE: that there is an ambiguity between two possible places for __attributes__ s here-exportVarDecl (VarDecl name attrs ty) = exportDeclr (exportDeclAttrs attrs) ty [] name-exportParamDecl :: ParamDecl -> CDecl-exportParamDecl paramdecl =- let (specs,declr) = exportVarDecl (getVarDecl paramdecl)- in CDecl specs [(Just declr, Nothing , Nothing) ] (nodeInfo paramdecl)--exportDeclAttrs :: DeclAttrs -> [CDeclSpec]-exportDeclAttrs (DeclAttrs fun_attrs storage attrs) =- map CFunSpec (exportFunAttrs fun_attrs)- ++ map CStorageSpec (exportStorage storage)- ++ map (CTypeQual . CAttrQual) (exportAttrs attrs)---- | export function attributes to C function specifiers-exportFunAttrs :: FunctionAttrs -> [CFunSpec]-exportFunAttrs fattrs = catMaybes [inlQual, noretQual]- where- inlQual = if isInline fattrs then Just (CInlineQual ni) else Nothing- noretQual = if isNoreturn fattrs then Just (CNoreturnQual ni) else Nothing---- | express storage in terms of storage specifiers.------ This isn't always possible and depends on the context the identifier is declared.--- Most importantly, if there is a /conflicting/ declaration in scope, export is impossible.--- Furthermore, automatic storage is impossible in file scope.--- If the storage can actually be specified, the export is correct.-exportStorage :: Storage -> [CStorageSpec]-exportStorage NoStorage = []-exportStorage (Auto reg) = if reg then [CRegister ni] else []-exportStorage (Static InternalLinkage thread_local) = threadLocal thread_local [CStatic ni]-exportStorage (Static ExternalLinkage thread_local) = threadLocal thread_local [CExtern ni]-exportStorage (Static NoLinkage _) = error "impossible storage: static without linkage"-exportStorage (FunLinkage InternalLinkage) = [CStatic ni]-exportStorage (FunLinkage ExternalLinkage) = []-exportStorage (FunLinkage NoLinkage) = error "impossible storage: function without linkage"--threadLocal :: Bool -> [CStorageSpec] -> [CStorageSpec]-threadLocal False = id-threadLocal True = ((CThread ni) :)--exportAttrs :: [Attr] -> [CAttr]-exportAttrs = map exportAttr where- exportAttr (Attr ident es n) = CAttr ident es n--fromDirectType :: Type -> TypeName-fromDirectType (DirectType ty _ _) = ty-fromDirectType (TypeDefType (TypeDefRef _ ty _) _ _) = fromDirectType ty-fromDirectType _ = error "fromDirectType"--ni :: NodeInfo-ni = undefNode+----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Analysis.Export +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : prototype +-- Portability : ghc +-- +-- /WARNING/ : This is just an implementation sketch and not very well tested. +-- +-- Export 'SemRep' entities to 'AST' nodes. +----------------------------------------------------------------------------- +module Language.C.Analysis.Export ( +exportDeclr, +exportType, exportTypeDecl, exportTypeSpec, +exportTypeDef, +exportCompType, exportCompTypeDecl, exportCompTypeRef, +exportEnumType, exportEnumTypeDecl, exportEnumTypeRef, +) +where +import Language.C.Data.Ident +import Language.C.Data.Name (nameId) +import Language.C.Data.Node +import Language.C.Syntax.AST +import Language.C.Analysis.SemRep +import Data.Maybe + +-- |Export Declarator +-- +-- Synopsis: @exportDeclr other_specs type attributes variable-name@ +exportDeclr :: [CDeclSpec] -> Type -> Attributes -> VarName -> ([CDeclSpec],CDeclr) +exportDeclr other_specs ty attrs name = + (other_specs ++ specs, CDeclr ident derived asmname (exportAttrs attrs) ni) + where + (specs,derived) = exportType ty + (ident,asmname) = case name of (VarName vident asmname_opt) -> (Just vident, asmname_opt) + _ -> (Nothing,Nothing) + +exportTypeDecl :: Type -> CDecl +exportTypeDecl ty = + CDecl declspecs declrs ni + where + (declspecs,derived) = exportType ty + declrs | null derived = [] + | otherwise = [(Just $ CDeclr Nothing derived Nothing [] ni,Nothing,Nothing)] + +exportTypeDef :: TypeDef -> CDecl +exportTypeDef (TypeDef ident ty attrs node_info) = + CDecl (CStorageSpec (CTypedef ni) : declspecs) [declr] node_info + where + (declspecs,derived) = exportType ty + declr = (Just $ CDeclr (Just ident) derived Nothing (exportAttrs attrs) ni, Nothing, Nothing) + +-- |Export a type to syntax +exportType :: Type -> ([CDeclSpec],[CDerivedDeclr]) +exportType ty = exportTy [] ty + where + exportTy dd (PtrType ity tyquals attrs) = + let ptr_declr = CPtrDeclr (exportTypeQualsAttrs tyquals attrs) ni + in exportTy (ptr_declr : dd) ity + exportTy dd (ArrayType ity array_sz tyquals attrs) = + let arr_declr = CArrDeclr (exportTypeQualsAttrs tyquals attrs) (exportArraySize array_sz) ni + in exportTy (arr_declr : dd) ity + exportTy dd (FunctionType (FunType ity params variadic) attrs) = + let fun_declr = CFunDeclr (Right (map exportParamDecl params,variadic)) (exportAttrs attrs) ni + in exportTy (fun_declr : dd) ity + exportTy dd (FunctionType (FunTypeIncomplete ity) attrs) = + let fun_declr = CFunDeclr (Right ([],False)) (exportAttrs attrs) ni + in exportTy (fun_declr : dd) ity + exportTy dd (TypeDefType (TypeDefRef ty_ident _ node) quals attrs) = + let declspecs = CTypeSpec (CTypeDef ty_ident node) + : map CTypeQual (exportTypeQualsAttrs quals attrs) + in (declspecs, reverse dd) + exportTy dd (DirectType ity quals attrs) = + let declspecs = map CTypeQual (exportTypeQualsAttrs quals attrs) + ++ map CTypeSpec (exportTypeSpec ity) + in (declspecs, reverse dd) + +exportTypeQuals :: TypeQuals -> [CTypeQual] +exportTypeQuals quals = mapMaybe select [(constant,CConstQual ni),(volatile,CVolatQual ni),(restrict,CRestrQual ni)] + where + select (predicate,tyqual) | predicate quals = Just tyqual + | otherwise = Nothing + +exportTypeQualsAttrs :: TypeQuals -> Attributes -> [CTypeQual] +exportTypeQualsAttrs tyqs attrs = (exportTypeQuals tyqs ++ map CAttrQual (exportAttrs attrs)) + +exportArraySize :: ArraySize -> CArrSize +exportArraySize (ArraySize static e) = CArrSize static e +exportArraySize (UnknownArraySize complete) = CNoArrSize complete + +exportTypeSpec :: TypeName -> [CTypeSpec] +exportTypeSpec tyname = + case tyname of + TyVoid -> [CVoidType ni] + TyIntegral ity -> exportIntType ity + TyFloating fty -> exportFloatType fty + TyComplex fty -> exportComplexType fty + TyComp comp -> exportCompTypeDecl comp + TyEnum enum -> exportEnumTypeDecl enum + TyBuiltin TyVaList -> [CTypeDef (internalIdent "va_list") ni] + TyBuiltin TyAny -> [CTypeDef (internalIdent "__ty_any") ni] + +exportIntType :: IntType -> [CTypeSpec] +exportIntType ty = + case ty of + TyBool -> [CBoolType ni] + TyChar -> [CCharType ni] + TySChar -> [CSignedType ni,CCharType ni] + TyUChar -> [CUnsigType ni,CCharType ni] + TyShort -> [CShortType ni] + TyUShort -> [CUnsigType ni, CShortType ni] + TyInt -> [CIntType ni] + TyUInt -> [CUnsigType ni, CIntType ni] + TyInt128 -> [CInt128Type ni] + TyUInt128 -> [CUnsigType ni, CInt128Type ni] + TyLong -> [CLongType ni] + TyULong -> [CUnsigType ni,CLongType ni] + TyLLong -> [CLongType ni, CLongType ni] + TyULLong -> [CUnsigType ni, CLongType ni, CLongType ni] + +exportFloatType :: FloatType -> [CTypeSpec] +exportFloatType ty = + case ty of + TyFloat -> [CFloatType ni] + TyDouble -> [CDoubleType ni] + TyLDouble -> [CLongType ni, CDoubleType ni] + TyFloat128 -> [CFloat128Type ni] + +exportComplexType :: FloatType -> [CTypeSpec] +exportComplexType ty = (CComplexType ni) : exportFloatType ty + +exportCompTypeDecl :: CompTypeRef -> [CTypeSpec] +exportCompTypeDecl ty = [CSUType (exportComp ty) ni] + where + exportComp (CompTypeRef sue_ref comp_tag _n) = + CStruct (if comp_tag == StructTag then CStructTag else CUnionTag) + (exportSUERef sue_ref) Nothing [] ni + +exportEnumTypeDecl :: EnumTypeRef -> [CTypeSpec] +exportEnumTypeDecl ty = [CEnumType (exportEnum ty) ni] + where + exportEnum (EnumTypeRef sue_ref _n) = + CEnum (exportSUERef sue_ref) Nothing [] ni + +exportCompType :: CompType -> [CTypeSpec] +exportCompType (CompType sue_ref comp_tag members attrs node_info) = [CSUType comp ni] + where + comp = CStruct (if comp_tag == StructTag then CStructTag else CUnionTag) + (exportSUERef sue_ref) + (Just (map exportMemberDecl members)) + (exportAttrs attrs) + node_info +exportCompTypeRef :: CompType -> [CTypeSpec] +exportCompTypeRef (CompType sue_ref com_tag _ _ node_info) = exportCompTypeDecl (CompTypeRef sue_ref com_tag node_info) + +exportEnumType :: EnumType -> [CTypeSpec] +exportEnumType (EnumType sue_ref enumerators attrs node_info) = [CEnumType enum ni] + where + enum = CEnum (exportSUERef sue_ref) + (Just (map exportEnumerator enumerators)) + (exportAttrs attrs) + node_info + exportEnumerator (Enumerator ident val _ty _) = (ident,Just val) + +exportEnumTypeRef :: EnumType -> [CTypeSpec] +exportEnumTypeRef (EnumType sue_ref _ _ node_info) = exportEnumTypeDecl (EnumTypeRef sue_ref node_info) + +-- XXX: relies on a the source program not having any $'s in it +exportSUERef :: SUERef -> Maybe Ident +exportSUERef (AnonymousRef name) = Just (internalIdent $ "$" ++ show (nameId name)) +exportSUERef (NamedRef ident) = Just ident + +exportMemberDecl :: MemberDecl -> CDecl +exportMemberDecl (AnonBitField ty expr node_info) = + CDecl (map CTypeSpec $ exportTypeSpec $ fromDirectType ty) [(Nothing,Nothing,Just expr)] node_info +exportMemberDecl (MemberDecl vardecl bitfieldsz node_info) = + let (specs,declarator) = exportVarDecl vardecl + in CDecl specs [(Just declarator, Nothing, bitfieldsz)] node_info +exportVarDecl :: VarDecl -> ([CDeclSpec],CDeclr) + +-- NOTE: that there is an ambiguity between two possible places for __attributes__ s here +exportVarDecl (VarDecl name attrs ty) = exportDeclr (exportDeclAttrs attrs) ty [] name +exportParamDecl :: ParamDecl -> CDecl +exportParamDecl paramdecl = + let (specs,declr) = exportVarDecl (getVarDecl paramdecl) + in CDecl specs [(Just declr, Nothing , Nothing) ] (nodeInfo paramdecl) + +exportDeclAttrs :: DeclAttrs -> [CDeclSpec] +exportDeclAttrs (DeclAttrs fun_attrs storage attrs) = + map CFunSpec (exportFunAttrs fun_attrs) + ++ map CStorageSpec (exportStorage storage) + ++ map (CTypeQual . CAttrQual) (exportAttrs attrs) + +-- | export function attributes to C function specifiers +exportFunAttrs :: FunctionAttrs -> [CFunSpec] +exportFunAttrs fattrs = catMaybes [inlQual, noretQual] + where + inlQual = if isInline fattrs then Just (CInlineQual ni) else Nothing + noretQual = if isNoreturn fattrs then Just (CNoreturnQual ni) else Nothing + +-- | express storage in terms of storage specifiers. +-- +-- This isn't always possible and depends on the context the identifier is declared. +-- Most importantly, if there is a /conflicting/ declaration in scope, export is impossible. +-- Furthermore, automatic storage is impossible in file scope. +-- If the storage can actually be specified, the export is correct. +exportStorage :: Storage -> [CStorageSpec] +exportStorage NoStorage = [] +exportStorage (Auto reg) = if reg then [CRegister ni] else [] +exportStorage (Static InternalLinkage thread_local) = threadLocal thread_local [CStatic ni] +exportStorage (Static ExternalLinkage thread_local) = threadLocal thread_local [CExtern ni] +exportStorage (Static NoLinkage _) = error "impossible storage: static without linkage" +exportStorage (FunLinkage InternalLinkage) = [CStatic ni] +exportStorage (FunLinkage ExternalLinkage) = [] +exportStorage (FunLinkage NoLinkage) = error "impossible storage: function without linkage" + +threadLocal :: Bool -> [CStorageSpec] -> [CStorageSpec] +threadLocal False = id +threadLocal True = ((CThread ni) :) + +exportAttrs :: [Attr] -> [CAttr] +exportAttrs = map exportAttr where + exportAttr (Attr ident es n) = CAttr ident es n + +fromDirectType :: Type -> TypeName +fromDirectType (DirectType ty _ _) = ty +fromDirectType (TypeDefType (TypeDefRef _ ty _) _ _) = fromDirectType ty +fromDirectType _ = error "fromDirectType" + +ni :: NodeInfo +ni = undefNode
src/Language/C/Analysis/NameSpaceMap.hs view
@@ -1,159 +1,159 @@--------------------------------------------------------------------------------- |--- Module : Language.C.Analysis.NameSpaceMap--- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty--- (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : alpha--- Portability : portable------ This module manages name spaces.------ * A name space map associates identifiers with their definition.------ * Each name space map is organized in a hierarchical way using the notion of--- scopes. A name space map, at any moment, always has a global scope and may--- have several local scopes. Definitions in inner scopes hide definitions--- of the same identifier in outer scopes.----module Language.C.Analysis.NameSpaceMap (- -- * name space maps- NameSpaceMap, nameSpaceMap, nsMapToList,- globalNames,localNames,hasLocalNames,- -- * scope modification- defGlobal,- enterNewScope, leaveScope,- defLocal,- lookupName,lookupGlobal,lookupInnermostScope,- mergeNameSpace- )-where-import Prelude hiding (lookup)-import qualified Prelude-import qualified Data.Map as Map (empty, insert, lookup, toList, union)-import qualified Data.List as List (unionBy)-import Data.Map (Map)--{--C Namespaces and scopes:----}---- DevDocs:------ * the definitions in the global scope are stored in a finite map, because--- they tend to be a lot.------ * the definitions of the local scopes are stored in a single list, usually--- they are not very many and the definitions entered last are the most--- frequently accessed ones; the list structure naturally hides older--- definitions, i.e., definitions from outer scopes; adding new definitions--- is done in time proportinal to the current size of the scope; removing a--- scope is done in constant time (and the definitions of a scope can be--- returned as a result of leaving the scope); lookup is proportional to the--- number of definitions in the local scopes and the logarithm of the number--- of definitions in the global scope -- i.e., efficiency relies on a--- relatively low number of local definitions together with frequent lookup--- of the most recently defined local identifiers------- | @NameSpaceMap a@ is a Map from identifiers to @a@, which manages--- global and local name spaces.-data NameSpaceMap k v = NsMap (Map k v) -- defs in global scope- [[(k, v)]] -- stack of local scopes-globalNames :: (Ord k) => NameSpaceMap k v -> Map k v-globalNames (NsMap g _) = g-hasLocalNames :: NameSpaceMap k v -> Bool-hasLocalNames (NsMap _ l) = not (null l)-localNames :: (Ord k) => NameSpaceMap k v -> [[(k,v)]]-localNames (NsMap _ l) = l---- | create a name space-nameSpaceMap :: (Ord k) => NameSpaceMap k v-nameSpaceMap = NsMap Map.empty []------ | Add global definition------ @(ns',oldDef) = defGlobal ns ident def@--- adds a global definition @ident := def@ to the namespace.--- It returns the modified namespace @ns'@. If the identifier is--- already declared in the global namespace, the definition is overwritten--- and the old definition @oldDef@ is returned.-defGlobal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)-defGlobal (NsMap gs lss) ident def- = (NsMap (Map.insert ident def gs) lss, Map.lookup ident gs)---- | Enter new local scope------ @ns' = enterNewScope ns@ creates and enters a new local scope.-enterNewScope :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a-enterNewScope (NsMap gs lss) = NsMap gs ([]:lss)---- | Leave innermost local scope------ @(ns',defs) = leaveScope ns@ pops leaves the innermost local scope.--- and returns its definitions-leaveScope :: (Ord k) => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)])-leaveScope (NsMap _ []) = error "NsMaps.leaveScope: No local scope!"-leaveScope (NsMap gs (ls:lss)) = (NsMap gs lss, ls)---- | Add local definition------ @(ns',oldDef) = defLocal ns ident def@ adds the local definition--- @ident := def@ to the innermost local scope, if there is a local scope,--- and to the global scope otherwise.--- It returns the modified name space @ns'@ and the old binding of--- the identifier @oldDef@, which is overwritten.-defLocal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a)-defLocal ns@(NsMap _ []) ident def = defGlobal ns ident def-defLocal (NsMap gs (ls:lss)) ident def =- (NsMap gs (((ident, def):ls):lss),- Prelude.lookup ident ls)---- | Search for a definition------ @def = find ns ident@ returns the definition in some scope (inner to outer),--- if there is one.-lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a-lookupName ns@(NsMap _ localDefs) ident- = case lookupLocal localDefs of- Nothing -> lookupGlobal ns ident- Just def -> Just def- where- lookupLocal [] = Nothing- lookupLocal (ls:lss) =- case Prelude.lookup ident ls of- Nothing -> lookupLocal lss- Just def -> Just def--lookupGlobal :: (Ord k) => NameSpaceMap k a -> k -> Maybe a-lookupGlobal (NsMap gs _) ident = Map.lookup ident gs--lookupInnermostScope :: (Ord k) => NameSpaceMap k a -> k -> Maybe a-lookupInnermostScope nsm@(NsMap _gs localDefs) ident =- case localDefs of- (ls : _lss) -> Prelude.lookup ident ls- [] -> lookupGlobal nsm ident---- | flatten a namespace into a assoc list------ @nameSpaceToList ns = (localDefInnermost ns ++ .. ++ localDefsOutermost ns) ++ globalDefs ns@-nsMapToList :: (Ord k) => NameSpaceMap k a -> [(k, a)]-nsMapToList (NsMap gs lss) = concat lss ++ Map.toList gs---- | Merge two namespaces. If they disagree on the types of any--- variables, all bets are off.-mergeNameSpace :: (Ord k) =>- NameSpaceMap k a- -> NameSpaceMap k a- -> NameSpaceMap k a-mergeNameSpace (NsMap global1 local1) (NsMap global2 local2) =- NsMap (Map.union global1 global2) (localUnion local1 local2)- where localUnion (l1:ls1) (l2:ls2) =- List.unionBy (\p1 p2 -> fst p1 == fst p2) l1 l2 : localUnion ls1 ls2- localUnion [] ls2 = ls2- localUnion ls1 [] = ls1+----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Analysis.NameSpaceMap +-- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty +-- (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : alpha +-- Portability : portable +-- +-- This module manages name spaces. +-- +-- * A name space map associates identifiers with their definition. +-- +-- * Each name space map is organized in a hierarchical way using the notion of +-- scopes. A name space map, at any moment, always has a global scope and may +-- have several local scopes. Definitions in inner scopes hide definitions +-- of the same identifier in outer scopes. +-- +module Language.C.Analysis.NameSpaceMap ( + -- * name space maps + NameSpaceMap, nameSpaceMap, nsMapToList, + globalNames,localNames,hasLocalNames, + -- * scope modification + defGlobal, + enterNewScope, leaveScope, + defLocal, + lookupName,lookupGlobal,lookupInnermostScope, + mergeNameSpace + ) +where +import Prelude hiding (lookup) +import qualified Prelude +import qualified Data.Map as Map (empty, insert, lookup, toList, union) +import qualified Data.List as List (unionBy) +import Data.Map (Map) + +{- +C Namespaces and scopes: + + +-} + +-- DevDocs: +-- +-- * the definitions in the global scope are stored in a finite map, because +-- they tend to be a lot. +-- +-- * the definitions of the local scopes are stored in a single list, usually +-- they are not very many and the definitions entered last are the most +-- frequently accessed ones; the list structure naturally hides older +-- definitions, i.e., definitions from outer scopes; adding new definitions +-- is done in time proportinal to the current size of the scope; removing a +-- scope is done in constant time (and the definitions of a scope can be +-- returned as a result of leaving the scope); lookup is proportional to the +-- number of definitions in the local scopes and the logarithm of the number +-- of definitions in the global scope -- i.e., efficiency relies on a +-- relatively low number of local definitions together with frequent lookup +-- of the most recently defined local identifiers +-- + +-- | @NameSpaceMap a@ is a Map from identifiers to @a@, which manages +-- global and local name spaces. +data NameSpaceMap k v = NsMap (Map k v) -- defs in global scope + [[(k, v)]] -- stack of local scopes +globalNames :: (Ord k) => NameSpaceMap k v -> Map k v +globalNames (NsMap g _) = g +hasLocalNames :: NameSpaceMap k v -> Bool +hasLocalNames (NsMap _ l) = not (null l) +localNames :: (Ord k) => NameSpaceMap k v -> [[(k,v)]] +localNames (NsMap _ l) = l + +-- | create a name space +nameSpaceMap :: (Ord k) => NameSpaceMap k v +nameSpaceMap = NsMap Map.empty [] + + + +-- | Add global definition +-- +-- @(ns',oldDef) = defGlobal ns ident def@ +-- adds a global definition @ident := def@ to the namespace. +-- It returns the modified namespace @ns'@. If the identifier is +-- already declared in the global namespace, the definition is overwritten +-- and the old definition @oldDef@ is returned. +defGlobal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a) +defGlobal (NsMap gs lss) ident def + = (NsMap (Map.insert ident def gs) lss, Map.lookup ident gs) + +-- | Enter new local scope +-- +-- @ns' = enterNewScope ns@ creates and enters a new local scope. +enterNewScope :: (Ord k) => NameSpaceMap k a -> NameSpaceMap k a +enterNewScope (NsMap gs lss) = NsMap gs ([]:lss) + +-- | Leave innermost local scope +-- +-- @(ns',defs) = leaveScope ns@ pops leaves the innermost local scope. +-- and returns its definitions +leaveScope :: (Ord k) => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)]) +leaveScope (NsMap _ []) = error "NsMaps.leaveScope: No local scope!" +leaveScope (NsMap gs (ls:lss)) = (NsMap gs lss, ls) + +-- | Add local definition +-- +-- @(ns',oldDef) = defLocal ns ident def@ adds the local definition +-- @ident := def@ to the innermost local scope, if there is a local scope, +-- and to the global scope otherwise. +-- It returns the modified name space @ns'@ and the old binding of +-- the identifier @oldDef@, which is overwritten. +defLocal :: (Ord k) => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a) +defLocal ns@(NsMap _ []) ident def = defGlobal ns ident def +defLocal (NsMap gs (ls:lss)) ident def = + (NsMap gs (((ident, def):ls):lss), + Prelude.lookup ident ls) + +-- | Search for a definition +-- +-- @def = find ns ident@ returns the definition in some scope (inner to outer), +-- if there is one. +lookupName :: (Ord k) => NameSpaceMap k a -> k -> Maybe a +lookupName ns@(NsMap _ localDefs) ident + = case lookupLocal localDefs of + Nothing -> lookupGlobal ns ident + Just def -> Just def + where + lookupLocal [] = Nothing + lookupLocal (ls:lss) = + case Prelude.lookup ident ls of + Nothing -> lookupLocal lss + Just def -> Just def + +lookupGlobal :: (Ord k) => NameSpaceMap k a -> k -> Maybe a +lookupGlobal (NsMap gs _) ident = Map.lookup ident gs + +lookupInnermostScope :: (Ord k) => NameSpaceMap k a -> k -> Maybe a +lookupInnermostScope nsm@(NsMap _gs localDefs) ident = + case localDefs of + (ls : _lss) -> Prelude.lookup ident ls + [] -> lookupGlobal nsm ident + +-- | flatten a namespace into a assoc list +-- +-- @nameSpaceToList ns = (localDefInnermost ns ++ .. ++ localDefsOutermost ns) ++ globalDefs ns@ +nsMapToList :: (Ord k) => NameSpaceMap k a -> [(k, a)] +nsMapToList (NsMap gs lss) = concat lss ++ Map.toList gs + +-- | Merge two namespaces. If they disagree on the types of any +-- variables, all bets are off. +mergeNameSpace :: (Ord k) => + NameSpaceMap k a + -> NameSpaceMap k a + -> NameSpaceMap k a +mergeNameSpace (NsMap global1 local1) (NsMap global2 local2) = + NsMap (Map.union global1 global2) (localUnion local1 local2) + where localUnion (l1:ls1) (l2:ls2) = + List.unionBy (\p1 p2 -> fst p1 == fst p2) l1 l2 : localUnion ls1 ls2 + localUnion [] ls2 = ls2 + localUnion ls1 [] = ls1
src/Language/C/Analysis/SemError.hs view
@@ -1,109 +1,109 @@-{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Analysis.SemError--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : alpha--- Portability : ghc------ Errors in the semantic analysis-------------------------------------------------------------------------------module Language.C.Analysis.SemError (-InvalidASTError(..), invalidAST,-BadSpecifierError(..), badSpecifierError,-TypeMismatch(..), typeMismatch,-RedefError(..), RedefInfo(..), RedefKind(..), redefinition,-)-where-import Data.Typeable---- this means we cannot use SemError in SemRep, but use rich types here-import Language.C.Analysis.SemRep--import Language.C.Data.Error-import Language.C.Data.Node---- here are the errors available---- | InvalidASTError is caused by the violation of an invariant in the AST-newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable)--instance Error InvalidASTError where- errorInfo (InvalidAST ei) = ei- changeErrorLevel (InvalidAST ei) lvl' = InvalidAST (changeErrorLevel ei lvl')---- | BadSpecifierError is caused by an invalid combination of specifiers-newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable)--instance Error BadSpecifierError where- errorInfo (BadSpecifierError ei) = ei- changeErrorLevel (BadSpecifierError ei) lvl' = BadSpecifierError (changeErrorLevel ei lvl')---- | RedefError is caused by an invalid redefinition of the same identifier or type-data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable--data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo-data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef | DisagreeLinkage |- NoLinkageOld-data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable---- Invalid AST--- ~~~~~~~~~~~--instance Show InvalidASTError where show = showError "AST invariant violated"--invalidAST :: NodeInfo -> String -> InvalidASTError-invalidAST node_info msg = InvalidAST (mkErrorInfo LevelError msg node_info)---- Bad specifier (e.g. static for a parameter, or extern when there is an initializer)--- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--instance Show BadSpecifierError where show = showError "Bad specifier"--badSpecifierError :: NodeInfo -> String -> BadSpecifierError-badSpecifierError node_info msg = BadSpecifierError (mkErrorInfo LevelError msg node_info)---- Type mismatch--- ~~~~~~~~~~~~~-typeMismatch :: String -> (NodeInfo, Type) -> (NodeInfo,Type) -> TypeMismatch-typeMismatch = TypeMismatch--instance Show TypeMismatch where- show tm = showError "Type mismatch" (typeMismatchInfo tm)-instance Error TypeMismatch where- errorInfo = typeMismatchInfo-typeMismatchInfo :: TypeMismatch -> ErrorInfo-typeMismatchInfo (TypeMismatch reason (node1,_ty2) _t2) =- ErrorInfo LevelError (posOfNode node1) [reason]---- Redefinitions--- ~~~~~~~~~~~~~--instance Show RedefError where- show (RedefError lvl info) = showErrorInfo (redefErrLabel info) (redefErrorInfo lvl info)-instance Error RedefError where- errorInfo (RedefError lvl info) = redefErrorInfo lvl info- changeErrorLevel (RedefError _lvl info) lvl' = RedefError lvl' info--redefErrLabel :: RedefInfo -> String-redefErrLabel (RedefInfo ident _ _ _) = ident ++ " redefined"--redefErrorInfo :: ErrorLevel -> RedefInfo -> ErrorInfo-redefErrorInfo lvl info@(RedefInfo _ _ node old_node) =- ErrorInfo lvl (posOfNode node) ([redefErrReason info] ++ prevDeclMsg old_node)--redefErrReason :: RedefInfo -> String-redefErrReason (RedefInfo ident DuplicateDef _ _) = "duplicate definition of " ++ ident-redefErrReason (RedefInfo ident ShadowedDef _ _) = "this declaration of " ++ ident ++ " shadows a previous one"-redefErrReason (RedefInfo ident DiffKindRedecl _ _) = ident ++ " previously declared as a different kind of symbol"-redefErrReason (RedefInfo ident DisagreeLinkage _ _) = ident ++ " previously declared with different linkage"-redefErrReason (RedefInfo ident NoLinkageOld _ _) = ident ++ " previously declared without linkage"--prevDeclMsg :: NodeInfo -> [String]-prevDeclMsg old_node = ["The previous declaration was here: ", show (posOfNode old_node)]--redefinition :: ErrorLevel -> String -> RedefKind -> NodeInfo -> NodeInfo -> RedefError-redefinition lvl ctx kind new old = RedefError lvl (RedefInfo ctx kind new old)-+{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Analysis.SemError +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : alpha +-- Portability : ghc +-- +-- Errors in the semantic analysis +----------------------------------------------------------------------------- +module Language.C.Analysis.SemError ( +InvalidASTError(..), invalidAST, +BadSpecifierError(..), badSpecifierError, +TypeMismatch(..), typeMismatch, +RedefError(..), RedefInfo(..), RedefKind(..), redefinition, +) +where +import Data.Typeable + +-- this means we cannot use SemError in SemRep, but use rich types here +import Language.C.Analysis.SemRep + +import Language.C.Data.Error +import Language.C.Data.Node + +-- here are the errors available + +-- | InvalidASTError is caused by the violation of an invariant in the AST +newtype InvalidASTError = InvalidAST ErrorInfo deriving (Typeable) + +instance Error InvalidASTError where + errorInfo (InvalidAST ei) = ei + changeErrorLevel (InvalidAST ei) lvl' = InvalidAST (changeErrorLevel ei lvl') + +-- | BadSpecifierError is caused by an invalid combination of specifiers +newtype BadSpecifierError = BadSpecifierError ErrorInfo deriving (Typeable) + +instance Error BadSpecifierError where + errorInfo (BadSpecifierError ei) = ei + changeErrorLevel (BadSpecifierError ei) lvl' = BadSpecifierError (changeErrorLevel ei lvl') + +-- | RedefError is caused by an invalid redefinition of the same identifier or type +data RedefError = RedefError ErrorLevel RedefInfo deriving Typeable + +data RedefInfo = RedefInfo String RedefKind NodeInfo NodeInfo +data RedefKind = DuplicateDef | DiffKindRedecl | ShadowedDef | DisagreeLinkage | + NoLinkageOld +data TypeMismatch = TypeMismatch String (NodeInfo,Type) (NodeInfo,Type) deriving Typeable + +-- Invalid AST +-- ~~~~~~~~~~~ + +instance Show InvalidASTError where show = showError "AST invariant violated" + +invalidAST :: NodeInfo -> String -> InvalidASTError +invalidAST node_info msg = InvalidAST (mkErrorInfo LevelError msg node_info) + +-- Bad specifier (e.g. static for a parameter, or extern when there is an initializer) +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +instance Show BadSpecifierError where show = showError "Bad specifier" + +badSpecifierError :: NodeInfo -> String -> BadSpecifierError +badSpecifierError node_info msg = BadSpecifierError (mkErrorInfo LevelError msg node_info) + +-- Type mismatch +-- ~~~~~~~~~~~~~ +typeMismatch :: String -> (NodeInfo, Type) -> (NodeInfo,Type) -> TypeMismatch +typeMismatch = TypeMismatch + +instance Show TypeMismatch where + show tm = showError "Type mismatch" (typeMismatchInfo tm) +instance Error TypeMismatch where + errorInfo = typeMismatchInfo +typeMismatchInfo :: TypeMismatch -> ErrorInfo +typeMismatchInfo (TypeMismatch reason (node1,_ty2) _t2) = + ErrorInfo LevelError (posOfNode node1) [reason] + +-- Redefinitions +-- ~~~~~~~~~~~~~ + +instance Show RedefError where + show (RedefError lvl info) = showErrorInfo (redefErrLabel info) (redefErrorInfo lvl info) +instance Error RedefError where + errorInfo (RedefError lvl info) = redefErrorInfo lvl info + changeErrorLevel (RedefError _lvl info) lvl' = RedefError lvl' info + +redefErrLabel :: RedefInfo -> String +redefErrLabel (RedefInfo ident _ _ _) = ident ++ " redefined" + +redefErrorInfo :: ErrorLevel -> RedefInfo -> ErrorInfo +redefErrorInfo lvl info@(RedefInfo _ _ node old_node) = + ErrorInfo lvl (posOfNode node) ([redefErrReason info] ++ prevDeclMsg old_node) + +redefErrReason :: RedefInfo -> String +redefErrReason (RedefInfo ident DuplicateDef _ _) = "duplicate definition of " ++ ident +redefErrReason (RedefInfo ident ShadowedDef _ _) = "this declaration of " ++ ident ++ " shadows a previous one" +redefErrReason (RedefInfo ident DiffKindRedecl _ _) = ident ++ " previously declared as a different kind of symbol" +redefErrReason (RedefInfo ident DisagreeLinkage _ _) = ident ++ " previously declared with different linkage" +redefErrReason (RedefInfo ident NoLinkageOld _ _) = ident ++ " previously declared without linkage" + +prevDeclMsg :: NodeInfo -> [String] +prevDeclMsg old_node = ["The previous declaration was here: ", show (posOfNode old_node)] + +redefinition :: ErrorLevel -> String -> RedefKind -> NodeInfo -> NodeInfo -> RedefError +redefinition lvl ctx kind new old = RedefError lvl (RedefInfo ctx kind new old) +
src/Language/C/Analysis/SemRep.hs view
@@ -1,680 +1,682 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Analysis.Syntax--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : alpha--- Portability : ghc------ This module contains definitions for representing C translation units.--- In contrast to 'Language.C.Syntax.AST', the representation tries to express the semantics of--- of a translation unit.-----------------------------------------------------------------------------------------------------module Language.C.Analysis.SemRep(--- * Sums of tags and identifiers-TagDef(..),typeOfTagDef,-Declaration(..),declIdent,declName,declType,declAttrs,-IdentDecl(..),objKindDescr, splitIdentDecls,--- * Global definitions-GlobalDecls(..),emptyGlobalDecls,filterGlobalDecls,mergeGlobalDecls,--- * Events for visitors-DeclEvent(..),--- * Declarations and definitions-Decl(..),-ObjDef(..),isTentative,-FunDef(..),-ParamDecl(..),MemberDecl(..),-TypeDef(..),identOfTypeDef,-VarDecl(..),--- * Declaration attributes-DeclAttrs(..),isExtDecl,-FunctionAttrs(..), functionAttrs, noFunctionAttrs,-Storage(..),declStorage,ThreadLocal,Register,-Linkage(..),hasLinkage,declLinkage,--- * Types-Type(..),-FunType(..),-ArraySize(..),-TypeDefRef(..),-TypeName(..),BuiltinType(..),-IntType(..),FloatType(..),-HasSUERef(..),HasCompTyKind(..),-CompTypeRef(..),CompType(..),typeOfCompDef,CompTyKind(..),-EnumTypeRef(..),EnumType(..),typeOfEnumDef,-Enumerator(..),-TypeQuals(..),noTypeQuals,mergeTypeQuals,--- * Variable names-VarName(..),identOfVarName,isNoName,AsmName,--- * Attributes (STUB, not yet analyzed)-Attr(..),Attributes,noAttributes,mergeAttributes,--- * Statements and Expressions (STUB, aliases to Syntax)-Stmt,Expr,Initializer,AsmBlock,-)-where-import Language.C.Data-import Language.C.Syntax-import Data.Map (Map)-import qualified Data.Map as Map-import Data.Maybe-import Data.Generics---- | accessor class : struct\/union\/enum names-class HasSUERef a where- sueRef :: a -> SUERef---- | accessor class : composite type tags (struct or union)-class HasCompTyKind a where- compTag :: a -> CompTyKind---- | Composite type definitions (tags)-data TagDef = CompDef CompType --composite definition- | EnumDef EnumType --enum definition- deriving (Typeable, Data {-! ,CNode !-})--instance HasSUERef TagDef where- sueRef (CompDef ct) = sueRef ct- sueRef (EnumDef et) = sueRef et---- | return the type corresponding to a tag definition-typeOfTagDef :: TagDef -> TypeName-typeOfTagDef (CompDef comptype) = typeOfCompDef comptype-typeOfTagDef (EnumDef enumtype) = typeOfEnumDef enumtype---- | All datatypes aggregating a declaration are instances of @Declaration@-class Declaration n where- -- | get the name, type and declaration attributes of a declaration or definition- getVarDecl :: n -> VarDecl---- | get the declaration corresponding to a definition-declOfDef :: (Declaration n, CNode n) => n -> Decl-declOfDef def = let vd = getVarDecl def in Decl vd (nodeInfo def)---- | get the variable identifier of a declaration (only safe if the--- the declaration is known to have a name)-declIdent :: (Declaration n) => n -> Ident-declIdent = identOfVarName . declName--- | get the variable name of a @Declaration@-declName :: (Declaration n) => n -> VarName-declName = (\(VarDecl n _ _) -> n) . getVarDecl--- | get the type of a @Declaration@-declType :: (Declaration n) => n -> Type-declType = (\(VarDecl _ _ ty) -> ty) . getVarDecl--- | get the declaration attributes of a @Declaration@-declAttrs :: (Declaration n) => n -> DeclAttrs-declAttrs = (\(VarDecl _ specs _) -> specs) . getVarDecl--instance (Declaration a, Declaration b) => Declaration (Either a b) where- getVarDecl = either getVarDecl getVarDecl---- | identifiers, typedefs and enumeration constants (namespace sum)-data IdentDecl = Declaration Decl -- ^ object or function declaration- | ObjectDef ObjDef -- ^ object definition- | FunctionDef FunDef -- ^ function definition- | EnumeratorDef Enumerator -- ^ definition of an enumerator- deriving (Typeable, Data {-! ,CNode !-})--instance Declaration IdentDecl where- getVarDecl (Declaration decl) = getVarDecl decl- getVarDecl (ObjectDef def) = getVarDecl def- getVarDecl (FunctionDef def) = getVarDecl def- getVarDecl (EnumeratorDef def) = getVarDecl def---- | textual description of the kind of an object-objKindDescr :: IdentDecl -> String-objKindDescr (Declaration _ ) = "declaration"-objKindDescr (ObjectDef _) = "object definition"-objKindDescr (FunctionDef _) = "function definition"-objKindDescr (EnumeratorDef _) = "enumerator definition"---- | @splitIdentDecls includeAllDecls@ splits a map of object, function and enumerator declarations and definitions into one map--- holding declarations, and three maps for object definitions, enumerator definitions and function definitions.--- If @includeAllDecls@ is @True@ all declarations are present in the first map, otherwise only those where no corresponding definition--- is available.-splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl,- ( Map Ident Enumerator,- Map Ident ObjDef,- Map Ident FunDef ) )-splitIdentDecls include_all = Map.foldWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty))- where- deal ident entry (decls,defs) = (Map.insert ident (declOfDef entry) decls, addDef ident entry defs)- deal' ident (Declaration d) (decls,defs) = (Map.insert ident d decls,defs)- deal' ident def (decls,defs) = (decls, addDef ident def defs)- addDef ident entry (es,os,fs) =- case entry of- Declaration _ -> (es,os,fs)- EnumeratorDef e -> (Map.insert ident e es,os,fs)- ObjectDef o -> (es,Map.insert ident o os,fs)- FunctionDef f -> (es, os,Map.insert ident f fs)----- | global declaration\/definition table returned by the analysis-data GlobalDecls = GlobalDecls {- gObjs :: Map Ident IdentDecl,- gTags :: Map SUERef TagDef,- gTypeDefs :: Map Ident TypeDef- }---- | empty global declaration table-emptyGlobalDecls :: GlobalDecls-emptyGlobalDecls = GlobalDecls Map.empty Map.empty Map.empty---- | filter global declarations-filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls-filterGlobalDecls decl_filter gmap = GlobalDecls- {- gObjs = Map.filter (decl_filter . DeclEvent) (gObjs gmap),- gTags = Map.filter (decl_filter . TagEvent) (gTags gmap),- gTypeDefs = Map.filter (decl_filter . TypeDefEvent) (gTypeDefs gmap)- }--- | merge global declarations-mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls-mergeGlobalDecls gmap1 gmap2 = GlobalDecls- {- gObjs = Map.union (gObjs gmap1) (gObjs gmap2),- gTags = Map.union (gTags gmap1) (gTags gmap2),- gTypeDefs = Map.union (gTypeDefs gmap1) (gTypeDefs gmap2)- }----- * Events---- | Declaration events------ Those events are reported to callbacks, which are executed during the traversal.-data DeclEvent =- TagEvent TagDef- -- ^ file-scope struct\/union\/enum event- | DeclEvent IdentDecl- -- ^ file-scope declaration or definition- | ParamEvent ParamDecl- -- ^ parameter declaration- | LocalEvent IdentDecl- -- ^ local variable declaration or definition- | TypeDefEvent TypeDef- -- ^ a type definition- | AsmEvent AsmBlock- -- ^ assembler block- deriving ({-! CNode !-})---- * Declarations and definitions---- | Declarations, which aren't definitions-data Decl = Decl VarDecl NodeInfo- deriving (Typeable, Data {-! ,CNode !-})--instance Declaration Decl where- getVarDecl (Decl vd _) = vd---- | Object Definitions------ An object definition is a declaration together with an initializer.------ If the initializer is missing, it is a tentative definition, i.e. a--- definition which might be overriden later on.-data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo- deriving (Typeable, Data {-! ,CNode !-})-instance Declaration ObjDef where- getVarDecl (ObjDef vd _ _) = vd---- | Returns @True@ if the given object definition is tentative.-isTentative :: ObjDef -> Bool-isTentative (ObjDef decl init_opt _) | isExtDecl decl = isNothing init_opt- | otherwise = False---- | Function definitions------ A function definition is a declaration together with a statement (the function body).-data FunDef = FunDef VarDecl Stmt NodeInfo- deriving (Typeable, Data {-! ,CNode !-})-instance Declaration FunDef where- getVarDecl (FunDef vd _ _) = vd----- | Parameter declaration-data ParamDecl = ParamDecl VarDecl NodeInfo- | AbstractParamDecl VarDecl NodeInfo- deriving (Typeable, Data {-! ,CNode !-} )--instance Declaration ParamDecl where- getVarDecl (ParamDecl vd _) = vd- getVarDecl (AbstractParamDecl vd _) = vd---- | Struct\/Union member declaration-data MemberDecl = MemberDecl VarDecl (Maybe Expr) NodeInfo- -- ^ @MemberDecl vardecl bitfieldsize node@- | AnonBitField Type Expr NodeInfo- -- ^ @AnonBitField typ size@- deriving (Typeable, Data {-! ,CNode !-} )--instance Declaration MemberDecl where- getVarDecl (MemberDecl vd _ _) = vd- getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty---- | @typedef@ definitions.------ The identifier is a new name for the given type.-data TypeDef = TypeDef Ident Type Attributes NodeInfo- deriving (Typeable, Data {-! ,CNode !-} )---- | return the idenitifier of a @typedef@-identOfTypeDef :: TypeDef -> Ident-identOfTypeDef (TypeDef ide _ _ _) = ide---- | Generic variable declarations-data VarDecl = VarDecl VarName DeclAttrs Type- deriving (Typeable, Data)--instance Declaration VarDecl where- getVarDecl = id---- @isExtDecl d@ returns true if the declaration has /linkage/-isExtDecl :: (Declaration n) => n -> Bool-isExtDecl = hasLinkage . declStorage---- | Declaration attributes of the form @DeclAttrs isInlineFunction storage linkage attrs@------ They specify the storage and linkage of a declared object.-data DeclAttrs = DeclAttrs FunctionAttrs Storage Attributes- -- ^ @DeclAttrs fspecs storage attrs@- deriving (Typeable, Data)---- | get the 'Storage' of a declaration-declStorage :: (Declaration d) => d -> Storage-declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st---- | get the `function attributes' of a declaration-functionAttrs :: (Declaration d) => d -> FunctionAttrs-functionAttrs d = case declAttrs d of (DeclAttrs fa _ _) -> fa---- Function attributes (inline, noreturn)-data FunctionAttrs = FunctionAttrs { isInline :: Bool, isNoreturn :: Bool }- deriving (Eq, Ord, Typeable, Data)--noFunctionAttrs :: FunctionAttrs-noFunctionAttrs = FunctionAttrs { isInline = False, isNoreturn = False }----- In C we have--- Identifiers can either have internal, external or no linkage--- (same object everywhere, same object within the translation unit, unique).--- * top-level identifiers--- static : internal linkage (objects and function defs)--- extern : linkage of prior declaration (if specified), external linkage otherwise--- no-spec: external linkage--- * storage duration--- * static storage duration: objects with external or internal linkage, or local ones with the static keyword--- * automatic storage duration: otherwise (register)--- See http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html, Table 8.1, 8.2---- | Storage duration and linkage of a variable-data Storage = NoStorage -- ^ no storage- | Auto Register -- ^ automatic storage (optional: register)- | Static Linkage ThreadLocal -- ^ static storage, linkage spec and thread local specifier (gnu c)- | FunLinkage Linkage -- ^ function, either internal or external linkage- deriving (Typeable, Data, Show, Eq, Ord)--type ThreadLocal = Bool-type Register = Bool---- | Linkage: Either no linkage, internal to the translation unit or external-data Linkage = NoLinkage | InternalLinkage | ExternalLinkage- deriving (Typeable, Data, Show, Eq, Ord)---- | return @True@ if the object has linkage-hasLinkage :: Storage -> Bool-hasLinkage (Auto _) = False-hasLinkage (Static NoLinkage _) = False-hasLinkage _ = True---- | Get the linkage of a definition-declLinkage :: (Declaration d) => d -> Linkage-declLinkage decl =- case declStorage decl of- NoStorage -> undefined- Auto _ -> NoLinkage- Static linkage _ -> linkage- FunLinkage linkage -> linkage----- * types---- | types of C objects-data Type =- DirectType TypeName TypeQuals Attributes- -- ^ a non-derived type- | PtrType Type TypeQuals Attributes- -- ^ pointer type- | ArrayType Type ArraySize TypeQuals Attributes- -- ^ array type- | FunctionType FunType Attributes- -- ^ function type- | TypeDefType TypeDefRef TypeQuals Attributes- -- ^ a defined type- deriving (Typeable, Data)---- | Function types are of the form @FunType return-type params isVariadic@.------ If the parameter types aren't yet known, the function has type @FunTypeIncomplete type attrs@.-data FunType = FunType Type [ParamDecl] Bool- | FunTypeIncomplete Type- deriving (Typeable, Data)---- | An array type may either have unknown size or a specified array size, the latter either variable or constant.--- Furthermore, when used as a function parameters, the size may be qualified as /static/.--- In a function prototype, the size may be `Unspecified variable size' (@[*]@).-data ArraySize = UnknownArraySize Bool- -- ^ @UnknownArraySize is-starred@- | ArraySize Bool Expr- -- ^ @FixedSizeArray is-static size-expr@- deriving (Typeable, Data)---- | normalized type representation-data TypeName =- TyVoid- | TyIntegral IntType- | TyFloating FloatType- | TyComplex FloatType- | TyComp CompTypeRef- | TyEnum EnumTypeRef- | TyBuiltin BuiltinType- deriving (Typeable, Data)---- | Builtin type (va_list, anything)-data BuiltinType = TyVaList- | TyAny- deriving (Typeable, Data)---- | typdef references--- If the actual type is known, it is attached for convenience-data TypeDefRef = TypeDefRef Ident Type NodeInfo- deriving (Typeable, Data {-! ,CNode !-})---- | integral types (C99 6.7.2.2)-data IntType =- TyBool- | TyChar- | TySChar- | TyUChar- | TyShort- | TyUShort- | TyInt- | TyUInt- | TyInt128- | TyUInt128- | TyLong- | TyULong- | TyLLong- | TyULLong- deriving (Typeable, Data, Eq, Ord)--instance Show IntType where- show TyBool = "_Bool"- show TyChar = "char"- show TySChar = "signed char"- show TyUChar = "unsigned char"- show TyShort = "short"- show TyUShort = "unsigned short"- show TyInt = "int"- show TyUInt = "unsigned int"- show TyInt128 = "__int128"- show TyUInt128 = "unsigned __int128"- show TyLong = "long"- show TyULong = "unsigned long"- show TyLLong = "long long"- show TyULLong = "unsigned long long"---- | floating point type (C99 6.7.2.2)-data FloatType =- TyFloat- | TyDouble- | TyLDouble- deriving (Typeable, Data, Eq, Ord)--instance Show FloatType where- show TyFloat = "float"- show TyDouble = "double"- show TyLDouble = "long double"---- | composite type declarations-data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo- deriving (Typeable, Data {-! ,CNode !-})--instance HasSUERef CompTypeRef where sueRef (CompTypeRef ref _ _) = ref-instance HasCompTyKind CompTypeRef where compTag (CompTypeRef _ tag _) = tag--data EnumTypeRef = EnumTypeRef SUERef NodeInfo- deriving (Typeable, Data {-! ,CNode !-})-instance HasSUERef EnumTypeRef where sueRef (EnumTypeRef ref _) = ref---- | Composite type (struct or union).-data CompType = CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo- deriving (Typeable, Data {-! ,CNode !-} )-instance HasSUERef CompType where sueRef (CompType ref _ _ _ _) = ref-instance HasCompTyKind CompType where compTag (CompType _ tag _ _ _) = tag---- | return the type of a composite type definition-typeOfCompDef :: CompType -> TypeName-typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag undefNode)---- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'.-data CompTyKind = StructTag- | UnionTag- deriving (Eq,Ord,Typeable,Data)--instance Show CompTyKind where- show StructTag = "struct"- show UnionTag = "union"---- | Representation of C enumeration types-data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo- -- ^ @EnumType name enumeration-constants attrs node@- deriving (Typeable, Data {-! ,CNode !-} )--instance HasSUERef EnumType where sueRef (EnumType ref _ _ _) = ref---- | return the type of an enum definition-typeOfEnumDef :: EnumType -> TypeName-typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref undefNode)---- | An Enumerator consists of an identifier, a constant expressions and the link to its type-data Enumerator = Enumerator Ident Expr EnumType NodeInfo- deriving (Typeable, Data {-! ,CNode !-})-instance Declaration Enumerator where- getVarDecl (Enumerator ide _ enumty _) =- VarDecl- (VarName ide Nothing)- (DeclAttrs noFunctionAttrs NoStorage [])- (DirectType (typeOfEnumDef enumty) noTypeQuals noAttributes)---- | Type qualifiers: constant, volatile and restrict-data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool,- restrict :: Bool, atomic :: Bool,- nullable :: Bool, nonnull :: Bool }- deriving (Typeable, Data)--instance Eq TypeQuals where- (==) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =- c1 == c2 && v1 == v2 && r1 == r2 && a1 == a2 && n1 == n2 && nn1 == nn2--instance Ord TypeQuals where- (<=) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =- c1 <= c2 && v1 <= v2 && r1 <= r2 && a1 <= a2 && n1 <= n2 && nn1 <= nn2----- | no type qualifiers-noTypeQuals :: TypeQuals-noTypeQuals = TypeQuals False False False False False False---- | merge (/&&/) two type qualifier sets-mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals-mergeTypeQuals (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) =- TypeQuals (c1 && c2) (v1 && v2) (r1 && r2) (a1 && a2) (n1 && n2) (nn1 && nn2)---- * initializers---- | 'Initializer' is currently an alias for 'CInit'.------ We're planning a normalized representation, but this depends on the implementation of--- constant expression evaluation-type Initializer = CInit---- | Normalized C Initializers--- * If the expression has scalar type, the initializer is an expression--- * If the expression has struct type, the initializer is a map from designators to initializers--- * If the expression has array type, the initializer is a list of values--- Not implemented yet, as it depends on constant expression evaluation----- * names and attributes---- | @VarName name assembler-name@ is a name of an declared object-data VarName = VarName Ident (Maybe AsmName)- | NoName- deriving (Typeable, Data)-identOfVarName :: VarName -> Ident-identOfVarName NoName = error "identOfVarName: NoName"-identOfVarName (VarName ident _) = ident--isNoName :: VarName -> Bool-isNoName NoName = True-isNoName _ = False---- | Top level assembler block (alias for @CStrLit@)-type AsmBlock = CStrLit---- | Assembler name (alias for @CStrLit@)-type AsmName = CStrLit---- | @__attribute__@ annotations------ Those are of the form @Attr attribute-name attribute-parameters@,--- and serve as generic properties of some syntax tree elements.------ Some examples:------ * labels can be attributed with /unused/ to indicate that their not used------ * struct definitions can be attributed with /packed/ to tell the compiler to use the most compact representation------ * declarations can be attributed with /deprecated/------ * function declarations can be attributes with /noreturn/ to tell the compiler that the function will never return,------ * or with /const/ to indicate that it is a pure function------ /TODO/: ultimatively, we want to parse attributes and represent them in a typed way-data Attr = Attr Ident [Expr] NodeInfo- deriving (Typeable, Data {-! ,CNode !-})--type Attributes = [Attr]---- |Empty attribute list-noAttributes :: Attributes-noAttributes = []---- |Merge attribute lists--- /TODO/: currently does not remove duplicates-mergeAttributes :: Attributes -> Attributes -> Attributes-mergeAttributes = (++)---- * statements and expressions (Type aliases)---- | 'Stmt' is an alias for 'CStat' (Syntax)-type Stmt = CStat--- | 'Expr' is currently an alias for 'CExpr' (Syntax)-type Expr = CExpr--- GENERATED START--instance CNode TagDef where- nodeInfo (CompDef d) = nodeInfo d- nodeInfo (EnumDef d) = nodeInfo d-instance Pos TagDef where- posOf x = posOf (nodeInfo x)--instance CNode IdentDecl where- nodeInfo (Declaration d) = nodeInfo d- nodeInfo (ObjectDef d) = nodeInfo d- nodeInfo (FunctionDef d) = nodeInfo d- nodeInfo (EnumeratorDef d) = nodeInfo d-instance Pos IdentDecl where- posOf x = posOf (nodeInfo x)--instance CNode DeclEvent where- nodeInfo (TagEvent d) = nodeInfo d- nodeInfo (DeclEvent d) = nodeInfo d- nodeInfo (ParamEvent d) = nodeInfo d- nodeInfo (LocalEvent d) = nodeInfo d- nodeInfo (TypeDefEvent d) = nodeInfo d- nodeInfo (AsmEvent d) = nodeInfo d-instance Pos DeclEvent where- posOf x = posOf (nodeInfo x)--instance CNode Decl where- nodeInfo (Decl _ n) = n-instance Pos Decl where- posOf x = posOf (nodeInfo x)--instance CNode ObjDef where- nodeInfo (ObjDef _ _ n) = n-instance Pos ObjDef where- posOf x = posOf (nodeInfo x)--instance CNode FunDef where- nodeInfo (FunDef _ _ n) = n-instance Pos FunDef where- posOf x = posOf (nodeInfo x)--instance CNode ParamDecl where- nodeInfo (ParamDecl _ n) = n- nodeInfo (AbstractParamDecl _ n) = n-instance Pos ParamDecl where- posOf x = posOf (nodeInfo x)--instance CNode MemberDecl where- nodeInfo (MemberDecl _ _ n) = n- nodeInfo (AnonBitField _ _ n) = n-instance Pos MemberDecl where- posOf x = posOf (nodeInfo x)--instance CNode TypeDef where- nodeInfo (TypeDef _ _ _ n) = n-instance Pos TypeDef where- posOf x = posOf (nodeInfo x)--instance CNode TypeDefRef where- nodeInfo (TypeDefRef _ _ n) = n-instance Pos TypeDefRef where- posOf x = posOf (nodeInfo x)--instance CNode CompTypeRef where- nodeInfo (CompTypeRef _ _ n) = n-instance Pos CompTypeRef where- posOf x = posOf (nodeInfo x)--instance CNode EnumTypeRef where- nodeInfo (EnumTypeRef _ n) = n-instance Pos EnumTypeRef where- posOf x = posOf (nodeInfo x)--instance CNode CompType where- nodeInfo (CompType _ _ _ _ n) = n-instance Pos CompType where- posOf x = posOf (nodeInfo x)--instance CNode EnumType where- nodeInfo (EnumType _ _ _ n) = n-instance Pos EnumType where- posOf x = posOf (nodeInfo x)--instance CNode Enumerator where- nodeInfo (Enumerator _ _ _ n) = n-instance Pos Enumerator where- posOf x = posOf (nodeInfo x)--instance CNode Attr where- nodeInfo (Attr _ _ n) = n-instance Pos Attr where- posOf x = posOf (nodeInfo x)--- GENERATED STOP+{-# LANGUAGE DeriveDataTypeable #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Analysis.Syntax +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : alpha +-- Portability : ghc +-- +-- This module contains definitions for representing C translation units. +-- In contrast to 'Language.C.Syntax.AST', the representation tries to express the semantics of +-- of a translation unit. +--------------------------------------------------------------------------------------------------- +module Language.C.Analysis.SemRep( +-- * Sums of tags and identifiers +TagDef(..),typeOfTagDef, +Declaration(..),declIdent,declName,declType,declAttrs, +IdentDecl(..),objKindDescr, splitIdentDecls, +-- * Global definitions +GlobalDecls(..),emptyGlobalDecls,filterGlobalDecls,mergeGlobalDecls, +-- * Events for visitors +DeclEvent(..), +-- * Declarations and definitions +Decl(..), +ObjDef(..),isTentative, +FunDef(..), +ParamDecl(..),MemberDecl(..), +TypeDef(..),identOfTypeDef, +VarDecl(..), +-- * Declaration attributes +DeclAttrs(..),isExtDecl, +FunctionAttrs(..), functionAttrs, noFunctionAttrs, +Storage(..),declStorage,ThreadLocal,Register, +Linkage(..),hasLinkage,declLinkage, +-- * Types +Type(..), +FunType(..), +ArraySize(..), +TypeDefRef(..), +TypeName(..),BuiltinType(..), +IntType(..),FloatType(..), +HasSUERef(..),HasCompTyKind(..), +CompTypeRef(..),CompType(..),typeOfCompDef,CompTyKind(..), +EnumTypeRef(..),EnumType(..),typeOfEnumDef, +Enumerator(..), +TypeQuals(..),noTypeQuals,mergeTypeQuals, +-- * Variable names +VarName(..),identOfVarName,isNoName,AsmName, +-- * Attributes (STUB, not yet analyzed) +Attr(..),Attributes,noAttributes,mergeAttributes, +-- * Statements and Expressions (STUB, aliases to Syntax) +Stmt,Expr,Initializer,AsmBlock, +) +where +import Language.C.Data +import Language.C.Syntax +import Data.Map (Map) +import qualified Data.Map as Map +import Data.Maybe +import Data.Generics + +-- | accessor class : struct\/union\/enum names +class HasSUERef a where + sueRef :: a -> SUERef + +-- | accessor class : composite type tags (struct or union) +class HasCompTyKind a where + compTag :: a -> CompTyKind + +-- | Composite type definitions (tags) +data TagDef = CompDef CompType --composite definition + | EnumDef EnumType --enum definition + deriving (Typeable, Data {-! ,CNode !-}) + +instance HasSUERef TagDef where + sueRef (CompDef ct) = sueRef ct + sueRef (EnumDef et) = sueRef et + +-- | return the type corresponding to a tag definition +typeOfTagDef :: TagDef -> TypeName +typeOfTagDef (CompDef comptype) = typeOfCompDef comptype +typeOfTagDef (EnumDef enumtype) = typeOfEnumDef enumtype + +-- | All datatypes aggregating a declaration are instances of @Declaration@ +class Declaration n where + -- | get the name, type and declaration attributes of a declaration or definition + getVarDecl :: n -> VarDecl + +-- | get the declaration corresponding to a definition +declOfDef :: (Declaration n, CNode n) => n -> Decl +declOfDef def = let vd = getVarDecl def in Decl vd (nodeInfo def) + +-- | get the variable identifier of a declaration (only safe if the +-- the declaration is known to have a name) +declIdent :: (Declaration n) => n -> Ident +declIdent = identOfVarName . declName +-- | get the variable name of a @Declaration@ +declName :: (Declaration n) => n -> VarName +declName = (\(VarDecl n _ _) -> n) . getVarDecl +-- | get the type of a @Declaration@ +declType :: (Declaration n) => n -> Type +declType = (\(VarDecl _ _ ty) -> ty) . getVarDecl +-- | get the declaration attributes of a @Declaration@ +declAttrs :: (Declaration n) => n -> DeclAttrs +declAttrs = (\(VarDecl _ specs _) -> specs) . getVarDecl + +instance (Declaration a, Declaration b) => Declaration (Either a b) where + getVarDecl = either getVarDecl getVarDecl + +-- | identifiers, typedefs and enumeration constants (namespace sum) +data IdentDecl = Declaration Decl -- ^ object or function declaration + | ObjectDef ObjDef -- ^ object definition + | FunctionDef FunDef -- ^ function definition + | EnumeratorDef Enumerator -- ^ definition of an enumerator + deriving (Typeable, Data {-! ,CNode !-}) + +instance Declaration IdentDecl where + getVarDecl (Declaration decl) = getVarDecl decl + getVarDecl (ObjectDef def) = getVarDecl def + getVarDecl (FunctionDef def) = getVarDecl def + getVarDecl (EnumeratorDef def) = getVarDecl def + +-- | textual description of the kind of an object +objKindDescr :: IdentDecl -> String +objKindDescr (Declaration _ ) = "declaration" +objKindDescr (ObjectDef _) = "object definition" +objKindDescr (FunctionDef _) = "function definition" +objKindDescr (EnumeratorDef _) = "enumerator definition" + +-- | @splitIdentDecls includeAllDecls@ splits a map of object, function and enumerator declarations and definitions into one map +-- holding declarations, and three maps for object definitions, enumerator definitions and function definitions. +-- If @includeAllDecls@ is @True@ all declarations are present in the first map, otherwise only those where no corresponding definition +-- is available. +splitIdentDecls :: Bool -> Map Ident IdentDecl -> (Map Ident Decl, + ( Map Ident Enumerator, + Map Ident ObjDef, + Map Ident FunDef ) ) +splitIdentDecls include_all = Map.foldWithKey (if include_all then deal else deal') (Map.empty,(Map.empty,Map.empty,Map.empty)) + where + deal ident entry (decls,defs) = (Map.insert ident (declOfDef entry) decls, addDef ident entry defs) + deal' ident (Declaration d) (decls,defs) = (Map.insert ident d decls,defs) + deal' ident def (decls,defs) = (decls, addDef ident def defs) + addDef ident entry (es,os,fs) = + case entry of + Declaration _ -> (es,os,fs) + EnumeratorDef e -> (Map.insert ident e es,os,fs) + ObjectDef o -> (es,Map.insert ident o os,fs) + FunctionDef f -> (es, os,Map.insert ident f fs) + + +-- | global declaration\/definition table returned by the analysis +data GlobalDecls = GlobalDecls { + gObjs :: Map Ident IdentDecl, + gTags :: Map SUERef TagDef, + gTypeDefs :: Map Ident TypeDef + } + +-- | empty global declaration table +emptyGlobalDecls :: GlobalDecls +emptyGlobalDecls = GlobalDecls Map.empty Map.empty Map.empty + +-- | filter global declarations +filterGlobalDecls :: (DeclEvent -> Bool) -> GlobalDecls -> GlobalDecls +filterGlobalDecls decl_filter gmap = GlobalDecls + { + gObjs = Map.filter (decl_filter . DeclEvent) (gObjs gmap), + gTags = Map.filter (decl_filter . TagEvent) (gTags gmap), + gTypeDefs = Map.filter (decl_filter . TypeDefEvent) (gTypeDefs gmap) + } +-- | merge global declarations +mergeGlobalDecls :: GlobalDecls -> GlobalDecls -> GlobalDecls +mergeGlobalDecls gmap1 gmap2 = GlobalDecls + { + gObjs = Map.union (gObjs gmap1) (gObjs gmap2), + gTags = Map.union (gTags gmap1) (gTags gmap2), + gTypeDefs = Map.union (gTypeDefs gmap1) (gTypeDefs gmap2) + } + + +-- * Events + +-- | Declaration events +-- +-- Those events are reported to callbacks, which are executed during the traversal. +data DeclEvent = + TagEvent TagDef + -- ^ file-scope struct\/union\/enum event + | DeclEvent IdentDecl + -- ^ file-scope declaration or definition + | ParamEvent ParamDecl + -- ^ parameter declaration + | LocalEvent IdentDecl + -- ^ local variable declaration or definition + | TypeDefEvent TypeDef + -- ^ a type definition + | AsmEvent AsmBlock + -- ^ assembler block + deriving ({-! CNode !-}) + +-- * Declarations and definitions + +-- | Declarations, which aren't definitions +data Decl = Decl VarDecl NodeInfo + deriving (Typeable, Data {-! ,CNode !-}) + +instance Declaration Decl where + getVarDecl (Decl vd _) = vd + +-- | Object Definitions +-- +-- An object definition is a declaration together with an initializer. +-- +-- If the initializer is missing, it is a tentative definition, i.e. a +-- definition which might be overriden later on. +data ObjDef = ObjDef VarDecl (Maybe Initializer) NodeInfo + deriving (Typeable, Data {-! ,CNode !-}) +instance Declaration ObjDef where + getVarDecl (ObjDef vd _ _) = vd + +-- | Returns @True@ if the given object definition is tentative. +isTentative :: ObjDef -> Bool +isTentative (ObjDef decl init_opt _) | isExtDecl decl = isNothing init_opt + | otherwise = False + +-- | Function definitions +-- +-- A function definition is a declaration together with a statement (the function body). +data FunDef = FunDef VarDecl Stmt NodeInfo + deriving (Typeable, Data {-! ,CNode !-}) +instance Declaration FunDef where + getVarDecl (FunDef vd _ _) = vd + + +-- | Parameter declaration +data ParamDecl = ParamDecl VarDecl NodeInfo + | AbstractParamDecl VarDecl NodeInfo + deriving (Typeable, Data {-! ,CNode !-} ) + +instance Declaration ParamDecl where + getVarDecl (ParamDecl vd _) = vd + getVarDecl (AbstractParamDecl vd _) = vd + +-- | Struct\/Union member declaration +data MemberDecl = MemberDecl VarDecl (Maybe Expr) NodeInfo + -- ^ @MemberDecl vardecl bitfieldsize node@ + | AnonBitField Type Expr NodeInfo + -- ^ @AnonBitField typ size@ + deriving (Typeable, Data {-! ,CNode !-} ) + +instance Declaration MemberDecl where + getVarDecl (MemberDecl vd _ _) = vd + getVarDecl (AnonBitField ty _ _) = VarDecl NoName (DeclAttrs noFunctionAttrs NoStorage []) ty + +-- | @typedef@ definitions. +-- +-- The identifier is a new name for the given type. +data TypeDef = TypeDef Ident Type Attributes NodeInfo + deriving (Typeable, Data {-! ,CNode !-} ) + +-- | return the idenitifier of a @typedef@ +identOfTypeDef :: TypeDef -> Ident +identOfTypeDef (TypeDef ide _ _ _) = ide + +-- | Generic variable declarations +data VarDecl = VarDecl VarName DeclAttrs Type + deriving (Typeable, Data) + +instance Declaration VarDecl where + getVarDecl = id + +-- @isExtDecl d@ returns true if the declaration has /linkage/ +isExtDecl :: (Declaration n) => n -> Bool +isExtDecl = hasLinkage . declStorage + +-- | Declaration attributes of the form @DeclAttrs isInlineFunction storage linkage attrs@ +-- +-- They specify the storage and linkage of a declared object. +data DeclAttrs = DeclAttrs FunctionAttrs Storage Attributes + -- ^ @DeclAttrs fspecs storage attrs@ + deriving (Typeable, Data) + +-- | get the 'Storage' of a declaration +declStorage :: (Declaration d) => d -> Storage +declStorage d = case declAttrs d of (DeclAttrs _ st _) -> st + +-- | get the `function attributes' of a declaration +functionAttrs :: (Declaration d) => d -> FunctionAttrs +functionAttrs d = case declAttrs d of (DeclAttrs fa _ _) -> fa + +-- Function attributes (inline, noreturn) +data FunctionAttrs = FunctionAttrs { isInline :: Bool, isNoreturn :: Bool } + deriving (Eq, Ord, Typeable, Data) + +noFunctionAttrs :: FunctionAttrs +noFunctionAttrs = FunctionAttrs { isInline = False, isNoreturn = False } + + +-- In C we have +-- Identifiers can either have internal, external or no linkage +-- (same object everywhere, same object within the translation unit, unique). +-- * top-level identifiers +-- static : internal linkage (objects and function defs) +-- extern : linkage of prior declaration (if specified), external linkage otherwise +-- no-spec: external linkage +-- * storage duration +-- * static storage duration: objects with external or internal linkage, or local ones with the static keyword +-- * automatic storage duration: otherwise (register) +-- See http://publications.gbdirect.co.uk/c_book/chapter8/declarations_and_definitions.html, Table 8.1, 8.2 + +-- | Storage duration and linkage of a variable +data Storage = NoStorage -- ^ no storage + | Auto Register -- ^ automatic storage (optional: register) + | Static Linkage ThreadLocal -- ^ static storage, linkage spec and thread local specifier (gnu c) + | FunLinkage Linkage -- ^ function, either internal or external linkage + deriving (Typeable, Data, Show, Eq, Ord) + +type ThreadLocal = Bool +type Register = Bool + +-- | Linkage: Either no linkage, internal to the translation unit or external +data Linkage = NoLinkage | InternalLinkage | ExternalLinkage + deriving (Typeable, Data, Show, Eq, Ord) + +-- | return @True@ if the object has linkage +hasLinkage :: Storage -> Bool +hasLinkage (Auto _) = False +hasLinkage (Static NoLinkage _) = False +hasLinkage _ = True + +-- | Get the linkage of a definition +declLinkage :: (Declaration d) => d -> Linkage +declLinkage decl = + case declStorage decl of + NoStorage -> undefined + Auto _ -> NoLinkage + Static linkage _ -> linkage + FunLinkage linkage -> linkage + + +-- * types + +-- | types of C objects +data Type = + DirectType TypeName TypeQuals Attributes + -- ^ a non-derived type + | PtrType Type TypeQuals Attributes + -- ^ pointer type + | ArrayType Type ArraySize TypeQuals Attributes + -- ^ array type + | FunctionType FunType Attributes + -- ^ function type + | TypeDefType TypeDefRef TypeQuals Attributes + -- ^ a defined type + deriving (Typeable, Data) + +-- | Function types are of the form @FunType return-type params isVariadic@. +-- +-- If the parameter types aren't yet known, the function has type @FunTypeIncomplete type attrs@. +data FunType = FunType Type [ParamDecl] Bool + | FunTypeIncomplete Type + deriving (Typeable, Data) + +-- | An array type may either have unknown size or a specified array size, the latter either variable or constant. +-- Furthermore, when used as a function parameters, the size may be qualified as /static/. +-- In a function prototype, the size may be `Unspecified variable size' (@[*]@). +data ArraySize = UnknownArraySize Bool + -- ^ @UnknownArraySize is-starred@ + | ArraySize Bool Expr + -- ^ @FixedSizeArray is-static size-expr@ + deriving (Typeable, Data) + +-- | normalized type representation +data TypeName = + TyVoid + | TyIntegral IntType + | TyFloating FloatType + | TyComplex FloatType + | TyComp CompTypeRef + | TyEnum EnumTypeRef + | TyBuiltin BuiltinType + deriving (Typeable, Data) + +-- | Builtin type (va_list, anything) +data BuiltinType = TyVaList + | TyAny + deriving (Typeable, Data) + +-- | typdef references +-- If the actual type is known, it is attached for convenience +data TypeDefRef = TypeDefRef Ident Type NodeInfo + deriving (Typeable, Data {-! ,CNode !-}) + +-- | integral types (C99 6.7.2.2) +data IntType = + TyBool + | TyChar + | TySChar + | TyUChar + | TyShort + | TyUShort + | TyInt + | TyUInt + | TyInt128 + | TyUInt128 + | TyLong + | TyULong + | TyLLong + | TyULLong + deriving (Typeable, Data, Eq, Ord) + +instance Show IntType where + show TyBool = "_Bool" + show TyChar = "char" + show TySChar = "signed char" + show TyUChar = "unsigned char" + show TyShort = "short" + show TyUShort = "unsigned short" + show TyInt = "int" + show TyUInt = "unsigned int" + show TyInt128 = "__int128" + show TyUInt128 = "unsigned __int128" + show TyLong = "long" + show TyULong = "unsigned long" + show TyLLong = "long long" + show TyULLong = "unsigned long long" + +-- | floating point type (C99 6.7.2.2) +data FloatType = + TyFloat + | TyDouble + | TyLDouble + | TyFloat128 + deriving (Typeable, Data, Eq, Ord) + +instance Show FloatType where + show TyFloat = "float" + show TyDouble = "double" + show TyLDouble = "long double" + show TyFloat128 = "__float128" + +-- | composite type declarations +data CompTypeRef = CompTypeRef SUERef CompTyKind NodeInfo + deriving (Typeable, Data {-! ,CNode !-}) + +instance HasSUERef CompTypeRef where sueRef (CompTypeRef ref _ _) = ref +instance HasCompTyKind CompTypeRef where compTag (CompTypeRef _ tag _) = tag + +data EnumTypeRef = EnumTypeRef SUERef NodeInfo + deriving (Typeable, Data {-! ,CNode !-}) +instance HasSUERef EnumTypeRef where sueRef (EnumTypeRef ref _) = ref + +-- | Composite type (struct or union). +data CompType = CompType SUERef CompTyKind [MemberDecl] Attributes NodeInfo + deriving (Typeable, Data {-! ,CNode !-} ) +instance HasSUERef CompType where sueRef (CompType ref _ _ _ _) = ref +instance HasCompTyKind CompType where compTag (CompType _ tag _ _ _) = tag + +-- | return the type of a composite type definition +typeOfCompDef :: CompType -> TypeName +typeOfCompDef (CompType ref tag _ _ _) = TyComp (CompTypeRef ref tag undefNode) + +-- | a tag to determine wheter we refer to a @struct@ or @union@, see 'CompType'. +data CompTyKind = StructTag + | UnionTag + deriving (Eq,Ord,Typeable,Data) + +instance Show CompTyKind where + show StructTag = "struct" + show UnionTag = "union" + +-- | Representation of C enumeration types +data EnumType = EnumType SUERef [Enumerator] Attributes NodeInfo + -- ^ @EnumType name enumeration-constants attrs node@ + deriving (Typeable, Data {-! ,CNode !-} ) + +instance HasSUERef EnumType where sueRef (EnumType ref _ _ _) = ref + +-- | return the type of an enum definition +typeOfEnumDef :: EnumType -> TypeName +typeOfEnumDef (EnumType ref _ _ _) = TyEnum (EnumTypeRef ref undefNode) + +-- | An Enumerator consists of an identifier, a constant expressions and the link to its type +data Enumerator = Enumerator Ident Expr EnumType NodeInfo + deriving (Typeable, Data {-! ,CNode !-}) +instance Declaration Enumerator where + getVarDecl (Enumerator ide _ enumty _) = + VarDecl + (VarName ide Nothing) + (DeclAttrs noFunctionAttrs NoStorage []) + (DirectType (typeOfEnumDef enumty) noTypeQuals noAttributes) + +-- | Type qualifiers: constant, volatile and restrict +data TypeQuals = TypeQuals { constant :: Bool, volatile :: Bool, + restrict :: Bool, atomic :: Bool, + nullable :: Bool, nonnull :: Bool } + deriving (Typeable, Data) + +instance Eq TypeQuals where + (==) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) = + c1 == c2 && v1 == v2 && r1 == r2 && a1 == a2 && n1 == n2 && nn1 == nn2 + +instance Ord TypeQuals where + (<=) (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) = + c1 <= c2 && v1 <= v2 && r1 <= r2 && a1 <= a2 && n1 <= n2 && nn1 <= nn2 + + +-- | no type qualifiers +noTypeQuals :: TypeQuals +noTypeQuals = TypeQuals False False False False False False + +-- | merge (/&&/) two type qualifier sets +mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals +mergeTypeQuals (TypeQuals c1 v1 r1 a1 n1 nn1) (TypeQuals c2 v2 r2 a2 n2 nn2) = + TypeQuals (c1 && c2) (v1 && v2) (r1 && r2) (a1 && a2) (n1 && n2) (nn1 && nn2) + +-- * initializers + +-- | 'Initializer' is currently an alias for 'CInit'. +-- +-- We're planning a normalized representation, but this depends on the implementation of +-- constant expression evaluation +type Initializer = CInit + +-- | Normalized C Initializers +-- * If the expression has scalar type, the initializer is an expression +-- * If the expression has struct type, the initializer is a map from designators to initializers +-- * If the expression has array type, the initializer is a list of values +-- Not implemented yet, as it depends on constant expression evaluation + + +-- * names and attributes + +-- | @VarName name assembler-name@ is a name of an declared object +data VarName = VarName Ident (Maybe AsmName) + | NoName + deriving (Typeable, Data) +identOfVarName :: VarName -> Ident +identOfVarName NoName = error "identOfVarName: NoName" +identOfVarName (VarName ident _) = ident + +isNoName :: VarName -> Bool +isNoName NoName = True +isNoName _ = False + +-- | Top level assembler block (alias for @CStrLit@) +type AsmBlock = CStrLit + +-- | Assembler name (alias for @CStrLit@) +type AsmName = CStrLit + +-- | @__attribute__@ annotations +-- +-- Those are of the form @Attr attribute-name attribute-parameters@, +-- and serve as generic properties of some syntax tree elements. +-- +-- Some examples: +-- +-- * labels can be attributed with /unused/ to indicate that their not used +-- +-- * struct definitions can be attributed with /packed/ to tell the compiler to use the most compact representation +-- +-- * declarations can be attributed with /deprecated/ +-- +-- * function declarations can be attributes with /noreturn/ to tell the compiler that the function will never return, +-- +-- * or with /const/ to indicate that it is a pure function +-- +-- /TODO/: ultimatively, we want to parse attributes and represent them in a typed way +data Attr = Attr Ident [Expr] NodeInfo + deriving (Typeable, Data {-! ,CNode !-}) + +type Attributes = [Attr] + +-- |Empty attribute list +noAttributes :: Attributes +noAttributes = [] + +-- |Merge attribute lists +-- /TODO/: currently does not remove duplicates +mergeAttributes :: Attributes -> Attributes -> Attributes +mergeAttributes = (++) + +-- * statements and expressions (Type aliases) + +-- | 'Stmt' is an alias for 'CStat' (Syntax) +type Stmt = CStat +-- | 'Expr' is currently an alias for 'CExpr' (Syntax) +type Expr = CExpr +-- GENERATED START + +instance CNode TagDef where + nodeInfo (CompDef d) = nodeInfo d + nodeInfo (EnumDef d) = nodeInfo d +instance Pos TagDef where + posOf x = posOf (nodeInfo x) + +instance CNode IdentDecl where + nodeInfo (Declaration d) = nodeInfo d + nodeInfo (ObjectDef d) = nodeInfo d + nodeInfo (FunctionDef d) = nodeInfo d + nodeInfo (EnumeratorDef d) = nodeInfo d +instance Pos IdentDecl where + posOf x = posOf (nodeInfo x) + +instance CNode DeclEvent where + nodeInfo (TagEvent d) = nodeInfo d + nodeInfo (DeclEvent d) = nodeInfo d + nodeInfo (ParamEvent d) = nodeInfo d + nodeInfo (LocalEvent d) = nodeInfo d + nodeInfo (TypeDefEvent d) = nodeInfo d + nodeInfo (AsmEvent d) = nodeInfo d +instance Pos DeclEvent where + posOf x = posOf (nodeInfo x) + +instance CNode Decl where + nodeInfo (Decl _ n) = n +instance Pos Decl where + posOf x = posOf (nodeInfo x) + +instance CNode ObjDef where + nodeInfo (ObjDef _ _ n) = n +instance Pos ObjDef where + posOf x = posOf (nodeInfo x) + +instance CNode FunDef where + nodeInfo (FunDef _ _ n) = n +instance Pos FunDef where + posOf x = posOf (nodeInfo x) + +instance CNode ParamDecl where + nodeInfo (ParamDecl _ n) = n + nodeInfo (AbstractParamDecl _ n) = n +instance Pos ParamDecl where + posOf x = posOf (nodeInfo x) + +instance CNode MemberDecl where + nodeInfo (MemberDecl _ _ n) = n + nodeInfo (AnonBitField _ _ n) = n +instance Pos MemberDecl where + posOf x = posOf (nodeInfo x) + +instance CNode TypeDef where + nodeInfo (TypeDef _ _ _ n) = n +instance Pos TypeDef where + posOf x = posOf (nodeInfo x) + +instance CNode TypeDefRef where + nodeInfo (TypeDefRef _ _ n) = n +instance Pos TypeDefRef where + posOf x = posOf (nodeInfo x) + +instance CNode CompTypeRef where + nodeInfo (CompTypeRef _ _ n) = n +instance Pos CompTypeRef where + posOf x = posOf (nodeInfo x) + +instance CNode EnumTypeRef where + nodeInfo (EnumTypeRef _ n) = n +instance Pos EnumTypeRef where + posOf x = posOf (nodeInfo x) + +instance CNode CompType where + nodeInfo (CompType _ _ _ _ n) = n +instance Pos CompType where + posOf x = posOf (nodeInfo x) + +instance CNode EnumType where + nodeInfo (EnumType _ _ _ n) = n +instance Pos EnumType where + posOf x = posOf (nodeInfo x) + +instance CNode Enumerator where + nodeInfo (Enumerator _ _ _ n) = n +instance Pos Enumerator where + posOf x = posOf (nodeInfo x) + +instance CNode Attr where + nodeInfo (Attr _ _ n) = n +instance Pos Attr where + posOf x = posOf (nodeInfo x) +-- GENERATED STOP
src/Language/C/Analysis/TravMonad.hs view
@@ -1,513 +1,513 @@-{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances,- PatternGuards, RankNTypes, ScopedTypeVariables #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Analysis.TravMonad--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : alpha--- Portability : ghc------ Monad for Traversals of the C AST.------ For the traversal, we maintain a symboltable and need MonadError and unique--- name generation facilities.--- Furthermore, the user may provide callbacks to handle declarations and definitions.-------------------------------------------------------------------------------module Language.C.Analysis.TravMonad (- -- * Name generation monad- MonadName(..),- -- * Symbol table monad- MonadSymtab(..),- -- * Specialized C error-handling monad- MonadCError(..),- -- * AST traversal monad- MonadTrav(..),- -- * Handling declarations- handleTagDecl, handleTagDef, handleEnumeratorDef, handleTypeDef,- handleObjectDef,handleFunDef,handleVarDecl,handleParamDecl,- handleAsmBlock,- -- * Symbol table scope modification- enterPrototypeScope,leavePrototypeScope,- enterFunctionScope,leaveFunctionScope,- enterBlockScope,leaveBlockScope,- -- * Symbol table lookup (delegate)- lookupTypeDef, lookupObject,- -- * Symbol table modification- createSUERef,- -- * Additional error handling facilities- hadHardErrors,handleTravError,throwOnLeft,- astError, warn,- -- * Trav - default MonadTrav implementation- Trav,- runTrav,runTrav_,- TravState,initTravState,withExtDeclHandler,modifyUserState,userState,- getUserState,- TravOptions(..),modifyOptions,- travErrors,- -- * Language options- CLanguage(..),- -- * Helpers- mapMaybeM,maybeM,mapSndM,concatMapM,-)-where-import Language.C.Data-import Language.C.Data.RList as RList--import Language.C.Analysis.Builtins-import Language.C.Analysis.SemError-import Language.C.Analysis.SemRep-import Language.C.Analysis.TypeUtils (sameType)-import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope,- enterFunctionScope,leaveFunctionScope)-import qualified Language.C.Analysis.DefTable as ST--import Data.IntMap (insert)-import Data.Maybe-import Control.Applicative (Applicative(..))-import Control.Monad (liftM, ap)-import Prelude hiding (lookup)--class (Monad m) => MonadName m where- -- | unique name generation- genName :: m Name--class (Monad m) => MonadSymtab m where- -- symbol table handling- -- | return the definition table- getDefTable :: m DefTable- -- | perform an action modifying the definition table- withDefTable :: (DefTable -> (a, DefTable)) -> m a--class (Monad m) => MonadCError m where- -- error handling facilities-- -- | throw an 'Error'- throwTravError :: Error e => e -> m a- -- | catch an 'Error' (we could implement dynamically-typed catch here)- catchTravError :: m a -> (CError -> m a) -> m a- -- | remember that an 'Error' occurred (without throwing it)- recordError :: Error e => e -> m ()- -- | return the list of recorded errors- getErrors :: m [CError]---- | Traversal monad-class (MonadName m, MonadSymtab m, MonadCError m) => MonadTrav m where- -- | handling declarations and definitions- handleDecl :: DeclEvent -> m ()---- * handling declarations---- check wheter a redefinition is ok-checkRedef :: (MonadCError m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m ()-checkRedef subject new_decl redecl_status =- case redecl_status of- NewDecl -> return ()- Redeclared old_def -> throwTravError $- redefinition LevelError subject DuplicateDef (nodeInfo new_decl) (nodeInfo old_def)- KindMismatch old_def -> throwTravError $- redefinition LevelError subject DiffKindRedecl (nodeInfo new_decl) (nodeInfo old_def)- Shadowed _old_def -> return ()- -- warn $- -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def)- KeepDef _old_def -> return ()---- | forward declaration of a tag. Only necessary for name analysis, but otherwise no semantic--- consequences.-handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m ()-handleTagDecl decl = do- redecl <- withDefTable $ declareTag (sueRef decl) decl- checkRedef (sueRefToString $ sueRef decl) decl redecl---- | define the given composite type or enumeration--- If there is a declaration visible, overwrite it with the definition.--- Otherwise, enter a new definition in the current namespace.--- If there is already a definition present, yield an error (redeclaration).-handleTagDef :: (MonadTrav m) => TagDef -> m ()-handleTagDef def = do- redecl <- withDefTable $ defineTag (sueRef def) def- checkRedef (sueRefToString $ sueRef def) def redecl- handleDecl (TagEvent def)--handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator -> m ()-handleEnumeratorDef enumerator = do- let ident = declIdent enumerator- redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator)- checkRedef (identToString ident) ident redecl- return ()--handleTypeDef :: (MonadTrav m) => TypeDef -> m ()-handleTypeDef typeDef@(TypeDef ident t1 _ _) = do- redecl <- withDefTable $ defineTypeDef ident typeDef- -- C11 6.7/3 If an identifier has no linkage, there shall be no more than- -- one declaration of the identifier (in a declarator or type specifier)- -- with the same scope and in the same name space, except that: a typedef- -- name may be redefined to denote the same type as it currently does,- -- provided that type is not a variably modified type;- case redecl of- Redeclared (Left (TypeDef _ t2 _ _)) | sameType t1 t2 -> return ()- _ -> checkRedef (identToString ident) typeDef redecl- handleDecl (TypeDefEvent typeDef)- return ()--handleAsmBlock :: (MonadTrav m) => AsmBlock -> m ()-handleAsmBlock asm = handleDecl (AsmEvent asm)--redefErr :: (MonadCError m, CNode old, CNode new) =>- Ident -> ErrorLevel -> new -> old -> RedefKind -> m ()-redefErr name lvl new old kind =- throwTravError $ redefinition lvl (identToString name) kind (nodeInfo new) (nodeInfo old)---- TODO: unused-_checkIdentTyRedef :: (MonadCError m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m ()-_checkIdentTyRedef (Right decl) status = checkVarRedef decl status-_checkIdentTyRedef (Left tydef) (KindMismatch old_def) =- redefErr (identOfTypeDef tydef) LevelError tydef old_def DiffKindRedecl-_checkIdentTyRedef (Left tydef) (Redeclared old_def) =- redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef-_checkIdentTyRedef (Left _tydef) _ = return ()---- Check whether it is ok to declare a variable already in scope-checkVarRedef :: (MonadCError m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m ()-checkVarRedef def redecl =- case redecl of- -- always an error- KindMismatch old_def -> redefVarErr old_def DiffKindRedecl- -- Declaration referencing definition:- -- * new entry has to be a declaration- -- * old entry and new entry have to have linkage and agree on linkage- -- * types have to match- KeepDef (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def- | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)- -- redefinition:- -- * old entry has to be a declaration or tentative definition- -- * old entry and new entry have to have linkage and agree on linkage- -- * types have to match- Redeclared (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def- | not(canBeOverwritten old_def) -> redefVarErr old_def DuplicateDef- | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def)- -- NewDecl/Shadowed is ok- _ -> return ()- where- redefVarErr old_def kind = redefErr (declIdent def) LevelError def old_def kind- linkageErr new_def old_def =- case (declLinkage new_def, declLinkage old_def) of- (NoLinkage, _) -> redefErr (declIdent new_def) LevelError new_def old_def NoLinkageOld- _ -> redefErr (declIdent new_def) LevelError new_def old_def DisagreeLinkage-- new_ty = declType def- canBeOverwritten (Declaration _) = True- canBeOverwritten (ObjectDef od) = isTentative od- canBeOverwritten _ = False- agreeOnLinkage new_def old_def- | declStorage old_def == FunLinkage InternalLinkage = True- | not (hasLinkage $ declStorage new_def) || not (hasLinkage $ declStorage old_def) = False- | (declLinkage new_def) /= (declLinkage old_def) = False- | otherwise = True---- | handle variable declarations (external object declarations and function prototypes)--- variable declarations are either function prototypes, or external declarations, and not very--- interesting on their own. we only put them in the symbol table and call the handle.--- declarations never override definitions-handleVarDecl :: (MonadTrav m) => Bool -> Decl -> m ()-handleVarDecl is_local decl = do- def <- enterDecl decl (const False)- handleDecl ((if is_local then LocalEvent else DeclEvent) def)---- | handle parameter declaration. The interesting part is that parameters can be abstract--- (if they are part of a type). If they have a name, we enter the name (usually in function prototype or function scope),--- checking if there are duplicate definitions.--- FIXME: I think it would be more transparent to handle parameter declarations in a special way-handleParamDecl :: (MonadTrav m) => ParamDecl -> m ()-handleParamDecl pd@(AbstractParamDecl _ _) = handleDecl (ParamEvent pd)-handleParamDecl pd@(ParamDecl vardecl node) = do- let def = ObjectDef (ObjDef vardecl Nothing node)- redecl <- withDefTable $ defineScopedIdent (declIdent def) def- checkVarRedef def redecl- handleDecl (ParamEvent pd)---- shared impl-enterDecl :: (MonadCError m, MonadSymtab m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl-enterDecl decl cond = do- let def = Declaration decl- redecl <- withDefTable $- defineScopedIdentWhen cond (declIdent def) def- checkVarRedef def redecl- return def---- | handle function definitions-handleFunDef :: (MonadTrav m) => Ident -> FunDef -> m ()-handleFunDef ident fun_def = do- let def = FunctionDef fun_def- redecl <- withDefTable $- defineScopedIdentWhen isDeclaration ident def- checkVarRedef def redecl- handleDecl (DeclEvent def)--isDeclaration :: IdentDecl -> Bool-isDeclaration (Declaration _) = True-isDeclaration _ = False--checkCompatibleTypes :: Type -> Type -> Either TypeMismatch ()-checkCompatibleTypes _ _ = Right ()---- | handle object defintions (maybe tentative)-handleObjectDef :: (MonadTrav m) => Bool -> Ident -> ObjDef -> m ()-handleObjectDef local ident obj_def = do- let def = ObjectDef obj_def- redecl <- withDefTable $- defineScopedIdentWhen (shouldOverride def) ident def- checkVarRedef def redecl- handleDecl ((if local then LocalEvent else DeclEvent) def)- where- isTentativeDef (ObjectDef object_def) = isTentative object_def- isTentativeDef _ = False- shouldOverride def old | isDeclaration old = True- | not (isTentativeDef def) = True- | isTentativeDef old = True- | otherwise = False---- * scope manipulation------ * file scope: outside of parameter lists and blocks (outermost)------ * function prototype scope------ * function scope: labels are visible within the entire function, and declared implicitely------ * block scope-updDefTable :: (MonadSymtab m) => (DefTable -> DefTable) -> m ()-updDefTable f = withDefTable (\st -> ((),f st))--enterPrototypeScope :: (MonadSymtab m) => m ()-enterPrototypeScope = updDefTable (ST.enterBlockScope)--leavePrototypeScope :: (MonadSymtab m) => m ()-leavePrototypeScope = updDefTable (ST.leaveBlockScope)--enterFunctionScope :: (MonadSymtab m) => m ()-enterFunctionScope = updDefTable (ST.enterFunctionScope)--leaveFunctionScope :: (MonadSymtab m) => m ()-leaveFunctionScope = updDefTable (ST.leaveFunctionScope)--enterBlockScope :: (MonadSymtab m) => m ()-enterBlockScope = updDefTable (ST.enterBlockScope)--leaveBlockScope :: (MonadSymtab m) => m ()-leaveBlockScope = updDefTable (ST.leaveBlockScope)---- * Lookup---- | lookup a type definition--- the 'wrong kind of object' is an internal error here,--- because the parser should distinguish typeDefs and other--- objects-lookupTypeDef :: (MonadCError m, MonadSymtab m) => Ident -> m Type-lookupTypeDef ident =- getDefTable >>= \symt ->- case lookupIdent ident symt of- Nothing ->- astError (nodeInfo ident) $ "unbound typeDef: " ++ identToString ident- Just (Left (TypeDef def_ident ty _ _)) -> addRef ident def_ident >> return ty- Just (Right d) -> astError (nodeInfo ident) (wrongKindErrMsg d)- where- wrongKindErrMsg d = "wrong kind of object: expected typedef but found "++ (objKindDescr d)- ++ " (for identifier `" ++ identToString ident ++ "')"----- | lookup an object, function or enumerator-lookupObject :: (MonadCError m, MonadSymtab m) => Ident -> m (Maybe IdentDecl)-lookupObject ident = do- old_decl <- liftM (lookupIdent ident) getDefTable- mapMaybeM old_decl $ \obj ->- case obj of- Right objdef -> addRef ident objdef >> return objdef- Left _tydef -> astError (nodeInfo ident) (mismatchErr "lookupObject" "an object" "a typeDef")---- | add link between use and definition (private)-addRef :: (MonadCError m, MonadSymtab m, CNode u, CNode d) => u -> d -> m ()-addRef use def =- case (nodeInfo use, nodeInfo def) of- (NodeInfo _ _ useName, NodeInfo _ _ defName) ->- withDefTable- (\dt ->- ((),- dt { refTable = insert (nameId useName) defName (refTable dt) }- )- )- (_, _) -> return () -- Don't have Names for both, so can't record.---mismatchErr :: String -> String -> String -> String-mismatchErr ctx expect found = ctx ++ ": Expected " ++ expect ++ ", but found: " ++ found---- * inserting declarations---- | create a reference to a struct\/union\/enum------ This currently depends on the fact the structs are tagged with unique names.--- We could use the name generation of TravMonad as well, which might be the better--- choice when dealing with autogenerated code.-createSUERef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> m SUERef-createSUERef _node_info (Just ident) = return$ NamedRef ident-createSUERef node_info Nothing | (Just name) <- nameOfNode node_info = return $ AnonymousRef name- | otherwise = astError node_info "struct/union/enum definition without unique name"---- * error handling facilities--handleTravError :: (MonadCError m) => m a -> m (Maybe a)-handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing)---- | check wheter non-recoverable errors occurred-hadHardErrors :: [CError] -> Bool-hadHardErrors = any isHardError---- | raise an error caused by a malformed AST-astError :: (MonadCError m) => NodeInfo -> String -> m a-astError node msg = throwTravError $ invalidAST node msg---- | raise an error based on an Either argument-throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a-throwOnLeft (Left err) = throwTravError err-throwOnLeft (Right v) = return v--warn :: (Error e, MonadCError m) => e -> m ()-warn err = recordError (changeErrorLevel err LevelWarn)---- * The Trav datatype---- | simple traversal monad, providing user state and callbacks-newtype Trav s a = Trav { unTrav :: TravState s -> Either CError (a, TravState s) }-modify :: (TravState s -> TravState s) -> Trav s ()-modify f = Trav (\s -> Right ((),f s))-gets :: (TravState s -> a) -> Trav s a-gets f = Trav (\s -> Right (f s, s))-get :: Trav s (TravState s)-get = Trav (\s -> Right (s,s))-put :: TravState s -> Trav s ()-put s = Trav (\_ -> Right ((),s))---runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s)-runTrav state traversal =- case unTrav action (initTravState state) of- Left trav_err -> Left [trav_err]- Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts)- | otherwise -> Right (v,ts)- where- action = do withDefTable (const ((), builtins))- traversal--runTrav_ :: Trav () a -> Either [CError] (a,[CError])-runTrav_ t = fmap fst . runTrav () $- do r <- t- es <- getErrors- return (r,es)--withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a-withExtDeclHandler action handler =- do modify $ \st -> st { doHandleExtDecl = handler }- action--instance Functor (Trav s) where- fmap = liftM--instance Applicative (Trav s) where- pure = return- (<*>) = ap--instance Monad (Trav s) where- return x = Trav (\s -> Right (x,s))- m >>= k = Trav (\s -> case unTrav m s of- Right (x,s1) -> unTrav (k x) s1- Left e -> Left e)--instance MonadName (Trav s) where- -- unique name generation- genName = generateName--instance MonadSymtab (Trav s) where- -- symbol table handling- getDefTable = gets symbolTable- withDefTable f = do- ts <- get- let (r,symt') = f (symbolTable ts)- put $ ts { symbolTable = symt' }- return r--instance MonadCError (Trav s) where- -- error handling facilities- throwTravError e = Trav (\_ -> Left (toError e))- catchTravError a handler = Trav (\s -> case unTrav a s of- Left e -> unTrav (handler e) s- Right r -> Right r)- recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e }- getErrors = gets (RList.reverse . rerrors)--instance MonadTrav (Trav s) where- -- handling declarations and definitions- handleDecl d = ($ d) =<< gets doHandleExtDecl---- | The variety of the C language to accept. Note: this is not yet enforced.-data CLanguage = C89 | C99 | GNU89 | GNU99--data TravOptions =- TravOptions {- language :: CLanguage- }--data TravState s =- TravState {- symbolTable :: DefTable,- rerrors :: RList CError,- nameGenerator :: [Name],- doHandleExtDecl :: (DeclEvent -> Trav s ()),- userState :: s,- options :: TravOptions- }--travErrors :: TravState s -> [CError]-travErrors = RList.reverse . rerrors--initTravState :: s -> TravState s-initTravState userst =- TravState {- symbolTable = emptyDefTable,- rerrors = RList.empty,- nameGenerator = newNameSupply,- doHandleExtDecl = const (return ()),- userState = userst,- options = TravOptions { language = C99 }- }---- * Trav specific operations-modifyUserState :: (s -> s) -> Trav s ()-modifyUserState f = modify $ \ts -> ts { userState = f (userState ts) }--getUserState :: Trav s s-getUserState = userState `liftM` get--modifyOptions :: (TravOptions -> TravOptions) -> Trav s ()-modifyOptions f = modify $ \ts -> ts { options = f (options ts) }--generateName :: Trav s Name-generateName =- get >>= \ts ->- do let (new_name : gen') = nameGenerator ts- put $ ts { nameGenerator = gen'}- return new_name---- * helpers-mapMaybeM :: (Monad m) => (Maybe a) -> (a -> m b) -> m (Maybe b)-mapMaybeM m f = maybe (return Nothing) (liftM Just . f) m--maybeM :: (Monad m) => (Maybe a) -> (a -> m ()) -> m ()-maybeM m f = maybe (return ()) f m--mapSndM :: (Monad m) => (b -> m c) -> (a,b) -> m (a,c)-mapSndM f (a,b) = liftM ((,) a) (f b)--concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b]-concatMapM f = liftM concat . mapM f+{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleContexts,FlexibleInstances, + PatternGuards, RankNTypes, ScopedTypeVariables #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Analysis.TravMonad +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : alpha +-- Portability : ghc +-- +-- Monad for Traversals of the C AST. +-- +-- For the traversal, we maintain a symboltable and need MonadError and unique +-- name generation facilities. +-- Furthermore, the user may provide callbacks to handle declarations and definitions. +----------------------------------------------------------------------------- +module Language.C.Analysis.TravMonad ( + -- * Name generation monad + MonadName(..), + -- * Symbol table monad + MonadSymtab(..), + -- * Specialized C error-handling monad + MonadCError(..), + -- * AST traversal monad + MonadTrav(..), + -- * Handling declarations + handleTagDecl, handleTagDef, handleEnumeratorDef, handleTypeDef, + handleObjectDef,handleFunDef,handleVarDecl,handleParamDecl, + handleAsmBlock, + -- * Symbol table scope modification + enterPrototypeScope,leavePrototypeScope, + enterFunctionScope,leaveFunctionScope, + enterBlockScope,leaveBlockScope, + -- * Symbol table lookup (delegate) + lookupTypeDef, lookupObject, + -- * Symbol table modification + createSUERef, + -- * Additional error handling facilities + hadHardErrors,handleTravError,throwOnLeft, + astError, warn, + -- * Trav - default MonadTrav implementation + Trav, + runTrav,runTrav_, + TravState,initTravState,withExtDeclHandler,modifyUserState,userState, + getUserState, + TravOptions(..),modifyOptions, + travErrors, + -- * Language options + CLanguage(..), + -- * Helpers + mapMaybeM,maybeM,mapSndM,concatMapM, +) +where +import Language.C.Data +import Language.C.Data.RList as RList + +import Language.C.Analysis.Builtins +import Language.C.Analysis.SemError +import Language.C.Analysis.SemRep +import Language.C.Analysis.TypeUtils (sameType) +import Language.C.Analysis.DefTable hiding (enterBlockScope,leaveBlockScope, + enterFunctionScope,leaveFunctionScope) +import qualified Language.C.Analysis.DefTable as ST + +import Data.IntMap (insert) +import Data.Maybe +import Control.Applicative (Applicative(..)) +import Control.Monad (liftM, ap) +import Prelude hiding (lookup) + +class (Monad m) => MonadName m where + -- | unique name generation + genName :: m Name + +class (Monad m) => MonadSymtab m where + -- symbol table handling + -- | return the definition table + getDefTable :: m DefTable + -- | perform an action modifying the definition table + withDefTable :: (DefTable -> (a, DefTable)) -> m a + +class (Monad m) => MonadCError m where + -- error handling facilities + + -- | throw an 'Error' + throwTravError :: Error e => e -> m a + -- | catch an 'Error' (we could implement dynamically-typed catch here) + catchTravError :: m a -> (CError -> m a) -> m a + -- | remember that an 'Error' occurred (without throwing it) + recordError :: Error e => e -> m () + -- | return the list of recorded errors + getErrors :: m [CError] + +-- | Traversal monad +class (MonadName m, MonadSymtab m, MonadCError m) => MonadTrav m where + -- | handling declarations and definitions + handleDecl :: DeclEvent -> m () + +-- * handling declarations + +-- check wheter a redefinition is ok +checkRedef :: (MonadCError m, CNode t, CNode t1) => String -> t -> (DeclarationStatus t1) -> m () +checkRedef subject new_decl redecl_status = + case redecl_status of + NewDecl -> return () + Redeclared old_def -> throwTravError $ + redefinition LevelError subject DuplicateDef (nodeInfo new_decl) (nodeInfo old_def) + KindMismatch old_def -> throwTravError $ + redefinition LevelError subject DiffKindRedecl (nodeInfo new_decl) (nodeInfo old_def) + Shadowed _old_def -> return () + -- warn $ + -- redefinition LevelWarn subject ShadowedDef (nodeInfo new_decl) (nodeInfo old_def) + KeepDef _old_def -> return () + +-- | forward declaration of a tag. Only necessary for name analysis, but otherwise no semantic +-- consequences. +handleTagDecl :: (MonadCError m, MonadSymtab m) => TagFwdDecl -> m () +handleTagDecl decl = do + redecl <- withDefTable $ declareTag (sueRef decl) decl + checkRedef (sueRefToString $ sueRef decl) decl redecl + +-- | define the given composite type or enumeration +-- If there is a declaration visible, overwrite it with the definition. +-- Otherwise, enter a new definition in the current namespace. +-- If there is already a definition present, yield an error (redeclaration). +handleTagDef :: (MonadTrav m) => TagDef -> m () +handleTagDef def = do + redecl <- withDefTable $ defineTag (sueRef def) def + checkRedef (sueRefToString $ sueRef def) def redecl + handleDecl (TagEvent def) + +handleEnumeratorDef :: (MonadCError m, MonadSymtab m) => Enumerator -> m () +handleEnumeratorDef enumerator = do + let ident = declIdent enumerator + redecl <- withDefTable $ defineScopedIdent ident (EnumeratorDef enumerator) + checkRedef (identToString ident) ident redecl + return () + +handleTypeDef :: (MonadTrav m) => TypeDef -> m () +handleTypeDef typeDef@(TypeDef ident t1 _ _) = do + redecl <- withDefTable $ defineTypeDef ident typeDef + -- C11 6.7/3 If an identifier has no linkage, there shall be no more than + -- one declaration of the identifier (in a declarator or type specifier) + -- with the same scope and in the same name space, except that: a typedef + -- name may be redefined to denote the same type as it currently does, + -- provided that type is not a variably modified type; + case redecl of + Redeclared (Left (TypeDef _ t2 _ _)) | sameType t1 t2 -> return () + _ -> checkRedef (identToString ident) typeDef redecl + handleDecl (TypeDefEvent typeDef) + return () + +handleAsmBlock :: (MonadTrav m) => AsmBlock -> m () +handleAsmBlock asm = handleDecl (AsmEvent asm) + +redefErr :: (MonadCError m, CNode old, CNode new) => + Ident -> ErrorLevel -> new -> old -> RedefKind -> m () +redefErr name lvl new old kind = + throwTravError $ redefinition lvl (identToString name) kind (nodeInfo new) (nodeInfo old) + +-- TODO: unused +_checkIdentTyRedef :: (MonadCError m) => IdentEntry -> (DeclarationStatus IdentEntry) -> m () +_checkIdentTyRedef (Right decl) status = checkVarRedef decl status +_checkIdentTyRedef (Left tydef) (KindMismatch old_def) = + redefErr (identOfTypeDef tydef) LevelError tydef old_def DiffKindRedecl +_checkIdentTyRedef (Left tydef) (Redeclared old_def) = + redefErr (identOfTypeDef tydef) LevelError tydef old_def DuplicateDef +_checkIdentTyRedef (Left _tydef) _ = return () + +-- Check whether it is ok to declare a variable already in scope +checkVarRedef :: (MonadCError m) => IdentDecl -> (DeclarationStatus IdentEntry) -> m () +checkVarRedef def redecl = + case redecl of + -- always an error + KindMismatch old_def -> redefVarErr old_def DiffKindRedecl + -- Declaration referencing definition: + -- * new entry has to be a declaration + -- * old entry and new entry have to have linkage and agree on linkage + -- * types have to match + KeepDef (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def + | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def) + -- redefinition: + -- * old entry has to be a declaration or tentative definition + -- * old entry and new entry have to have linkage and agree on linkage + -- * types have to match + Redeclared (Right old_def) | not (agreeOnLinkage def old_def) -> linkageErr def old_def + | not(canBeOverwritten old_def) -> redefVarErr old_def DuplicateDef + | otherwise -> throwOnLeft $ checkCompatibleTypes new_ty (declType old_def) + -- NewDecl/Shadowed is ok + _ -> return () + where + redefVarErr old_def kind = redefErr (declIdent def) LevelError def old_def kind + linkageErr new_def old_def = + case (declLinkage new_def, declLinkage old_def) of + (NoLinkage, _) -> redefErr (declIdent new_def) LevelError new_def old_def NoLinkageOld + _ -> redefErr (declIdent new_def) LevelError new_def old_def DisagreeLinkage + + new_ty = declType def + canBeOverwritten (Declaration _) = True + canBeOverwritten (ObjectDef od) = isTentative od + canBeOverwritten _ = False + agreeOnLinkage new_def old_def + | declStorage old_def == FunLinkage InternalLinkage = True + | not (hasLinkage $ declStorage new_def) || not (hasLinkage $ declStorage old_def) = False + | (declLinkage new_def) /= (declLinkage old_def) = False + | otherwise = True + +-- | handle variable declarations (external object declarations and function prototypes) +-- variable declarations are either function prototypes, or external declarations, and not very +-- interesting on their own. we only put them in the symbol table and call the handle. +-- declarations never override definitions +handleVarDecl :: (MonadTrav m) => Bool -> Decl -> m () +handleVarDecl is_local decl = do + def <- enterDecl decl (const False) + handleDecl ((if is_local then LocalEvent else DeclEvent) def) + +-- | handle parameter declaration. The interesting part is that parameters can be abstract +-- (if they are part of a type). If they have a name, we enter the name (usually in function prototype or function scope), +-- checking if there are duplicate definitions. +-- FIXME: I think it would be more transparent to handle parameter declarations in a special way +handleParamDecl :: (MonadTrav m) => ParamDecl -> m () +handleParamDecl pd@(AbstractParamDecl _ _) = handleDecl (ParamEvent pd) +handleParamDecl pd@(ParamDecl vardecl node) = do + let def = ObjectDef (ObjDef vardecl Nothing node) + redecl <- withDefTable $ defineScopedIdent (declIdent def) def + checkVarRedef def redecl + handleDecl (ParamEvent pd) + +-- shared impl +enterDecl :: (MonadCError m, MonadSymtab m) => Decl -> (IdentDecl -> Bool) -> m IdentDecl +enterDecl decl cond = do + let def = Declaration decl + redecl <- withDefTable $ + defineScopedIdentWhen cond (declIdent def) def + checkVarRedef def redecl + return def + +-- | handle function definitions +handleFunDef :: (MonadTrav m) => Ident -> FunDef -> m () +handleFunDef ident fun_def = do + let def = FunctionDef fun_def + redecl <- withDefTable $ + defineScopedIdentWhen isDeclaration ident def + checkVarRedef def redecl + handleDecl (DeclEvent def) + +isDeclaration :: IdentDecl -> Bool +isDeclaration (Declaration _) = True +isDeclaration _ = False + +checkCompatibleTypes :: Type -> Type -> Either TypeMismatch () +checkCompatibleTypes _ _ = Right () + +-- | handle object defintions (maybe tentative) +handleObjectDef :: (MonadTrav m) => Bool -> Ident -> ObjDef -> m () +handleObjectDef local ident obj_def = do + let def = ObjectDef obj_def + redecl <- withDefTable $ + defineScopedIdentWhen (shouldOverride def) ident def + checkVarRedef def redecl + handleDecl ((if local then LocalEvent else DeclEvent) def) + where + isTentativeDef (ObjectDef object_def) = isTentative object_def + isTentativeDef _ = False + shouldOverride def old | isDeclaration old = True + | not (isTentativeDef def) = True + | isTentativeDef old = True + | otherwise = False + +-- * scope manipulation +-- +-- * file scope: outside of parameter lists and blocks (outermost) +-- +-- * function prototype scope +-- +-- * function scope: labels are visible within the entire function, and declared implicitely +-- +-- * block scope +updDefTable :: (MonadSymtab m) => (DefTable -> DefTable) -> m () +updDefTable f = withDefTable (\st -> ((),f st)) + +enterPrototypeScope :: (MonadSymtab m) => m () +enterPrototypeScope = updDefTable (ST.enterBlockScope) + +leavePrototypeScope :: (MonadSymtab m) => m () +leavePrototypeScope = updDefTable (ST.leaveBlockScope) + +enterFunctionScope :: (MonadSymtab m) => m () +enterFunctionScope = updDefTable (ST.enterFunctionScope) + +leaveFunctionScope :: (MonadSymtab m) => m () +leaveFunctionScope = updDefTable (ST.leaveFunctionScope) + +enterBlockScope :: (MonadSymtab m) => m () +enterBlockScope = updDefTable (ST.enterBlockScope) + +leaveBlockScope :: (MonadSymtab m) => m () +leaveBlockScope = updDefTable (ST.leaveBlockScope) + +-- * Lookup + +-- | lookup a type definition +-- the 'wrong kind of object' is an internal error here, +-- because the parser should distinguish typeDefs and other +-- objects +lookupTypeDef :: (MonadCError m, MonadSymtab m) => Ident -> m Type +lookupTypeDef ident = + getDefTable >>= \symt -> + case lookupIdent ident symt of + Nothing -> + astError (nodeInfo ident) $ "unbound typeDef: " ++ identToString ident + Just (Left (TypeDef def_ident ty _ _)) -> addRef ident def_ident >> return ty + Just (Right d) -> astError (nodeInfo ident) (wrongKindErrMsg d) + where + wrongKindErrMsg d = "wrong kind of object: expected typedef but found "++ (objKindDescr d) + ++ " (for identifier `" ++ identToString ident ++ "')" + + +-- | lookup an object, function or enumerator +lookupObject :: (MonadCError m, MonadSymtab m) => Ident -> m (Maybe IdentDecl) +lookupObject ident = do + old_decl <- liftM (lookupIdent ident) getDefTable + mapMaybeM old_decl $ \obj -> + case obj of + Right objdef -> addRef ident objdef >> return objdef + Left _tydef -> astError (nodeInfo ident) (mismatchErr "lookupObject" "an object" "a typeDef") + +-- | add link between use and definition (private) +addRef :: (MonadCError m, MonadSymtab m, CNode u, CNode d) => u -> d -> m () +addRef use def = + case (nodeInfo use, nodeInfo def) of + (NodeInfo _ _ useName, NodeInfo _ _ defName) -> + withDefTable + (\dt -> + ((), + dt { refTable = insert (nameId useName) defName (refTable dt) } + ) + ) + (_, _) -> return () -- Don't have Names for both, so can't record. + + +mismatchErr :: String -> String -> String -> String +mismatchErr ctx expect found = ctx ++ ": Expected " ++ expect ++ ", but found: " ++ found + +-- * inserting declarations + +-- | create a reference to a struct\/union\/enum +-- +-- This currently depends on the fact the structs are tagged with unique names. +-- We could use the name generation of TravMonad as well, which might be the better +-- choice when dealing with autogenerated code. +createSUERef :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> m SUERef +createSUERef _node_info (Just ident) = return$ NamedRef ident +createSUERef node_info Nothing | (Just name) <- nameOfNode node_info = return $ AnonymousRef name + | otherwise = astError node_info "struct/union/enum definition without unique name" + +-- * error handling facilities + +handleTravError :: (MonadCError m) => m a -> m (Maybe a) +handleTravError a = liftM Just a `catchTravError` (\e -> recordError e >> return Nothing) + +-- | check wheter non-recoverable errors occurred +hadHardErrors :: [CError] -> Bool +hadHardErrors = any isHardError + +-- | raise an error caused by a malformed AST +astError :: (MonadCError m) => NodeInfo -> String -> m a +astError node msg = throwTravError $ invalidAST node msg + +-- | raise an error based on an Either argument +throwOnLeft :: (MonadCError m, Error e) => Either e a -> m a +throwOnLeft (Left err) = throwTravError err +throwOnLeft (Right v) = return v + +warn :: (Error e, MonadCError m) => e -> m () +warn err = recordError (changeErrorLevel err LevelWarn) + +-- * The Trav datatype + +-- | simple traversal monad, providing user state and callbacks +newtype Trav s a = Trav { unTrav :: TravState s -> Either CError (a, TravState s) } +modify :: (TravState s -> TravState s) -> Trav s () +modify f = Trav (\s -> Right ((),f s)) +gets :: (TravState s -> a) -> Trav s a +gets f = Trav (\s -> Right (f s, s)) +get :: Trav s (TravState s) +get = Trav (\s -> Right (s,s)) +put :: TravState s -> Trav s () +put s = Trav (\_ -> Right ((),s)) + + +runTrav :: forall s a. s -> Trav s a -> Either [CError] (a, TravState s) +runTrav state traversal = + case unTrav action (initTravState state) of + Left trav_err -> Left [trav_err] + Right (v, ts) | hadHardErrors (travErrors ts) -> Left (travErrors ts) + | otherwise -> Right (v,ts) + where + action = do withDefTable (const ((), builtins)) + traversal + +runTrav_ :: Trav () a -> Either [CError] (a,[CError]) +runTrav_ t = fmap fst . runTrav () $ + do r <- t + es <- getErrors + return (r,es) + +withExtDeclHandler :: Trav s a -> (DeclEvent -> Trav s ()) -> Trav s a +withExtDeclHandler action handler = + do modify $ \st -> st { doHandleExtDecl = handler } + action + +instance Functor (Trav s) where + fmap = liftM + +instance Applicative (Trav s) where + pure = return + (<*>) = ap + +instance Monad (Trav s) where + return x = Trav (\s -> Right (x,s)) + m >>= k = Trav (\s -> case unTrav m s of + Right (x,s1) -> unTrav (k x) s1 + Left e -> Left e) + +instance MonadName (Trav s) where + -- unique name generation + genName = generateName + +instance MonadSymtab (Trav s) where + -- symbol table handling + getDefTable = gets symbolTable + withDefTable f = do + ts <- get + let (r,symt') = f (symbolTable ts) + put $ ts { symbolTable = symt' } + return r + +instance MonadCError (Trav s) where + -- error handling facilities + throwTravError e = Trav (\_ -> Left (toError e)) + catchTravError a handler = Trav (\s -> case unTrav a s of + Left e -> unTrav (handler e) s + Right r -> Right r) + recordError e = modify $ \st -> st { rerrors = (rerrors st) `snoc` toError e } + getErrors = gets (RList.reverse . rerrors) + +instance MonadTrav (Trav s) where + -- handling declarations and definitions + handleDecl d = ($ d) =<< gets doHandleExtDecl + +-- | The variety of the C language to accept. Note: this is not yet enforced. +data CLanguage = C89 | C99 | GNU89 | GNU99 + +data TravOptions = + TravOptions { + language :: CLanguage + } + +data TravState s = + TravState { + symbolTable :: DefTable, + rerrors :: RList CError, + nameGenerator :: [Name], + doHandleExtDecl :: (DeclEvent -> Trav s ()), + userState :: s, + options :: TravOptions + } + +travErrors :: TravState s -> [CError] +travErrors = RList.reverse . rerrors + +initTravState :: s -> TravState s +initTravState userst = + TravState { + symbolTable = emptyDefTable, + rerrors = RList.empty, + nameGenerator = newNameSupply, + doHandleExtDecl = const (return ()), + userState = userst, + options = TravOptions { language = C99 } + } + +-- * Trav specific operations +modifyUserState :: (s -> s) -> Trav s () +modifyUserState f = modify $ \ts -> ts { userState = f (userState ts) } + +getUserState :: Trav s s +getUserState = userState `liftM` get + +modifyOptions :: (TravOptions -> TravOptions) -> Trav s () +modifyOptions f = modify $ \ts -> ts { options = f (options ts) } + +generateName :: Trav s Name +generateName = + get >>= \ts -> + do let (new_name : gen') = nameGenerator ts + put $ ts { nameGenerator = gen'} + return new_name + +-- * helpers +mapMaybeM :: (Monad m) => (Maybe a) -> (a -> m b) -> m (Maybe b) +mapMaybeM m f = maybe (return Nothing) (liftM Just . f) m + +maybeM :: (Monad m) => (Maybe a) -> (a -> m ()) -> m () +maybeM m f = maybe (return ()) f m + +mapSndM :: (Monad m) => (b -> m c) -> (a,b) -> m (a,c) +mapSndM f (a,b) = liftM ((,) a) (f b) + +concatMapM :: (Monad m) => (a -> m [b]) -> [a] -> m [b] +concatMapM f = liftM concat . mapM f
src/Language/C/Analysis/TypeCheck.hs view
@@ -1,446 +1,446 @@-{-# LANGUAGE FlexibleInstances, CPP #-}-module Language.C.Analysis.TypeCheck where--import Control.Monad-import Data.Maybe-import Language.C.Data.Ident-import Language.C.Data.Node-import Language.C.Data.Position-import Language.C.Pretty-import Language.C.Syntax.AST-import Language.C.Syntax.Constants-import Language.C.Syntax.Ops-import Language.C.Analysis.DefTable-import Language.C.Analysis.SemRep-import Language.C.Analysis.TravMonad-import Language.C.Analysis.TypeConversions-import Language.C.Analysis.TypeUtils-import Language.C.Analysis.Debug ()-import Text.PrettyPrint.HughesPJ---- We used to re-implement and export the standard Either instance for--- Monad, which is bad, because as of GHC 7 it is in Control.Monad.Instances--- in base >4.2. For backwards compatibility with ghc-6.X, we use CPP here.-#if __GLASGOW_HASKELL__ < 700-instance Monad (Either String) where- return = Right- Left l >>= _ = Left l- Right r >>= k = k r- fail msg = Left msg-#endif--pType :: Type -> String-pType = render . pretty--typeErrorOnLeft :: (MonadCError m) => NodeInfo -> Either String a -> m a-typeErrorOnLeft ni (Left err) = typeError ni err-typeErrorOnLeft _ (Right v) = return v---- XXX: this should use a custom error type, but typeMismatch isn't always right-typeError :: MonadCError m => NodeInfo -> String -> m a-typeError = astError--notFound :: Ident -> Either String a-notFound i = Left $ "not found: " ++ identToString i--checkScalar' :: MonadCError m => NodeInfo -> Type -> m ()-checkScalar' ni = typeErrorOnLeft ni . checkScalar--checkIntegral' :: MonadCError m => NodeInfo -> Type -> m ()-checkIntegral' ni = typeErrorOnLeft ni . checkIntegral--assignCompatible' :: MonadCError m =>- NodeInfo -> CAssignOp -> Type -> Type -> m ()-assignCompatible' ni op t1 t2 = typeErrorOnLeft ni (assignCompatible op t1 t2)--binopType' :: MonadCError m =>- NodeInfo -> CBinaryOp -> Type -> Type -> m Type-binopType' ni op t1 t2 = typeErrorOnLeft ni (binopType op t1 t2)--conditionalType' :: MonadCError m => NodeInfo -> Type -> Type -> m Type-conditionalType' ni t1 t2 = typeErrorOnLeft ni $ conditionalType t1 t2--checkScalar :: Type -> Either String ()-checkScalar t =- case canonicalType t of- DirectType _ _ _ -> Right ()- PtrType _ _ _ -> Right ()- ArrayType _ _ _ _ -> Right () -- because it's just a pointer- t' -> Left $- "expected scalar type, got: "- ++ pType t ++ " (" ++ pType t' ++ ")"--checkIntegral :: Type -> Either String ()-checkIntegral t | isIntegralType (canonicalType t) = Right ()- | otherwise = Left $- "expected integral type, got: " ++- pType t ++ " (" ++- pType (canonicalType t) ++ ")"---- | Determine the type of a constant.-constType :: (MonadCError m, MonadName m) => CConst -> m Type-constType (CIntConst (CInteger _ _ flags) _) =- return $ DirectType (TyIntegral (getIntType flags)) noTypeQuals noAttributes-constType (CCharConst (CChar _ True) _) =- return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes-constType (CCharConst (CChar _ False) _) =- return $ DirectType (TyIntegral TyChar) noTypeQuals noAttributes-constType (CCharConst (CChars _ _) _) =- return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes -- XXX-constType (CFloatConst (CFloat fs) _) =- return $ DirectType (TyFloating (getFloatType fs)) noTypeQuals noAttributes--- XXX: should strings have any type qualifiers or attributes?-constType (CStrConst (CString chars wide) ni) =- do n <- genName- let charType | wide = TyInt -- XXX: this isn't universal- | otherwise = TyChar- ni' = mkNodeInfo (posOf ni) n- arraySize = ArraySize- True -- XXX: is it static?- (CConst- (CIntConst- (cInteger (toInteger (length chars))) ni'))- return $ ArrayType (DirectType (TyIntegral charType) noTypeQuals noAttributes)- arraySize noTypeQuals []---- | Determine whether two types are compatible.-compatible :: Type -> Type -> Either String ()-compatible t1 t2 = void$ compositeType t1 t2---- | Determine the composite type of two compatible types.-compositeType :: Type -> Type -> Either String Type-compositeType t1 (DirectType (TyBuiltin TyAny) _ _) = Right t1-compositeType (DirectType (TyBuiltin TyAny) _ _) t2 = Right t2-compositeType t1@(DirectType tn1 q1 a1) t2@(DirectType tn2 q2 a2) =- do tn <- case (tn1, tn2) of- (TyVoid, TyVoid) -> Right TyVoid- (TyIntegral _, TyEnum _) -> Right tn1- (TyEnum _, TyIntegral _) -> Right tn2- (TyIntegral i1, TyIntegral i2) ->- Right $ TyIntegral (intConversion i1 i2)- (TyFloating f1, TyFloating f2) ->- Right $ TyFloating (floatConversion f1 f2)- (TyComplex f1, TyComplex f2) ->- Right $ TyComplex (floatConversion f1 f2)- (TyComp c1, TyComp c2) ->- do when (sueRef c1 /= sueRef c2) $- Left $ "incompatible composite types: "- ++ pType t1 ++ ", " ++ pType t2- Right tn1- (TyEnum e1, TyEnum e2) ->- do when (sueRef e1 /= sueRef e2) $- Left $ "incompatible enumeration types: "- ++ pType t1 ++ ", " ++ pType t2- Right $ TyEnum e1- (TyBuiltin TyVaList, TyBuiltin TyVaList) ->- Right $ TyBuiltin TyVaList- (TyBuiltin _, TyBuiltin _) ->- Left $ "incompatible builtin types: "- ++ pType t1 ++ ", " ++ pType t2- (_, _) -> Left $ "incompatible direct types: "- ++ pType t1 ++ ", " ++ pType t2- Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)-compositeType (PtrType t1 q1 a1) (PtrType (DirectType TyVoid _ _) q2 _) =- Right $ PtrType t1 (mergeTypeQuals q1 q2) a1-compositeType (PtrType (DirectType TyVoid _ _) q1 _) (PtrType t2 q2 a2) =- Right $ PtrType t2 (mergeTypeQuals q1 q2) a2-compositeType (PtrType t1 q1 a1) t2 | isIntegralType t2 =- Right $ PtrType t1 (mergeTypeQuals q1 (typeQuals t2)) a1-compositeType t1 (PtrType t2 q2 a2) | isIntegralType t1 =- Right $ PtrType t2 (mergeTypeQuals (typeQuals t1) q2) a2-compositeType (ArrayType t1 _sz1 q1 a1) t2 | isIntegralType t2 =- Right $ PtrType t1 q1 a1-compositeType t1 (ArrayType t2 _sz2 q2 a2) | isIntegralType t1 =- Right $ PtrType t2 q2 a2-compositeType (ArrayType t1 s1 q1 a1) (ArrayType t2 s2 q2 a2) =- do t <- compositeType t1 t2- s <- compositeSize s1 s2- let quals = mergeTypeQuals q1 q2- attrs = mergeAttrs a1 a2- Right (ArrayType t s quals attrs)-compositeType t1 t2 | isPointerType t1 && isPointerType t2 =- do t <- compositeType (baseType t1) (baseType t2)- let quals = mergeTypeQuals (typeQuals t1) (typeQuals t2)- attrs = mergeAttrs (typeAttrs t1) (typeAttrs t2)- Right (PtrType t quals attrs)-compositeType (TypeDefType tdr1 _q1 _a1) (TypeDefType tdr2 _q2 _a2) =- case (tdr1, tdr2) of- (TypeDefRef _ t1 _, TypeDefRef _ t2 _) ->- compositeType t1 t2-compositeType (FunctionType ft1 attrs1) (FunctionType ft2 attrs2) =- case (ft1, ft2) of- (FunType rt1 args1 varargs1, FunType rt2 args2 varargs2) ->- do {- when (length args1 /= length args2) $- Left "different numbers of arguments in function types" -}- args <- zipWithM compositeParamDecl args1 args2- when (varargs1 /= varargs2) $- Left "incompatible varargs declarations"- doFunType rt1 rt2 args varargs1- (FunType rt1 args1 varargs1, FunTypeIncomplete rt2) ->- doFunType rt1 rt2 args1 varargs1- (FunTypeIncomplete rt1, FunType rt2 args2 varargs2) ->- doFunType rt1 rt2 args2 varargs2- (FunTypeIncomplete rt1, FunTypeIncomplete rt2) ->- do rt <- compositeType rt1 rt2- Right (FunctionType (FunTypeIncomplete rt) (mergeAttrs attrs1 attrs2))- where doFunType rt1 rt2 args varargs =- do rt <- compositeType rt1 rt2- Right (FunctionType- (FunType rt args varargs)- (mergeAttrs attrs1 attrs2))-compositeType t1 t2 = Left $ "incompatible types: "- ++ pType t1 ++ ", " ++ pType t2---- XXX: this may not be correct-compositeSize :: ArraySize -> ArraySize -> Either String ArraySize-compositeSize (UnknownArraySize _) s2 = Right s2-compositeSize s1 (UnknownArraySize _) = Right s1-compositeSize (ArraySize s1 e1) (ArraySize s2 e2)- | s1 == s2 && sizeEqual e1 e2 = Right $ ArraySize s1 e1- | otherwise = Right $ ArraySize s1 e1-{-- fail $ "incompatible array sizes: "- ++ (render . pretty) e1 ++ ", " ++ (render . pretty) e2--}--sizeEqual :: CExpr -> CExpr -> Bool-sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2-sizeEqual e1 e2 = nodeInfo e1 == nodeInfo e2--mergeAttrs :: Attributes -> Attributes -> Attributes-mergeAttrs = (++) -- XXX: ultimately this should be smarter--compositeParamDecl :: ParamDecl -> ParamDecl -> Either String ParamDecl-compositeParamDecl (ParamDecl vd1 ni1) (ParamDecl vd2 _) =- compositeParamDecl' ParamDecl vd1 vd2 ni1-compositeParamDecl (AbstractParamDecl vd1 _) (ParamDecl vd2 ni2) =- compositeParamDecl' ParamDecl vd1 vd2 ni2-compositeParamDecl (ParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =- compositeParamDecl' ParamDecl vd1 vd2 ni1-compositeParamDecl (AbstractParamDecl vd1 ni1) (AbstractParamDecl vd2 _) =- compositeParamDecl' AbstractParamDecl vd1 vd2 ni1--compositeParamDecl' :: (VarDecl -> NodeInfo -> ParamDecl)- -> VarDecl- -> VarDecl- -> NodeInfo- -> Either String ParamDecl-compositeParamDecl' f (VarDecl n1 attrs1 t1) (VarDecl n2 attrs2 t2) dni =- do vd <- compositeVarDecl (VarDecl n1 attrs1 t1') (VarDecl n2 attrs2 t2')- Right $ f vd dni- where t1' = canonicalType t1- t2' = canonicalType t2--compositeVarDecl :: VarDecl -> VarDecl -> Either String VarDecl-compositeVarDecl (VarDecl n1 attrs1 t1) (VarDecl _ attrs2 t2) =- do t <- compositeType t1 t2- Right (VarDecl n1 (compositeDeclAttrs attrs1 attrs2) t)---- XXX: bad treatement of inline and storage-compositeDeclAttrs :: DeclAttrs -> DeclAttrs -> DeclAttrs-compositeDeclAttrs (DeclAttrs inl stor attrs1) (DeclAttrs _ _ attrs2) =- DeclAttrs inl stor (mergeAttrs attrs1 attrs2)--castCompatible :: Type -> Type -> Either String ()-castCompatible t1 t2 =- case (canonicalType t1, canonicalType t2) of- (DirectType TyVoid _ _, _) -> Right ()- (_, _) -> checkScalar t1 >> checkScalar t2---- | Determine whether two types are compatible in an assignment expression.-assignCompatible :: CAssignOp -> Type -> Type -> Either String ()-assignCompatible CAssignOp t1 t2 =- case (canonicalType t1, canonicalType t2) of- (DirectType (TyBuiltin TyAny) _ _, _) -> Right ()- (_, DirectType (TyBuiltin TyAny) _ _) -> Right ()- -- XXX: check qualifiers- (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right ()- -- XXX: check qualifiers- (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right ()- (PtrType _ _ _, t2') | isIntegralType t2' -> Right ()- (t1', t2') | isPointerType t1' && isPointerType t2' ->- compatible (baseType t1') (baseType t2')- --unless (typeQuals t2 <= typeQuals t1) $- -- Left $- -- "incompatible qualifiers in pointer assignment: "- -- ++ pType t1 ++ ", " ++ pType t2- (DirectType (TyComp c1) _ _, DirectType (TyComp c2) _ _)- | sueRef c1 == sueRef c2 -> Right ()- | otherwise -> Left $- "incompatible compound types in assignment: "- ++ pType t1 ++ ", " ++ pType t2- (DirectType (TyBuiltin TyVaList) _ _, DirectType (TyBuiltin TyVaList) _ _) ->- Right ()- (DirectType tn1 _ _, DirectType tn2 _ _)- | isJust (arithmeticConversion tn1 tn2) -> Right ()- | otherwise -> Left $ "incompatible direct types in assignment: "- ++ pType t1 ++ ", " ++ pType t2- (t1', t2') -> compatible t1' t2'-assignCompatible op t1 t2 = void$ binopType (assignBinop op) t1 t2---- | Determine the type of a binary operation.-binopType :: CBinaryOp -> Type -> Type -> Either String Type-binopType op t1 t2 =- case (op, canonicalType t1, canonicalType t2) of- (_, t1', t2')- | isLogicOp op ->- checkScalar t1' >> checkScalar t2' >> Right boolType- | isCmpOp op ->- case (t1', t2') of- (DirectType tn1 _ _, DirectType tn2 _ _) ->- case arithmeticConversion tn1 tn2 of- Just _ -> Right boolType- Nothing -> Left $ render $- text "incompatible arithmetic types in comparison: "- <+> pretty t1 <+> text "and" <+> pretty t2- (PtrType (DirectType TyVoid _ _) _ _, _)- | isPointerType t2' -> Right boolType- (_, PtrType (DirectType TyVoid _ _) _ _)- | isPointerType t1' -> Right boolType- (_, _)- | isPointerType t1' && isIntegralType t2' -> Right boolType- | isIntegralType t1' && isPointerType t2' -> Right boolType- | isPointerType t1' && isPointerType t2' ->- compatible t1' t2' >> Right boolType- (_, _) -> Left "incompatible types in comparison"- (CSubOp, ArrayType t1' _ _ _, ArrayType t2' _ _ _) ->- compatible t1' t2' >> Right ptrDiffType- (CSubOp, ArrayType t1' _ _ _, PtrType t2' _ _) ->- compatible t1' t2' >> Right ptrDiffType- (CSubOp, PtrType t1' _ _, ArrayType t2' _ _ _) ->- compatible t1' t2' >> Right ptrDiffType- (CSubOp, PtrType t1' _ _, PtrType t2' _ _) ->- compatible t1' t2' >> Right ptrDiffType- (_, PtrType _ _ _, t2')- | isPtrOp op && isIntegralType t2' -> Right t1- | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)- (CAddOp, t1', PtrType _ _ _) | isIntegralType t1' -> Right t2- (_, ArrayType _ _ _ _, t2')- | isPtrOp op && isIntegralType t2' -> Right t1- | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op)- (CAddOp, t1', ArrayType _ _ _ _) | isIntegralType t1' -> Right t2- (_, DirectType tn1 q1 a1, DirectType tn2 q2 a2) ->- do when (isBitOp op) (checkIntegral t1 >> checkIntegral t2)- case arithmeticConversion tn1 tn2 of- Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)- Nothing -> Left $ render $- text "invalid binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2- (_, _, _) -> Left $ render $- text "unhandled binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2---- | Determine the type of a conditional expression.-conditionalType :: Type -> Type -> Either String Type-conditionalType t1 t2 =- case (canonicalType t1, canonicalType t2) of- (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right t2- (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right t1- (ArrayType t1' _ q1 a1, ArrayType t2' _ q2 a2) ->- do t <- compositeType t1' t2'- Right $ ArrayType t (UnknownArraySize False)- (mergeTypeQuals q1 q2) (mergeAttrs a1 a2)- (t1'@(DirectType tn1 q1 a1), t2'@(DirectType tn2 q2 a2)) ->- case arithmeticConversion tn1 tn2 of- Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2)- Nothing -> compositeType t1' t2'- (t1', t2') -> compositeType t1' t2'--derefType :: Type -> Either String Type-derefType (PtrType t _ _) = Right t-derefType (ArrayType t _ _ _) = Right t-derefType t =- -- XXX: is it good to use canonicalType here?- case canonicalType t of- PtrType t' _ _ -> Right t'- ArrayType t' _ _ _ -> Right t'- _ -> Left $ "dereferencing non-pointer: " ++ pType t--varAddrType :: IdentDecl -> Either String Type-varAddrType d =- do case declStorage d of- Auto True -> Left "address of register variable"- _ -> Right ()- case t of- ArrayType _ _ q a -> Right $ PtrType t q a- _ -> Right $ simplePtr t- where t = declType d---- | Get the type of field @m@ of type @t@-fieldType :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> Type -> m Type-fieldType ni m t =- case canonicalType t of- DirectType (TyComp ctr) _ _ ->- do td <- lookupSUE ni (sueRef ctr)- ms <- tagMembers ni td- case lookup m ms of- Just ft -> return ft- Nothing -> typeError ni $ "field not found: " ++ identToString m- _t' -> astError ni $- "field of non-composite type: " ++ identToString m- ++ ", " ++ pType t---- | Get all members of a struct, union, or enum, with their--- types. Collapse fields of anonymous members.-tagMembers :: (MonadCError m, MonadSymtab m) =>- NodeInfo -> TagDef -> m [(Ident, Type)]-tagMembers ni td =- case td of- CompDef (CompType _ _ ms _ _) -> getMembers ms- EnumDef (EnumType _ es _ _) -> getMembers es- where getMembers ds =- do let ts = map declType ds- ns = map declName ds- concat `liftM` mapM (expandAnonymous ni) (zip ns ts)---- | Expand an anonymous composite type into a list of member names--- and their associated types.-expandAnonymous :: (MonadCError m, MonadSymtab m) =>- NodeInfo -> (VarName, Type)- -> m [(Ident, Type)]-expandAnonymous ni (NoName, DirectType (TyComp ctr) _ _) =- lookupSUE ni (sueRef ctr) >>= tagMembers ni-expandAnonymous _ (NoName, _) = return []-expandAnonymous _ (VarName n _, t) = return [(n, t)]--lookupSUE :: (MonadCError m, MonadSymtab m) =>- NodeInfo -> SUERef -> m TagDef-lookupSUE ni sue =- do dt <- getDefTable- case lookupTag sue dt of- Just (Right td) -> return td- _ ->- typeError ni $ "unknown composite type: " ++ (render . pretty) sue--deepTypeAttrs :: (MonadCError m, MonadSymtab m) =>- Type -> m Attributes-deepTypeAttrs (DirectType (TyComp (CompTypeRef sue _ ni)) _ attrs) =- (attrs ++) `liftM` sueAttrs ni sue-deepTypeAttrs (DirectType (TyEnum (EnumTypeRef sue ni)) _ attrs) =- (attrs ++) `liftM` sueAttrs ni sue-deepTypeAttrs (DirectType _ _ attrs) = return attrs-deepTypeAttrs (PtrType t _ attrs) = (attrs ++) `liftM` deepTypeAttrs t-deepTypeAttrs (ArrayType t _ _ attrs) = (attrs ++) `liftM` deepTypeAttrs t-deepTypeAttrs (FunctionType (FunType t _ _) attrs) =- (attrs ++) `liftM` deepTypeAttrs t-deepTypeAttrs (FunctionType (FunTypeIncomplete t) attrs) =- (attrs ++) `liftM` deepTypeAttrs t-deepTypeAttrs (TypeDefType (TypeDefRef i _ ni) _ attrs) =- (attrs ++) `liftM` typeDefAttrs ni i--typeDefAttrs :: (MonadCError m, MonadSymtab m) =>- NodeInfo -> Ident -> m Attributes-typeDefAttrs ni i =- do dt <- getDefTable- case lookupIdent i dt of- Nothing -> astError ni $ "can't find typedef name: " ++ identToString i- Just (Left (TypeDef _ t attrs _)) -> (attrs ++) `liftM` deepTypeAttrs t- Just (Right _) -> astError ni $ "not a typedef name: " ++ identToString i--sueAttrs :: (MonadCError m, MonadSymtab m) =>- NodeInfo -> SUERef -> m Attributes-sueAttrs ni sue =- do dt <- getDefTable- case lookupTag sue dt of- Nothing -> astError ni $ "SUE not found: " ++ render (pretty sue)- Just (Left _) -> return []- Just (Right (CompDef (CompType _ _ _ attrs _))) -> return attrs- Just (Right (EnumDef (EnumType _ _ attrs _))) -> return attrs+{-# LANGUAGE FlexibleInstances, CPP #-} +module Language.C.Analysis.TypeCheck where + +import Control.Monad +import Data.Maybe +import Language.C.Data.Ident +import Language.C.Data.Node +import Language.C.Data.Position +import Language.C.Pretty +import Language.C.Syntax.AST +import Language.C.Syntax.Constants +import Language.C.Syntax.Ops +import Language.C.Analysis.DefTable +import Language.C.Analysis.SemRep +import Language.C.Analysis.TravMonad +import Language.C.Analysis.TypeConversions +import Language.C.Analysis.TypeUtils +import Language.C.Analysis.Debug () +import Text.PrettyPrint.HughesPJ + +-- We used to re-implement and export the standard Either instance for +-- Monad, which is bad, because as of GHC 7 it is in Control.Monad.Instances +-- in base >4.2. For backwards compatibility with ghc-6.X, we use CPP here. +#if __GLASGOW_HASKELL__ < 700 +instance Monad (Either String) where + return = Right + Left l >>= _ = Left l + Right r >>= k = k r + fail msg = Left msg +#endif + +pType :: Type -> String +pType = render . pretty + +typeErrorOnLeft :: (MonadCError m) => NodeInfo -> Either String a -> m a +typeErrorOnLeft ni (Left err) = typeError ni err +typeErrorOnLeft _ (Right v) = return v + +-- XXX: this should use a custom error type, but typeMismatch isn't always right +typeError :: MonadCError m => NodeInfo -> String -> m a +typeError = astError + +notFound :: Ident -> Either String a +notFound i = Left $ "not found: " ++ identToString i + +checkScalar' :: MonadCError m => NodeInfo -> Type -> m () +checkScalar' ni = typeErrorOnLeft ni . checkScalar + +checkIntegral' :: MonadCError m => NodeInfo -> Type -> m () +checkIntegral' ni = typeErrorOnLeft ni . checkIntegral + +assignCompatible' :: MonadCError m => + NodeInfo -> CAssignOp -> Type -> Type -> m () +assignCompatible' ni op t1 t2 = typeErrorOnLeft ni (assignCompatible op t1 t2) + +binopType' :: MonadCError m => + NodeInfo -> CBinaryOp -> Type -> Type -> m Type +binopType' ni op t1 t2 = typeErrorOnLeft ni (binopType op t1 t2) + +conditionalType' :: MonadCError m => NodeInfo -> Type -> Type -> m Type +conditionalType' ni t1 t2 = typeErrorOnLeft ni $ conditionalType t1 t2 + +checkScalar :: Type -> Either String () +checkScalar t = + case canonicalType t of + DirectType _ _ _ -> Right () + PtrType _ _ _ -> Right () + ArrayType _ _ _ _ -> Right () -- because it's just a pointer + t' -> Left $ + "expected scalar type, got: " + ++ pType t ++ " (" ++ pType t' ++ ")" + +checkIntegral :: Type -> Either String () +checkIntegral t | isIntegralType (canonicalType t) = Right () + | otherwise = Left $ + "expected integral type, got: " ++ + pType t ++ " (" ++ + pType (canonicalType t) ++ ")" + +-- | Determine the type of a constant. +constType :: (MonadCError m, MonadName m) => CConst -> m Type +constType (CIntConst (CInteger _ _ flags) _) = + return $ DirectType (TyIntegral (getIntType flags)) noTypeQuals noAttributes +constType (CCharConst (CChar _ True) _) = + return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes +constType (CCharConst (CChar _ False) _) = + return $ DirectType (TyIntegral TyChar) noTypeQuals noAttributes +constType (CCharConst (CChars _ _) _) = + return $ DirectType (TyIntegral TyInt) noTypeQuals noAttributes -- XXX +constType (CFloatConst (CFloat fs) _) = + return $ DirectType (TyFloating (getFloatType fs)) noTypeQuals noAttributes +-- XXX: should strings have any type qualifiers or attributes? +constType (CStrConst (CString chars wide) ni) = + do n <- genName + let charType | wide = TyInt -- XXX: this isn't universal + | otherwise = TyChar + ni' = mkNodeInfo (posOf ni) n + arraySize = ArraySize + True -- XXX: is it static? + (CConst + (CIntConst + (cInteger (toInteger (length chars))) ni')) + return $ ArrayType (DirectType (TyIntegral charType) noTypeQuals noAttributes) + arraySize noTypeQuals [] + +-- | Determine whether two types are compatible. +compatible :: Type -> Type -> Either String () +compatible t1 t2 = void$ compositeType t1 t2 + +-- | Determine the composite type of two compatible types. +compositeType :: Type -> Type -> Either String Type +compositeType t1 (DirectType (TyBuiltin TyAny) _ _) = Right t1 +compositeType (DirectType (TyBuiltin TyAny) _ _) t2 = Right t2 +compositeType t1@(DirectType tn1 q1 a1) t2@(DirectType tn2 q2 a2) = + do tn <- case (tn1, tn2) of + (TyVoid, TyVoid) -> Right TyVoid + (TyIntegral _, TyEnum _) -> Right tn1 + (TyEnum _, TyIntegral _) -> Right tn2 + (TyIntegral i1, TyIntegral i2) -> + Right $ TyIntegral (intConversion i1 i2) + (TyFloating f1, TyFloating f2) -> + Right $ TyFloating (floatConversion f1 f2) + (TyComplex f1, TyComplex f2) -> + Right $ TyComplex (floatConversion f1 f2) + (TyComp c1, TyComp c2) -> + do when (sueRef c1 /= sueRef c2) $ + Left $ "incompatible composite types: " + ++ pType t1 ++ ", " ++ pType t2 + Right tn1 + (TyEnum e1, TyEnum e2) -> + do when (sueRef e1 /= sueRef e2) $ + Left $ "incompatible enumeration types: " + ++ pType t1 ++ ", " ++ pType t2 + Right $ TyEnum e1 + (TyBuiltin TyVaList, TyBuiltin TyVaList) -> + Right $ TyBuiltin TyVaList + (TyBuiltin _, TyBuiltin _) -> + Left $ "incompatible builtin types: " + ++ pType t1 ++ ", " ++ pType t2 + (_, _) -> Left $ "incompatible direct types: " + ++ pType t1 ++ ", " ++ pType t2 + Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2) +compositeType (PtrType t1 q1 a1) (PtrType (DirectType TyVoid _ _) q2 _) = + Right $ PtrType t1 (mergeTypeQuals q1 q2) a1 +compositeType (PtrType (DirectType TyVoid _ _) q1 _) (PtrType t2 q2 a2) = + Right $ PtrType t2 (mergeTypeQuals q1 q2) a2 +compositeType (PtrType t1 q1 a1) t2 | isIntegralType t2 = + Right $ PtrType t1 (mergeTypeQuals q1 (typeQuals t2)) a1 +compositeType t1 (PtrType t2 q2 a2) | isIntegralType t1 = + Right $ PtrType t2 (mergeTypeQuals (typeQuals t1) q2) a2 +compositeType (ArrayType t1 _sz1 q1 a1) t2 | isIntegralType t2 = + Right $ PtrType t1 q1 a1 +compositeType t1 (ArrayType t2 _sz2 q2 a2) | isIntegralType t1 = + Right $ PtrType t2 q2 a2 +compositeType (ArrayType t1 s1 q1 a1) (ArrayType t2 s2 q2 a2) = + do t <- compositeType t1 t2 + s <- compositeSize s1 s2 + let quals = mergeTypeQuals q1 q2 + attrs = mergeAttrs a1 a2 + Right (ArrayType t s quals attrs) +compositeType t1 t2 | isPointerType t1 && isPointerType t2 = + do t <- compositeType (baseType t1) (baseType t2) + let quals = mergeTypeQuals (typeQuals t1) (typeQuals t2) + attrs = mergeAttrs (typeAttrs t1) (typeAttrs t2) + Right (PtrType t quals attrs) +compositeType (TypeDefType tdr1 _q1 _a1) (TypeDefType tdr2 _q2 _a2) = + case (tdr1, tdr2) of + (TypeDefRef _ t1 _, TypeDefRef _ t2 _) -> + compositeType t1 t2 +compositeType (FunctionType ft1 attrs1) (FunctionType ft2 attrs2) = + case (ft1, ft2) of + (FunType rt1 args1 varargs1, FunType rt2 args2 varargs2) -> + do {- when (length args1 /= length args2) $ + Left "different numbers of arguments in function types" -} + args <- zipWithM compositeParamDecl args1 args2 + when (varargs1 /= varargs2) $ + Left "incompatible varargs declarations" + doFunType rt1 rt2 args varargs1 + (FunType rt1 args1 varargs1, FunTypeIncomplete rt2) -> + doFunType rt1 rt2 args1 varargs1 + (FunTypeIncomplete rt1, FunType rt2 args2 varargs2) -> + doFunType rt1 rt2 args2 varargs2 + (FunTypeIncomplete rt1, FunTypeIncomplete rt2) -> + do rt <- compositeType rt1 rt2 + Right (FunctionType (FunTypeIncomplete rt) (mergeAttrs attrs1 attrs2)) + where doFunType rt1 rt2 args varargs = + do rt <- compositeType rt1 rt2 + Right (FunctionType + (FunType rt args varargs) + (mergeAttrs attrs1 attrs2)) +compositeType t1 t2 = Left $ "incompatible types: " + ++ pType t1 ++ ", " ++ pType t2 + +-- XXX: this may not be correct +compositeSize :: ArraySize -> ArraySize -> Either String ArraySize +compositeSize (UnknownArraySize _) s2 = Right s2 +compositeSize s1 (UnknownArraySize _) = Right s1 +compositeSize (ArraySize s1 e1) (ArraySize s2 e2) + | s1 == s2 && sizeEqual e1 e2 = Right $ ArraySize s1 e1 + | otherwise = Right $ ArraySize s1 e1 +{- + fail $ "incompatible array sizes: " + ++ (render . pretty) e1 ++ ", " ++ (render . pretty) e2 +-} + +sizeEqual :: CExpr -> CExpr -> Bool +sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2 +sizeEqual e1 e2 = nodeInfo e1 == nodeInfo e2 + +mergeAttrs :: Attributes -> Attributes -> Attributes +mergeAttrs = (++) -- XXX: ultimately this should be smarter + +compositeParamDecl :: ParamDecl -> ParamDecl -> Either String ParamDecl +compositeParamDecl (ParamDecl vd1 ni1) (ParamDecl vd2 _) = + compositeParamDecl' ParamDecl vd1 vd2 ni1 +compositeParamDecl (AbstractParamDecl vd1 _) (ParamDecl vd2 ni2) = + compositeParamDecl' ParamDecl vd1 vd2 ni2 +compositeParamDecl (ParamDecl vd1 ni1) (AbstractParamDecl vd2 _) = + compositeParamDecl' ParamDecl vd1 vd2 ni1 +compositeParamDecl (AbstractParamDecl vd1 ni1) (AbstractParamDecl vd2 _) = + compositeParamDecl' AbstractParamDecl vd1 vd2 ni1 + +compositeParamDecl' :: (VarDecl -> NodeInfo -> ParamDecl) + -> VarDecl + -> VarDecl + -> NodeInfo + -> Either String ParamDecl +compositeParamDecl' f (VarDecl n1 attrs1 t1) (VarDecl n2 attrs2 t2) dni = + do vd <- compositeVarDecl (VarDecl n1 attrs1 t1') (VarDecl n2 attrs2 t2') + Right $ f vd dni + where t1' = canonicalType t1 + t2' = canonicalType t2 + +compositeVarDecl :: VarDecl -> VarDecl -> Either String VarDecl +compositeVarDecl (VarDecl n1 attrs1 t1) (VarDecl _ attrs2 t2) = + do t <- compositeType t1 t2 + Right (VarDecl n1 (compositeDeclAttrs attrs1 attrs2) t) + +-- XXX: bad treatement of inline and storage +compositeDeclAttrs :: DeclAttrs -> DeclAttrs -> DeclAttrs +compositeDeclAttrs (DeclAttrs inl stor attrs1) (DeclAttrs _ _ attrs2) = + DeclAttrs inl stor (mergeAttrs attrs1 attrs2) + +castCompatible :: Type -> Type -> Either String () +castCompatible t1 t2 = + case (canonicalType t1, canonicalType t2) of + (DirectType TyVoid _ _, _) -> Right () + (_, _) -> checkScalar t1 >> checkScalar t2 + +-- | Determine whether two types are compatible in an assignment expression. +assignCompatible :: CAssignOp -> Type -> Type -> Either String () +assignCompatible CAssignOp t1 t2 = + case (canonicalType t1, canonicalType t2) of + (DirectType (TyBuiltin TyAny) _ _, _) -> Right () + (_, DirectType (TyBuiltin TyAny) _ _) -> Right () + -- XXX: check qualifiers + (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right () + -- XXX: check qualifiers + (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right () + (PtrType _ _ _, t2') | isIntegralType t2' -> Right () + (t1', t2') | isPointerType t1' && isPointerType t2' -> + compatible (baseType t1') (baseType t2') + --unless (typeQuals t2 <= typeQuals t1) $ + -- Left $ + -- "incompatible qualifiers in pointer assignment: " + -- ++ pType t1 ++ ", " ++ pType t2 + (DirectType (TyComp c1) _ _, DirectType (TyComp c2) _ _) + | sueRef c1 == sueRef c2 -> Right () + | otherwise -> Left $ + "incompatible compound types in assignment: " + ++ pType t1 ++ ", " ++ pType t2 + (DirectType (TyBuiltin TyVaList) _ _, DirectType (TyBuiltin TyVaList) _ _) -> + Right () + (DirectType tn1 _ _, DirectType tn2 _ _) + | isJust (arithmeticConversion tn1 tn2) -> Right () + | otherwise -> Left $ "incompatible direct types in assignment: " + ++ pType t1 ++ ", " ++ pType t2 + (t1', t2') -> compatible t1' t2' +assignCompatible op t1 t2 = void$ binopType (assignBinop op) t1 t2 + +-- | Determine the type of a binary operation. +binopType :: CBinaryOp -> Type -> Type -> Either String Type +binopType op t1 t2 = + case (op, canonicalType t1, canonicalType t2) of + (_, t1', t2') + | isLogicOp op -> + checkScalar t1' >> checkScalar t2' >> Right boolType + | isCmpOp op -> + case (t1', t2') of + (DirectType tn1 _ _, DirectType tn2 _ _) -> + case arithmeticConversion tn1 tn2 of + Just _ -> Right boolType + Nothing -> Left $ render $ + text "incompatible arithmetic types in comparison: " + <+> pretty t1 <+> text "and" <+> pretty t2 + (PtrType (DirectType TyVoid _ _) _ _, _) + | isPointerType t2' -> Right boolType + (_, PtrType (DirectType TyVoid _ _) _ _) + | isPointerType t1' -> Right boolType + (_, _) + | isPointerType t1' && isIntegralType t2' -> Right boolType + | isIntegralType t1' && isPointerType t2' -> Right boolType + | isPointerType t1' && isPointerType t2' -> + compatible t1' t2' >> Right boolType + (_, _) -> Left "incompatible types in comparison" + (CSubOp, ArrayType t1' _ _ _, ArrayType t2' _ _ _) -> + compatible t1' t2' >> Right ptrDiffType + (CSubOp, ArrayType t1' _ _ _, PtrType t2' _ _) -> + compatible t1' t2' >> Right ptrDiffType + (CSubOp, PtrType t1' _ _, ArrayType t2' _ _ _) -> + compatible t1' t2' >> Right ptrDiffType + (CSubOp, PtrType t1' _ _, PtrType t2' _ _) -> + compatible t1' t2' >> Right ptrDiffType + (_, PtrType _ _ _, t2') + | isPtrOp op && isIntegralType t2' -> Right t1 + | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op) + (CAddOp, t1', PtrType _ _ _) | isIntegralType t1' -> Right t2 + (_, ArrayType _ _ _ _, t2') + | isPtrOp op && isIntegralType t2' -> Right t1 + | otherwise -> Left $ "invalid pointer operation: " ++ render (pretty op) + (CAddOp, t1', ArrayType _ _ _ _) | isIntegralType t1' -> Right t2 + (_, DirectType tn1 q1 a1, DirectType tn2 q2 a2) -> + do when (isBitOp op) (checkIntegral t1 >> checkIntegral t2) + case arithmeticConversion tn1 tn2 of + Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2) + Nothing -> Left $ render $ + text "invalid binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2 + (_, _, _) -> Left $ render $ + text "unhandled binary operation:" <+> pretty t1 <+> pretty op <+> pretty t2 + +-- | Determine the type of a conditional expression. +conditionalType :: Type -> Type -> Either String Type +conditionalType t1 t2 = + case (canonicalType t1, canonicalType t2) of + (PtrType (DirectType TyVoid _ _) _ _, t2') | isPointerType t2' -> Right t2 + (t1', PtrType (DirectType TyVoid _ _) _ _) | isPointerType t1' -> Right t1 + (ArrayType t1' _ q1 a1, ArrayType t2' _ q2 a2) -> + do t <- compositeType t1' t2' + Right $ ArrayType t (UnknownArraySize False) + (mergeTypeQuals q1 q2) (mergeAttrs a1 a2) + (t1'@(DirectType tn1 q1 a1), t2'@(DirectType tn2 q2 a2)) -> + case arithmeticConversion tn1 tn2 of + Just tn -> Right $ DirectType tn (mergeTypeQuals q1 q2) (mergeAttributes a1 a2) + Nothing -> compositeType t1' t2' + (t1', t2') -> compositeType t1' t2' + +derefType :: Type -> Either String Type +derefType (PtrType t _ _) = Right t +derefType (ArrayType t _ _ _) = Right t +derefType t = + -- XXX: is it good to use canonicalType here? + case canonicalType t of + PtrType t' _ _ -> Right t' + ArrayType t' _ _ _ -> Right t' + _ -> Left $ "dereferencing non-pointer: " ++ pType t + +varAddrType :: IdentDecl -> Either String Type +varAddrType d = + do case declStorage d of + Auto True -> Left "address of register variable" + _ -> Right () + case t of + ArrayType _ _ q a -> Right $ PtrType t q a + _ -> Right $ simplePtr t + where t = declType d + +-- | Get the type of field @m@ of type @t@ +fieldType :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> Type -> m Type +fieldType ni m t = + case canonicalType t of + DirectType (TyComp ctr) _ _ -> + do td <- lookupSUE ni (sueRef ctr) + ms <- tagMembers ni td + case lookup m ms of + Just ft -> return ft + Nothing -> typeError ni $ "field not found: " ++ identToString m + _t' -> astError ni $ + "field of non-composite type: " ++ identToString m + ++ ", " ++ pType t + +-- | Get all members of a struct, union, or enum, with their +-- types. Collapse fields of anonymous members. +tagMembers :: (MonadCError m, MonadSymtab m) => + NodeInfo -> TagDef -> m [(Ident, Type)] +tagMembers ni td = + case td of + CompDef (CompType _ _ ms _ _) -> getMembers ms + EnumDef (EnumType _ es _ _) -> getMembers es + where getMembers ds = + do let ts = map declType ds + ns = map declName ds + concat `liftM` mapM (expandAnonymous ni) (zip ns ts) + +-- | Expand an anonymous composite type into a list of member names +-- and their associated types. +expandAnonymous :: (MonadCError m, MonadSymtab m) => + NodeInfo -> (VarName, Type) + -> m [(Ident, Type)] +expandAnonymous ni (NoName, DirectType (TyComp ctr) _ _) = + lookupSUE ni (sueRef ctr) >>= tagMembers ni +expandAnonymous _ (NoName, _) = return [] +expandAnonymous _ (VarName n _, t) = return [(n, t)] + +lookupSUE :: (MonadCError m, MonadSymtab m) => + NodeInfo -> SUERef -> m TagDef +lookupSUE ni sue = + do dt <- getDefTable + case lookupTag sue dt of + Just (Right td) -> return td + _ -> + typeError ni $ "unknown composite type: " ++ (render . pretty) sue + +deepTypeAttrs :: (MonadCError m, MonadSymtab m) => + Type -> m Attributes +deepTypeAttrs (DirectType (TyComp (CompTypeRef sue _ ni)) _ attrs) = + (attrs ++) `liftM` sueAttrs ni sue +deepTypeAttrs (DirectType (TyEnum (EnumTypeRef sue ni)) _ attrs) = + (attrs ++) `liftM` sueAttrs ni sue +deepTypeAttrs (DirectType _ _ attrs) = return attrs +deepTypeAttrs (PtrType t _ attrs) = (attrs ++) `liftM` deepTypeAttrs t +deepTypeAttrs (ArrayType t _ _ attrs) = (attrs ++) `liftM` deepTypeAttrs t +deepTypeAttrs (FunctionType (FunType t _ _) attrs) = + (attrs ++) `liftM` deepTypeAttrs t +deepTypeAttrs (FunctionType (FunTypeIncomplete t) attrs) = + (attrs ++) `liftM` deepTypeAttrs t +deepTypeAttrs (TypeDefType (TypeDefRef i _ ni) _ attrs) = + (attrs ++) `liftM` typeDefAttrs ni i + +typeDefAttrs :: (MonadCError m, MonadSymtab m) => + NodeInfo -> Ident -> m Attributes +typeDefAttrs ni i = + do dt <- getDefTable + case lookupIdent i dt of + Nothing -> astError ni $ "can't find typedef name: " ++ identToString i + Just (Left (TypeDef _ t attrs _)) -> (attrs ++) `liftM` deepTypeAttrs t + Just (Right _) -> astError ni $ "not a typedef name: " ++ identToString i + +sueAttrs :: (MonadCError m, MonadSymtab m) => + NodeInfo -> SUERef -> m Attributes +sueAttrs ni sue = + do dt <- getDefTable + case lookupTag sue dt of + Nothing -> astError ni $ "SUE not found: " ++ render (pretty sue) + Just (Left _) -> return [] + Just (Right (CompDef (CompType _ _ _ attrs _))) -> return attrs + Just (Right (EnumDef (EnumType _ _ attrs _))) -> return attrs
src/Language/C/Analysis/TypeConversions.hs view
@@ -1,39 +1,39 @@-module Language.C.Analysis.TypeConversions (- arithmeticConversion,- floatConversion,- intConversion-) where--import Language.C.Analysis.SemRep---- | For an arithmetic operator, if the arguments are of the given--- types, return the type of the full expression.-arithmeticConversion :: TypeName -> TypeName -> Maybe TypeName--- XXX: I'm assuming that double `op` complex float = complex--- double. The standard seems somewhat unclear on whether this is--- really the case.-arithmeticConversion (TyComplex t1) (TyComplex t2) =- Just $ TyComplex $ floatConversion t1 t2-arithmeticConversion (TyComplex t1) (TyFloating t2) =- Just $ TyComplex $ floatConversion t1 t2-arithmeticConversion (TyFloating t1) (TyComplex t2) =- Just $ TyComplex $ floatConversion t1 t2-arithmeticConversion t1@(TyComplex _) (TyIntegral _) = Just t1-arithmeticConversion (TyIntegral _) t2@(TyComplex _) = Just t2-arithmeticConversion (TyFloating t1) (TyFloating t2) =- Just $ TyFloating $ floatConversion t1 t2-arithmeticConversion t1@(TyFloating _) (TyIntegral _) = Just t1-arithmeticConversion (TyIntegral _) t2@(TyFloating _) = Just t2-arithmeticConversion (TyIntegral t1) (TyIntegral t2) =- Just $ TyIntegral $ intConversion t1 t2-arithmeticConversion (TyEnum _) (TyEnum _) = Just $ TyIntegral TyInt-arithmeticConversion (TyEnum _) t2 = Just t2-arithmeticConversion t1 (TyEnum _) = Just t1-arithmeticConversion _ _ = Nothing--floatConversion :: FloatType -> FloatType -> FloatType-floatConversion = max--intConversion :: IntType -> IntType -> IntType-intConversion t1 t2 = max TyInt (max t1 t2)-+module Language.C.Analysis.TypeConversions ( + arithmeticConversion, + floatConversion, + intConversion +) where + +import Language.C.Analysis.SemRep + +-- | For an arithmetic operator, if the arguments are of the given +-- types, return the type of the full expression. +arithmeticConversion :: TypeName -> TypeName -> Maybe TypeName +-- XXX: I'm assuming that double `op` complex float = complex +-- double. The standard seems somewhat unclear on whether this is +-- really the case. +arithmeticConversion (TyComplex t1) (TyComplex t2) = + Just $ TyComplex $ floatConversion t1 t2 +arithmeticConversion (TyComplex t1) (TyFloating t2) = + Just $ TyComplex $ floatConversion t1 t2 +arithmeticConversion (TyFloating t1) (TyComplex t2) = + Just $ TyComplex $ floatConversion t1 t2 +arithmeticConversion t1@(TyComplex _) (TyIntegral _) = Just t1 +arithmeticConversion (TyIntegral _) t2@(TyComplex _) = Just t2 +arithmeticConversion (TyFloating t1) (TyFloating t2) = + Just $ TyFloating $ floatConversion t1 t2 +arithmeticConversion t1@(TyFloating _) (TyIntegral _) = Just t1 +arithmeticConversion (TyIntegral _) t2@(TyFloating _) = Just t2 +arithmeticConversion (TyIntegral t1) (TyIntegral t2) = + Just $ TyIntegral $ intConversion t1 t2 +arithmeticConversion (TyEnum _) (TyEnum _) = Just $ TyIntegral TyInt +arithmeticConversion (TyEnum _) t2 = Just t2 +arithmeticConversion t1 (TyEnum _) = Just t1 +arithmeticConversion _ _ = Nothing + +floatConversion :: FloatType -> FloatType -> FloatType +floatConversion = max + +intConversion :: IntType -> IntType -> IntType +intConversion t1 t2 = max TyInt (max t1 t2) +
src/Language/C/Analysis/TypeUtils.hs view
@@ -1,343 +1,343 @@-module Language.C.Analysis.TypeUtils (- -- * Constructors- integral,- floating,- simplePtr,- uint16_tType,- uint32_tType,- uint64_tType,- size_tType,- ptrDiffType,- boolType,- voidType,- voidPtr,- constVoidPtr,- charPtr,- constCharPtr,- stringType,- valistType,- -- * Classifiers- isIntegralType,- isFloatingType,- isPointerType,- isScalarType,- isFunctionType,- -- Extractors- typeQuals,- typeQualsUpd,- typeAttrs,- typeAttrsUpd,- baseType,- derefTypeDef,- deepDerefTypeDef,- canonicalType,- -- * Type comparisons- sameType,- -- * Other utilities- getIntType,- getFloatType-) where--import Language.C.Analysis.SemRep-import Language.C.Data.Node (CNode(..))-import Language.C.Syntax.AST (CExpression (..), CConstant (..))-import Language.C.Syntax.Constants---- | Constructor for a simple integral type.-integral :: IntType -> Type-integral ty = DirectType (TyIntegral ty) noTypeQuals noAttributes---- | Constructor for a simple floating-point type.-floating :: FloatType -> Type-floating ty = DirectType (TyFloating ty) noTypeQuals noAttributes---- | A simple pointer with no qualifiers-simplePtr :: Type -> Type-simplePtr t = PtrType t noTypeQuals []---- | A pointer with the @const@ qualifier.-constPtr :: Type -> Type-constPtr t = PtrType t (noTypeQuals { constant = True }) []---- | The underlying type for @uint16_t@. For now, this is just @unsigned short@.-uint16_tType :: Type-uint16_tType = integral TyUShort---- | The underlying type for @uint32_t@. For now, this is just @unsigned int@.-uint32_tType :: Type-uint32_tType = integral TyUInt---- | The underlying type for @uint64_t@. For now, this is just @unsigned long long@.-uint64_tType :: Type-uint64_tType = integral TyULLong---- | The type returned by sizeof (size_t). For now, this is just @int@.-size_tType :: Type-size_tType = integral TyInt---- | The type of pointer differences (ptrdiff_t). For now, this is just @int@.-ptrDiffType :: Type-ptrDiffType = integral TyInt---- | The type of comparisons\/guards. This is always just @int@.-boolType :: Type-boolType = integral TyInt---- | Simple @void@ type.-voidType :: Type-voidType = DirectType TyVoid noTypeQuals noAttributes---- | An unqualified @void@ pointer.-voidPtr :: Type-voidPtr = simplePtr voidType---- | A @const@-qualified @void@ pointer.-constVoidPtr :: Type-constVoidPtr = constPtr voidType---- | An unqualified @char@ pointer.-charPtr :: Type-charPtr = simplePtr (integral TyChar)---- | A @const@-qualified @char@ pointer.-constCharPtr :: Type-constCharPtr = constPtr (integral TyChar)---- | The type of a constant string.-stringType :: Type-stringType = ArrayType- (DirectType (TyIntegral TyChar)- (noTypeQuals { constant = True })- noAttributes)- (UnknownArraySize False)- noTypeQuals- []---- | The builtin type of variable-length argument lists.-valistType :: Type-valistType = DirectType (TyBuiltin TyVaList) noTypeQuals noAttributes---- | Check whether a type is an integral type. This includes @enum@--- types. This function does not attempt to resolve @typedef@ types.-isIntegralType :: Type -> Bool-isIntegralType (DirectType (TyIntegral _) _ _) = True-isIntegralType (DirectType (TyEnum _) _ _) = True-isIntegralType _ = False---- | Check whether a type is a floating-point numeric type. This--- function does not attempt to resolve @typedef@ types.-isFloatingType :: Type -> Bool-isFloatingType (DirectType (TyFloating _) _ _) = True-isFloatingType _ = False---- | Check whether a type is an pointer type. This includes array--- types. This function does not attempt to resolve @typedef@ types.-isPointerType :: Type -> Bool-isPointerType (PtrType _ _ _) = True-isPointerType (ArrayType _ _ _ _) = True-isPointerType _ = False---- | Check whether a type is a scalar type. Scalar types include--- arithmetic types and pointer types.-isScalarType :: Type -> Bool-isScalarType t = isIntegralType t || isPointerType t || isFloatingType t---- | return @True@ if the given type is a function type------ Result is undefined in the presence of undefined typeDefs-isFunctionType :: Type -> Bool-isFunctionType ty =- case ty of TypeDefType (TypeDefRef _ actual_ty _) _ _ -> isFunctionType actual_ty- FunctionType _ _ -> True- _ -> False---- | Return the qualifiers of a type.-typeQuals :: Type -> TypeQuals-typeQuals (DirectType _ q _) = q-typeQuals (PtrType _ q _) = q-typeQuals (ArrayType _ _ q _) = q-typeQuals (FunctionType _ _) = noTypeQuals-typeQuals (TypeDefType (TypeDefRef _ t _) q _) = mergeTypeQuals q (typeQuals t)---- |Update type qualifiers--- For function types, it is an error to change any type qualifiers--- For typedef types, the result is stored in the typedef attribute field-typeQualsUpd :: (TypeQuals -> TypeQuals) -> Type -> Type-typeQualsUpd f ty =- case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name (f ty_quals) ty_attrs- PtrType ty_inner ty_quals ty_attrs -> PtrType ty_inner (f ty_quals) ty_attrs- ArrayType ty_inner sz ty_quals ty_attrs -> ArrayType ty_inner sz (f ty_quals) ty_attrs- FunctionType ty_inner ty_attrs -> FunctionType ty_inner ty_attrs- TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref (f ty_quals) ty_attrs---- | Return the attributes of a type.-typeAttrs :: Type -> Attributes-typeAttrs (DirectType _ _ a) = a-typeAttrs (PtrType _ _ a) = a-typeAttrs (ArrayType _ _ _ a) = a-typeAttrs (FunctionType _ a) = a-typeAttrs (TypeDefType (TypeDefRef _ t _) _ a) = mergeAttributes a (typeAttrs t)---- |Update type attributes-typeAttrsUpd :: (Attributes -> Attributes) -> Type -> Type-typeAttrsUpd f ty =- case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name ty_quals (f ty_attrs)- PtrType ty_inner ty_quals ty_attrs -> PtrType ty_inner ty_quals (f ty_attrs)- ArrayType ty_inner sz ty_quals ty_attrs -> ArrayType ty_inner sz ty_quals (f ty_attrs)- FunctionType ty_inner ty_attrs -> FunctionType ty_inner (f ty_attrs)- TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref ty_quals (f ty_attrs)---- | Return the base type of a pointer or array type. It is an error--- to call this function with a type that is not in one of those two--- categories.-baseType :: Type -> Type-baseType (PtrType t _ _) = t-baseType (ArrayType t _ _ _) = t-baseType _ = error "base of non-pointer type"---- | resolve typedefs, if possible-derefTypeDef :: Type -> Type-derefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =- (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))- (derefTypeDef t)-derefTypeDef ty = ty---- | Attempt to remove all references to @typedef@ types from a given type.--- Note that this does not dereference the types of structure or union--- fields, so there are still cases where further dereferencing is--- needed.-deepDerefTypeDef :: Type -> Type-deepDerefTypeDef (PtrType t quals attrs) =- PtrType (deepDerefTypeDef t) quals attrs-deepDerefTypeDef (ArrayType t size quals attrs) =- ArrayType (deepDerefTypeDef t) size quals attrs-deepDerefTypeDef (FunctionType (FunType rt params varargs) attrs) =- FunctionType (FunType (deepDerefTypeDef rt) params varargs) attrs-deepDerefTypeDef (FunctionType (FunTypeIncomplete rt) attrs) =- FunctionType (FunTypeIncomplete (deepDerefTypeDef rt)) attrs-deepDerefTypeDef (TypeDefType (TypeDefRef _ t _) q a) =- (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q))- (deepDerefTypeDef t)-deepDerefTypeDef t = t---- | True iff Type is a variable length array or a derived type thereof.--- Variably modified types have function or block scope, so only some--- constructions are possible.-isVariablyModifiedType :: Type -> Bool-isVariablyModifiedType t =- case derefTypeDef t of- TypeDefType {} -> error "impossible: derefTypeDef t returned a TypeDefType"- DirectType {} -> False- PtrType ptr_ty _ _ -> isVariablyModifiedType ptr_ty- ArrayType _ sz _ _ -> isVariableArraySize sz- FunctionType {} -> False- where- isVariableArraySize :: ArraySize -> Bool- isVariableArraySize (UnknownArraySize isStarred) = isStarred- isVariableArraySize (ArraySize isStatic e) = isStatic || isConstantSize e-- isConstantSize :: Expr -> Bool- isConstantSize (CConst (CIntConst {})) = True- isConstantSize _ = False---- | Two types denote the same type if they are identical, ignoring type--- definitions, and neither is a variably modified type.-sameType :: Type -> Type -> Bool-sameType t1 t2 =- not (isVariablyModifiedType t1 || isVariablyModifiedType t2) && sameType'- where- sameType' =- case (derefTypeDef t1, derefTypeDef t2) of- (TypeDefType {}, _) -> error "impossible: derefTypeDef t1 returned a TypeDefType"- (_, TypeDefType {}) -> error "impossible: derefTypeDef t2 returned a TypeDefType"- (DirectType tn1 q1 _a1, DirectType tn2 q2 _a2) ->- sameTypeName tn1 tn2 && sameQuals q1 q2 {- FIXME: same attributes? -}- (PtrType pt1 q1 _a1, PtrType pt2 q2 _a2) ->- sameType pt1 pt2 && sameQuals q1 q2- (ArrayType at1 sz1 q1 _a1, ArrayType at2 sz2 q2 _a2) ->- sameType at1 at2 && sameArraySize sz1 sz2 && sameQuals q1 q2- (FunctionType ft1 _a1, FunctionType ft2 _a2) ->- sameFunType ft1 ft2- _ -> False--sameTypeName :: TypeName -> TypeName -> Bool-sameTypeName t1 t2 =- case (t1, t2) of- (TyVoid, TyVoid) -> True- (TyIntegral i1, TyIntegral i2) -> i1 == i2- (TyFloating f1, TyFloating f2) -> f1 == f2- (TyComplex f1, TyComplex f2) -> f1 == f2- (TyComp ctr1, TyComp ctr2) -> sameCompTypeRef ctr1 ctr2- (TyEnum etr1, TyEnum etr2) -> sameEnumTypeRef etr1 etr2- (TyBuiltin b1, TyBuiltin b2) -> sameBuiltinType b1 b2- _ -> False--sameBuiltinType :: BuiltinType -> BuiltinType -> Bool-sameBuiltinType TyVaList TyVaList = True-sameBuiltinType TyAny TyAny = False {- what does TyAny mean? -}-sameBuiltinType _ _ = False--sameCompTypeRef :: CompTypeRef -> CompTypeRef -> Bool-sameCompTypeRef (CompTypeRef sue1 kind1 _) (CompTypeRef sue2 kind2 _) =- sue1 == sue2 && kind1 == kind2--sameEnumTypeRef :: EnumTypeRef -> EnumTypeRef -> Bool-sameEnumTypeRef (EnumTypeRef sue1 _) (EnumTypeRef sue2 _) = sue1 == sue2--sameFunType :: FunType -> FunType -> Bool-sameFunType (FunType rt1 params1 isVar1) (FunType rt2 params2 isVar2) =- sameType rt1 rt2 && sameParamDecls params1 params2 && isVar1 == isVar2- where- sameParamDecls :: [ParamDecl] -> [ParamDecl] -> Bool- sameParamDecls param_list1 param_list2 =- length param_list1 == length param_list2- && and (zipWith sameParamDecl param_list1 param_list2)- -- ignores param identifiers, just compares types- sameParamDecl :: ParamDecl -> ParamDecl -> Bool- sameParamDecl p1 p2 = sameType (declType p1) (declType p2)-sameFunType (FunTypeIncomplete rt1) (FunTypeIncomplete rt2) =- sameType rt1 rt2-sameFunType _ _ = False---- | Returns 'True' iff both array sizes denote the same size. Assumes that--- neither array type was a variably modified type.-sameArraySize :: ArraySize -> ArraySize -> Bool-sameArraySize (UnknownArraySize isStar1) (UnknownArraySize isStar2) = isStar1 == isStar2-sameArraySize (ArraySize s1 e1) (ArraySize s2 e2) = s1 == s2 && sizeEqual e1 e2- where- -- FIXME: Do something better, and combine with sizeEqual in Language.C.Analysis.TypeCheck- sizeEqual :: Expr -> Expr -> Bool- sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2- sizeEqual oe1 oe2 = nodeInfo oe1 == nodeInfo oe2-sameArraySize _ _ = False--sameQuals :: TypeQuals -> TypeQuals -> Bool-sameQuals (TypeQuals {constant = c1, volatile = v1, restrict = r1})- (TypeQuals {constant = c2, volatile = v2, restrict = r2}) =- c1 == c2 && v1 == v2 && r1 == r2--canonicalType :: Type -> Type-canonicalType t =- case deepDerefTypeDef t of- FunctionType ft attrs -> simplePtr (FunctionType ft attrs)- t' -> t'---- XXX: move to be with other flag functions-testFlags :: Enum f => [f] -> Flags f -> Bool-testFlags flags fi = all (`testFlag` fi) flags---- XXX: deal with FlagImag. No representation for it in Complex.--- XXX: deal with invalid combinations of flags?-getIntType :: Flags CIntFlag -> IntType-getIntType flags | testFlags [FlagLongLong, FlagUnsigned] flags = TyULLong- | testFlag FlagLongLong flags = TyLLong- | testFlags [FlagLong, FlagUnsigned] flags = TyULong- | testFlag FlagLong flags = TyLong- | testFlag FlagUnsigned flags = TyUInt- | otherwise = TyInt--getFloatType :: String -> FloatType-getFloatType fs | last fs `elem` ['f', 'F'] = TyFloat- | last fs `elem` ['l', 'L'] = TyLDouble- | otherwise = TyDouble-+module Language.C.Analysis.TypeUtils ( + -- * Constructors + integral, + floating, + simplePtr, + uint16_tType, + uint32_tType, + uint64_tType, + size_tType, + ptrDiffType, + boolType, + voidType, + voidPtr, + constVoidPtr, + charPtr, + constCharPtr, + stringType, + valistType, + -- * Classifiers + isIntegralType, + isFloatingType, + isPointerType, + isScalarType, + isFunctionType, + -- Extractors + typeQuals, + typeQualsUpd, + typeAttrs, + typeAttrsUpd, + baseType, + derefTypeDef, + deepDerefTypeDef, + canonicalType, + -- * Type comparisons + sameType, + -- * Other utilities + getIntType, + getFloatType +) where + +import Language.C.Analysis.SemRep +import Language.C.Data.Node (CNode(..)) +import Language.C.Syntax.AST (CExpression (..), CConstant (..)) +import Language.C.Syntax.Constants + +-- | Constructor for a simple integral type. +integral :: IntType -> Type +integral ty = DirectType (TyIntegral ty) noTypeQuals noAttributes + +-- | Constructor for a simple floating-point type. +floating :: FloatType -> Type +floating ty = DirectType (TyFloating ty) noTypeQuals noAttributes + +-- | A simple pointer with no qualifiers +simplePtr :: Type -> Type +simplePtr t = PtrType t noTypeQuals [] + +-- | A pointer with the @const@ qualifier. +constPtr :: Type -> Type +constPtr t = PtrType t (noTypeQuals { constant = True }) [] + +-- | The underlying type for @uint16_t@. For now, this is just @unsigned short@. +uint16_tType :: Type +uint16_tType = integral TyUShort + +-- | The underlying type for @uint32_t@. For now, this is just @unsigned int@. +uint32_tType :: Type +uint32_tType = integral TyUInt + +-- | The underlying type for @uint64_t@. For now, this is just @unsigned long long@. +uint64_tType :: Type +uint64_tType = integral TyULLong + +-- | The type returned by sizeof (size_t). For now, this is just @int@. +size_tType :: Type +size_tType = integral TyInt + +-- | The type of pointer differences (ptrdiff_t). For now, this is just @int@. +ptrDiffType :: Type +ptrDiffType = integral TyInt + +-- | The type of comparisons\/guards. This is always just @int@. +boolType :: Type +boolType = integral TyInt + +-- | Simple @void@ type. +voidType :: Type +voidType = DirectType TyVoid noTypeQuals noAttributes + +-- | An unqualified @void@ pointer. +voidPtr :: Type +voidPtr = simplePtr voidType + +-- | A @const@-qualified @void@ pointer. +constVoidPtr :: Type +constVoidPtr = constPtr voidType + +-- | An unqualified @char@ pointer. +charPtr :: Type +charPtr = simplePtr (integral TyChar) + +-- | A @const@-qualified @char@ pointer. +constCharPtr :: Type +constCharPtr = constPtr (integral TyChar) + +-- | The type of a constant string. +stringType :: Type +stringType = ArrayType + (DirectType (TyIntegral TyChar) + (noTypeQuals { constant = True }) + noAttributes) + (UnknownArraySize False) + noTypeQuals + [] + +-- | The builtin type of variable-length argument lists. +valistType :: Type +valistType = DirectType (TyBuiltin TyVaList) noTypeQuals noAttributes + +-- | Check whether a type is an integral type. This includes @enum@ +-- types. This function does not attempt to resolve @typedef@ types. +isIntegralType :: Type -> Bool +isIntegralType (DirectType (TyIntegral _) _ _) = True +isIntegralType (DirectType (TyEnum _) _ _) = True +isIntegralType _ = False + +-- | Check whether a type is a floating-point numeric type. This +-- function does not attempt to resolve @typedef@ types. +isFloatingType :: Type -> Bool +isFloatingType (DirectType (TyFloating _) _ _) = True +isFloatingType _ = False + +-- | Check whether a type is an pointer type. This includes array +-- types. This function does not attempt to resolve @typedef@ types. +isPointerType :: Type -> Bool +isPointerType (PtrType _ _ _) = True +isPointerType (ArrayType _ _ _ _) = True +isPointerType _ = False + +-- | Check whether a type is a scalar type. Scalar types include +-- arithmetic types and pointer types. +isScalarType :: Type -> Bool +isScalarType t = isIntegralType t || isPointerType t || isFloatingType t + +-- | return @True@ if the given type is a function type +-- +-- Result is undefined in the presence of undefined typeDefs +isFunctionType :: Type -> Bool +isFunctionType ty = + case ty of TypeDefType (TypeDefRef _ actual_ty _) _ _ -> isFunctionType actual_ty + FunctionType _ _ -> True + _ -> False + +-- | Return the qualifiers of a type. +typeQuals :: Type -> TypeQuals +typeQuals (DirectType _ q _) = q +typeQuals (PtrType _ q _) = q +typeQuals (ArrayType _ _ q _) = q +typeQuals (FunctionType _ _) = noTypeQuals +typeQuals (TypeDefType (TypeDefRef _ t _) q _) = mergeTypeQuals q (typeQuals t) + +-- |Update type qualifiers +-- For function types, it is an error to change any type qualifiers +-- For typedef types, the result is stored in the typedef attribute field +typeQualsUpd :: (TypeQuals -> TypeQuals) -> Type -> Type +typeQualsUpd f ty = + case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name (f ty_quals) ty_attrs + PtrType ty_inner ty_quals ty_attrs -> PtrType ty_inner (f ty_quals) ty_attrs + ArrayType ty_inner sz ty_quals ty_attrs -> ArrayType ty_inner sz (f ty_quals) ty_attrs + FunctionType ty_inner ty_attrs -> FunctionType ty_inner ty_attrs + TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref (f ty_quals) ty_attrs + +-- | Return the attributes of a type. +typeAttrs :: Type -> Attributes +typeAttrs (DirectType _ _ a) = a +typeAttrs (PtrType _ _ a) = a +typeAttrs (ArrayType _ _ _ a) = a +typeAttrs (FunctionType _ a) = a +typeAttrs (TypeDefType (TypeDefRef _ t _) _ a) = mergeAttributes a (typeAttrs t) + +-- |Update type attributes +typeAttrsUpd :: (Attributes -> Attributes) -> Type -> Type +typeAttrsUpd f ty = + case ty of DirectType ty_name ty_quals ty_attrs -> DirectType ty_name ty_quals (f ty_attrs) + PtrType ty_inner ty_quals ty_attrs -> PtrType ty_inner ty_quals (f ty_attrs) + ArrayType ty_inner sz ty_quals ty_attrs -> ArrayType ty_inner sz ty_quals (f ty_attrs) + FunctionType ty_inner ty_attrs -> FunctionType ty_inner (f ty_attrs) + TypeDefType ty_ref ty_quals ty_attrs -> TypeDefType ty_ref ty_quals (f ty_attrs) + +-- | Return the base type of a pointer or array type. It is an error +-- to call this function with a type that is not in one of those two +-- categories. +baseType :: Type -> Type +baseType (PtrType t _ _) = t +baseType (ArrayType t _ _ _) = t +baseType _ = error "base of non-pointer type" + +-- | resolve typedefs, if possible +derefTypeDef :: Type -> Type +derefTypeDef (TypeDefType (TypeDefRef _ t _) q a) = + (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q)) + (derefTypeDef t) +derefTypeDef ty = ty + +-- | Attempt to remove all references to @typedef@ types from a given type. +-- Note that this does not dereference the types of structure or union +-- fields, so there are still cases where further dereferencing is +-- needed. +deepDerefTypeDef :: Type -> Type +deepDerefTypeDef (PtrType t quals attrs) = + PtrType (deepDerefTypeDef t) quals attrs +deepDerefTypeDef (ArrayType t size quals attrs) = + ArrayType (deepDerefTypeDef t) size quals attrs +deepDerefTypeDef (FunctionType (FunType rt params varargs) attrs) = + FunctionType (FunType (deepDerefTypeDef rt) params varargs) attrs +deepDerefTypeDef (FunctionType (FunTypeIncomplete rt) attrs) = + FunctionType (FunTypeIncomplete (deepDerefTypeDef rt)) attrs +deepDerefTypeDef (TypeDefType (TypeDefRef _ t _) q a) = + (typeAttrsUpd (mergeAttributes a) . typeQualsUpd (mergeTypeQuals q)) + (deepDerefTypeDef t) +deepDerefTypeDef t = t + +-- | True iff Type is a variable length array or a derived type thereof. +-- Variably modified types have function or block scope, so only some +-- constructions are possible. +isVariablyModifiedType :: Type -> Bool +isVariablyModifiedType t = + case derefTypeDef t of + TypeDefType {} -> error "impossible: derefTypeDef t returned a TypeDefType" + DirectType {} -> False + PtrType ptr_ty _ _ -> isVariablyModifiedType ptr_ty + ArrayType _ sz _ _ -> isVariableArraySize sz + FunctionType {} -> False + where + isVariableArraySize :: ArraySize -> Bool + isVariableArraySize (UnknownArraySize isStarred) = isStarred + isVariableArraySize (ArraySize isStatic e) = isStatic || isConstantSize e + + isConstantSize :: Expr -> Bool + isConstantSize (CConst (CIntConst {})) = True + isConstantSize _ = False + +-- | Two types denote the same type if they are identical, ignoring type +-- definitions, and neither is a variably modified type. +sameType :: Type -> Type -> Bool +sameType t1 t2 = + not (isVariablyModifiedType t1 || isVariablyModifiedType t2) && sameType' + where + sameType' = + case (derefTypeDef t1, derefTypeDef t2) of + (TypeDefType {}, _) -> error "impossible: derefTypeDef t1 returned a TypeDefType" + (_, TypeDefType {}) -> error "impossible: derefTypeDef t2 returned a TypeDefType" + (DirectType tn1 q1 _a1, DirectType tn2 q2 _a2) -> + sameTypeName tn1 tn2 && sameQuals q1 q2 {- FIXME: same attributes? -} + (PtrType pt1 q1 _a1, PtrType pt2 q2 _a2) -> + sameType pt1 pt2 && sameQuals q1 q2 + (ArrayType at1 sz1 q1 _a1, ArrayType at2 sz2 q2 _a2) -> + sameType at1 at2 && sameArraySize sz1 sz2 && sameQuals q1 q2 + (FunctionType ft1 _a1, FunctionType ft2 _a2) -> + sameFunType ft1 ft2 + _ -> False + +sameTypeName :: TypeName -> TypeName -> Bool +sameTypeName t1 t2 = + case (t1, t2) of + (TyVoid, TyVoid) -> True + (TyIntegral i1, TyIntegral i2) -> i1 == i2 + (TyFloating f1, TyFloating f2) -> f1 == f2 + (TyComplex f1, TyComplex f2) -> f1 == f2 + (TyComp ctr1, TyComp ctr2) -> sameCompTypeRef ctr1 ctr2 + (TyEnum etr1, TyEnum etr2) -> sameEnumTypeRef etr1 etr2 + (TyBuiltin b1, TyBuiltin b2) -> sameBuiltinType b1 b2 + _ -> False + +sameBuiltinType :: BuiltinType -> BuiltinType -> Bool +sameBuiltinType TyVaList TyVaList = True +sameBuiltinType TyAny TyAny = False {- what does TyAny mean? -} +sameBuiltinType _ _ = False + +sameCompTypeRef :: CompTypeRef -> CompTypeRef -> Bool +sameCompTypeRef (CompTypeRef sue1 kind1 _) (CompTypeRef sue2 kind2 _) = + sue1 == sue2 && kind1 == kind2 + +sameEnumTypeRef :: EnumTypeRef -> EnumTypeRef -> Bool +sameEnumTypeRef (EnumTypeRef sue1 _) (EnumTypeRef sue2 _) = sue1 == sue2 + +sameFunType :: FunType -> FunType -> Bool +sameFunType (FunType rt1 params1 isVar1) (FunType rt2 params2 isVar2) = + sameType rt1 rt2 && sameParamDecls params1 params2 && isVar1 == isVar2 + where + sameParamDecls :: [ParamDecl] -> [ParamDecl] -> Bool + sameParamDecls param_list1 param_list2 = + length param_list1 == length param_list2 + && and (zipWith sameParamDecl param_list1 param_list2) + -- ignores param identifiers, just compares types + sameParamDecl :: ParamDecl -> ParamDecl -> Bool + sameParamDecl p1 p2 = sameType (declType p1) (declType p2) +sameFunType (FunTypeIncomplete rt1) (FunTypeIncomplete rt2) = + sameType rt1 rt2 +sameFunType _ _ = False + +-- | Returns 'True' iff both array sizes denote the same size. Assumes that +-- neither array type was a variably modified type. +sameArraySize :: ArraySize -> ArraySize -> Bool +sameArraySize (UnknownArraySize isStar1) (UnknownArraySize isStar2) = isStar1 == isStar2 +sameArraySize (ArraySize s1 e1) (ArraySize s2 e2) = s1 == s2 && sizeEqual e1 e2 + where + -- FIXME: Do something better, and combine with sizeEqual in Language.C.Analysis.TypeCheck + sizeEqual :: Expr -> Expr -> Bool + sizeEqual (CConst (CIntConst i1 _)) (CConst (CIntConst i2 _)) = i1 == i2 + sizeEqual oe1 oe2 = nodeInfo oe1 == nodeInfo oe2 +sameArraySize _ _ = False + +sameQuals :: TypeQuals -> TypeQuals -> Bool +sameQuals (TypeQuals {constant = c1, volatile = v1, restrict = r1}) + (TypeQuals {constant = c2, volatile = v2, restrict = r2}) = + c1 == c2 && v1 == v2 && r1 == r2 + +canonicalType :: Type -> Type +canonicalType t = + case deepDerefTypeDef t of + FunctionType ft attrs -> simplePtr (FunctionType ft attrs) + t' -> t' + +-- XXX: move to be with other flag functions +testFlags :: Enum f => [f] -> Flags f -> Bool +testFlags flags fi = all (`testFlag` fi) flags + +-- XXX: deal with FlagImag. No representation for it in Complex. +-- XXX: deal with invalid combinations of flags? +getIntType :: Flags CIntFlag -> IntType +getIntType flags | testFlags [FlagLongLong, FlagUnsigned] flags = TyULLong + | testFlag FlagLongLong flags = TyLLong + | testFlags [FlagLong, FlagUnsigned] flags = TyULong + | testFlag FlagLong flags = TyLong + | testFlag FlagUnsigned flags = TyUInt + | otherwise = TyInt + +getFloatType :: String -> FloatType +getFloatType fs | last fs `elem` ['f', 'F'] = TyFloat + | last fs `elem` ['l', 'L'] = TyLDouble + | otherwise = TyDouble +
src/Language/C/Data.hs view
@@ -1,40 +1,40 @@--------------------------------------------------------------------------------- |--- Module : Language.C.Data--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Common data types for Language.C: Identifiers, unique names, source code locations,--- ast node attributes and extensible errors.-------------------------------------------------------------------------------module Language.C.Data (- -- * Input stream- module Language.C.Data.InputStream,- -- * Identifiers- SUERef(..), isAnonymousRef, sueRefToString,- Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent,- -- * Unqiue names- Name(..),newNameSupply,- -- * Source code positions- Position(..),posFile,posParent,- Pos(..),- initPos, nopos,builtinPos,internalPos,- isSourcePos,isBuiltinPos,isInternalPos,- -- * Syntax tree nodes- NodeInfo(..),CNode(..),- fileOfNode,posOfNode,nameOfNode,- undefNode,mkNodeInfoOnlyPos,mkNodeInfo,- internalNode, -- DEPRECATED- -- * Extensible errors- module Language.C.Data.Error-)-where-import Language.C.Data.InputStream-import Language.C.Data.Ident-import Language.C.Data.Name-import Language.C.Data.Position-import Language.C.Data.Error-import Language.C.Data.Node+----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Data +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Common data types for Language.C: Identifiers, unique names, source code locations, +-- ast node attributes and extensible errors. +----------------------------------------------------------------------------- +module Language.C.Data ( + -- * Input stream + module Language.C.Data.InputStream, + -- * Identifiers + SUERef(..), isAnonymousRef, sueRefToString, + Ident,mkIdent, identToString, internalIdent, isInternalIdent, builtinIdent, + -- * Unqiue names + Name(..),newNameSupply, + -- * Source code positions + Position(..),posFile,posParent, + Pos(..), + initPos, nopos,builtinPos,internalPos, + isSourcePos,isBuiltinPos,isInternalPos, + -- * Syntax tree nodes + NodeInfo(..),CNode(..), + fileOfNode,posOfNode,nameOfNode, + undefNode,mkNodeInfoOnlyPos,mkNodeInfo, + internalNode, -- DEPRECATED + -- * Extensible errors + module Language.C.Data.Error +) +where +import Language.C.Data.InputStream +import Language.C.Data.Ident +import Language.C.Data.Name +import Language.C.Data.Position +import Language.C.Data.Error +import Language.C.Data.Node
src/Language/C/Data/Error.hs view
@@ -1,171 +1,171 @@-{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Data.Error--- Copyright : (c) 2008 Benedikt Huber, Manuel M. T. Chakravarty--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Base type for errors occurring in parsing, analysing and pretty-printing.--- With ideas from Simon Marlow's--- "An extensible dynamically-typed hierarchy of execeptions [2006]"-------------------------------------------------------------------------------module Language.C.Data.Error (- -- * Severity Level- ErrorLevel(..), isHardError,- -- * Error class- Error(..), errorPos, errorLevel, errorMsgs,- -- * Error 'supertype'- CError(..),- -- * Infos attached to errors- ErrorInfo(..),showError,showErrorInfo,mkErrorInfo,- -- * Default error types- UnsupportedFeature, unsupportedFeature, unsupportedFeature_,- UserError, userErr,- -- * Raising internal errors- internalErr,-)-where-import Data.Typeable-import Language.C.Data.Node-import Language.C.Data.Position---- | Error levels (severity)-data ErrorLevel = LevelWarn- | LevelError- | LevelFatal- deriving (Eq, Ord)--instance Show ErrorLevel where- show LevelWarn = "WARNING"- show LevelError = "ERROR"- show LevelFatal = "FATAL ERROR"---- | return @True@ when the given error makes it impossible to continue--- analysis or compilation.-isHardError :: (Error ex) => ex -> Bool-isHardError = ( > LevelWarn) . errorLevel---- | information attached to every error in Language.C-data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable---- to facilitate newtype deriving-instance Show ErrorInfo where show = showErrorInfo "error"-instance Error ErrorInfo where- errorInfo = id- changeErrorLevel (ErrorInfo _ pos msgs) lvl' = ErrorInfo lvl' pos msgs--mkErrorInfo :: ErrorLevel -> String -> NodeInfo -> ErrorInfo-mkErrorInfo lvl msg node = ErrorInfo lvl (posOfNode node) (lines msg)---- | `supertype' of all errors-data CError- = forall err. (Error err) => CError err- deriving Typeable---- | errors in Language.C are instance of 'Error'-class (Typeable e, Show e) => Error e where- -- | obtain source location etc. of an error- errorInfo :: e -> ErrorInfo- -- | wrap error in 'CError'- toError :: e -> CError- -- | try to cast a generic 'CError' to the specific error type- fromError :: CError -> (Maybe e)- -- | modify the error level- changeErrorLevel :: e -> ErrorLevel -> e-- -- default implementation- fromError (CError e) = cast e- toError = CError- changeErrorLevel e lvl =- if errorLevel e == lvl- then e- else error $ "changeErrorLevel: not possible for " ++ show e--instance Show CError where- show (CError e) = show e-instance Error CError where- errorInfo (CError err) = errorInfo err- toError = id- fromError = Just- changeErrorLevel (CError e) = CError . changeErrorLevel e---- | position of an @Error@-errorPos :: (Error e) => e -> Position-errorPos = ( \(ErrorInfo _ pos _) -> pos ) . errorInfo---- | severity level of an @Error@-errorLevel :: (Error e) => e -> ErrorLevel-errorLevel = ( \(ErrorInfo lvl _ _) -> lvl ) . errorInfo---- | message lines of an @Error@-errorMsgs :: (Error e) => e -> [String]-errorMsgs = ( \(ErrorInfo _ _ msgs) -> msgs ) . errorInfo---- | error raised if a operation requires an unsupported or not yet implemented feature.-data UnsupportedFeature = UnsupportedFeature String Position deriving Typeable-instance Error UnsupportedFeature where- errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg)-instance Show UnsupportedFeature where show = showError "Unsupported Feature"--unsupportedFeature :: (Pos a) => String -> a -> UnsupportedFeature-unsupportedFeature msg a = UnsupportedFeature msg (posOf a)--unsupportedFeature_ :: String -> UnsupportedFeature-unsupportedFeature_ msg = UnsupportedFeature msg internalPos---- | unspecified error raised by the user (in case the user does not want to define--- her own error types).-newtype UserError = UserError ErrorInfo deriving Typeable-instance Error UserError where- errorInfo (UserError info) = info-instance Show UserError where show = showError "User Error"--userErr :: String -> UserError-userErr msg = UserError (ErrorInfo LevelError internalPos (lines msg))---- other errors to be defined elsewhere--showError :: (Error e) => String -> e -> String-showError short_msg = showErrorInfo short_msg . errorInfo---- | converts an error into a string using a fixed format------ * either the lines of the long error message or the short message has to be non-empty------ * the format is------ > <fname>:<row>: (column <col>) [<err lvl>]--- > >>> <line_1>--- > <line_2>--- > ...--- > <line_n>-showErrorInfo :: String -> ErrorInfo -> String-showErrorInfo short_msg (ErrorInfo level pos msgs) =- header ++ showMsgLines (if null short_msg then msgs else short_msg:msgs)- where- header = showPos pos ++ "[" ++ show level ++ "]"- showPos p | isSourcePos p = (posFile p) ++ ":" ++ show (posRow pos) ++ ": " ++- "(column " ++ show (posColumn pos) ++ ") "- | otherwise = show p ++ ":: "- showMsgLines [] = internalErr "No short message or error message provided."- showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs)----- internal errors-internalErrPrefix :: String-internalErrPrefix = unlines [ "Language.C : Internal Error" ,- "This is propably a bug, and should be reported at "++- "http://www.sivity.net/projects/language.c/newticket"]---- | raise a fatal internal error; message may have multiple lines-internalErr :: String -> a-internalErr msg = error (internalErrPrefix ++ "\n"- ++ indentLines msg- ++ "\n")-indent :: String-indent = " "-indentLines :: String -> String-indentLines = unlines . map (indent++) . lines+{-# LANGUAGE ExistentialQuantification, DeriveDataTypeable #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Data.Error +-- Copyright : (c) 2008 Benedikt Huber, Manuel M. T. Chakravarty +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Base type for errors occurring in parsing, analysing and pretty-printing. +-- With ideas from Simon Marlow's +-- "An extensible dynamically-typed hierarchy of execeptions [2006]" +----------------------------------------------------------------------------- +module Language.C.Data.Error ( + -- * Severity Level + ErrorLevel(..), isHardError, + -- * Error class + Error(..), errorPos, errorLevel, errorMsgs, + -- * Error 'supertype' + CError(..), + -- * Infos attached to errors + ErrorInfo(..),showError,showErrorInfo,mkErrorInfo, + -- * Default error types + UnsupportedFeature, unsupportedFeature, unsupportedFeature_, + UserError, userErr, + -- * Raising internal errors + internalErr, +) +where +import Data.Typeable +import Language.C.Data.Node +import Language.C.Data.Position + +-- | Error levels (severity) +data ErrorLevel = LevelWarn + | LevelError + | LevelFatal + deriving (Eq, Ord) + +instance Show ErrorLevel where + show LevelWarn = "WARNING" + show LevelError = "ERROR" + show LevelFatal = "FATAL ERROR" + +-- | return @True@ when the given error makes it impossible to continue +-- analysis or compilation. +isHardError :: (Error ex) => ex -> Bool +isHardError = ( > LevelWarn) . errorLevel + +-- | information attached to every error in Language.C +data ErrorInfo = ErrorInfo ErrorLevel Position [String] deriving Typeable + +-- to facilitate newtype deriving +instance Show ErrorInfo where show = showErrorInfo "error" +instance Error ErrorInfo where + errorInfo = id + changeErrorLevel (ErrorInfo _ pos msgs) lvl' = ErrorInfo lvl' pos msgs + +mkErrorInfo :: ErrorLevel -> String -> NodeInfo -> ErrorInfo +mkErrorInfo lvl msg node = ErrorInfo lvl (posOfNode node) (lines msg) + +-- | `supertype' of all errors +data CError + = forall err. (Error err) => CError err + deriving Typeable + +-- | errors in Language.C are instance of 'Error' +class (Typeable e, Show e) => Error e where + -- | obtain source location etc. of an error + errorInfo :: e -> ErrorInfo + -- | wrap error in 'CError' + toError :: e -> CError + -- | try to cast a generic 'CError' to the specific error type + fromError :: CError -> (Maybe e) + -- | modify the error level + changeErrorLevel :: e -> ErrorLevel -> e + + -- default implementation + fromError (CError e) = cast e + toError = CError + changeErrorLevel e lvl = + if errorLevel e == lvl + then e + else error $ "changeErrorLevel: not possible for " ++ show e + +instance Show CError where + show (CError e) = show e +instance Error CError where + errorInfo (CError err) = errorInfo err + toError = id + fromError = Just + changeErrorLevel (CError e) = CError . changeErrorLevel e + +-- | position of an @Error@ +errorPos :: (Error e) => e -> Position +errorPos = ( \(ErrorInfo _ pos _) -> pos ) . errorInfo + +-- | severity level of an @Error@ +errorLevel :: (Error e) => e -> ErrorLevel +errorLevel = ( \(ErrorInfo lvl _ _) -> lvl ) . errorInfo + +-- | message lines of an @Error@ +errorMsgs :: (Error e) => e -> [String] +errorMsgs = ( \(ErrorInfo _ _ msgs) -> msgs ) . errorInfo + +-- | error raised if a operation requires an unsupported or not yet implemented feature. +data UnsupportedFeature = UnsupportedFeature String Position deriving Typeable +instance Error UnsupportedFeature where + errorInfo (UnsupportedFeature msg pos) = ErrorInfo LevelError pos (lines msg) +instance Show UnsupportedFeature where show = showError "Unsupported Feature" + +unsupportedFeature :: (Pos a) => String -> a -> UnsupportedFeature +unsupportedFeature msg a = UnsupportedFeature msg (posOf a) + +unsupportedFeature_ :: String -> UnsupportedFeature +unsupportedFeature_ msg = UnsupportedFeature msg internalPos + +-- | unspecified error raised by the user (in case the user does not want to define +-- her own error types). +newtype UserError = UserError ErrorInfo deriving Typeable +instance Error UserError where + errorInfo (UserError info) = info +instance Show UserError where show = showError "User Error" + +userErr :: String -> UserError +userErr msg = UserError (ErrorInfo LevelError internalPos (lines msg)) + +-- other errors to be defined elsewhere + +showError :: (Error e) => String -> e -> String +showError short_msg = showErrorInfo short_msg . errorInfo + +-- | converts an error into a string using a fixed format +-- +-- * either the lines of the long error message or the short message has to be non-empty +-- +-- * the format is +-- +-- > <fname>:<row>: (column <col>) [<err lvl>] +-- > >>> <line_1> +-- > <line_2> +-- > ... +-- > <line_n> +showErrorInfo :: String -> ErrorInfo -> String +showErrorInfo short_msg (ErrorInfo level pos msgs) = + header ++ showMsgLines (if null short_msg then msgs else short_msg:msgs) + where + header = showPos pos ++ "[" ++ show level ++ "]" + showPos p | isSourcePos p = (posFile p) ++ ":" ++ show (posRow pos) ++ ": " ++ + "(column " ++ show (posColumn pos) ++ ") " + | otherwise = show p ++ ":: " + showMsgLines [] = internalErr "No short message or error message provided." + showMsgLines (x:xs) = indent ++ ">>> " ++ x ++ "\n" ++ unlines (map (indent++) xs) + + +-- internal errors +internalErrPrefix :: String +internalErrPrefix = unlines [ "Language.C : Internal Error" , + "This is propably a bug, and should be reported at "++ + "http://www.sivity.net/projects/language.c/newticket"] + +-- | raise a fatal internal error; message may have multiple lines +internalErr :: String -> a +internalErr msg = error (internalErrPrefix ++ "\n" + ++ indentLines msg + ++ "\n") +indent :: String +indent = " " +indentLines :: String -> String +indentLines = unlines . map (indent++) . lines
src/Language/C/Data/Ident.hs view
@@ -1,134 +1,134 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Data.Ident--- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty--- (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ This module provides the notion of identifiers in C, speed up using hashing.--- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with--- a unique 'Name' and a source location ('Position'). The ordering relation on--- identifiers is based on the hash and does not follow the lexical order.-------------------------------------------------------------------------------module Language.C.Data.Ident (- Ident(..),- SUERef(..), isAnonymousRef,- mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent,- identToString, sueRefToString, dumpIdent)-where---- TODO (comment from manuel):--- * Hashing is not 8bit clean.--import Data.Char-import Language.C.Data.Position-import Language.C.Data.Node-import Language.C.Data.Name (Name)-import Data.Generics---- | References uniquely determining a struct, union or enum type.--- Those are either identified by an string identifier, or by a unique--- name (anonymous types).-data SUERef = AnonymousRef Name- | NamedRef Ident- deriving (Typeable, Data, Ord, Eq, Show) --, Read---- | Return true if the struct\/union\/enum reference is anonymous.-isAnonymousRef :: SUERef -> Bool-isAnonymousRef (AnonymousRef _) = True-isAnonymousRef _ = False---- | C identifiers-data Ident = Ident String -- lexeme- {-# UNPACK #-} !Int -- hash to speed up equality check- NodeInfo -- attributes of this ident. incl. position- deriving (Data,Typeable,Show) -- Read---- the definition of the equality allows identifiers to be equal that are--- defined at different source text positions, and aims at speeding up the--- equality test, by comparing the lexemes only if the two numbers are equal----instance Eq Ident where- (Ident s h _) == (Ident s' h' _) = (h == h') && (s == s')---- this does *not* follow the alphanumerical ordering of the lexemes----instance Ord Ident where- compare (Ident s h _) (Ident s' h' _) = compare (h, s) (h', s')---- identifiers are attributed-instance CNode Ident where- nodeInfo (Ident _ _ at) = at-instance Pos Ident where- posOf = posOfNode . nodeInfo--- to speed up the equality test we compute some hash-like value for each--- identifiers lexeme and store it in the identifiers representation---- hash function from the dragon book pp437; assumes 7 bit characters and needs--- the (nearly) full range of values guaranteed for `Int' by the Haskell--- language definition; can handle 8 bit characters provided we have 29 bit--- for the `Int's without sign----quad :: String -> Int-quad (c1:c2:c3:c4:s) = ((ord c4 * bits21- + ord c3 * bits14- + ord c2 * bits7- + ord c1)- `mod` bits28)- + (quad s `mod` bits28)-quad (c1:c2:c3:[] ) = ord c3 * bits14 + ord c2 * bits7 + ord c1-quad (c1:c2:[] ) = ord c2 * bits7 + ord c1-quad (c1:[] ) = ord c1-quad ([] ) = 0--bits7 :: Int-bits7 = 2^(7::Int)-bits14 :: Int-bits14 = 2^(14::Int)-bits21 :: Int-bits21 = 2^(21::Int)-bits28 :: Int-bits28 = 2^(28::Int)---- | build an identifier from a string.------ * only minimal error checking, e.g., the characters of the identifier are--- not checked for being alphanumerical only; the correct lexis of the--- identifier should be ensured by the caller, e.g., the scanner.------ * for reasons of simplicity the complete lexeme is hashed.-mkIdent :: Position -> String -> Name -> Ident-mkIdent pos s name = Ident s (quad s) (mkNodeInfo' pos (pos,length s) name)---- | returns an /internal/ identifier (has internal position and no unique name)-internalIdent :: String -> Ident-internalIdent s = Ident s (quad s) (mkNodeInfoOnlyPos internalPos)---- | return an /internal/ identifier with position info-internalIdentAt :: Position -> String -> Ident-internalIdentAt pos s = Ident s (quad s) (mkNodeInfoPosLen pos (pos, length s))---- | returns a /builtin/ identifier (has builtin position and no unique name)-builtinIdent :: String -> Ident-builtinIdent s = Ident s (quad s) (mkNodeInfoOnlyPos builtinPos)---- | return @True@ if the given identifier is /internal/-isInternalIdent :: Ident -> Bool-isInternalIdent (Ident _ _ nodeinfo) = isInternalPos (posOfNode nodeinfo)---- | string of an identifier-identToString :: Ident -> String-identToString (Ident s _ _) = s---- | string of a SUE ref (empty if anonymous)-sueRefToString :: SUERef -> String-sueRefToString (AnonymousRef _) = ""-sueRefToString (NamedRef ident) = identToString ident---- | dump the identifier string and its positions for debugging purposes-dumpIdent :: Ident -> String-dumpIdent ide = identToString ide ++ " at " ++ show (nodeInfo ide)+{-# LANGUAGE DeriveDataTypeable #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Data.Ident +-- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty +-- (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- This module provides the notion of identifiers in C, speed up using hashing. +-- Identifiers are associated optionally associated with a 'NodeInfo', i.e. with +-- a unique 'Name' and a source location ('Position'). The ordering relation on +-- identifiers is based on the hash and does not follow the lexical order. +----------------------------------------------------------------------------- +module Language.C.Data.Ident ( + Ident(..), + SUERef(..), isAnonymousRef, + mkIdent, builtinIdent, internalIdent, internalIdentAt, isInternalIdent, + identToString, sueRefToString, dumpIdent) +where + +-- TODO (comment from manuel): +-- * Hashing is not 8bit clean. + +import Data.Char +import Language.C.Data.Position +import Language.C.Data.Node +import Language.C.Data.Name (Name) +import Data.Generics + +-- | References uniquely determining a struct, union or enum type. +-- Those are either identified by an string identifier, or by a unique +-- name (anonymous types). +data SUERef = AnonymousRef Name + | NamedRef Ident + deriving (Typeable, Data, Ord, Eq, Show) --, Read + +-- | Return true if the struct\/union\/enum reference is anonymous. +isAnonymousRef :: SUERef -> Bool +isAnonymousRef (AnonymousRef _) = True +isAnonymousRef _ = False + +-- | C identifiers +data Ident = Ident String -- lexeme + {-# UNPACK #-} !Int -- hash to speed up equality check + NodeInfo -- attributes of this ident. incl. position + deriving (Data,Typeable,Show) -- Read + +-- the definition of the equality allows identifiers to be equal that are +-- defined at different source text positions, and aims at speeding up the +-- equality test, by comparing the lexemes only if the two numbers are equal +-- +instance Eq Ident where + (Ident s h _) == (Ident s' h' _) = (h == h') && (s == s') + +-- this does *not* follow the alphanumerical ordering of the lexemes +-- +instance Ord Ident where + compare (Ident s h _) (Ident s' h' _) = compare (h, s) (h', s') + +-- identifiers are attributed +instance CNode Ident where + nodeInfo (Ident _ _ at) = at +instance Pos Ident where + posOf = posOfNode . nodeInfo +-- to speed up the equality test we compute some hash-like value for each +-- identifiers lexeme and store it in the identifiers representation + +-- hash function from the dragon book pp437; assumes 7 bit characters and needs +-- the (nearly) full range of values guaranteed for `Int' by the Haskell +-- language definition; can handle 8 bit characters provided we have 29 bit +-- for the `Int's without sign +-- +quad :: String -> Int +quad (c1:c2:c3:c4:s) = ((ord c4 * bits21 + + ord c3 * bits14 + + ord c2 * bits7 + + ord c1) + `mod` bits28) + + (quad s `mod` bits28) +quad (c1:c2:c3:[] ) = ord c3 * bits14 + ord c2 * bits7 + ord c1 +quad (c1:c2:[] ) = ord c2 * bits7 + ord c1 +quad (c1:[] ) = ord c1 +quad ([] ) = 0 + +bits7 :: Int +bits7 = 2^(7::Int) +bits14 :: Int +bits14 = 2^(14::Int) +bits21 :: Int +bits21 = 2^(21::Int) +bits28 :: Int +bits28 = 2^(28::Int) + +-- | build an identifier from a string. +-- +-- * only minimal error checking, e.g., the characters of the identifier are +-- not checked for being alphanumerical only; the correct lexis of the +-- identifier should be ensured by the caller, e.g., the scanner. +-- +-- * for reasons of simplicity the complete lexeme is hashed. +mkIdent :: Position -> String -> Name -> Ident +mkIdent pos s name = Ident s (quad s) (mkNodeInfo' pos (pos,length s) name) + +-- | returns an /internal/ identifier (has internal position and no unique name) +internalIdent :: String -> Ident +internalIdent s = Ident s (quad s) (mkNodeInfoOnlyPos internalPos) + +-- | return an /internal/ identifier with position info +internalIdentAt :: Position -> String -> Ident +internalIdentAt pos s = Ident s (quad s) (mkNodeInfoPosLen pos (pos, length s)) + +-- | returns a /builtin/ identifier (has builtin position and no unique name) +builtinIdent :: String -> Ident +builtinIdent s = Ident s (quad s) (mkNodeInfoOnlyPos builtinPos) + +-- | return @True@ if the given identifier is /internal/ +isInternalIdent :: Ident -> Bool +isInternalIdent (Ident _ _ nodeinfo) = isInternalPos (posOfNode nodeinfo) + +-- | string of an identifier +identToString :: Ident -> String +identToString (Ident s _ _) = s + +-- | string of a SUE ref (empty if anonymous) +sueRefToString :: SUERef -> String +sueRefToString (AnonymousRef _) = "" +sueRefToString (NamedRef ident) = identToString ident + +-- | dump the identifier string and its positions for debugging purposes +dumpIdent :: Ident -> String +dumpIdent ide = identToString ide ++ " at " ++ show (nodeInfo ide)
src/Language/C/Data/InputStream.hs view
@@ -1,99 +1,99 @@-{-# LANGUAGE CPP, BangPatterns #-}-{-# OPTIONS -Wall #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Data.InputStream--- Copyright : (c) 2008,2011 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Compile time input abstraction for the parser, relying on ByteString.--- The String interface only supports Latin-1 since alex-3, as alex now requires--- byte based access to the input stream.---------------------------------------------------------------------------------module Language.C.Data.InputStream (- InputStream, readInputStream,inputStreamToString,inputStreamFromString,- takeByte, takeChar, inputStreamEmpty, takeChars,- countLines,-)-where--import Data.Word--#ifndef NO_BYTESTRING-import Data.ByteString (ByteString)-import qualified Data.ByteString as BSW-import qualified Data.ByteString.Char8 as BSC-#else-import qualified Data.Char as Char-#endif---- Generic InputStream stuff---- | read a file into an 'InputStream'-readInputStream :: FilePath -> IO InputStream---- | convert 'InputStream' to 'String'-inputStreamToString :: InputStream -> String-{-# INLINE inputStreamToString #-}---- | convert a 'String' to an 'InputStream'-inputStreamFromString :: String -> InputStream---- | @(b,is') = takeByte is@ reads and removes--- the first byte @b@ from the 'InputStream' @is@-takeByte :: InputStream -> (Word8, InputStream)-{-# INLINE takeByte #-}---- | @(c,is') = takeChar is@ reads and removes--- the first character @c@ from the 'InputStream' @is@-takeChar :: InputStream -> (Char, InputStream)-{-# INLINE takeChar #-}---- | return @True@ if the given input stream is empty-inputStreamEmpty :: InputStream -> Bool-{-# INLINE inputStreamEmpty #-}---- | @str = takeChars n is@ returns the first @n@ characters--- of the given input stream, without removing them-takeChars :: Int -> InputStream -> [Char]-{-# INLINE takeChars #-}---- | @countLines@ returns the number of text lines in the--- given 'InputStream'-countLines :: InputStream -> Int--#ifndef NO_BYTESTRING--type InputStream = ByteString-takeByte bs = BSW.head bs `seq` (BSW.head bs, BSW.tail bs)-takeChar bs = BSC.head bs `seq` (BSC.head bs, BSC.tail bs)-inputStreamEmpty = BSW.null-#ifndef __HADDOCK__-takeChars !n bstr = BSC.unpack $ BSC.take n bstr --leaks-#endif-readInputStream = BSW.readFile--inputStreamToString = BSC.unpack-inputStreamFromString = BSC.pack-countLines = length . BSC.lines---#else--type InputStream = String-takeByte bs- | Char.isLatin1 c = let b = fromIntegral (Char.ord c) in b `seq` (b, tail bs)- | otherwise = error "takeByte: not a latin-1 character"- where c = head bs-takeChar bs = (head bs, tail bs)-inputStreamEmpty = null-takeChars n str = take n str-readInputStream = readFile-inputStreamToString = id-inputStreamFromString = id-countLines = length . lines-#endif-+{-# LANGUAGE CPP, BangPatterns #-} +{-# OPTIONS -Wall #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Data.InputStream +-- Copyright : (c) 2008,2011 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Compile time input abstraction for the parser, relying on ByteString. +-- The String interface only supports Latin-1 since alex-3, as alex now requires +-- byte based access to the input stream. +------------------------------------------------------------------------------- +module Language.C.Data.InputStream ( + InputStream, readInputStream,inputStreamToString,inputStreamFromString, + takeByte, takeChar, inputStreamEmpty, takeChars, + countLines, +) +where + +import Data.Word + +#ifndef NO_BYTESTRING +import Data.ByteString (ByteString) +import qualified Data.ByteString as BSW +import qualified Data.ByteString.Char8 as BSC +#else +import qualified Data.Char as Char +#endif + +-- Generic InputStream stuff + +-- | read a file into an 'InputStream' +readInputStream :: FilePath -> IO InputStream + +-- | convert 'InputStream' to 'String' +inputStreamToString :: InputStream -> String +{-# INLINE inputStreamToString #-} + +-- | convert a 'String' to an 'InputStream' +inputStreamFromString :: String -> InputStream + +-- | @(b,is') = takeByte is@ reads and removes +-- the first byte @b@ from the 'InputStream' @is@ +takeByte :: InputStream -> (Word8, InputStream) +{-# INLINE takeByte #-} + +-- | @(c,is') = takeChar is@ reads and removes +-- the first character @c@ from the 'InputStream' @is@ +takeChar :: InputStream -> (Char, InputStream) +{-# INLINE takeChar #-} + +-- | return @True@ if the given input stream is empty +inputStreamEmpty :: InputStream -> Bool +{-# INLINE inputStreamEmpty #-} + +-- | @str = takeChars n is@ returns the first @n@ characters +-- of the given input stream, without removing them +takeChars :: Int -> InputStream -> [Char] +{-# INLINE takeChars #-} + +-- | @countLines@ returns the number of text lines in the +-- given 'InputStream' +countLines :: InputStream -> Int + +#ifndef NO_BYTESTRING + +type InputStream = ByteString +takeByte bs = BSW.head bs `seq` (BSW.head bs, BSW.tail bs) +takeChar bs = BSC.head bs `seq` (BSC.head bs, BSC.tail bs) +inputStreamEmpty = BSW.null +#ifndef __HADDOCK__ +takeChars !n bstr = BSC.unpack $ BSC.take n bstr --leaks +#endif +readInputStream = BSW.readFile + +inputStreamToString = BSC.unpack +inputStreamFromString = BSC.pack +countLines = length . BSC.lines + + +#else + +type InputStream = String +takeByte bs + | Char.isLatin1 c = let b = fromIntegral (Char.ord c) in b `seq` (b, tail bs) + | otherwise = error "takeByte: not a latin-1 character" + where c = head bs +takeChar bs = (head bs, tail bs) +inputStreamEmpty = null +takeChars n str = take n str +readInputStream = readFile +inputStreamToString = id +inputStreamFromString = id +countLines = length . lines +#endif +
src/Language/C/Data/Name.hs view
@@ -1,31 +1,31 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Data.Name--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Unique Names with fast equality (newtype 'Int')-module Language.C.Data.Name (-Name(..),newNameSupply, namesStartingFrom-) where-import Data.Ix-import Data.Generics---- | Name is a unique identifier-newtype Name = Name { nameId :: Int } deriving (Show, Read, Eq, Ord, Ix, Data, Typeable)--instance Enum Name where- toEnum = Name- fromEnum (Name n) = n---- | return an infinite stream of 'Name's starting with @nameId@ 0-newNameSupply :: [Name]-newNameSupply = namesStartingFrom 0---- | get the infinite stream of unique names starting from the given integer-namesStartingFrom :: Int -> [Name]-namesStartingFrom k = [Name k..]+{-# LANGUAGE DeriveDataTypeable #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Data.Name +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Unique Names with fast equality (newtype 'Int') +module Language.C.Data.Name ( +Name(..),newNameSupply, namesStartingFrom +) where +import Data.Ix +import Data.Generics + +-- | Name is a unique identifier +newtype Name = Name { nameId :: Int } deriving (Show, Read, Eq, Ord, Ix, Data, Typeable) + +instance Enum Name where + toEnum = Name + fromEnum (Name n) = n + +-- | return an infinite stream of 'Name's starting with @nameId@ 0 +newNameSupply :: [Name] +newNameSupply = namesStartingFrom 0 + +-- | get the infinite stream of unique names starting from the given integer +namesStartingFrom :: Int -> [Name] +namesStartingFrom k = [Name k..]
src/Language/C/Data/Node.hs view
@@ -1,124 +1,124 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Syntax.Attributes--- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty--- (c) 2008 Benedikt Huber (stripped radically)--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ source position and unqiue name-------------------------------------------------------------------------------module Language.C.Data.Node (- NodeInfo(..), undefNode, isUndefNode,- mkNodeInfoOnlyPos,mkNodeInfoPosLen, mkNodeInfo,mkNodeInfo',- internalNode, -- deprecated, use undefNode- CNode(nodeInfo), fileOfNode,- posOfNode, nameOfNode, getLastTokenPos, lengthOfNode,- eqByName,-) where-import Language.C.Data.Position-import Language.C.Data.Name (Name)-import Data.Generics---- | Parsed entity attribute-data NodeInfo = OnlyPos Position {-# UNPACK #-} !PosLength -- only pos and last token (for internal stuff only)- | NodeInfo Position {-# UNPACK #-} !PosLength !Name -- pos, last token and unique name- deriving (Data,Typeable,Eq,Ord)--instance Show NodeInfo where- showsPrec d (OnlyPos p l) =- (showString "(OnlyPos ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString ")")- showsPrec d (NodeInfo p l n) =- (showString "(NodeInfo ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString " ") . (showsPrec d n) . (showString ")")---- name equality of attributes, used to define (name) equality of objects---instance Eq NodeInfo where--- (NodeInfo _ _ id1) == (NodeInfo _ _ id2) = id1 == id2--- _ == _ =--- error "Attributes: Attempt to compare `OnlyPos' attributes!"---- attribute ordering---instance Ord NodeInfo where--- (NodeInfo _ _ id1) <= (NodeInfo _ _ id2) = id1 <= id2--- _ <= _ =--- error "Attributes: Attempt to compare `OnlyPos' attributes!"--instance Pos NodeInfo where- posOf (OnlyPos pos _) = pos- posOf (NodeInfo pos _ _) = pos---- | get the number of characters an AST node spans-lengthOfNode :: NodeInfo -> Maybe Int-lengthOfNode ni = len- where- len = case ni of NodeInfo firstPos lastTok _ -> computeLength firstPos lastTok- OnlyPos firstPos lastTok -> computeLength firstPos lastTok- computeLength pos (lastPos,lastTokLen) | lastTokLen < 0 = Nothing- | otherwise = Just (posOffset lastPos + lastTokLen - posOffset pos)---- | get the position and length of the last token-getLastTokenPos :: NodeInfo -> PosLength-getLastTokenPos (NodeInfo _ lastTok _) = lastTok-getLastTokenPos (OnlyPos _ lastTok) = lastTok---- | a class for convenient access to the attributes of an attributed object-class CNode a where- nodeInfo :: a -> NodeInfo-instance CNode NodeInfo where- nodeInfo = id-instance (CNode a, CNode b) => CNode (Either a b) where- nodeInfo = either nodeInfo nodeInfo--nameOfNode :: NodeInfo -> Maybe Name-nameOfNode (OnlyPos _ _) = Nothing-nameOfNode (NodeInfo _ _ name) = Just name-posOfNode :: NodeInfo -> Position-posOfNode ni = case ni of (OnlyPos pos _) -> pos; (NodeInfo pos _ _) -> pos-fileOfNode :: (CNode a) => a -> Maybe FilePath-fileOfNode = fmap posFile . justIf isSourcePos . posOfNode . nodeInfo where- justIf predicate x | predicate x = Just x- | otherwise = Nothing---- | equality by name-eqByName :: CNode a => a -> a -> Bool-eqByName obj1 obj2 = (nodeInfo obj1) == (nodeInfo obj2)----- attribute identifier creation--- ------------------------------{-# DEPRECATED internalNode "use undefNode instead" #-}-internalNode :: NodeInfo-internalNode = undefNode---- | create a node with neither name nor positional information-undefNode :: NodeInfo-undefNode = OnlyPos nopos (nopos,-1)---- | return True if the node carries neither name nor positional information-isUndefNode :: NodeInfo -> Bool-isUndefNode (OnlyPos p _) | isNoPos p = True- | otherwise = False-isUndefNode _ = False---- |--- | Given only a source position, create a new node attribute-mkNodeInfoOnlyPos :: Position -> NodeInfo-mkNodeInfoOnlyPos pos = OnlyPos pos (nopos,-1)---- | Given a source position and the position and length of the last token, create a new node attribute-mkNodeInfoPosLen :: Position -> PosLength -> NodeInfo-mkNodeInfoPosLen = OnlyPos---- | Given a source position and a unique name, create a new attribute--- identifier-mkNodeInfo :: Position -> Name -> NodeInfo-mkNodeInfo pos name = NodeInfo pos (nopos,-1) name---- | Given a source position, the position and length of the last token and a unique name, create a new attribute--- identifier. Strict in-mkNodeInfo' :: Position -> PosLength -> Name -> NodeInfo-mkNodeInfo' pos lasttok name = NodeInfo pos lasttok name-+{-# LANGUAGE DeriveDataTypeable #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Syntax.Attributes +-- Copyright : (c) [1995..1999] Manuel M. T. Chakravarty +-- (c) 2008 Benedikt Huber (stripped radically) +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- source position and unqiue name +----------------------------------------------------------------------------- +module Language.C.Data.Node ( + NodeInfo(..), undefNode, isUndefNode, + mkNodeInfoOnlyPos,mkNodeInfoPosLen, mkNodeInfo,mkNodeInfo', + internalNode, -- deprecated, use undefNode + CNode(nodeInfo), fileOfNode, + posOfNode, nameOfNode, getLastTokenPos, lengthOfNode, + eqByName, +) where +import Language.C.Data.Position +import Language.C.Data.Name (Name) +import Data.Generics + +-- | Parsed entity attribute +data NodeInfo = OnlyPos Position {-# UNPACK #-} !PosLength -- only pos and last token (for internal stuff only) + | NodeInfo Position {-# UNPACK #-} !PosLength !Name -- pos, last token and unique name + deriving (Data,Typeable,Eq,Ord) + +instance Show NodeInfo where + showsPrec d (OnlyPos p l) = + (showString "(OnlyPos ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString ")") + showsPrec d (NodeInfo p l n) = + (showString "(NodeInfo ") . (showsPrec d p) . (showString " ") . (showsPrec d l) . (showString " ") . (showsPrec d n) . (showString ")") + +-- name equality of attributes, used to define (name) equality of objects +--instance Eq NodeInfo where +-- (NodeInfo _ _ id1) == (NodeInfo _ _ id2) = id1 == id2 +-- _ == _ = +-- error "Attributes: Attempt to compare `OnlyPos' attributes!" + +-- attribute ordering +--instance Ord NodeInfo where +-- (NodeInfo _ _ id1) <= (NodeInfo _ _ id2) = id1 <= id2 +-- _ <= _ = +-- error "Attributes: Attempt to compare `OnlyPos' attributes!" + +instance Pos NodeInfo where + posOf (OnlyPos pos _) = pos + posOf (NodeInfo pos _ _) = pos + +-- | get the number of characters an AST node spans +lengthOfNode :: NodeInfo -> Maybe Int +lengthOfNode ni = len + where + len = case ni of NodeInfo firstPos lastTok _ -> computeLength firstPos lastTok + OnlyPos firstPos lastTok -> computeLength firstPos lastTok + computeLength pos (lastPos,lastTokLen) | lastTokLen < 0 = Nothing + | otherwise = Just (posOffset lastPos + lastTokLen - posOffset pos) + +-- | get the position and length of the last token +getLastTokenPos :: NodeInfo -> PosLength +getLastTokenPos (NodeInfo _ lastTok _) = lastTok +getLastTokenPos (OnlyPos _ lastTok) = lastTok + +-- | a class for convenient access to the attributes of an attributed object +class CNode a where + nodeInfo :: a -> NodeInfo +instance CNode NodeInfo where + nodeInfo = id +instance (CNode a, CNode b) => CNode (Either a b) where + nodeInfo = either nodeInfo nodeInfo + +nameOfNode :: NodeInfo -> Maybe Name +nameOfNode (OnlyPos _ _) = Nothing +nameOfNode (NodeInfo _ _ name) = Just name +posOfNode :: NodeInfo -> Position +posOfNode ni = case ni of (OnlyPos pos _) -> pos; (NodeInfo pos _ _) -> pos +fileOfNode :: (CNode a) => a -> Maybe FilePath +fileOfNode = fmap posFile . justIf isSourcePos . posOfNode . nodeInfo where + justIf predicate x | predicate x = Just x + | otherwise = Nothing + +-- | equality by name +eqByName :: CNode a => a -> a -> Bool +eqByName obj1 obj2 = (nodeInfo obj1) == (nodeInfo obj2) + + +-- attribute identifier creation +-- ----------------------------- +{-# DEPRECATED internalNode "use undefNode instead" #-} +internalNode :: NodeInfo +internalNode = undefNode + +-- | create a node with neither name nor positional information +undefNode :: NodeInfo +undefNode = OnlyPos nopos (nopos,-1) + +-- | return True if the node carries neither name nor positional information +isUndefNode :: NodeInfo -> Bool +isUndefNode (OnlyPos p _) | isNoPos p = True + | otherwise = False +isUndefNode _ = False + +-- | +-- | Given only a source position, create a new node attribute +mkNodeInfoOnlyPos :: Position -> NodeInfo +mkNodeInfoOnlyPos pos = OnlyPos pos (nopos,-1) + +-- | Given a source position and the position and length of the last token, create a new node attribute +mkNodeInfoPosLen :: Position -> PosLength -> NodeInfo +mkNodeInfoPosLen = OnlyPos + +-- | Given a source position and a unique name, create a new attribute +-- identifier +mkNodeInfo :: Position -> Name -> NodeInfo +mkNodeInfo pos name = NodeInfo pos (nopos,-1) name + +-- | Given a source position, the position and length of the last token and a unique name, create a new attribute +-- identifier. Strict in +mkNodeInfo' :: Position -> PosLength -> Name -> NodeInfo +mkNodeInfo' pos lasttok name = NodeInfo pos lasttok name +
src/Language/C/Data/Position.hs view
@@ -1,129 +1,129 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Data.Position--- Copyright : (c) [1995..2000] Manuel M. T. Chakravarty--- [2008..2009] Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Source code position-------------------------------------------------------------------------------module Language.C.Data.Position (- --- -- source text positions- --- Position(),- position,- PosLength,- posFile,posRow,posColumn,posOffset,posParent,- initPos, isSourcePos,- nopos, isNoPos,- builtinPos, isBuiltinPos,- internalPos, isInternalPos,- incPos, retPos,- incOffset,- Pos(..),-) where-import Data.Generics---- | file position information-data FilePosition = FilePosition { posSrcFile :: String, -- ^ source file- posParentFile :: (Maybe Position) -- ^ including file, if any- }- deriving (Eq, Ord, Typeable, Data)---- | uniform representation of source file positions-data Position = Position { posOffset :: {-# UNPACK #-} !Int -- ^ absolute offset in the preprocessed file- , posRow :: {-# UNPACK #-} !Int -- ^ row (line) in the original file. Affected by #LINE pragmas.- , posColumn :: {-# UNPACK #-} !Int -- ^ column in the preprocessed file. Inaccurate w.r.t. to the original- -- file in the presence of preprocessor macros.- , posFileInfo :: FilePosition -- ^ position in source file, including files- }- | NoPosition- | BuiltinPosition- | InternalPosition- deriving (Eq, Ord, Typeable, Data)--posFile :: Position -> String-posFile = posSrcFile . posFileInfo--posParent :: Position -> (Maybe Position)-posParent = posParentFile . posFileInfo---- | Position and length of a token-type PosLength = (Position,Int)--instance Show Position where- showsPrec _ (Position _ row _ (FilePosition fname mparent)) =- showString "(" . showsPrec 0 fname . showString ": line " . showsPrec 0 row .- maybe id (\p -> showString ", in file included from " . showsPrec 0 p) mparent .- showString ")"- showsPrec _ NoPosition = showString "<no file>"- showsPrec _ BuiltinPosition = showString "<builtin>"- showsPrec _ InternalPosition = showString "<internal>"---- | @position absoluteOffset fileName lineNumber columnNumber@ initializes a @Position@ using the given arguments-position :: Int -> String -> Int -> Int -> Maybe Position -> Position-position offset fname row col mparent = Position offset row col (FilePosition fname mparent)---- | class of type which aggregate a source code location-class Pos a where- posOf :: a -> Position---- | initialize a Position to the start of the translation unit starting in the given file-initPos :: FilePath -> Position-initPos file = Position 0 1 1 (FilePosition file Nothing)---- | returns @True@ if the given position refers to an actual source file-isSourcePos :: Position -> Bool-isSourcePos (Position _ _ _ _) = True-isSourcePos _ = False---- | no position (for unknown position information)-nopos :: Position-nopos = NoPosition---- | returns @True@ if the there is no position information available-isNoPos :: Position -> Bool-isNoPos NoPosition = True-isNoPos _ = False---- | position attached to built-in objects----builtinPos :: Position-builtinPos = BuiltinPosition---- | returns @True@ if the given position refers to a builtin definition-isBuiltinPos :: Position -> Bool-isBuiltinPos BuiltinPosition = True-isBuiltinPos _ = False---- | position used for internal errors-internalPos :: Position-internalPos = InternalPosition---- | returns @True@ if the given position is internal-isInternalPos :: Position -> Bool-isInternalPos InternalPosition = True-isInternalPos _ = False--{-# INLINE incPos #-}--- | advance column-incPos :: Position -> Int -> Position-incPos (Position offs row col fpos) n = Position (offs + n) row (col + n) fpos-incPos p _ = p--{-# INLINE retPos #-}--- | advance to next line-retPos :: Position -> Position-retPos (Position offs row _ fpos) = Position (offs+1) (row + 1) 1 fpos-retPos p = p--{-# INLINE incOffset #-}--- | advance just the offset-incOffset :: Position -> Int -> Position-incOffset (Position o r c f) n = Position (o + n) r c f-incOffset pos _ = pos+{-# LANGUAGE DeriveDataTypeable #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Data.Position +-- Copyright : (c) [1995..2000] Manuel M. T. Chakravarty +-- [2008..2009] Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Source code position +----------------------------------------------------------------------------- +module Language.C.Data.Position ( + -- + -- source text positions + -- + Position(), + position, + PosLength, + posFile,posRow,posColumn,posOffset,posParent, + initPos, isSourcePos, + nopos, isNoPos, + builtinPos, isBuiltinPos, + internalPos, isInternalPos, + incPos, retPos, + incOffset, + Pos(..), +) where +import Data.Generics + +-- | file position information +data FilePosition = FilePosition { posSrcFile :: String, -- ^ source file + posParentFile :: (Maybe Position) -- ^ including file, if any + } + deriving (Eq, Ord, Typeable, Data) + +-- | uniform representation of source file positions +data Position = Position { posOffset :: {-# UNPACK #-} !Int -- ^ absolute offset in the preprocessed file + , posRow :: {-# UNPACK #-} !Int -- ^ row (line) in the original file. Affected by #LINE pragmas. + , posColumn :: {-# UNPACK #-} !Int -- ^ column in the preprocessed file. Inaccurate w.r.t. to the original + -- file in the presence of preprocessor macros. + , posFileInfo :: FilePosition -- ^ position in source file, including files + } + | NoPosition + | BuiltinPosition + | InternalPosition + deriving (Eq, Ord, Typeable, Data) + +posFile :: Position -> String +posFile = posSrcFile . posFileInfo + +posParent :: Position -> (Maybe Position) +posParent = posParentFile . posFileInfo + +-- | Position and length of a token +type PosLength = (Position,Int) + +instance Show Position where + showsPrec _ (Position _ row _ (FilePosition fname mparent)) = + showString "(" . showsPrec 0 fname . showString ": line " . showsPrec 0 row . + maybe id (\p -> showString ", in file included from " . showsPrec 0 p) mparent . + showString ")" + showsPrec _ NoPosition = showString "<no file>" + showsPrec _ BuiltinPosition = showString "<builtin>" + showsPrec _ InternalPosition = showString "<internal>" + +-- | @position absoluteOffset fileName lineNumber columnNumber@ initializes a @Position@ using the given arguments +position :: Int -> String -> Int -> Int -> Maybe Position -> Position +position offset fname row col mparent = Position offset row col (FilePosition fname mparent) + +-- | class of type which aggregate a source code location +class Pos a where + posOf :: a -> Position + +-- | initialize a Position to the start of the translation unit starting in the given file +initPos :: FilePath -> Position +initPos file = Position 0 1 1 (FilePosition file Nothing) + +-- | returns @True@ if the given position refers to an actual source file +isSourcePos :: Position -> Bool +isSourcePos (Position _ _ _ _) = True +isSourcePos _ = False + +-- | no position (for unknown position information) +nopos :: Position +nopos = NoPosition + +-- | returns @True@ if the there is no position information available +isNoPos :: Position -> Bool +isNoPos NoPosition = True +isNoPos _ = False + +-- | position attached to built-in objects +-- +builtinPos :: Position +builtinPos = BuiltinPosition + +-- | returns @True@ if the given position refers to a builtin definition +isBuiltinPos :: Position -> Bool +isBuiltinPos BuiltinPosition = True +isBuiltinPos _ = False + +-- | position used for internal errors +internalPos :: Position +internalPos = InternalPosition + +-- | returns @True@ if the given position is internal +isInternalPos :: Position -> Bool +isInternalPos InternalPosition = True +isInternalPos _ = False + +{-# INLINE incPos #-} +-- | advance column +incPos :: Position -> Int -> Position +incPos (Position offs row col fpos) n = Position (offs + n) row (col + n) fpos +incPos p _ = p + +{-# INLINE retPos #-} +-- | advance to next line +retPos :: Position -> Position +retPos (Position offs row _ fpos) = Position (offs+1) (row + 1) 1 fpos +retPos p = p + +{-# INLINE incOffset #-} +-- | advance just the offset +incOffset :: Position -> Int -> Position +incOffset (Position o r c f) n = Position (o + n) r c f +incOffset pos _ = pos
src/Language/C/Data/RList.hs view
@@ -1,52 +1,52 @@--------------------------------------------------------------------------------- |--- Module : Language.C.Data.RList--- Copyright : (c) [2007..2008] Duncan Coutts, Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Due to the way the grammar is constructed we very often have to build lists--- in reverse. To make sure we do this consistently and correctly we have a--- newtype to wrap the reversed style of list:-------------------------------------------------------------------------------module Language.C.Data.RList (- RList,Reversed(..),- empty,singleton,snoc,rappend,appendr,rappendr,rmap,reverse,- viewr,-)-where-import Prelude hiding (reverse)-import qualified Data.List as List--newtype Reversed a = Reversed a-type RList a = Reversed [a]-empty :: Reversed [a]-empty = Reversed []--singleton :: a -> Reversed [a]-singleton x = Reversed [x]--snoc :: Reversed [a] -> a -> Reversed [a]-snoc (Reversed xs) x = Reversed (x : xs)-infixl 5 `snoc`--rappend :: Reversed [a] -> [a] -> Reversed [a]-rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs)--appendr :: [a] -> Reversed [a] -> Reversed [a]-appendr xs (Reversed ys) = Reversed (ys ++ List.reverse xs)--rappendr :: Reversed [a] -> Reversed [a] -> Reversed [a]-rappendr (Reversed xs) (Reversed ys) = Reversed (ys ++ xs)--rmap :: (a -> b) -> Reversed [a] -> Reversed [b]-rmap f (Reversed xs) = Reversed (map f xs)--reverse :: Reversed [a] -> [a]-reverse (Reversed xs) = List.reverse xs--viewr :: Reversed [a] -> (Reversed [a] , a)-viewr (Reversed []) = error "viewr: empty RList"-viewr (Reversed (x:xs)) = (Reversed xs, x)+----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Data.RList +-- Copyright : (c) [2007..2008] Duncan Coutts, Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Due to the way the grammar is constructed we very often have to build lists +-- in reverse. To make sure we do this consistently and correctly we have a +-- newtype to wrap the reversed style of list: +----------------------------------------------------------------------------- +module Language.C.Data.RList ( + RList,Reversed(..), + empty,singleton,snoc,rappend,appendr,rappendr,rmap,reverse, + viewr, +) +where +import Prelude hiding (reverse) +import qualified Data.List as List + +newtype Reversed a = Reversed a +type RList a = Reversed [a] +empty :: Reversed [a] +empty = Reversed [] + +singleton :: a -> Reversed [a] +singleton x = Reversed [x] + +snoc :: Reversed [a] -> a -> Reversed [a] +snoc (Reversed xs) x = Reversed (x : xs) +infixl 5 `snoc` + +rappend :: Reversed [a] -> [a] -> Reversed [a] +rappend (Reversed xs) ys = Reversed (List.reverse ys ++ xs) + +appendr :: [a] -> Reversed [a] -> Reversed [a] +appendr xs (Reversed ys) = Reversed (ys ++ List.reverse xs) + +rappendr :: Reversed [a] -> Reversed [a] -> Reversed [a] +rappendr (Reversed xs) (Reversed ys) = Reversed (ys ++ xs) + +rmap :: (a -> b) -> Reversed [a] -> Reversed [b] +rmap f (Reversed xs) = Reversed (map f xs) + +reverse :: Reversed [a] -> [a] +reverse (Reversed xs) = List.reverse xs + +viewr :: Reversed [a] -> (Reversed [a] , a) +viewr (Reversed []) = error "viewr: empty RList" +viewr (Reversed (x:xs)) = (Reversed xs, x)
src/Language/C/Parser.hs view
@@ -1,36 +1,36 @@-{-# OPTIONS #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Parser--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Language.C parser-------------------------------------------------------------------------------module Language.C.Parser (- -- * Simple API- parseC,- -- * Parser Monad- P,execParser,execParser_,builtinTypeNames,- -- * Exposed Parsers- translUnitP, extDeclP, statementP, expressionP,- -- * Parser Monad- ParseError(..)-)-where-import Language.C.Parser.Parser (parseC,translUnitP, extDeclP, statementP, expressionP)-import Language.C.Parser.ParserMonad (execParser, ParseError(..),P)-import Language.C.Parser.Builtin (builtinTypeNames)--import Language.C.Data---- | run the given parser using a new name supply and builtin typedefs--- see 'execParser'------ Synopsis: @runParser parser inputStream initialPos@-execParser_ :: P a -> InputStream -> Position -> Either ParseError a-execParser_ parser input pos =- fmap fst $ execParser parser input pos builtinTypeNames newNameSupply+{-# OPTIONS #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Parser +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Language.C parser +----------------------------------------------------------------------------- +module Language.C.Parser ( + -- * Simple API + parseC, + -- * Parser Monad + P,execParser,execParser_,builtinTypeNames, + -- * Exposed Parsers + translUnitP, extDeclP, statementP, expressionP, + -- * Parser Monad + ParseError(..) +) +where +import Language.C.Parser.Parser (parseC,translUnitP, extDeclP, statementP, expressionP) +import Language.C.Parser.ParserMonad (execParser, ParseError(..),P) +import Language.C.Parser.Builtin (builtinTypeNames) + +import Language.C.Data + +-- | run the given parser using a new name supply and builtin typedefs +-- see 'execParser' +-- +-- Synopsis: @runParser parser inputStream initialPos@ +execParser_ :: P a -> InputStream -> Position -> Either ParseError a +execParser_ parser input pos = + fmap fst $ execParser parser input pos builtinTypeNames newNameSupply
src/Language/C/Parser/Builtin.hs view
@@ -1,21 +1,21 @@--- |--- Module : Language.C.Parser.Builtin--- Copyright : (c) 2001 Manuel M. T. Chakravarty--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Portability : portable------ This module provides information about builtin entities.------ Currently, only builtin type names are supported. The only builtin type--- name is `__builtin_va_list', which is a builtin of GNU C.----module Language.C.Parser.Builtin (- builtinTypeNames-) where-import Language.C.Data.Ident (Ident, builtinIdent)---- predefined type names----builtinTypeNames :: [Ident]-builtinTypeNames = [builtinIdent "__builtin_va_list"]+-- | +-- Module : Language.C.Parser.Builtin +-- Copyright : (c) 2001 Manuel M. T. Chakravarty +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Portability : portable +-- +-- This module provides information about builtin entities. +-- +-- Currently, only builtin type names are supported. The only builtin type +-- name is `__builtin_va_list', which is a builtin of GNU C. +-- +module Language.C.Parser.Builtin ( + builtinTypeNames +) where +import Language.C.Data.Ident (Ident, builtinIdent) + +-- predefined type names +-- +builtinTypeNames :: [Ident] +builtinTypeNames = [builtinIdent "__builtin_va_list"]
src/Language/C/Parser/Lexer.x view
@@ -1,566 +1,566 @@--------------------------------------------------------------------------------- Module : Lexer.x--- Copyright : (c) [1999..2004] Manuel M T Chakravarty--- (c) 2005 Duncan Coutts--- (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Portability : portable------ Lexer for C files, after being processed by the C preprocessor------ We assume that the input already went through cpp. Thus, we do not handle--- comments and preprocessor directives here. It supports the--- C99 `restrict' extension: <http://www.lysator.liu.se/c/restrict.html> as--- well as inline functions.------ Comments:------ * Universal character names and multi-character character constants,--- as well as trigraphs are unsupported. They are lexed, but yield an error.------ * We add `typedef-name' (K&R 8.9) as a token, as proposed in K&R A13.--- However, as these tokens cannot be recognized lexically, but require a--- context analysis, they are never produced by the lexer, but instead have--- to be introduced in a later phase (by converting the corresponding--- identifiers).------ * We also recognize GNU C `__attribute__', `__extension__', `__complex__',--- `__const', `__const__', `__imag', `__imag__', `__inline', `__inline__',--- `__real', `__real__, `__restrict', and `__restrict__'.------ * Any line starting with `#pragma' is ignored.------ With K&R we refer to ``The C Programming Language'', second edition, Brain--- W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988.------ With C99 we refer to ``ISO/IEC 9899:TC3'',--- available online at http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf.------- TODO ---------------------------------------------------------------------------- * There are more GNU C specific keywords. Add them and change `Parser.y'--- correspondingly (in particular, most tokens within __attribute ((...))--- expressions are actually keywords, but we handle them as identifiers at--- the moment).------ * Add support for bytestrings--{--module Language.C.Parser.Lexer (lexC, parseError) where--import Data.Char (chr, isDigit)-import Data.Word (Word8)-import Control.Monad (liftM, when)--import Language.C.Data.InputStream- (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars)---- ( InputStream, readInputStream,inputStreamToString,inputStreamFromString,--- takeByte, takeChar, inputStreamEmpty, takeChars,--- countLines,--- )-import Language.C.Data.Position-import Language.C.Data.Ident (mkIdent)--import Language.C.Syntax.Constants--import Language.C.Parser.Tokens-import Language.C.Parser.ParserMonad-}--$space = [ \ \t ] -- horizontal white space-$eol = \n -- end of line--$letter = [a-zA-Z]-$identletter = [a-zA-Z_\$] -- GNU extension: allow $ in variable names-$octdigit = 0-7-$digit = 0-9-$digitNZ = 1-9-$hexdigit = [0-9a-fA-F]--$inchar = . # [ \\ \' \n \r ] -- valid character in char constant-$instr = . # [ \\ \" \n \r ] -- valid character in a string literal-$infname = . # [ \\ \" ] -- valid character in a filename--@sp = $space*---- character escape sequence (follows K&R A2.5.2)------ * also used for strings--- * C99: 6.4.4.4-@charesc = \\([ntvbrfaeE\\\?\'\"]|$octdigit{1,3}|x$hexdigit+)-@ucn = \\u$hexdigit{4}|\\U$hexdigit{8}---- components of integer constants------ * C99: 6.4.4.1-@int = $digitNZ$digit*---- integer suffixes-@llsuffix = ll|LL-@gnusuffix = [ij]?-@intsuffix = [uU][lL]?|[uU]@llsuffix|[lL][uU]?|@llsuffix[uU]?-@intgnusuffix = @intsuffix@gnusuffix?|@gnusuffix@intsuffix?---- components of float constants (follows K&R A2.5.3)------ * C99: 6.4.4.2-@digits = $digit+-@intpart = @digits-@fractpart = @digits--@mantpart = @intpart?\.@fractpart|@intpart\.-@exppart = [eE][\+\-]?@digits--@hexprefix = 0x-@hexdigits = $hexdigit+-@hexmant = @hexdigits?\.@hexdigits|@hexdigits\.-@binexp = [pP][\+\-]?@digits---- Suffixes `qQwW` are GNU floating type extensions: <https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html>-@floatsuffix = [fFlLqQwW]-@floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix?---- clang version literals with a major.minor.rev-@clangversion = @intpart\.@intpart\.@intpart--tokens :----- whitespace (follows K&R A2.1)------ * horizontal and vertical tabs, newlines, and form feeds are filter out by--- `Lexers.ctrlLexer'------ * comments are not handled, as we assume the input already went through cpp----$white+ ;---- #line directive (C11 6.10.4, GCC Line Control)------ * standard form: int => change line number--- * standard form: int string => change source file and line number--- * preprocessor (gcc/clang): int string int => change source file and line number,--- push or pop item from stack------ * see https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html----\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol- { \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False }---- #pragma directive (K&R A12.8)------ * we simply ignore any #pragma (but take care to update the position--- information)----\#$space*pragma.*$eol ;---- #ident directive, eg used by rcs/cvs------ * we simply ignore any #ident (but take care to update the position--- information)----\#$space*ident.*$eol ;---- identifiers and keywords (follows K&R A2.3 and A2.4)----$identletter($identletter|$digit)* { \pos len str -> idkwtok (takeChars len str) pos }---- constants (follows K&R A2.5)------ * K&R,C99 explicitly mention `enumeration-constants'; however, as they are--- lexically identifiers, we do not have an extra case for them------- integer constants (follows K&R A2.5.1, C99 6.4.4.1)--- NOTE: 0 is lexed as octal integer constant, and readCOctal takes care of this-0$octdigit*@intgnusuffix? { token_plus CTokILit readCOctal }-$digitNZ$digit*@intgnusuffix? { token_plus CTokILit (readCInteger DecRepr) }-0[xX]$hexdigit+@intgnusuffix? { token_plus CTokILit (readCInteger HexRepr . drop 2) }--(0$octdigit*|$digitNZ$digit*|0[xX]$hexdigit+)[uUlL]+ { token_fail "Invalid integer constant suffix" }---- character constants (follows K&R A2.5.2, C99 6.4.4.4)------ * Universal Character Names are unsupported and cause an error.-\'($inchar|@charesc)\' { token CTokCLit (cChar . fst . unescapeChar . tail) }-L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) }-\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars .tail) }-L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) }---- Clang version literals-@clangversion { token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion }---- float constants (follows K&R A2.5.3. C99 6.4.4.2)------ * NOTE: Hexadecimal floating constants without binary exponents are forbidden.--- They generate a lexer error, because they are hard to recognize in the parser.-(@mantpart@exppart?|@intpart@exppart)@floatgnusuffix? { token CTokFLit readCFloat }-@hexprefix(@hexmant|@hexdigits)@binexp@floatgnusuffix? { token CTokFLit readCFloat }-@hexprefix@hexmant { token_fail "Hexadecimal floating constant requires an exponent" }---- string literal (follows K&R A2.6)--- C99: 6.4.5.-\"($instr|@charesc)*\" { token CTokSLit (cString . unescapeString . init . tail) }-L\"($instr|@charesc)*\" { token CTokSLit (cString_w . unescapeString . init . tail . tail) }--L?\'@ucn\' { token_fail "Universal character names are unsupported" }-L?\'\\[^0-7'\"\?\\abfnrtvuUx]\' { token_fail "Invalid escape sequence" }-L?\"($inchar|@charesc)*@ucn($inchar|@charesc|@ucn)*\" { token_fail "Universal character names in string literals are unsupported"}---- operators and separators----"(" { token_ 1 CTokLParen }-")" { token_ 1 CTokRParen }-"[" { token_ 1 CTokLBracket }-"]" { token_ 1 CTokRBracket }-"->" { token_ 2 CTokArrow }-"." { token_ 1 CTokDot }-"!" { token_ 1 CTokExclam }-"~" { token_ 1 CTokTilde }-"++" { token_ 2 CTokInc }-"--" { token_ 2 CTokDec }-"+" { token_ 1 CTokPlus }-"-" { token_ 1 CTokMinus }-"*" { token_ 1 CTokStar }-"/" { token_ 1 CTokSlash }-"%" { token_ 1 CTokPercent }-"&" { token_ 1 CTokAmper }-"<<" { token_ 2 CTokShiftL }-">>" { token_ 2 CTokShiftR }-"<" { token_ 1 CTokLess }-"<=" { token_ 2 CTokLessEq }-">" { token_ 1 CTokHigh }-">=" { token_ 2 CTokHighEq }-"==" { token_ 2 CTokEqual }-"!=" { token_ 2 CTokUnequal }-"^" { token_ 1 CTokHat }-"|" { token_ 1 CTokBar }-"&&" { token_ 2 CTokAnd }-"||" { token_ 2 CTokOr }-"?" { token_ 1 CTokQuest }-":" { token_ 1 CTokColon }-"=" { token_ 1 CTokAssign }-"+=" { token_ 2 CTokPlusAss }-"-=" { token_ 2 CTokMinusAss }-"*=" { token_ 2 CTokStarAss }-"/=" { token_ 2 CTokSlashAss }-"%=" { token_ 2 CTokPercAss }-"&=" { token_ 2 CTokAmpAss }-"^=" { token_ 2 CTokHatAss }-"|=" { token_ 2 CTokBarAss }-"<<=" { token_ 3 CTokSLAss }-">>=" { token_ 3 CTokSRAss }-"," { token_ 1 CTokComma }-\; { token_ 1 CTokSemic }-"{" { token_ 1 CTokLBrace }-"}" { token_ 1 CTokRBrace }-"..." { token_ 3 CTokEllipsis }---{--- Fix the 'octal' lexing of '0'-readCOctal :: String -> Either String CInteger-readCOctal s@('0':r) =- case r of- (c:_) | isDigit c -> readCInteger OctalRepr r- _ -> readCInteger DecRepr s-readCOctal _ = error "ReadOctal: string does not start with `0'"---- We use the odd looking list of string patterns here rather than normal--- string literals since GHC converts the latter into a sequence of string--- comparisons (ie a linear search) but it translates the former using its--- effecient pattern matching which gives us the expected radix-style search.--- This change makes a significant performance difference [chak]------ To make this a little more maintainable, we autogenerate it from this list,--- using the script GenerateKeywords.hs (in /scripts)-{--alignas _Alignas, alignof _Alignof __alignof alignof __alignof__, asm @__, atomic _Atomic, auto-break, bool _Bool,-case, char, const @__, continue, complex _Complex __complex__-default, do, double,-else, enum, extern,-float, for, goto,-if, inline @__, int, __int128, long, noreturn _Noreturn,-float, for,-generic _Generic, goto,-if, inline @__, int, int128 __int128, long,-noreturn _Noreturn, _Nullable __nullable, _Nonnull __nonnull,-register, restrict @__, return-short, signed @__, sizeof, static, staticAssert _Static_assert, struct, switch,-typedef, typeof @__, thread __thread _Thread_local-union, unsigned, void, volatile @__,-while,-label __label__-(CTokGnuC GnuCAttrTok) __attribute __attribute__-(CTokGnuC GnuCExtTok) __extension__-(CTokGnuC GnuCComplexReal) __real __real__-(CTokGnuC GnuCComplexImag) __imag __imag__-(CTokGnuC GnuCVaArg) __builtin_va_arg-(CTokGnuC GnuCOffsetof) __builtin_offsetof-(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p-(CTokClangC ClangBuiltinConvertVector) __builtin_convertvector--}--- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float __float128 _Float128 for _Generic goto if __inline inline __inline__ int __int128 long _Noreturn _Nullable __nullable _Nonnull __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local union unsigned void __volatile volatile __volatile__ while __label__ __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p __builtin_convertvector-idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas-idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof-idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic-idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool-idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex-idkwtok ('_' : 'N' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 8 CTokNonnull-idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric-idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn-idkwtok ('_' : 'N' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 9 CTokNullable-idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert-idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread-idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof-idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof-idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof-idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm-idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm-idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm-idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok)-idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok)-idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto-idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg)-idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector)-idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase-idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar-idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex-idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst-idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst-idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst-idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue-idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault-idkwtok ('d' : 'o' : []) = tok 2 CTokDo-idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble-idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse-idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum-idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok)-idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern-idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat-idkwtok ('_' : '_' : 'f' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 CTokFloat128-idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 CTokFloat128-idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor-idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto-idkwtok ('i' : 'f' : []) = tok 2 CTokIf-idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag)-idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag)-idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline-idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline-idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline-idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt-idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128-idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel-idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong-idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull-idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable-idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal)-idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal)-idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister-idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict-idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict-idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict-idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn-idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort-idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned-idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned-idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned-idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof-idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic-idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct-idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch-idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread-idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef-idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof-idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof-idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof-idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion-idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned-idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid-idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile-idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile-idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile-idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile--idkwtok cs = \pos -> do- name <- getNewName- let len = case length cs of l -> l- let ident = mkIdent pos cs name- tyident <- isTypeIdent ident- if tyident- then return (CTokTyIdent (pos,len) ident)- else return (CTokIdent (pos,len) ident)--ignoreAttribute :: P ()-ignoreAttribute = skipTokens (0::Int)- where skipTokens :: Int -> P ()- skipTokens n = do- ntok <- lexToken' False- case ntok of- CTokRParen _ | n == 1 -> return ()- | otherwise -> skipTokens (n-1)- CTokLParen _ -> skipTokens (n+1)- _ -> skipTokens n--tok :: Int -> (PosLength -> CToken) -> Position -> P CToken-tok len tc pos = return (tc (pos,len))--adjustLineDirective :: Int -> String -> Position -> Position-adjustLineDirective pragmaLen str pos =- offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent')- where- -- offset changes by length of #line pragma- offs' = (posOffset pos) + pragmaLen- str' = dropWhite . drop 1 $ str- (rowStr, str'') = span isDigit str'- -- row changes to the first number in the line pragma- row' = read rowStr- str''' = dropWhite str''- (fnameStr,str'''') = span (/= '"') . drop 1 $ str'''- fname = posFile pos- no_fn = null str''' || (head str''' /= '"') || (head str'''' /= '"')- -- filename changes to new filename, if specified- fname' | no_fn = fname- -- try and get more sharing of file name strings- | fnameStr == fname = fname- | otherwise = fnameStr- -- analye flags- min_flag = find_min_flag (5 :: Int) (drop 1 str'''')- find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit)- where- select_min (numStr, fstr') | null numStr = cur_min- | otherwise = find_min_flag (read numStr `min` cur_min) fstr'- parent = posParent pos- parent' = case min_flag of- 1 -> Just pos -- push- 2 -> case parent >>= posParent of- Nothing -> Nothing -- pop/underflow- Just gp -> gp `seq` Just gp -- pop- 3 -> parent -- unchanged stack, system header info- 4 -> parent -- unchanged stack, extern C info- _ -> Nothing- --- dropWhite = dropWhile (\c -> c == ' ' || c == '\t')---- special utility for the lexer-unescapeMultiChars :: String -> [Char]-unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs'-unescapeMultiChars ('\'' : []) = []-unescapeMultiChars _ = error "Unexpected end of multi-char constant"--{-# INLINE token_ #-}--- token that ignores the string-token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken-token_ len mkTok pos _ _ = return (mkTok (pos,len))--{-# INLINE token_fail #-}--- error token-token_fail :: String -> Position ->- Int -> InputStream -> P CToken-token_fail errmsg pos _ _ = failP pos [ "Lexical Error !", errmsg ]---{-# INLINE token #-}--- token that uses the string-token :: (PosLength -> a -> CToken) -> (String -> a)- -> Position -> Int -> InputStream -> P CToken-token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str))--{-# INLINE token_plus #-}--- token that may fail-token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a)- -> Position -> Int -> InputStream -> P CToken-token_plus mkTok fromStr pos len str =- case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ]- Right ok -> return $! mkTok (pos,len) ok---- -------------------------------------------------------------------------------- The input type--type AlexInput = (Position, -- current position,- InputStream) -- current input string--alexInputPrevChar :: AlexInput -> Char-alexInputPrevChar _ = error "alexInputPrevChar not used"---- for alex-3.0-alexGetByte :: AlexInput -> Maybe (Word8, AlexInput)-alexGetByte (p,is) | inputStreamEmpty is = Nothing- | otherwise = let (b,s) = takeByte is in- -- this is safe for latin-1, but ugly- let p' = alexMove p (chr (fromIntegral b)) in p' `seq`- Just (b, (p', s))--alexGetChar :: AlexInput -> Maybe (Char,AlexInput)-alexGetChar (p,is) | inputStreamEmpty is = Nothing- | otherwise = let (c,s) = takeChar is in- let p' = alexMove p c in p' `seq`- Just (c, (p', s))--alexMove :: Position -> Char -> Position-alexMove pos ' ' = incPos pos 1-alexMove pos '\n' = retPos pos-alexMove pos '\r' = incOffset pos 1-alexMove pos _ = incPos pos 1--lexicalError :: P a-lexicalError = do- pos <- getPos- (c,_) <- liftM takeChar getInput- failP pos- ["Lexical error !",- "The character " ++ show c ++ " does not fit here."]--parseError :: P a-parseError = do- lastTok <- getLastToken- failP (posOf lastTok)- ["Syntax error !",- "The symbol `" ++ show lastTok ++ "' does not fit here."]---- there is a problem with ignored tokens here (that aren't skipped)--- consider--- 1 > int x;--- 2 > LINE "ex.c" 4--- 4 > int y;--- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache.--- Now we run--- > action (pos 2,0) 14 "LINE \"ex.c\" 3\n"--- which in turn adjusts the position and then calls lexToken again--- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine)--- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad)--- to resolve this, recursive calls invoke lexToken' False.-lexToken :: P CToken-lexToken = lexToken' True--lexToken' :: Bool -> P CToken-lexToken' modifyCache = do- pos <- getPos- inp <- getInput- case alexScan (pos, inp) 0 of- AlexEOF -> do- handleEofToken- return CTokEof- AlexError _inp -> lexicalError- AlexSkip (pos', inp') _len -> do- setPos pos'- setInput inp'- lexToken' modifyCache- AlexToken (pos', inp') len action -> do- setPos pos'- setInput inp'- nextTok <- action pos len inp- when modifyCache $ setLastToken nextTok- return nextTok--lexC :: (CToken -> P a) -> P a-lexC cont = do- nextTok <- lexToken- cont nextTok-}+----------------------------------------------------------------------------- +-- Module : Lexer.x +-- Copyright : (c) [1999..2004] Manuel M T Chakravarty +-- (c) 2005 Duncan Coutts +-- (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Portability : portable +-- +-- Lexer for C files, after being processed by the C preprocessor +-- +-- We assume that the input already went through cpp. Thus, we do not handle +-- comments and preprocessor directives here. It supports the +-- C99 `restrict' extension: <http://www.lysator.liu.se/c/restrict.html> as +-- well as inline functions. +-- +-- Comments: +-- +-- * Universal character names and multi-character character constants, +-- as well as trigraphs are unsupported. They are lexed, but yield an error. +-- +-- * We add `typedef-name' (K&R 8.9) as a token, as proposed in K&R A13. +-- However, as these tokens cannot be recognized lexically, but require a +-- context analysis, they are never produced by the lexer, but instead have +-- to be introduced in a later phase (by converting the corresponding +-- identifiers). +-- +-- * We also recognize GNU C `__attribute__', `__extension__', `__complex__', +-- `__const', `__const__', `__imag', `__imag__', `__inline', `__inline__', +-- `__real', `__real__, `__restrict', and `__restrict__'. +-- +-- * Any line starting with `#pragma' is ignored. +-- +-- With K&R we refer to ``The C Programming Language'', second edition, Brain +-- W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. +-- +-- With C99 we refer to ``ISO/IEC 9899:TC3'', +-- available online at http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf. +-- +--- TODO ---------------------------------------------------------------------- +-- +-- * There are more GNU C specific keywords. Add them and change `Parser.y' +-- correspondingly (in particular, most tokens within __attribute ((...)) +-- expressions are actually keywords, but we handle them as identifiers at +-- the moment). +-- +-- * Add support for bytestrings + +{ + +module Language.C.Parser.Lexer (lexC, parseError) where + +import Data.Char (chr, isDigit) +import Data.Word (Word8) +import Control.Monad (liftM, when) + +import Language.C.Data.InputStream + (InputStream, inputStreamEmpty, takeByte, takeChar, takeChars) + +-- ( InputStream, readInputStream,inputStreamToString,inputStreamFromString, +-- takeByte, takeChar, inputStreamEmpty, takeChars, +-- countLines, +-- ) +import Language.C.Data.Position +import Language.C.Data.Ident (mkIdent) + +import Language.C.Syntax.Constants + +import Language.C.Parser.Tokens +import Language.C.Parser.ParserMonad +} + +$space = [ \ \t ] -- horizontal white space +$eol = \n -- end of line + +$letter = [a-zA-Z] +$identletter = [a-zA-Z_\$] -- GNU extension: allow $ in variable names +$octdigit = 0-7 +$digit = 0-9 +$digitNZ = 1-9 +$hexdigit = [0-9a-fA-F] + +$inchar = . # [ \\ \' \n \r ] -- valid character in char constant +$instr = . # [ \\ \" \n \r ] -- valid character in a string literal +$infname = . # [ \\ \" ] -- valid character in a filename + +@sp = $space* + +-- character escape sequence (follows K&R A2.5.2) +-- +-- * also used for strings +-- * C99: 6.4.4.4 +@charesc = \\([ntvbrfaeE\\\?\'\"]|$octdigit{1,3}|x$hexdigit+) +@ucn = \\u$hexdigit{4}|\\U$hexdigit{8} + +-- components of integer constants +-- +-- * C99: 6.4.4.1 +@int = $digitNZ$digit* + +-- integer suffixes +@llsuffix = ll|LL +@gnusuffix = [ij]? +@intsuffix = [uU][lL]?|[uU]@llsuffix|[lL][uU]?|@llsuffix[uU]? +@intgnusuffix = @intsuffix@gnusuffix?|@gnusuffix@intsuffix? + +-- components of float constants (follows K&R A2.5.3) +-- +-- * C99: 6.4.4.2 +@digits = $digit+ +@intpart = @digits +@fractpart = @digits + +@mantpart = @intpart?\.@fractpart|@intpart\. +@exppart = [eE][\+\-]?@digits + +@hexprefix = 0x +@hexdigits = $hexdigit+ +@hexmant = @hexdigits?\.@hexdigits|@hexdigits\. +@binexp = [pP][\+\-]?@digits + +-- Suffixes `qQwW` are GNU floating type extensions: <https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html> +@floatsuffix = [fFlLqQwW] +@floatgnusuffix = @floatsuffix@gnusuffix?|@gnusuffix@floatsuffix? + +-- clang version literals with a major.minor.rev +@clangversion = @intpart\.@intpart\.@intpart + +tokens :- + +-- whitespace (follows K&R A2.1) +-- +-- * horizontal and vertical tabs, newlines, and form feeds are filter out by +-- `Lexers.ctrlLexer' +-- +-- * comments are not handled, as we assume the input already went through cpp +-- +$white+ ; + +-- #line directive (C11 6.10.4, GCC Line Control) +-- +-- * standard form: int => change line number +-- * standard form: int string => change source file and line number +-- * preprocessor (gcc/clang): int string int => change source file and line number, +-- push or pop item from stack +-- +-- * see https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html +-- +\#$space*@int$space*(\"($infname|@charesc)*\"$space*)?(@int$space*)*\r?$eol + { \pos len str -> setPos (adjustLineDirective len (takeChars len str) pos) >> lexToken' False } + +-- #pragma directive (K&R A12.8) +-- +-- * we simply ignore any #pragma (but take care to update the position +-- information) +-- +\#$space*pragma.*$eol ; + +-- #ident directive, eg used by rcs/cvs +-- +-- * we simply ignore any #ident (but take care to update the position +-- information) +-- +\#$space*ident.*$eol ; + +-- identifiers and keywords (follows K&R A2.3 and A2.4) +-- +$identletter($identletter|$digit)* { \pos len str -> idkwtok (takeChars len str) pos } + +-- constants (follows K&R A2.5) +-- +-- * K&R,C99 explicitly mention `enumeration-constants'; however, as they are +-- lexically identifiers, we do not have an extra case for them +-- + +-- integer constants (follows K&R A2.5.1, C99 6.4.4.1) +-- NOTE: 0 is lexed as octal integer constant, and readCOctal takes care of this +0$octdigit*@intgnusuffix? { token_plus CTokILit readCOctal } +$digitNZ$digit*@intgnusuffix? { token_plus CTokILit (readCInteger DecRepr) } +0[xX]$hexdigit+@intgnusuffix? { token_plus CTokILit (readCInteger HexRepr . drop 2) } + +(0$octdigit*|$digitNZ$digit*|0[xX]$hexdigit+)[uUlL]+ { token_fail "Invalid integer constant suffix" } + +-- character constants (follows K&R A2.5.2, C99 6.4.4.4) +-- +-- * Universal Character Names are unsupported and cause an error. +\'($inchar|@charesc)\' { token CTokCLit (cChar . fst . unescapeChar . tail) } +L\'($inchar|@charesc)\' { token CTokCLit (cChar_w . fst . unescapeChar . tail . tail) } +\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars False . unescapeMultiChars .tail) } +L\'($inchar|@charesc){2,}\' { token CTokCLit (flip cChars True . unescapeMultiChars . tail . tail) } + +-- Clang version literals +@clangversion { token (\pos -> CTokClangC pos . ClangCVersionTok) readClangCVersion } + +-- float constants (follows K&R A2.5.3. C99 6.4.4.2) +-- +-- * NOTE: Hexadecimal floating constants without binary exponents are forbidden. +-- They generate a lexer error, because they are hard to recognize in the parser. +(@mantpart@exppart?|@intpart@exppart)@floatgnusuffix? { token CTokFLit readCFloat } +@hexprefix(@hexmant|@hexdigits)@binexp@floatgnusuffix? { token CTokFLit readCFloat } +@hexprefix@hexmant { token_fail "Hexadecimal floating constant requires an exponent" } + +-- string literal (follows K&R A2.6) +-- C99: 6.4.5. +\"($instr|@charesc)*\" { token CTokSLit (cString . unescapeString . init . tail) } +L\"($instr|@charesc)*\" { token CTokSLit (cString_w . unescapeString . init . tail . tail) } + +L?\'@ucn\' { token_fail "Universal character names are unsupported" } +L?\'\\[^0-7'\"\?\\abfnrtvuUx]\' { token_fail "Invalid escape sequence" } +L?\"($inchar|@charesc)*@ucn($inchar|@charesc|@ucn)*\" { token_fail "Universal character names in string literals are unsupported"} + +-- operators and separators +-- +"(" { token_ 1 CTokLParen } +")" { token_ 1 CTokRParen } +"[" { token_ 1 CTokLBracket } +"]" { token_ 1 CTokRBracket } +"->" { token_ 2 CTokArrow } +"." { token_ 1 CTokDot } +"!" { token_ 1 CTokExclam } +"~" { token_ 1 CTokTilde } +"++" { token_ 2 CTokInc } +"--" { token_ 2 CTokDec } +"+" { token_ 1 CTokPlus } +"-" { token_ 1 CTokMinus } +"*" { token_ 1 CTokStar } +"/" { token_ 1 CTokSlash } +"%" { token_ 1 CTokPercent } +"&" { token_ 1 CTokAmper } +"<<" { token_ 2 CTokShiftL } +">>" { token_ 2 CTokShiftR } +"<" { token_ 1 CTokLess } +"<=" { token_ 2 CTokLessEq } +">" { token_ 1 CTokHigh } +">=" { token_ 2 CTokHighEq } +"==" { token_ 2 CTokEqual } +"!=" { token_ 2 CTokUnequal } +"^" { token_ 1 CTokHat } +"|" { token_ 1 CTokBar } +"&&" { token_ 2 CTokAnd } +"||" { token_ 2 CTokOr } +"?" { token_ 1 CTokQuest } +":" { token_ 1 CTokColon } +"=" { token_ 1 CTokAssign } +"+=" { token_ 2 CTokPlusAss } +"-=" { token_ 2 CTokMinusAss } +"*=" { token_ 2 CTokStarAss } +"/=" { token_ 2 CTokSlashAss } +"%=" { token_ 2 CTokPercAss } +"&=" { token_ 2 CTokAmpAss } +"^=" { token_ 2 CTokHatAss } +"|=" { token_ 2 CTokBarAss } +"<<=" { token_ 3 CTokSLAss } +">>=" { token_ 3 CTokSRAss } +"," { token_ 1 CTokComma } +\; { token_ 1 CTokSemic } +"{" { token_ 1 CTokLBrace } +"}" { token_ 1 CTokRBrace } +"..." { token_ 3 CTokEllipsis } + + +{ +-- Fix the 'octal' lexing of '0' +readCOctal :: String -> Either String CInteger +readCOctal s@('0':r) = + case r of + (c:_) | isDigit c -> readCInteger OctalRepr r + _ -> readCInteger DecRepr s +readCOctal _ = error "ReadOctal: string does not start with `0'" + +-- We use the odd looking list of string patterns here rather than normal +-- string literals since GHC converts the latter into a sequence of string +-- comparisons (ie a linear search) but it translates the former using its +-- effecient pattern matching which gives us the expected radix-style search. +-- This change makes a significant performance difference [chak] +-- +-- To make this a little more maintainable, we autogenerate it from this list, +-- using the script GenerateKeywords.hs (in /scripts) +{- +alignas _Alignas, alignof _Alignof __alignof alignof __alignof__, asm @__, atomic _Atomic, auto +break, bool _Bool, +case, char, const @__, continue, complex _Complex __complex__ +default, do, double, +else, enum, extern, +float, for, goto, +if, inline @__, int, __int128, long, noreturn _Noreturn, +float, for, +generic _Generic, goto, +if, inline @__, int, int128 __int128, long, +noreturn _Noreturn, _Nullable __nullable, _Nonnull __nonnull, +register, restrict @__, return +short, signed @__, sizeof, static, staticAssert _Static_assert, struct, switch, +typedef, typeof @__, thread __thread _Thread_local +union, unsigned, void, volatile @__, +while, +label __label__ +(CTokGnuC GnuCAttrTok) __attribute __attribute__ +(CTokGnuC GnuCExtTok) __extension__ +(CTokGnuC GnuCComplexReal) __real __real__ +(CTokGnuC GnuCComplexImag) __imag __imag__ +(CTokGnuC GnuCVaArg) __builtin_va_arg +(CTokGnuC GnuCOffsetof) __builtin_offsetof +(CTokGnuC GnuCTyCompat) __builtin_types_compatible_p +(CTokClangC ClangBuiltinConvertVector) __builtin_convertvector +-} +-- Tokens: _Alignas _Alignof __alignof alignof __alignof__ __asm asm __asm__ _Atomic auto break _Bool case char __const const __const__ continue _Complex __complex__ default do double else enum extern float __float128 _Float128 for _Generic goto if __inline inline __inline__ int __int128 long _Noreturn _Nullable __nullable _Nonnull __nonnull register __restrict restrict __restrict__ return short __signed signed __signed__ sizeof static _Static_assert struct switch typedef __typeof typeof __typeof__ __thread _Thread_local union unsigned void __volatile volatile __volatile__ while __label__ __attribute __attribute__ __extension__ __real __real__ __imag __imag__ __builtin_va_arg __builtin_offsetof __builtin_types_compatible_p __builtin_convertvector +idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'a' : 's' : []) = tok 8 CTokAlignas +idkwtok ('_' : 'A' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 8 CTokAlignof +idkwtok ('_' : 'A' : 't' : 'o' : 'm' : 'i' : 'c' : []) = tok 7 CTokAtomic +idkwtok ('_' : 'B' : 'o' : 'o' : 'l' : []) = tok 5 CTokBool +idkwtok ('_' : 'C' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : []) = tok 8 CTokComplex +idkwtok ('_' : 'N' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 8 CTokNonnull +idkwtok ('_' : 'G' : 'e' : 'n' : 'e' : 'r' : 'i' : 'c' : []) = tok 8 CTokGeneric +idkwtok ('_' : 'N' : 'o' : 'r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 9 CTokNoreturn +idkwtok ('_' : 'N' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 9 CTokNullable +idkwtok ('_' : 'S' : 't' : 'a' : 't' : 'i' : 'c' : '_' : 'a' : 's' : 's' : 'e' : 'r' : 't' : []) = tok 14 CTokStaticAssert +idkwtok ('_' : 'T' : 'h' : 'r' : 'e' : 'a' : 'd' : '_' : 'l' : 'o' : 'c' : 'a' : 'l' : []) = tok 13 CTokThread +idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 9 CTokAlignof +idkwtok ('a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : []) = tok 7 CTokAlignof +idkwtok ('_' : '_' : 'a' : 'l' : 'i' : 'g' : 'n' : 'o' : 'f' : '_' : '_' : []) = tok 11 CTokAlignof +idkwtok ('_' : '_' : 'a' : 's' : 'm' : []) = tok 5 CTokAsm +idkwtok ('a' : 's' : 'm' : []) = tok 3 CTokAsm +idkwtok ('_' : '_' : 'a' : 's' : 'm' : '_' : '_' : []) = tok 7 CTokAsm +idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : []) = tok 11 (CTokGnuC GnuCAttrTok) +idkwtok ('_' : '_' : 'a' : 't' : 't' : 'r' : 'i' : 'b' : 'u' : 't' : 'e' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCAttrTok) +idkwtok ('a' : 'u' : 't' : 'o' : []) = tok 4 CTokAuto +idkwtok ('b' : 'r' : 'e' : 'a' : 'k' : []) = tok 5 CTokBreak +idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'o' : 'f' : 'f' : 's' : 'e' : 't' : 'o' : 'f' : []) = tok 18 (CTokGnuC GnuCOffsetof) +idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 't' : 'y' : 'p' : 'e' : 's' : '_' : 'c' : 'o' : 'm' : 'p' : 'a' : 't' : 'i' : 'b' : 'l' : 'e' : '_' : 'p' : []) = tok 28 (CTokGnuC GnuCTyCompat) +idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'v' : 'a' : '_' : 'a' : 'r' : 'g' : []) = tok 16 (CTokGnuC GnuCVaArg) +idkwtok ('_' : '_' : 'b' : 'u' : 'i' : 'l' : 't' : 'i' : 'n' : '_' : 'c' : 'o' : 'n' : 'v' : 'e' : 'r' : 't' : 'v' : 'e' : 'c' : 't' : 'o' : 'r' : []) = tok 23 (flip CTokClangC ClangBuiltinConvertVector) +idkwtok ('c' : 'a' : 's' : 'e' : []) = tok 4 CTokCase +idkwtok ('c' : 'h' : 'a' : 'r' : []) = tok 4 CTokChar +idkwtok ('_' : '_' : 'c' : 'o' : 'm' : 'p' : 'l' : 'e' : 'x' : '_' : '_' : []) = tok 11 CTokComplex +idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : []) = tok 7 CTokConst +idkwtok ('c' : 'o' : 'n' : 's' : 't' : []) = tok 5 CTokConst +idkwtok ('_' : '_' : 'c' : 'o' : 'n' : 's' : 't' : '_' : '_' : []) = tok 9 CTokConst +idkwtok ('c' : 'o' : 'n' : 't' : 'i' : 'n' : 'u' : 'e' : []) = tok 8 CTokContinue +idkwtok ('d' : 'e' : 'f' : 'a' : 'u' : 'l' : 't' : []) = tok 7 CTokDefault +idkwtok ('d' : 'o' : []) = tok 2 CTokDo +idkwtok ('d' : 'o' : 'u' : 'b' : 'l' : 'e' : []) = tok 6 CTokDouble +idkwtok ('e' : 'l' : 's' : 'e' : []) = tok 4 CTokElse +idkwtok ('e' : 'n' : 'u' : 'm' : []) = tok 4 CTokEnum +idkwtok ('_' : '_' : 'e' : 'x' : 't' : 'e' : 'n' : 's' : 'i' : 'o' : 'n' : '_' : '_' : []) = tok 13 (CTokGnuC GnuCExtTok) +idkwtok ('e' : 'x' : 't' : 'e' : 'r' : 'n' : []) = tok 6 CTokExtern +idkwtok ('f' : 'l' : 'o' : 'a' : 't' : []) = tok 5 CTokFloat +idkwtok ('_' : '_' : 'f' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 10 CTokFloat128 +idkwtok ('_' : 'F' : 'l' : 'o' : 'a' : 't' : '1' : '2' : '8' : []) = tok 9 CTokFloat128 +idkwtok ('f' : 'o' : 'r' : []) = tok 3 CTokFor +idkwtok ('g' : 'o' : 't' : 'o' : []) = tok 4 CTokGoto +idkwtok ('i' : 'f' : []) = tok 2 CTokIf +idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : []) = tok 6 (CTokGnuC GnuCComplexImag) +idkwtok ('_' : '_' : 'i' : 'm' : 'a' : 'g' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexImag) +idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 8 CTokInline +idkwtok ('i' : 'n' : 'l' : 'i' : 'n' : 'e' : []) = tok 6 CTokInline +idkwtok ('_' : '_' : 'i' : 'n' : 'l' : 'i' : 'n' : 'e' : '_' : '_' : []) = tok 10 CTokInline +idkwtok ('i' : 'n' : 't' : []) = tok 3 CTokInt +idkwtok ('_' : '_' : 'i' : 'n' : 't' : '1' : '2' : '8' : []) = tok 8 CTokInt128 +idkwtok ('_' : '_' : 'l' : 'a' : 'b' : 'e' : 'l' : '_' : '_' : []) = tok 9 CTokLabel +idkwtok ('l' : 'o' : 'n' : 'g' : []) = tok 4 CTokLong +idkwtok ('_' : '_' : 'n' : 'o' : 'n' : 'n' : 'u' : 'l' : 'l' : []) = tok 9 CTokNonnull +idkwtok ('_' : '_' : 'n' : 'u' : 'l' : 'l' : 'a' : 'b' : 'l' : 'e' : []) = tok 10 CTokNullable +idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : []) = tok 6 (CTokGnuC GnuCComplexReal) +idkwtok ('_' : '_' : 'r' : 'e' : 'a' : 'l' : '_' : '_' : []) = tok 8 (CTokGnuC GnuCComplexReal) +idkwtok ('r' : 'e' : 'g' : 'i' : 's' : 't' : 'e' : 'r' : []) = tok 8 CTokRegister +idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 10 CTokRestrict +idkwtok ('r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : []) = tok 8 CTokRestrict +idkwtok ('_' : '_' : 'r' : 'e' : 's' : 't' : 'r' : 'i' : 'c' : 't' : '_' : '_' : []) = tok 12 CTokRestrict +idkwtok ('r' : 'e' : 't' : 'u' : 'r' : 'n' : []) = tok 6 CTokReturn +idkwtok ('s' : 'h' : 'o' : 'r' : 't' : []) = tok 5 CTokShort +idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokSigned +idkwtok ('s' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 6 CTokSigned +idkwtok ('_' : '_' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : '_' : '_' : []) = tok 10 CTokSigned +idkwtok ('s' : 'i' : 'z' : 'e' : 'o' : 'f' : []) = tok 6 CTokSizeof +idkwtok ('s' : 't' : 'a' : 't' : 'i' : 'c' : []) = tok 6 CTokStatic +idkwtok ('s' : 't' : 'r' : 'u' : 'c' : 't' : []) = tok 6 CTokStruct +idkwtok ('s' : 'w' : 'i' : 't' : 'c' : 'h' : []) = tok 6 CTokSwitch +idkwtok ('_' : '_' : 't' : 'h' : 'r' : 'e' : 'a' : 'd' : []) = tok 8 CTokThread +idkwtok ('t' : 'y' : 'p' : 'e' : 'd' : 'e' : 'f' : []) = tok 7 CTokTypedef +idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 8 CTokTypeof +idkwtok ('t' : 'y' : 'p' : 'e' : 'o' : 'f' : []) = tok 6 CTokTypeof +idkwtok ('_' : '_' : 't' : 'y' : 'p' : 'e' : 'o' : 'f' : '_' : '_' : []) = tok 10 CTokTypeof +idkwtok ('u' : 'n' : 'i' : 'o' : 'n' : []) = tok 5 CTokUnion +idkwtok ('u' : 'n' : 's' : 'i' : 'g' : 'n' : 'e' : 'd' : []) = tok 8 CTokUnsigned +idkwtok ('v' : 'o' : 'i' : 'd' : []) = tok 4 CTokVoid +idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 10 CTokVolatile +idkwtok ('v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : []) = tok 8 CTokVolatile +idkwtok ('_' : '_' : 'v' : 'o' : 'l' : 'a' : 't' : 'i' : 'l' : 'e' : '_' : '_' : []) = tok 12 CTokVolatile +idkwtok ('w' : 'h' : 'i' : 'l' : 'e' : []) = tok 5 CTokWhile + +idkwtok cs = \pos -> do + name <- getNewName + let len = case length cs of l -> l + let ident = mkIdent pos cs name + tyident <- isTypeIdent ident + if tyident + then return (CTokTyIdent (pos,len) ident) + else return (CTokIdent (pos,len) ident) + +ignoreAttribute :: P () +ignoreAttribute = skipTokens (0::Int) + where skipTokens :: Int -> P () + skipTokens n = do + ntok <- lexToken' False + case ntok of + CTokRParen _ | n == 1 -> return () + | otherwise -> skipTokens (n-1) + CTokLParen _ -> skipTokens (n+1) + _ -> skipTokens n + +tok :: Int -> (PosLength -> CToken) -> Position -> P CToken +tok len tc pos = return (tc (pos,len)) + +adjustLineDirective :: Int -> String -> Position -> Position +adjustLineDirective pragmaLen str pos = + offs' `seq` fname' `seq` row' `seq` parent' `seq` (position offs' fname' row' 1 parent') + where + -- offset changes by length of #line pragma + offs' = (posOffset pos) + pragmaLen + str' = dropWhite . drop 1 $ str + (rowStr, str'') = span isDigit str' + -- row changes to the first number in the line pragma + row' = read rowStr + str''' = dropWhite str'' + (fnameStr,str'''') = span (/= '"') . drop 1 $ str''' + fname = posFile pos + no_fn = null str''' || (head str''' /= '"') || (head str'''' /= '"') + -- filename changes to new filename, if specified + fname' | no_fn = fname + -- try and get more sharing of file name strings + | fnameStr == fname = fname + | otherwise = fnameStr + -- analye flags + min_flag = find_min_flag (5 :: Int) (drop 1 str'''') + find_min_flag cur_min = select_min . span isDigit . dropWhile (not . isDigit) + where + select_min (numStr, fstr') | null numStr = cur_min + | otherwise = find_min_flag (read numStr `min` cur_min) fstr' + parent = posParent pos + parent' = case min_flag of + 1 -> Just pos -- push + 2 -> case parent >>= posParent of + Nothing -> Nothing -- pop/underflow + Just gp -> gp `seq` Just gp -- pop + 3 -> parent -- unchanged stack, system header info + 4 -> parent -- unchanged stack, extern C info + _ -> Nothing + -- + dropWhite = dropWhile (\c -> c == ' ' || c == '\t') + +-- special utility for the lexer +unescapeMultiChars :: String -> [Char] +unescapeMultiChars cs@(_ : _ : _) = case unescapeChar cs of (c,cs') -> c : unescapeMultiChars cs' +unescapeMultiChars ('\'' : []) = [] +unescapeMultiChars _ = error "Unexpected end of multi-char constant" + +{-# INLINE token_ #-} +-- token that ignores the string +token_ :: Int -> (PosLength -> CToken) -> Position -> Int -> InputStream -> P CToken +token_ len mkTok pos _ _ = return (mkTok (pos,len)) + +{-# INLINE token_fail #-} +-- error token +token_fail :: String -> Position -> + Int -> InputStream -> P CToken +token_fail errmsg pos _ _ = failP pos [ "Lexical Error !", errmsg ] + + +{-# INLINE token #-} +-- token that uses the string +token :: (PosLength -> a -> CToken) -> (String -> a) + -> Position -> Int -> InputStream -> P CToken +token mkTok fromStr pos len str = return (mkTok (pos,len) (fromStr $ takeChars len str)) + +{-# INLINE token_plus #-} +-- token that may fail +token_plus :: (PosLength -> a -> CToken) -> (String -> Either String a) + -> Position -> Int -> InputStream -> P CToken +token_plus mkTok fromStr pos len str = + case fromStr (takeChars len str) of Left err -> failP pos [ "Lexical error ! ", err ] + Right ok -> return $! mkTok (pos,len) ok + +-- ----------------------------------------------------------------------------- +-- The input type + +type AlexInput = (Position, -- current position, + InputStream) -- current input string + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar _ = error "alexInputPrevChar not used" + +-- for alex-3.0 +alexGetByte :: AlexInput -> Maybe (Word8, AlexInput) +alexGetByte (p,is) | inputStreamEmpty is = Nothing + | otherwise = let (b,s) = takeByte is in + -- this is safe for latin-1, but ugly + let p' = alexMove p (chr (fromIntegral b)) in p' `seq` + Just (b, (p', s)) + +alexGetChar :: AlexInput -> Maybe (Char,AlexInput) +alexGetChar (p,is) | inputStreamEmpty is = Nothing + | otherwise = let (c,s) = takeChar is in + let p' = alexMove p c in p' `seq` + Just (c, (p', s)) + +alexMove :: Position -> Char -> Position +alexMove pos ' ' = incPos pos 1 +alexMove pos '\n' = retPos pos +alexMove pos '\r' = incOffset pos 1 +alexMove pos _ = incPos pos 1 + +lexicalError :: P a +lexicalError = do + pos <- getPos + (c,_) <- liftM takeChar getInput + failP pos + ["Lexical error !", + "The character " ++ show c ++ " does not fit here."] + +parseError :: P a +parseError = do + lastTok <- getLastToken + failP (posOf lastTok) + ["Syntax error !", + "The symbol `" ++ show lastTok ++ "' does not fit here."] + +-- there is a problem with ignored tokens here (that aren't skipped) +-- consider +-- 1 > int x; +-- 2 > LINE "ex.c" 4 +-- 4 > int y; +-- when we get to LINE, we have [int (1,1),x (1,4)] in the token cache. +-- Now we run +-- > action (pos 2,0) 14 "LINE \"ex.c\" 3\n" +-- which in turn adjusts the position and then calls lexToken again +-- we get `int (pos 4,0)', and have [x (1,4), int (4,1) ] in the token cache (fine) +-- but then, we again call setLastToken when returning and get [int (4,1),int (4,1)] in the token cache (bad) +-- to resolve this, recursive calls invoke lexToken' False. +lexToken :: P CToken +lexToken = lexToken' True + +lexToken' :: Bool -> P CToken +lexToken' modifyCache = do + pos <- getPos + inp <- getInput + case alexScan (pos, inp) 0 of + AlexEOF -> do + handleEofToken + return CTokEof + AlexError _inp -> lexicalError + AlexSkip (pos', inp') _len -> do + setPos pos' + setInput inp' + lexToken' modifyCache + AlexToken (pos', inp') len action -> do + setPos pos' + setInput inp' + nextTok <- action pos len inp + when modifyCache $ setLastToken nextTok + return nextTok + +lexC :: (CToken -> P a) -> P a +lexC cont = do + nextTok <- lexToken + cont nextTok +}
src/Language/C/Parser/Parser.y view
@@ -1,2345 +1,2345 @@--------------------------------------------------------------------------------- Module : Parser.y--- Copyright : (c) 2005-2007 Duncan Coutts--- (c) 2008 Benedikt Huber--- (c) [1999..2004] Manuel M T Chakravarty--- Portions copyright 1989, 1990 James A. Roskind--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Portability : portable------ Parser for C translation units, which have already been run through the C--- preprocessor. It is recommended to use the `strict' flag for happy.------ The parser recognizes all of ISO C 99 and most GNU C extensions.------ With C99 we refer to the ISO C99 standard, specifically the section numbers--- used below refer to this report:------ <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf>------ GNU extensions are documented in the gcc parser------ <http://gcc.gnu.org/viewcvs/trunk/gcc/c-parser.c>------ and in: <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>------ The set of supported extensions is documented in------ <http://www.sivity.net/projects/language.c/wiki/Cee>--------------------------------------------------------------------{-module Language.C.Parser.Parser (- -- * Parse a C translation unit- parseC,- -- * Exposed Parsers- translUnitP, extDeclP, statementP, expressionP-) where---- Relevant C99 sections:------ 6.5 Expressions .1 - .17 and 6.6 (almost literally)--- Supported GNU extensions:--- - Allow a compound statement as an expression--- - Various __builtin_* forms that take type parameters--- - `alignof' expression or type--- - `__extension__' to suppress warnings about extensions--- - Allow taking address of a label with: && label--- - Omitting the `then' part of conditional expressions--- - complex numbers------ 6.7 C Declarations .1 -.8--- Supported GNU extensions:--- - '__thread' thread local storage (6.7.1)------ 6.8 Statements .1 - .8--- Supported GNU extensions:--- - case ranges (C99 6.8.1)--- - '__label__ ident;' declarations (C99 6.8.2)--- - computed gotos (C99 6.8.6)------ 6.9 Translation unit--- Supported GNU extensions:--- - allow empty translation_unit--- - allow redundant ';'--- - allow extension keyword before external declaration--- - asm definitions------ Since some of the grammar productions are quite difficult to read,--- (especially those involved with the decleration syntax) we document them--- with an extended syntax that allows a more consise representation:------ Ordinary rules------ foo named terminal or non-terminal------ 'c' terminal, literal character token------ A B concatenation------ A | B alternation------ (A) grouping------ Extended rules------ A? optional, short hand for (A|) or [A]{ 0==A || 1==A }------ ... stands for some part of the grammar omitted for clarity------ {A} represents sequences, 0 or more.------ <permute> modifier which states that any permutation of the immediate subterms is valid---------- TODO ---------------------------------------------------------------------------- !* We ignore C11 _Atomic type annotations--- !* We ignore the C99 static keyword (see C99 6.7.5.3)--- !* We do not distinguish in the AST between incomplete array types and--- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)--- !* The AST doesn't allow recording __attribute__ of unnamed struct field--- (see , struct_default_declaring_list, struct_identifier_declarator)--- !* see `We're being far to liberal here' (... struct definition within structs)--- * Documentation isn't complete and consistent yet.--import Prelude hiding (reverse)-import qualified Data.List as List-import Control.Monad (mplus)-import Language.C.Parser.Builtin (builtinTypeNames)-import Language.C.Parser.Lexer (lexC, parseError)-import Language.C.Parser.Tokens (CToken(..), GnuCTok(..), ClangCTok (..), posLenOfTok)-import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition,- enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..))--import Language.C.Data.RList-import Language.C.Data.InputStream-import Language.C.Data.Ident-import Language.C.Data.Name-import Language.C.Data.Node-import Language.C.Data.Position-import Language.C.Syntax--}--- in order to document the parsers, we have to alias them-%name translation_unit translation_unit-%name external_declaration external_declaration-%name statement statement-%name expression expression--%tokentype { CToken }--%monad { P } { >>= } { return }-%lexer { lexC } { CTokEof }--%expect 1--%token--'(' { CTokLParen _ }-')' { CTokRParen _ }-'[' { CTokLBracket _ }-']' { CTokRBracket _ }-"->" { CTokArrow _ }-'.' { CTokDot _ }-'!' { CTokExclam _ }-'~' { CTokTilde _ }-"++" { CTokInc _ }-"--" { CTokDec _ }-'+' { CTokPlus _ }-'-' { CTokMinus _ }-'*' { CTokStar _ }-'/' { CTokSlash _ }-'%' { CTokPercent _ }-'&' { CTokAmper _ }-"<<" { CTokShiftL _ }-">>" { CTokShiftR _ }-'<' { CTokLess _ }-"<=" { CTokLessEq _ }-'>' { CTokHigh _ }-">=" { CTokHighEq _ }-"==" { CTokEqual _ }-"!=" { CTokUnequal _ }-'^' { CTokHat _ }-'|' { CTokBar _ }-"&&" { CTokAnd _ }-"||" { CTokOr _ }-'?' { CTokQuest _ }-':' { CTokColon _ }-'=' { CTokAssign _ }-"+=" { CTokPlusAss _ }-"-=" { CTokMinusAss _ }-"*=" { CTokStarAss _ }-"/=" { CTokSlashAss _ }-"%=" { CTokPercAss _ }-"&=" { CTokAmpAss _ }-"^=" { CTokHatAss _ }-"|=" { CTokBarAss _ }-"<<=" { CTokSLAss _ }-">>=" { CTokSRAss _ }-',' { CTokComma _ }-';' { CTokSemic _ }-'{' { CTokLBrace _ }-'}' { CTokRBrace _ }-"..." { CTokEllipsis _ }-alignof { CTokAlignof _ }-alignas { CTokAlignas _ }-"_Atomic" { CTokAtomic _ }-asm { CTokAsm _ }-auto { CTokAuto _ }-break { CTokBreak _ }-"_Bool" { CTokBool _ }-case { CTokCase _ }-char { CTokChar _ }-const { CTokConst _ }-continue { CTokContinue _ }-"_Complex" { CTokComplex _ }-default { CTokDefault _ }-do { CTokDo _ }-double { CTokDouble _ }-else { CTokElse _ }-enum { CTokEnum _ }-extern { CTokExtern _ }-float { CTokFloat _ }-"__float128" { CTokFloat128 _ }-"_Float128" { CTokFloat128 _ }-for { CTokFor _ }-"_Generic" { CTokGeneric _ }-goto { CTokGoto _ }-if { CTokIf _ }-inline { CTokInline _ }-int { CTokInt _ }-"__int128" { CTokInt128 _ }-long { CTokLong _ }-"__label__" { CTokLabel _ }-"_Noreturn" { CTokNoreturn _ }-"_Nullable" { CTokNullable _ }-"_Nonnull" { CTokNonnull _ }-register { CTokRegister _ }-restrict { CTokRestrict _ }-return { CTokReturn _ }-short { CTokShort _ }-signed { CTokSigned _ }-sizeof { CTokSizeof _ }-static { CTokStatic _ }-"_Static_assert"{ CTokStaticAssert _ }-struct { CTokStruct _ }-switch { CTokSwitch _ }-typedef { CTokTypedef _ }-typeof { CTokTypeof _ }-"__thread" { CTokThread _ }-union { CTokUnion _ }-unsigned { CTokUnsigned _ }-void { CTokVoid _ }-volatile { CTokVolatile _ }-while { CTokWhile _ }-cchar { CTokCLit _ _ } -- character constant-cint { CTokILit _ _ } -- integer constant-cfloat { CTokFLit _ _ } -- float constant-cstr { CTokSLit _ _ } -- string constant (no escapes)-ident { CTokIdent _ $$ } -- identifier-tyident { CTokTyIdent _ $$ } -- `typedef-name' identifier-"__attribute__" { CTokGnuC GnuCAttrTok _ } -- special GNU C tokens-"__extension__" { CTokGnuC GnuCExtTok _ } -- special GNU C tokens-"__real__" { CTokGnuC GnuCComplexReal _ }-"__imag__" { CTokGnuC GnuCComplexImag _ }--- special GNU C builtin 'functions' that actually take types as parameters:-"__builtin_va_arg" { CTokGnuC GnuCVaArg _ }-"__builtin_offsetof" { CTokGnuC GnuCOffsetof _ }-"__builtin_types_compatible_p" { CTokGnuC GnuCTyCompat _ }-"__builtin_convertvector" { CTokClangC _ ClangBuiltinConvertVector }-clangcversion { CTokClangC _ (ClangCVersionTok $$) } -- Clang version literal--%%----- parse a complete C translation unit--- we have to take special care of empty translation units-translation_unit :: { CTranslUnit }-translation_unit- : ext_decl_list {% let decls = reverse $1 in- case decls of- [] -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) }- (d:ds) -> withNodeInfo d $ CTranslUnit decls }----- parse a list of external declarations, making up a C translation unit (C99 6.9)------ * GNU extensions:--- allow empty translation_unit--- allow redundant ';'-ext_decl_list :: { Reversed [CExtDecl] }-ext_decl_list- : {- empty -} { empty }- | ext_decl_list ';' { $1 }- | ext_decl_list external_declaration { $1 `snoc` $2 }----- parse external C declaration (C99 6.9)------ * GNU extensions:--- allow extension keyword before external declaration (TODO: discarded)--- asm definitions-external_declaration :: { CExtDecl }-external_declaration- : function_definition { CFDefExt $1 }- | declaration { CDeclExt $1 }- | "__extension__" external_declaration { $2 }- | asm '(' string_literal ')' ';' {% withNodeInfo $1 $ CAsmExt $3 }----- parse C function definition (C99 6.9.1)------ function_definition :- specifiers? fun-declarator compound-statement--- specifiers? old-fun-declarator declaration-list compound-statement------ The specifiers are a list consisting of type-names (int, struct foo, ...),--- storage-class specifiers (extern, static,...) and type qualifiers (const, volatile, ...).------ declaration_specifier :- <permute> type-qualifier* storage-class+ typename+ "extern unsigned static volatile int f()"--- type_specifier :- <permute> type-qualifier* typename+ "const int f()", "long int f()"--- declaration_qualifier_list :- <permute> type_qualifier* storage-class+ "extern static const f()"--- type_qualifier_list :- type-qualifier+ "const f()"------ * GNU extension:--- __attribute__ annotations----function_definition :: { CFunDef }-function_definition- : function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) }-- | attrs function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftCAttrs $1) $2 [] $3) }-- | declaration_specifier function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }-- | type_specifier function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }-- | declaration_qualifier_list function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }-- | type_qualifier_list function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }-- | type_qualifier_list attrs function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }-- -- old function declarators-- | function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef [] $1 (reverse $2) $3 }-- | attrs function_declarator_old declaration_list compound_statement- {% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 }-- | declaration_specifier function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }-- | type_specifier function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 }-- | declaration_qualifier_list function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 }-- | type_qualifier_list function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 }-- | type_qualifier_list attrs function_declarator_old declaration_list compound_statement- {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 (reverse $4) $5 }---- Read declarator and put function-function_declarator :: { CDeclr }-function_declarator- : identifier_declarator- {% let declr = reverseDeclr $1 in- enterScope >> doFuncParamDeclIdent declr >> return declr }----- parse C statement (C99 6.8)------ * GNU extension: ' __asm__ (...); ' statements----statement :: { CStat }-statement- : labeled_statement { $1 }- | compound_statement { $1 }- | expression_statement { $1 }- | selection_statement { $1 }- | iteration_statement { $1 }- | jump_statement { $1 }- | asm_statement {% withNodeInfo $1 (CAsm $1) }----- parse C labeled statement (C99 6.8.1)------ * GNU extension: case ranges----labeled_statement :: { CStat }-labeled_statement- : identifier ':' attrs_opt statement {% withNodeInfo $1 $ CLabel $1 $4 $3 }- | case constant_expression ':' statement {% withNodeInfo $1 $ CCase $2 $4 }- | default ':' statement {% withNodeInfo $1 $ CDefault $3 }- | case constant_expression "..." constant_expression ':' statement- {% withNodeInfo $1 $ CCases $2 $4 $6 }----- parse C compound statement (C99 6.8.2)------ * GNU extension: '__label__ ident;' declarations----compound_statement :: { CStat }-compound_statement- : '{' enter_scope block_item_list leave_scope '}'- {% withNodeInfo $1 $ CCompound [] (reverse $3) }-- | '{' enter_scope label_declarations block_item_list leave_scope '}'- {% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) }----- No syntax for these, just side effecting semantic actions.----enter_scope :: { () }-enter_scope : {% enterScope }-leave_scope :: { () }-leave_scope : {% leaveScope }---block_item_list :: { Reversed [CBlockItem] }-block_item_list- : {- empty -} { empty }- | block_item_list block_item { $1 `snoc` $2 }--block_item :: { CBlockItem }-block_item- : statement { CBlockStmt $1 }- | nested_declaration { $1 }--nested_declaration :: { CBlockItem }-nested_declaration- : declaration { CBlockDecl $1 }- | nested_function_definition { CNestedFunDef $1 }- | "__extension__" nested_declaration { $2 }--nested_function_definition :: { CFunDef }-nested_function_definition- : declaration_specifier function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }-- | type_specifier function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) }-- | declaration_qualifier_list function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) }-- | type_qualifier_list function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) }-- | type_qualifier_list attrs function_declarator compound_statement- {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) }---label_declarations :: { Reversed [Ident] }-label_declarations- : "__label__" identifier_list ';' { $2 }- | label_declarations "__label__" identifier_list ';' { $1 `rappendr` $3 }----- parse C expression statement (C99 6.8.3)----expression_statement :: { CStat }-expression_statement- : ';' {% withNodeInfo $1 $ CExpr Nothing }- | expression ';' {% withNodeInfo $1 $ CExpr (Just $1) }----- parse C selection statement (C99 6.8.4)----selection_statement :: { CStat }-selection_statement- : if '(' expression ')' statement- {% withNodeInfo $1 $ CIf $3 $5 Nothing }-- | if '(' expression ')' statement else statement- {% withNodeInfo $1 $ CIf $3 $5 (Just $7) }-- | switch '(' expression ')' statement- {% withNodeInfo $1 $ CSwitch $3 $5 }----- parse C iteration statement (C99 6.8.5)----iteration_statement :: { CStat }-iteration_statement- : while '(' expression ')' statement- {% withNodeInfo $1 $ CWhile $3 $5 False }-- | do statement while '(' expression ')' ';'- {% withNodeInfo $1 $ CWhile $5 $2 True }-- | for '(' expression_opt ';' expression_opt ';' expression_opt ')' statement- {% withNodeInfo $1 $ CFor (Left $3) $5 $7 $9 }-- | for '(' enter_scope declaration expression_opt ';' expression_opt ')' statement leave_scope- {% withNodeInfo $1 $ CFor (Right $4) $5 $7 $9 }----- parse C jump statement (C99 6.8.6)------ * GNU extension: computed gotos----jump_statement :: { CStat }-jump_statement- : goto identifier ';' {% withNodeInfo $1 $ CGoto $2 }- | goto '*' expression ';' {% withNodeInfo $1 $ CGotoPtr $3 }- | continue ';' {% withNodeInfo $1 $ CCont }- | break ';' {% withNodeInfo $1 $ CBreak }- | return expression_opt ';' {% withNodeInfo $1 $ CReturn $2 }----- parse GNU C __asm__ statement (compatible with C99: J.5.10)------ asm_stmt :- asm volatile? ( "asm..." : output-operands : input-operands : asm-clobbers )--- asm_operand :- [operand-name] "constraint" ( expr )--- asm_clobber :- "r1", "r2", ...----asm_statement :: { CAsmStmt }-asm_statement- : asm maybe_type_qualifier '(' string_literal ')' ';'- {% withNodeInfo $1 $ CAsmStmt $2 $4 [] [] [] }-- | asm maybe_type_qualifier '(' string_literal ':' asm_operands ')' ';'- {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 [] [] }-- | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ')' ';'- {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 [] }-- | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';'- {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 (reverse $10) }---maybe_type_qualifier :: { Maybe CTypeQual }-maybe_type_qualifier- : {- empty -} { Nothing }- | type_qualifier { Just $1 }--asm_operands :: { [CAsmOperand] }-asm_operands- : {- empty -} { [] }- | nonnull_asm_operands { reverse $1 }--nonnull_asm_operands :: { Reversed [CAsmOperand] }-nonnull_asm_operands- : asm_operand { singleton $1 }- | nonnull_asm_operands ',' asm_operand { $1 `snoc` $3 }--asm_operand :: { CAsmOperand }-asm_operand- : string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 }- | '[' ident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }- | '[' tyident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 }---asm_clobbers :: { Reversed [CStrLit] }-asm_clobbers- : string_literal { singleton $1 }- | asm_clobbers ',' string_literal { $1 `snoc` $3 }--{------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Declarations----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Declarations are the most complicated part of the grammar, and shall be summarized here.-To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand sides doesn't matter.- - <permute> a* b+ c === any sequence of a's, b's and c's, which contains exactly 1 'c' and at least one 'b'---- storage class and type qualifier-----------------------------------------------------------------------------------------------------------------attr :- __attribute__((..))-storage_class :- typedef | extern | static | auto | register | _Thread_local-function_specifier :- inline | _Noreturn-alignment_specifier :- _Alignas (type_name) | _Alignas (constant_expr)--type_qualifier :- const | volatile | restrict | _Atomic | _Nullable | _Nonnull-type_qualifier_list :- type_qualifier+--declaration_qualifier :- storage_class | type_qualifier | function_specifier | alginment_specifier-declaration_qualifier_list :- <permute> type_qualifier* storage_class+--qualifiers :- declaration_qualifier_list | type_qualifier_list- := <permute> (type_qualifier|storage_class)+---- type names-----------------------------------------------------------------------------------------------------------------declaration_specifier :- <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )-type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident)--specifiers :- declaration_specifier | type_specifier- := <permute> type_qualifier* storage_class* (basic_type_name+ | elaborated_type_name | tyident )---- struct/union/enum declarations-----------------------------------------------------------------------------------------------------------------sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name-sue_type_specifier :- <permute> type_qualifier* elaborated_type_name--sue_declaration := sue_declaration_specifier | sue_type_specifier- :- <permute> type_qualifier* storage_class* elaborated_type_name---- declarators-----------------------------------------------------------------------------------------------------------------identifier_declarator :- ( '*' (type_qualifier | attr)* ) * ident [ array_decl | "(" parameter-list ")" ]- plus additional parenthesis' ending ^^ here-typedef_declartor :--declarator :- identifier_declarator | typedef_declarator---- Declaration lists-----------------------------------------------------------------------------------------------------------------default_declaring_list :- qualifiers ( identifier_declarator asm*attrs* initializer? )_comma_list--declaring_list :- specifiers ( declarator asm*attrs* initializer? )_comma_list--declaration_list := default_declaring_list | declaring_list---- Declaration-----------------------------------------------------------------------------------------------------------------declaration = sue_declaration | declaration_list | _Static_assert(..)------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Attributes--- (citing http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html)----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"Attributes may appear after the colon following a label (expect case and default)"--labeled_statement :- identifier ':' attrs_opt statement--"Attributes may go either immediately after the struct/union/enum keyword or after the closing brace"--struct attrs_opt ...-struct ... { } attrs_opt--"In general: Attributes appear as part of declarations, either belonging to a declaration or declarator"--"Any list of specifiers and qualifiers at the start of a declaration may contain attribute specifiers"-"An attribute list may appear immediately before the comma, = or semicolon terminating a declaration of an identifier"------------------------------------------------------------------------------------------------------------------For the parser, we modified the following rules to be interleaved with attributes:--default_declaring_list' :- (declaration_qualifier_list' | type_qualifier_list' attr*)- identifier_declarator asm*attr* initializer?- { ',' attr* identifier_declarator asm*attr* initializer? }-declaring_list' :- specifier' declarator asm*attr* initializer?- { ',' attr* declarator asm*attr* initializer? }---type_qualifier_list' is like type_qualifier_list, but with preceeding and/or interleaving (but not terminating) __attribute__ annotations.-declaration_qualifier_list', declaration_specifier' and type_specifier' are like their unprimed variants, but with arbitrary preceeding, interleaving and/or terminating __attribute__ annotations.--"An attribute list may appear immediately before a declarator other than the first in a comma seperated list of declarators"--"The attribute specifiers may be the only specifiers present (implicit int)" [not supported]--"Attribute specifiers may be mixed with type qualifiers appearing inside the [] of an parameter array declarator"--tbc.--}------ parse C declaration (C11 6.7)------ * new form in C11--- _Static_assert(expr,string_literal)-declaration :: { CDecl }-declaration- : sue_declaration_specifier ';'- {% withNodeInfo $1 $ CDecl (reverse $1) [] }-- | sue_type_specifier ';'- {% withNodeInfo $1 $ CDecl (reverse $1) [] }-- | declaring_list ';'- {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }-- | default_declaring_list ';'- {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) }- | "_Static_assert" '(' constant_expression ',' string_literal ')' ';'- {% withNodeInfo $1 $ CStaticAssert $3 $5 }--declaration_list :: { Reversed [CDecl] }-declaration_list- : {- empty -} { empty }- | declaration_list declaration { $1 `snoc` $2 }----- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer?--- { ',' identifier_declarator asm_attrs initializer? }------ * GNU extensions--- __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)--- asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)--- The assembler annotation is used to specifiy an assembler name for the declarator.----default_declaring_list :: { CDecl }-default_declaring_list- : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt- {% let declspecs = reverse $1 in- do{ declr <- withAsmNameAttrs $3 $2- ; doDeclIdent declspecs declr- ; withNodeInfo $1 $- CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}-- | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt- {% let declspecs = liftTypeQuals $1 in- do{ declr <- withAsmNameAttrs $3 $2- ; doDeclIdent declspecs declr- ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}-- | type_qualifier_list attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt -- FIX 1600- {% let declspecs = liftTypeQuals $1 in- do{ declr <- withAsmNameAttrs $4 $3- ; doDeclIdent declspecs declr- ; withNodeInfo $1 $ CDecl (declspecs ++ liftCAttrs $2) [(Just (reverseDeclr declr), $5, Nothing)] }}-- -- GNU extension: __attribute__ as the only qualifier- | attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt- {% let declspecs = liftCAttrs $1 in- do{ declr <- withAsmNameAttrs $3 $2- ; doDeclIdent declspecs declr- ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }}-- | default_declaring_list ',' attrs_opt identifier_declarator asm_attrs_opt {-{}-} initializer_opt- {% case $1 of- CDecl declspecs dies at -> do- declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4- doDeclIdent declspecs declr- withLength at $ CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) }---- assembler, followed by attribute annotation-asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) }-asm_attrs_opt- : asm_opt attrs_opt- { ($1,$2) }------- SUMMARY: declaring_list :- specifier* declarator asm_attrs initializer?--- { ',' declarator asm_attrs initializer? }------ GNU extensions:--- __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11)--- asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12)----declaring_list :: { CDecl }-declaring_list- : declaration_specifier declarator asm_attrs_opt initializer_opt- {% do{- declr <- withAsmNameAttrs $3 $2;- doDeclIdent $1 declr;- withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }- }-- | type_specifier declarator asm_attrs_opt initializer_opt- {% do{- declr <- withAsmNameAttrs $3 $2;- doDeclIdent $1 declr;- withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] }- }-- | declaring_list ',' attrs_opt declarator asm_attrs_opt initializer_opt- {% case $1 of- CDecl declspecs dies at -> do- declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4- doDeclIdent declspecs declr- return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) }----- parse C declaration specifiers (C99 6.7)------ * <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident )----declaration_specifier :: { [CDeclSpec] }-declaration_specifier- : basic_declaration_specifier { reverse $1 } -- Arithmetic or void- | sue_declaration_specifier { reverse $1 } -- Struct/Union/Enum- | typedef_declaration_specifier { reverse $1 } -- Typedef----- A mixture of type qualifiers (const, volatile, restrict, _Atomic, _Nonnull, _Nullable),--- function specifiers (inline, _Noreturn),--- alignment specifiers (_Alignas) and--- storage class specifiers (extern, static, auto, register, _Thread_local),--- in any order, but containing at least one storage class specifier.------ declaration_qualifier_list :- <permute> type_qualifier* alignment_specifier* function_specifier* storage_class+------ GNU extensions--- * arbitrary interleaved __attribute__ annotations----declaration_qualifier_list :: { Reversed [CDeclSpec] }-declaration_qualifier_list- : declaration_qualifier_without_types- { singleton $1 }-- | attrs declaration_qualifier_without_types- { reverseList (liftCAttrs $1) `snoc` $2 }-- | type_qualifier_list declaration_qualifier_without_types- { rmap CTypeQual $1 `snoc` $2 }-- | type_qualifier_list attrs declaration_qualifier_without_types- { (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` $3 }-- | declaration_qualifier_list declaration_qualifier- { $1 `snoc` $2 }-- | declaration_qualifier_list attr- { addTrailingAttrs $1 $2 }------- declaration_qualifier :- storage_class | type_qualifier | function_specifier | alignment_specifier----declaration_qualifier :: { CDeclSpec }-declaration_qualifier- : storage_class { CStorageSpec $1 }- | type_qualifier { CTypeQual $1 }- | function_specifier { CFunSpec $1 }- | alignment_specifier { CAlignSpec $1 }---declaration_qualifier_without_types :: { CDeclSpec }- : storage_class { CStorageSpec $1 }- | function_specifier { CFunSpec $1 }- | alignment_specifier { CAlignSpec $1 }----- parse C storage class specifier (C99 6.7.1)------ * GNU extensions: '__thread' thread local storage----storage_class :: { CStorageSpec }-storage_class- : typedef {% withNodeInfo $1 $ CTypedef }- | extern {% withNodeInfo $1 $ CExtern }- | static {% withNodeInfo $1 $ CStatic }- | auto {% withNodeInfo $1 $ CAuto }- | register {% withNodeInfo $1 $ CRegister }- | "__thread" {% withNodeInfo $1 $ CThread }---- parse C function specifier (C11 6.7.4)-function_specifier :: { CFunSpec }-function_specifier- : inline {% withNodeInfo $1 $ CInlineQual }- | "_Noreturn" {% withNodeInfo $1 $ CNoreturnQual }---- parse C alignment specifier (C11 6.7.5)-alignment_specifier :: { CAlignSpec }-alignment_specifier- : alignas '(' type_name ')' {% withNodeInfo $1 $ CAlignAsType $3 }- | alignas '(' constant_expression ')' {% withNodeInfo $1 $ CAlignAsExpr $3 }---- parse C type specifier (C99 6.7.2)------ This recignises a whole list of type specifiers rather than just one--- as in the C99 grammar.------ type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | g)------ Type specifier _Atomic(type) is not yet supported because of conflicts with type qualifier _Atomic-type_specifier :: { [CDeclSpec] }-type_specifier- : basic_type_specifier { reverse $1 } -- Arithmetic or void- | sue_type_specifier { reverse $1 } -- Struct/Union/Enum- | typedef_type_specifier { reverse $1 } -- Typedef--- | "_Atomic" '(' type_name ')' -- _Atomic(type)--- {% withNodeInfo $1 $ \at -> [CTypeSpec (CAtomicType $3 at)] }--basic_type_name :: { CTypeSpec }-basic_type_name- : void {% withNodeInfo $1 $ CVoidType }- | char {% withNodeInfo $1 $ CCharType }- | short {% withNodeInfo $1 $ CShortType }- | int {% withNodeInfo $1 $ CIntType }- | long {% withNodeInfo $1 $ CLongType }- | float {% withNodeInfo $1 $ CFloatType }- | double {% withNodeInfo $1 $ CDoubleType }- | signed {% withNodeInfo $1 $ CSignedType }- | unsigned {% withNodeInfo $1 $ CUnsigType }- | "_Bool" {% withNodeInfo $1 $ CBoolType }- | "_Complex" {% withNodeInfo $1 $ CComplexType }- | "__int128" {% withNodeInfo $1 $ CInt128Type }- | "__float128" {% withNodeInfo $1 $ CFloat128Type }- | "_Float128" {% withNodeInfo $1 $ CFloat128Type }----- A mixture of type qualifiers, storage class and basic type names in any--- order, but containing at least one basic type name and at least one storage--- class specifier.------ basic_declaration_specifier :- <permute> type_qualifier* storage_class+ basic_type_name+------ GNU extensions--- arbitrary interleaved __attribute__ annotations----basic_declaration_specifier :: { Reversed [CDeclSpec] }-basic_declaration_specifier- : declaration_qualifier_list basic_type_name- { $1 `snoc` CTypeSpec $2 }-- | basic_type_specifier storage_class- { $1 `snoc` CStorageSpec $2 }-- | basic_declaration_specifier declaration_qualifier- { $1 `snoc` $2 }-- | basic_declaration_specifier basic_type_name- { $1 `snoc` CTypeSpec $2 }-- | basic_declaration_specifier attr- { addTrailingAttrs $1 $2 }----- A mixture of type qualifiers and basic type names in any order, but--- containing at least one basic type name.------ basic_type_specifier :- <permute> type_qualifier* basic_type_name+------ GNU extensions--- arbitrary interleaved __attribute__ annotations----basic_type_specifier :: { Reversed [CDeclSpec] }-basic_type_specifier- -- Arithmetic or void- : basic_type_name- { singleton (CTypeSpec $1) }-- | attrs basic_type_name- { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }-- | type_qualifier_list basic_type_name- { rmap CTypeQual $1 `snoc` CTypeSpec $2 }-- | type_qualifier_list attrs basic_type_name- { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }-- | basic_type_specifier type_qualifier- { $1 `snoc` CTypeQual $2 }-- | basic_type_specifier basic_type_name- { $1 `snoc` CTypeSpec $2 }-- | basic_type_specifier attr- { addTrailingAttrs $1 $2 }----- A named or anonymous struct, union or enum type along with at least one--- storage class and any mix of type qualifiers.------ * Summary:--- sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name----sue_declaration_specifier :: { Reversed [CDeclSpec] }-sue_declaration_specifier- : declaration_qualifier_list elaborated_type_name- { $1 `snoc` CTypeSpec $2 }-- | sue_type_specifier storage_class- { $1 `snoc` CStorageSpec $2 }-- | sue_declaration_specifier declaration_qualifier- { $1 `snoc` $2 }-- | sue_declaration_specifier attr- { addTrailingAttrs $1 $2 }----- A struct, union or enum type (named or anonymous) with optional leading and--- trailing type qualifiers.------ * Summary:--- sue_type_specifier :- <permute> type_qualifier* elaborated_type_name------ * GNU Extensions: records __attribute__ annotations----sue_type_specifier :: { Reversed [CDeclSpec] }-sue_type_specifier- -- struct/union/enum- : elaborated_type_name- { singleton (CTypeSpec $1) }-- | attrs elaborated_type_name- { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) }-- | type_qualifier_list elaborated_type_name- { rmap CTypeQual $1 `snoc` CTypeSpec $2 }-- | type_qualifier_list attrs elaborated_type_name- { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 }-- | sue_type_specifier type_qualifier- { $1 `snoc` CTypeQual $2 }-- | sue_type_specifier attr- { addTrailingAttrs $1 $2 }---- A typedef'ed type identifier with at least one storage qualifier and any--- number of type qualifiers------ * Summary:--- typedef_declaration_specifier :- <permute> type_qualifier* storage_class+ tyident------ * Note:--- the tyident can also be a: typeof '(' ... ')'----typedef_declaration_specifier :: { Reversed [CDeclSpec] }-typedef_declaration_specifier- : typedef_type_specifier storage_class- { $1 `snoc` CStorageSpec $2 }-- | declaration_qualifier_list tyident- {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) }-- | declaration_qualifier_list typeof '(' expression ')'- {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }-- | declaration_qualifier_list typeof '(' type_name ')'- {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) }-- | typedef_declaration_specifier declaration_qualifier- { $1 `snoc` $2 }-- | typedef_declaration_specifier attr- { addTrailingAttrs $1 $2 }----- typedef'ed type identifier with optional leading and trailing type qualifiers------ * Summary:--- type_qualifier* ( tyident | typeof '('...')' ) type_qualifier*----typedef_type_specifier :: { Reversed [CDeclSpec] }-typedef_type_specifier- : tyident- {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) }-- | typeof '(' expression ')'- {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) }-- | typeof '(' type_name ')'- {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) }-- | type_qualifier_list tyident- {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeDef $2 at) }-- | type_qualifier_list typeof '(' expression ')'- {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) }-- | type_qualifier_list typeof '(' type_name ')'- {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfType $4 at) }-- -- repeat with attrs (this could be easier if type qualifier list wouldn't allow leading attributes)- | attrs tyident- {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) }-- | attrs typeof '(' expression ')'- {% withNodeInfo $1 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeOfExpr $4 at)) }-- | attrs typeof '(' type_name ')'- {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeOfType $4 at)) }-- | type_qualifier_list attrs tyident- {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) }-- | type_qualifier_list attrs typeof '(' expression ')'- {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) }-- | type_qualifier_list attrs typeof '(' type_name ')'- {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) }-- | typedef_type_specifier type_qualifier- { $1 `snoc` CTypeQual $2 }-- | typedef_type_specifier attr- { addTrailingAttrs $1 $2 }----- A named or anonymous struct, union or enum type.------ * Summary:--- (struct|union|enum) (identifier? '{' ... '}' | identifier)----elaborated_type_name :: { CTypeSpec }-elaborated_type_name- : struct_or_union_specifier {% withNodeInfo $1 $ CSUType $1 }- | enum_specifier {% withNodeInfo $1 $ CEnumType $1 }----- parse C structure or union declaration (C99 6.7.2.1)------ * Summary:--- (struct|union) (identifier? '{' ... '}' | identifier)----struct_or_union_specifier :: { CStructUnion }-struct_or_union_specifier- : struct_or_union attrs_opt identifier '{' struct_declaration_list '}'- {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ reverse $5) $2 }-- | struct_or_union attrs_opt '{' struct_declaration_list '}'- {% withNodeInfo $1 $ CStruct (unL $1) Nothing (Just$ reverse $4) $2 }-- | struct_or_union attrs_opt identifier- {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 }---struct_or_union :: { Located CStructTag }-struct_or_union- : struct { L CStructTag (posOf $1) }- | union { L CUnionTag (posOf $1) }---struct_declaration_list :: { Reversed [CDecl] }-struct_declaration_list- : {- empty -} { empty }- | struct_declaration_list ';' { $1 }- | struct_declaration_list struct_declaration { $1 `snoc` $2 }----- parse C structure declaration (C99 6.7.2.1)----struct_declaration :: { CDecl }-struct_declaration- : struct_declaring_list ';'- { case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }-- | struct_default_declaring_list';'- { case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at }-- | "__extension__" struct_declaration { $2 }-------- * Note: doesn't redeclare typedef------ TODO: FIXME: AST doesn't allow recording attributes of unnamed struct members-struct_default_declaring_list :: { CDecl }-struct_default_declaring_list- : type_qualifier_list attrs_opt struct_identifier_declarator- {% withNodeInfo $1 $ case $3 of (d,s) -> CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [(d,Nothing,s)] }-- -- GNU extension: __attribute__ as only type qualifier- | attrs struct_identifier_declarator- {% withNodeInfo $1 $ case $2 of (d,s) -> CDecl (liftCAttrs $1) [(d,Nothing,s)] }- -- attrs_opt apply to the declared object- | struct_default_declaring_list ',' attrs_opt struct_identifier_declarator- { case $1 of- CDecl declspecs dies at ->- case $4 of- (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs $3 d,Nothing,s) : dies) at- (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at } -- FIXME---- * GNU extensions:--- allow anonymous nested structures and unions--- FIXME: cannot record attribute of unnamed field-struct_declaring_list :: { CDecl }-struct_declaring_list- : type_specifier struct_declarator attrs_opt- {% withNodeInfo $1 $ case $2 of { (Just d,s) -> CDecl $1 [(Just $! appendObjAttrs $3 d,Nothing,s)]- ; (Nothing,s) -> CDecl $1 [(Nothing,Nothing,s)] } } {- DO FIXME -}- | struct_declaring_list ',' attrs_opt struct_declarator attrs_opt- { case $1 of- CDecl declspecs dies attr ->- case $4 of- (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs ($3++$5) d,Nothing,s) : dies) attr- (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr }-- -- FIXME: We're being far too liberal in the parsing here, we really want to just- -- allow unnamed struct and union fields but we're actually allowing any- -- unnamed struct member. Making it allow only unnamed structs or unions in- -- the parser is far too tricky, it makes things ambiguous. So we'll have to- -- diagnose unnamed fields that are not structs/unions in a later stage.-- -- Note that a plain type specifier can have a trailing attribute-- | type_specifier- {% withNodeInfo $1 $ CDecl $1 [] }----- parse C structure declarator (C99 6.7.2.1)----struct_declarator :: { (Maybe CDeclr, Maybe CExpr) }-struct_declarator- : declarator { (Just (reverseDeclr $1), Nothing) }- | ':' constant_expression { (Nothing, Just $2) }- | declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) }---- FIXME: anonymous bitfield doesn't allow recording of attributes-struct_identifier_declarator :: { (Maybe CDeclr, Maybe CExpr) }-struct_identifier_declarator- : identifier_declarator { (Just (reverseDeclr $1), Nothing) }- | ':' constant_expression { (Nothing, Just $2) }- | identifier_declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) }- | struct_identifier_declarator attr- { case $1 of { (Nothing,expr) -> (Nothing,expr) {- FIXME -}- ; (Just (CDeclr name derived asmname attrs node), bsz) ->- (Just (CDeclr name derived asmname (attrs++$2) node),bsz)- }- }---- parse C enumeration declaration (C99 6.7.2.2)------ * Summary:--- enum (identifier? '{' ... '}' | identifier)----enum_specifier :: { CEnum }-enum_specifier- : enum attrs_opt '{' enumerator_list '}'- {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 }-- | enum attrs_opt '{' enumerator_list ',' '}'- {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 }-- | enum attrs_opt identifier '{' enumerator_list '}'- {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }-- | enum attrs_opt identifier '{' enumerator_list ',' '}'- {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 }-- | enum attrs_opt identifier- {% withNodeInfo $1 $ CEnum (Just $3) Nothing $2 }--enumerator_list :: { Reversed [(Ident, Maybe CExpr)] }-enumerator_list- : enumerator { singleton $1 }- | enumerator_list ',' enumerator { $1 `snoc` $3 }---enumerator :: { (Ident, Maybe CExpr) }-enumerator- : identifier { ($1, Nothing) }- | identifier attrs { ($1, Nothing) }- | identifier attrs '=' constant_expression { ($1, Just $4) }- | identifier '=' constant_expression { ($1, Just $3) }----- parse C type qualifier (C11 6.7.3)------ concerning atomic, note: If the _Atomic keyword is immediately followed by a left--- parenthesis, it should be interpreted as a type specifier (with a type name), not as a type qualifier-type_qualifier :: { CTypeQual }-type_qualifier- : const {% withNodeInfo $1 $ CConstQual }- | volatile {% withNodeInfo $1 $ CVolatQual }- | restrict {% withNodeInfo $1 $ CRestrQual }- | "_Nullable" {% withNodeInfo $1 $ CNullableQual }- | "_Nonnull" {% withNodeInfo $1 $ CNonnullQual }- | "_Atomic" {% withNodeInfo $1 $ CAtomicQual }---- a list containing at least one type_qualifier (const, volatile, restrict, inline, _Noreturn)--- and additionally CAttrs-type_qualifier_list :: { Reversed [CTypeQual] }-type_qualifier_list- : attrs_opt type_qualifier { reverseList (map CAttrQual $1) `snoc` $2 }- | type_qualifier_list type_qualifier { $1 `snoc` $2 }- | type_qualifier_list attrs type_qualifier { ($1 `rappend` map CAttrQual $2) `snoc` $3}---- parse C declarator (C99 6.7.5)----declarator :: { CDeclrR }-declarator- : identifier_declarator { $1 }- | typedef_declarator { $1 }----- Parse GNU C's asm annotations------ Those annotations allow to give an assembler name to a function or identifier.-asm_opt :: { Maybe CStrLit }-asm_opt- : {- empty -} { Nothing }- | asm '(' string_literal ')' { Just $3 }------- typedef_declarator :---typedef_declarator :: { CDeclrR }-typedef_declarator- -- would be ambiguous as parameter- : paren_typedef_declarator { $1 }-- -- not ambiguous as param- | parameter_typedef_declarator { $1 }----- parameter_typedef_declarator :- tyident declarator_postfix?--- | '(' attrs? clean_typedef_declarator ')' declarator_postfix?--- | '*' attrs? type_qualifier_list? parameter_typedef_declarator----parameter_typedef_declarator :: { CDeclrR }-parameter_typedef_declarator- : tyident- {% withNodeInfo $1 $ mkVarDeclr $1 }-- | tyident postfixing_abstract_declarator- {% withNodeInfo $1 $ \at -> $2 (mkVarDeclr $1 at) }-- | clean_typedef_declarator- { $1 }----- The following have at least one '*'.--- There is no (redundant) '(' between the '*' and the tyident.------ clean_typedef_declarator :- '(' attrs? clean_typedef_declarator ')' declarator_postfix?--- | '*' attrs? type_qualifier_list? parameter_typedef_declarator----clean_typedef_declarator :: { CDeclrR }-clean_typedef_declarator- : clean_postfix_typedef_declarator- { $1 }-- | '*' parameter_typedef_declarator- {% withNodeInfo $1 $ ptrDeclr $2 [] }-- | '*' attrs parameter_typedef_declarator- {% withAttribute $1 $2 $ ptrDeclr $3 [] }-- | '*' type_qualifier_list parameter_typedef_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }-- | '*' type_qualifier_list attrs parameter_typedef_declarator- {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }---- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix?----clean_postfix_typedef_declarator :: { CDeclrR }-clean_postfix_typedef_declarator- : '(' clean_typedef_declarator ')' { $2 }- | '(' clean_typedef_declarator ')' postfixing_abstract_declarator { $4 $2 }- | '(' attrs clean_typedef_declarator ')' { appendDeclrAttrs $2 $3 }- | '(' attrs clean_typedef_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) }----- The following have a redundant '(' placed--- immediately to the left of the tyident----paren_typedef_declarator :: { CDeclrR }-paren_typedef_declarator- : paren_postfix_typedef_declarator- { $1 }-- -- redundant paren- | '*' '(' simple_paren_typedef_declarator ')'- {% withNodeInfo $1 $ ptrDeclr $3 [] }-- | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')'- {% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) }- | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')'- {% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2) }-- | '*' paren_typedef_declarator- {% withNodeInfo $1 $ ptrDeclr $2 [] }-- | '*' type_qualifier_list paren_typedef_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }- | '*' type_qualifier_list attrs paren_typedef_declarator- {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }---- redundant paren to left of tname-paren_postfix_typedef_declarator :: { CDeclrR }-paren_postfix_typedef_declarator- : '(' paren_typedef_declarator ')'- { $2 }-- -- redundant paren- | '(' simple_paren_typedef_declarator postfixing_abstract_declarator ')'- { $3 $2 }-- | '(' paren_typedef_declarator ')' postfixing_abstract_declarator- { $4 $2 }----- Just a type name in any number of nested brackets----simple_paren_typedef_declarator :: { CDeclrR }-simple_paren_typedef_declarator- : tyident- {% withNodeInfo $1 $ mkVarDeclr $1 }-- | '(' simple_paren_typedef_declarator ')'- { $2 }------- Declarators--- * Summary--- declarator :- ( '*' (type_qualifier | attr)* )* ident ( array_decl | "(" parameter-list ")" )?--- + additional parenthesis----identifier_declarator :: { CDeclrR }-identifier_declarator- : unary_identifier_declarator { $1 }- | paren_identifier_declarator { $1 }---unary_identifier_declarator :: { CDeclrR }-unary_identifier_declarator- : postfix_identifier_declarator- { $1 }-- | '*' identifier_declarator- {% withNodeInfo $1 $ ptrDeclr $2 [] }-- | '*' attrs identifier_declarator- {% withAttribute $1 $2 $ ptrDeclr $3 [] }-- | '*' type_qualifier_list identifier_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }-- | '*' type_qualifier_list attrs identifier_declarator- {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) }--postfix_identifier_declarator :: { CDeclrR }-postfix_identifier_declarator- : paren_identifier_declarator postfixing_abstract_declarator- { $2 $1 }-- | '(' unary_identifier_declarator ')'- { $2 }-- | '(' unary_identifier_declarator ')' postfixing_abstract_declarator- { $4 $2 }-- | '(' attrs unary_identifier_declarator ')'- { appendDeclrAttrs $2 $3 }-- | '(' attrs unary_identifier_declarator ')' postfixing_abstract_declarator- { appendDeclrAttrs $2 ($5 $3) }----- just an identifier in any number of nested parenthesis-paren_identifier_declarator :: { CDeclrR }-paren_identifier_declarator- : ident- {% withNodeInfo $1 $ mkVarDeclr $1 }-- | '(' paren_identifier_declarator ')'- { $2 }-- | '(' attrs paren_identifier_declarator ')'- { appendDeclrAttrs $2 $3 }--function_declarator_old :: { CDeclr }-function_declarator_old- : old_function_declarator- { reverseDeclr $1 }--old_function_declarator :: { CDeclrR }-old_function_declarator- : postfix_old_function_declarator- { $1 }-- | '*' old_function_declarator- {% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ???-- | '*' type_qualifier_list old_function_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }--postfix_old_function_declarator :: { CDeclrR }-postfix_old_function_declarator- : paren_identifier_declarator '(' identifier_list ')'- {% withNodeInfo $1 $ funDeclr $1 (Left $ reverse $3) [] }-- | '(' old_function_declarator ')'- { $2 }-- | '(' old_function_declarator ')' postfixing_abstract_declarator- { $4 $2 }----- parse C parameter type list (C99 6.7.5)----parameter_type_list :: { ([CDecl], Bool) }-parameter_type_list- : {- empty -} { ([], False)}- | parameter_list { (reverse $1, False) }- | parameter_list ',' "..." { (reverse $1, True) }--parameter_list :: { Reversed [CDecl] }-parameter_list- : parameter_declaration { singleton $1 }- | parameter_list ',' parameter_declaration { $1 `snoc` $3 }--parameter_declaration :: { CDecl }-parameter_declaration- : declaration_specifier- {% withNodeInfo $1 $ CDecl $1 [] }-- | declaration_specifier abstract_declarator- {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }-- | declaration_specifier identifier_declarator attrs_opt- {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }-- | declaration_specifier parameter_typedef_declarator attrs_opt- {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }-- | declaration_qualifier_list- {% withNodeInfo $1 $ CDecl (reverse $1) [] }-- | declaration_qualifier_list abstract_declarator- {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }-- | declaration_qualifier_list identifier_declarator attrs_opt- {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }-- | type_specifier- {% withNodeInfo $1 $ CDecl $1 [] }-- | type_specifier abstract_declarator- {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }-- | type_specifier identifier_declarator attrs_opt- {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }-- | type_specifier parameter_typedef_declarator attrs_opt- {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] }-- | type_qualifier_list- {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [] }- | type_qualifier_list attr- {% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }-- | type_qualifier_list abstract_declarator- {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }-- | type_qualifier_list identifier_declarator attrs_opt- {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr$ appendDeclrAttrs $3 $2), Nothing, Nothing)] }---identifier_list :: { Reversed [Ident] }-identifier_list- : ident { singleton $1 }- | identifier_list ',' ident { $1 `snoc` $3 }----- parse C type name (C99 6.7.6)----type_name :: { CDecl }-type_name- : type_specifier- {% withNodeInfo $1 $ CDecl $1 [] }-- | type_specifier abstract_declarator- {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] }-- | type_qualifier_list attr- {% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] }-- | type_qualifier_list abstract_declarator- {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] }---- parse C abstract declarator (C99 6.7.6)------ postfix starts with '('--- postfixing starts with '(' or '['--- unary start with '*'-abstract_declarator :: { CDeclrR }-abstract_declarator- : unary_abstract_declarator { $1 }- | postfix_abstract_declarator { $1 }- | postfixing_abstract_declarator { $1 emptyDeclr }------- FIXME--- | postfixing_abstract_declarator attrs_opt { $1 emptyDeclr }---postfixing_abstract_declarator :: { CDeclrR -> CDeclrR }-postfixing_abstract_declarator- : array_abstract_declarator- { $1 }-- | '(' parameter_type_list ')'- {% withNodeInfo $1 $ \at declr -> case $2 of- (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at }----- * TODO: Note that we recognise but ignore the C99 static keyword (see C99 6.7.5.3)------ * TODO: We do not distinguish in the AST between incomplete array types and--- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2)----array_abstract_declarator :: { CDeclrR -> CDeclrR }-array_abstract_declarator- : postfix_array_abstract_declarator- { $1 }-- | array_abstract_declarator postfix_array_abstract_declarator- { \decl -> $2 ($1 decl) }------- TODO: record static-postfix_array_abstract_declarator :: { CDeclrR -> CDeclrR }-postfix_array_abstract_declarator- : '[' assignment_expression_opt ']'- {% withNodeInfo $1 $ \at declr -> arrDeclr declr [] False False $2 at }-- | '[' attrs assignment_expression_opt ']'- {% withAttributePF $1 $2 $ \at declr -> arrDeclr declr [] False False $3 at }-- | '[' type_qualifier_list assignment_expression_opt ']'- {% withNodeInfo $1 $ \at declr -> arrDeclr declr (reverse $2) False False $3 at }-- | '[' type_qualifier_list attrs assignment_expression_opt ']'- {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (reverse $2) False False $4 at }-- | '[' static attrs_opt assignment_expression ']'- {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] False True (Just $4) at }-- | '[' static type_qualifier_list attrs_opt assignment_expression ']'- {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $3) False True (Just $5) at }-- | '[' type_qualifier_list attrs_opt static attrs_opt assignment_expression ']'- {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) False True (Just $6) at }-- | '[' '*' attrs_opt ']'- {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at }- | '[' attrs '*' attrs_opt ']'- {% withAttributePF $1 ($2 ++ $4) $ \at declr -> arrDeclr declr [] True False Nothing at }-- | '[' type_qualifier_list '*' attrs_opt ']'- {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }- | '[' type_qualifier_list attrs '*' attrs_opt ']'- {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at }--unary_abstract_declarator :: { CDeclrR }-unary_abstract_declarator- : '*'- {% withNodeInfo $1 $ ptrDeclr emptyDeclr [] }-- | '*' type_qualifier_list attrs_opt- {% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2) }-- | '*' abstract_declarator- {% withNodeInfo $1 $ ptrDeclr $2 [] }-- | '*' type_qualifier_list abstract_declarator- {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) }-- | '*' attrs- {% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] }- | '*' attrs abstract_declarator- {% withAttribute $1 $2 $ ptrDeclr $3 [] }---- postfix_ad starts with '(', postfixing with '(' or '[', unary_abstract starts with '*'-postfix_abstract_declarator :: { CDeclrR }-postfix_abstract_declarator- : '(' unary_abstract_declarator ')' { $2 }- | '(' postfix_abstract_declarator ')' { $2 }- | '(' postfixing_abstract_declarator ')' { $2 emptyDeclr }- | '(' unary_abstract_declarator ')' postfixing_abstract_declarator { $4 $2 }---- FIX 0700- | '(' attrs unary_abstract_declarator ')' { appendDeclrAttrs $2 $3 }- | '(' attrs postfix_abstract_declarator ')' { appendDeclrAttrs $2 $3 }- | '(' attrs postfixing_abstract_declarator ')' { appendDeclrAttrs $2 ($3 emptyDeclr) }- | '(' attrs unary_abstract_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) }- | postfix_abstract_declarator attr { appendDeclrAttrs $2 $1 }----- parse C initializer (C99 6.7.8)----initializer :: { CInit }-initializer- : assignment_expression {% withNodeInfo $1 $ CInitExpr $1 }- | '{' initializer_list '}' {% withNodeInfo $1 $ CInitList (reverse $2) }- | '{' initializer_list ',' '}' {% withNodeInfo $1 $ CInitList (reverse $2) }---initializer_opt :: { Maybe CInit }-initializer_opt- : {- empty -} { Nothing }- | '=' initializer { Just $2 }---initializer_list :: { Reversed CInitList }-initializer_list- : {- empty -} { empty }- | initializer { singleton ([],$1) }- | designation initializer { singleton ($1,$2) }- | initializer_list ',' initializer { $1 `snoc` ([],$3) }- | initializer_list ',' designation initializer { $1 `snoc` ($3,$4) }----- designation------ * GNU extensions:--- old style member designation: 'ident :'--- array range designation----designation :: { [CDesignator] }-designation- : designator_list '=' { reverse $1 }- | identifier ':' {% withNodeInfo $1 $ \at -> [CMemberDesig $1 at] }- | array_designator { [$1] }---designator_list :: { Reversed [CDesignator] }-designator_list- : designator { singleton $1 }- | designator_list designator { $1 `snoc` $2 }---designator :: { CDesignator }-designator- : '[' constant_expression ']' {% withNodeInfo $1 $ CArrDesig $2 }- | '.' identifier {% withNodeInfo $1 $ CMemberDesig $2 }- | array_designator { $1 }---array_designator :: { CDesignator }-array_designator- : '[' constant_expression "..." constant_expression ']'- {% withNodeInfo $1 $ CRangeDesig $2 $4 }----- parse C primary expression (C11 6.5.1)------ We cannot use a typedef name as a variable------ * C11: generic selection--- * GNU extensions:--- allow a compound statement as an expression--- __builtin_va_arg--- __builtin_offsetof--- __builtin_types_compatible_p-primary_expression :: { CExpr }-primary_expression- : ident {% withNodeInfo $1 $ CVar $1 }- | constant { CConst $1 }- | string_literal { CConst (liftStrLit $1) }- | '(' expression ')' { $2 }- | "_Generic" '(' assignment_expression ',' generic_assoc_list ')'- {% withNodeInfo $1 $ CGenericSelection $3 (reverse $5) }- -- GNU extensions- | '(' compound_statement ')'- {% withNodeInfo $1 $ CStatExpr $2 }-- | "__builtin_va_arg" '(' assignment_expression ',' type_name ')'- {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 }-- | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')'- {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) }-- | "__builtin_types_compatible_p" '(' type_name ',' type_name ')'- {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 }-- | "__builtin_convertvector" '(' assignment_expression ',' type_name ')'- {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinConvertVector $3 $5 }---- Generic Selection association list (C11 6.5.1.1)------ TODO: introduce AST type for generic association-generic_assoc_list :: { Reversed [(Maybe CDecl, CExpr)] }- : generic_assoc_list ',' generic_assoc { $1 `snoc` $3 }- | generic_assoc { singleton $1 }-generic_assoc :: { (Maybe CDecl, CExpr) }-generic_assoc- : type_name ':' assignment_expression { (Just $1, $3) }- | default ':' assignment_expression { (Nothing, $3) }--offsetof_member_designator :: { Reversed [CDesignator] }-offsetof_member_designator- : identifier {% withNodeInfo $1 $ singleton . CMemberDesig $1 }- | offsetof_member_designator '.' identifier {% withNodeInfo $3 $ ($1 `snoc`) . CMemberDesig $3 }- | offsetof_member_designator '[' expression ']' {% withNodeInfo $3 $ ($1 `snoc`) . CArrDesig $3 }----- parse C postfix expression (C99 6.5.2)----postfix_expression :: { CExpr }-postfix_expression- : primary_expression- { $1 }-- | postfix_expression '[' expression ']'- {% withNodeInfo $1 $ CIndex $1 $3 }-- | postfix_expression '(' ')'- {% withNodeInfo $1 $ CCall $1 [] }-- | postfix_expression '(' argument_expression_list ')'- {% withNodeInfo $1 $ CCall $1 (reverse $3) }-- | postfix_expression '.' identifier- {% withNodeInfo $1 $ CMember $1 $3 False }-- | postfix_expression "->" identifier- {% withNodeInfo $1 $ CMember $1 $3 True }-- | postfix_expression "++"- {% withNodeInfo $1 $ CUnary CPostIncOp $1 }-- | postfix_expression "--"- {% withNodeInfo $1 $ CUnary CPostDecOp $1 }-- | '(' type_name ')' '{' initializer_list '}'- {% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }-- | '(' type_name ')' '{' initializer_list ',' '}'- {% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) }---argument_expression_list :: { Reversed [CExpr] }-argument_expression_list- : assignment_expression { singleton $1 }- | argument_expression_list ',' assignment_expression { $1 `snoc` $3 }----- parse C unary expression (C99 6.5.3)------ * GNU extensions:--- 'alignof' expression or type--- '__real' and '__imag' expression--- '__extension__' to suppress warnings about extensions--- allow taking address of a label with: && label----unary_expression :: { CExpr }-unary_expression- : postfix_expression { $1 }- | "++" unary_expression {% withNodeInfo $1 $ CUnary CPreIncOp $2 }- | "--" unary_expression {% withNodeInfo $1 $ CUnary CPreDecOp $2 }- | "__extension__" cast_expression { $2 }- | unary_operator cast_expression {% withNodeInfo $1 $ CUnary (unL $1) $2 }- | sizeof unary_expression {% withNodeInfo $1 $ CSizeofExpr $2 }- | sizeof '(' type_name ')' {% withNodeInfo $1 $ CSizeofType $3 }- -- GNU: alignof, complex and && extension- | alignof unary_expression {% withNodeInfo $1 $ CAlignofExpr $2 }- | alignof '(' type_name ')' {% withNodeInfo $1 $ CAlignofType $3 }- | "__real__" unary_expression {% withNodeInfo $1 $ CComplexReal $2 }- | "__imag__" unary_expression {% withNodeInfo $1 $ CComplexImag $2 }- | "&&" identifier {% withNodeInfo $1 $ CLabAddrExpr $2 }---unary_operator :: { Located CUnaryOp }-unary_operator- : '&' { L CAdrOp (posOf $1) }- | '*' { L CIndOp (posOf $1) }- | '+' { L CPlusOp (posOf $1) }- | '-' { L CMinOp (posOf $1) }- | '~' { L CCompOp (posOf $1) }- | '!' { L CNegOp (posOf $1) }----- parse C cast expression (C99 6.5.4)----cast_expression :: { CExpr }-cast_expression- : unary_expression { $1 }- | '(' type_name ')' cast_expression {% withNodeInfo $1 $ CCast $2 $4 }----- parse C multiplicative expression (C99 6.5.5)----multiplicative_expression :: { CExpr }-multiplicative_expression- : cast_expression- { $1 }-- | multiplicative_expression '*' cast_expression- {% withNodeInfo $1 $ CBinary CMulOp $1 $3 }-- | multiplicative_expression '/' cast_expression- {% withNodeInfo $1 $ CBinary CDivOp $1 $3 }-- | multiplicative_expression '%' cast_expression- {% withNodeInfo $1 $ CBinary CRmdOp $1 $3 }----- parse C additive expression (C99 6.5.6)----additive_expression :: { CExpr }-additive_expression- : multiplicative_expression- { $1 }-- | additive_expression '+' multiplicative_expression- {% withNodeInfo $1 $ CBinary CAddOp $1 $3 }-- | additive_expression '-' multiplicative_expression- {% withNodeInfo $1 $ CBinary CSubOp $1 $3 }----- parse C shift expression (C99 6.5.7)----shift_expression :: { CExpr }-shift_expression- : additive_expression- { $1 }-- | shift_expression "<<" additive_expression- {% withNodeInfo $1 $ CBinary CShlOp $1 $3 }-- | shift_expression ">>" additive_expression- {% withNodeInfo $1 $ CBinary CShrOp $1 $3 }----- parse C relational expression (C99 6.5.8)----relational_expression :: { CExpr }-relational_expression- : shift_expression- { $1 }-- | relational_expression '<' shift_expression- {% withNodeInfo $1 $ CBinary CLeOp $1 $3 }-- | relational_expression '>' shift_expression- {% withNodeInfo $1 $ CBinary CGrOp $1 $3 }-- | relational_expression "<=" shift_expression- {% withNodeInfo $1 $ CBinary CLeqOp $1 $3 }-- | relational_expression ">=" shift_expression- {% withNodeInfo $1 $ CBinary CGeqOp $1 $3 }----- parse C equality expression (C99 6.5.9)----equality_expression :: { CExpr }-equality_expression- : relational_expression- { $1 }-- | equality_expression "==" relational_expression- {% withNodeInfo $1 $ CBinary CEqOp $1 $3 }-- | equality_expression "!=" relational_expression- {% withNodeInfo $1 $ CBinary CNeqOp $1 $3 }----- parse C bitwise and expression (C99 6.5.10)----and_expression :: { CExpr }-and_expression- : equality_expression- { $1 }-- | and_expression '&' equality_expression- {% withNodeInfo $1 $ CBinary CAndOp $1 $3 }----- parse C bitwise exclusive or expression (C99 6.5.11)----exclusive_or_expression :: { CExpr }-exclusive_or_expression- : and_expression- { $1 }-- | exclusive_or_expression '^' and_expression- {% withNodeInfo $1 $ CBinary CXorOp $1 $3 }----- parse C bitwise or expression (C99 6.5.12)----inclusive_or_expression :: { CExpr }-inclusive_or_expression- : exclusive_or_expression- { $1 }-- | inclusive_or_expression '|' exclusive_or_expression- {% withNodeInfo $1 $ CBinary COrOp $1 $3 }----- parse C logical and expression (C99 6.5.13)----logical_and_expression :: { CExpr }-logical_and_expression- : inclusive_or_expression- { $1 }-- | logical_and_expression "&&" inclusive_or_expression- {% withNodeInfo $1 $ CBinary CLndOp $1 $3 }----- parse C logical or expression (C99 6.5.14)----logical_or_expression :: { CExpr }-logical_or_expression- : logical_and_expression- { $1 }-- | logical_or_expression "||" logical_and_expression- {% withNodeInfo $1 $ CBinary CLorOp $1 $3 }----- parse C conditional expression (C99 6.5.15)------ * GNU extensions:--- omitting the `then' part-conditional_expression :: { CExpr }-conditional_expression- : logical_or_expression- { $1 }-- | logical_or_expression '?' expression ':' conditional_expression- {% withNodeInfo $1 $ CCond $1 (Just $3) $5 }-- | logical_or_expression '?' ':' conditional_expression- {% withNodeInfo $1 $ CCond $1 Nothing $4 }----- parse C assignment expression (C99 6.5.16)------ * NOTE: LHS of assignment is more restricted than in gcc.--- `x ? y : z = 3' parses in gcc as `(x ? y : z) = 3',--- but `x ? y : z' is not an unary expression.-assignment_expression :: { CExpr }-assignment_expression- : conditional_expression- { $1 }-- | unary_expression assignment_operator assignment_expression- {% withNodeInfo $1 $ CAssign (unL $2) $1 $3 }---assignment_operator :: { Located CAssignOp }-assignment_operator- : '=' { L CAssignOp (posOf $1) }- | "*=" { L CMulAssOp (posOf $1) }- | "/=" { L CDivAssOp (posOf $1) }- | "%=" { L CRmdAssOp (posOf $1) }- | "+=" { L CAddAssOp (posOf $1) }- | "-=" { L CSubAssOp (posOf $1) }- | "<<=" { L CShlAssOp (posOf $1) }- | ">>=" { L CShrAssOp (posOf $1) }- | "&=" { L CAndAssOp (posOf $1) }- | "^=" { L CXorAssOp (posOf $1) }- | "|=" { L COrAssOp (posOf $1) }----- parse C expression (C99 6.5.17)----expression :: { CExpr }-expression- : assignment_expression- { $1 }-- | assignment_expression ',' comma_expression- {% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) }--comma_expression :: { Reversed [CExpr] }-comma_expression- : assignment_expression { singleton $1 }- | comma_expression ',' assignment_expression { $1 `snoc` $3 }----- The following was used for clarity-expression_opt :: { Maybe CExpr }-expression_opt- : {- empty -} { Nothing }- | expression { Just $1 }----- The following was used for clarity-assignment_expression_opt :: { Maybe CExpr }-assignment_expression_opt- : {- empty -} { Nothing }- | assignment_expression { Just $1 }----- parse C constant expression (C99 6.6)----constant_expression :: { CExpr }-constant_expression- : conditional_expression { $1 }----- parse C constants----constant :: { CConst }-constant- : cint {% withNodeInfo $1 $ case $1 of CTokILit _ i -> CIntConst i }- | cchar {% withNodeInfo $1 $ case $1 of CTokCLit _ c -> CCharConst c }- | cfloat {% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f }---string_literal :: { CStrLit }-string_literal- : cstr- {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit s }-- | cstr string_literal_list- {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse $2)) }---string_literal_list :: { Reversed [CString] }-string_literal_list- : cstr { case $1 of CTokSLit _ s -> singleton s }- | string_literal_list cstr { case $2 of CTokSLit _ s -> $1 `snoc` s }--clang_version_literal :: { ClangCVersion }- : clangcversion { $1 }--identifier :: { Ident }-identifier- : ident { $1 }- | tyident { $1 }----- parse GNU C attribute annotation-attrs_opt :: { [CAttr] }-attrs_opt- : {- empty -} { [] }- | attrs { $1 }---- GNU C attribute annotation-attrs :: { [CAttr] }-attrs- : attr { $1 }- | attrs attr { $1 ++ $2 }--attr :: { [CAttr] }-attr- : "__attribute__" '(' '(' attribute_list ')' ')' { reverse $4 }--attribute_list :: { Reversed [CAttr] }- : attribute { case $1 of Nothing -> empty; Just attr -> singleton attr }- | attribute_list ',' attribute { (maybe id (flip snoc) $3) $1 }---attribute :: { Maybe CAttr }-attribute- : {- empty -} { Nothing }- | ident {% withNodeInfo $1 $ Just . CAttr $1 [] }- | const {% withNodeInfo $1 $ Just . CAttr (internalIdent "const") [] }- | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (reverse $3) }- | ident '(' ')' {% withNodeInfo $1 $ Just . CAttr $1 [] }---- OS X 10.9 (Mavericks) makes use of more liberal attribute syntax--- that includes assignment-like expressions referencing version--- numbers.--attribute_params :: { Reversed [CExpr] }-attribute_params- : constant_expression { singleton $1 }- | unary_expression assignment_operator clang_version_literal { Reversed [] }- | unary_expression assignment_operator unary_expression { Reversed [] }- | attribute_params ',' constant_expression { $1 `snoc` $3 }- | attribute_params ',' unary_expression assignment_operator unary_expression { $1 }- | attribute_params ',' unary_expression assignment_operator clang_version_literal { $1 }--{---- sometimes it is neccessary to reverse an unreversed list-reverseList :: [a] -> Reversed [a]-reverseList = Reversed . List.reverse---- We occasionally need things to have a location when they don't naturally--- have one built in as tokens and most AST elements do.----data Located a = L !a !Position--unL :: Located a -> a-unL (L a pos) = a--instance Pos (Located a) where- posOf (L _ pos) = pos---- FIXME: the next 3 inlines here increase the object file size by 70%--- Check whether the speed win is worth it-{-# INLINE withNodeInfo #-}-withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a-withNodeInfo node mkAttrNode = do- name <- getNewName- lastTok <- getSavedToken- let firstPos = posOf node- let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name- attrs `seq` return (mkAttrNode attrs)--{-# INLINE withLength #-}-withLength :: NodeInfo -> (NodeInfo -> a) -> P a-withLength nodeinfo mkAttrNode = do- lastTok <- getSavedToken- let firstPos = posOfNode nodeinfo- let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok)- (maybe (error "nameOfNode") id (nameOfNode nodeinfo))- attrs `seq` return (mkAttrNode attrs)--data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo-reverseDeclr :: CDeclrR -> CDeclr-reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at)- = CDeclr ide (reverse reversedDDs) asmname cattrs at-instance CNode (CDeclrR) where- nodeInfo (CDeclrR _ _ _ _ n) = n-instance Pos (CDeclrR) where- posOf (CDeclrR _ _ _ _ n) = posOf n--{-# INLINE withAttribute #-}-withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR-withAttribute node cattrs mkDeclrNode = do- name <- getNewName- let attrs = mkNodeInfo (posOf node) name- let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs- attrs `seq` newDeclr `seq` return newDeclr---- postfixing variant-{-# INLINE withAttributePF #-}-withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR)-withAttributePF node cattrs mkDeclrCtor = do- name <- getNewName- let attrs = mkNodeInfo (posOf node) name- let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs- attrs `seq` newDeclr `seq` return newDeclr---- add top level attributes for a declarator.------ In the following example------ > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3));------ the attributes `a1' and `a3' are top-level attributes for y.--- The (pseudo)-AST for the second declarator is------ > CDeclr "y"--- > [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ]--- > (asm "$y")--- > [__attribute__((a1)), __attribute__((a3)) ]------ So assembler names and preceeding and trailing attributes are recorded in object declarator.----appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr-appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at)- = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at-appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR-appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at)- = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at--setAsmName :: Maybe CStrLit -> CDeclrR -> P CDeclrR-setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) =- case combineName mAsmName oldName of- Left (n1,n2) -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2]- Right newName -> return $ CDeclrR ident indirections newName cattrs at- where- combineName Nothing Nothing = Right Nothing- combineName Nothing oldname@(Just _) = Right oldname- combineName newname@(Just _) Nothing = Right newname- combineName (Just n1) (Just n2) = Left (n1,n2)- showName (CStrLit cstr _) = show cstr--withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR-withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr)--appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at)- = CDeclrR ident empty asmname (cattrs ++ newAttrs) at-appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at)- = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where- appendAttrs (CPtrDeclr typeQuals at) = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at- appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at- appendAttrs (CFunDeclr parameters cattrs at) = CFunDeclr parameters (cattrs ++ newAttrs) at--ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR-ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at- = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat-funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR-funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at- = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat-arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR-arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at- = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat )- where- arr_sz = case size_expr_opt of- Just e -> CArrSize static_size e- Nothing -> CNoArrSize var_sized--liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec]-liftTypeQuals = map CTypeQual . reverse---- lift CAttrs to DeclSpecs----liftCAttrs :: [CAttr] -> [CDeclSpec]-liftCAttrs = map (CTypeQual . CAttrQual)---- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list--- needs special care when @decl_spec_n@ is a SUE definition-addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec]-addTrailingAttrs declspecs new_attrs =- case viewr declspecs of- (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node))- -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node))- (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node))- -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node))- _ -> declspecs `rappend` (liftCAttrs new_attrs)---- convenient instance, the position of a list of things is the position of--- the first thing in the list----instance Pos a => Pos [a] where- posOf (x:_) = posOf x--instance Pos a => Pos (Reversed a) where- posOf (Reversed x) = posOf x--emptyDeclr :: CDeclrR-emptyDeclr = CDeclrR Nothing empty Nothing [] undefNode-mkVarDeclr :: Ident -> NodeInfo -> CDeclrR-mkVarDeclr ident = CDeclrR (Just ident) empty Nothing []---- Take the identifiers and use them to update the typedef'ed identifier set--- if the decl is defining a typedef then we add it to the set,--- if it's a var decl then that shadows typedefed identifiers----doDeclIdent :: [CDeclSpec] -> CDeclrR -> P ()-doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) =- case mIdent of- Nothing -> return ()- Just ident | any iypedef declspecs -> addTypedef ident- | otherwise -> shadowTypedef ident-- where iypedef (CStorageSpec (CTypedef _)) = True- iypedef _ = False--doFuncParamDeclIdent :: CDeclr -> P ()-doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) =- sequence_- [ case getCDeclrIdent declr of- Nothing -> return ()- Just ident -> shadowTypedef ident- | CDecl _ dle _ <- either (const []) fst params- , (Just declr, _, _) <- dle ]-doFuncParamDeclIdent _ = return ()---- extract all identifiers-getCDeclrIdent :: CDeclr -> Maybe Ident-getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent--happyError :: P a-happyError = parseError---- * public interface---- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors.-parseC :: InputStream -> Position -> Either ParseError CTranslUnit-parseC input initialPosition =- fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0)---- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations.-translUnitP :: P CTranslUnit-translUnitP = translation_unit--- | @extDeclP@ provides a parser for an external (file-scope) declaration-extDeclP :: P CExtDecl-extDeclP = external_declaration--- | @statementP@ provides a parser for C statements-statementP :: P CStat-statementP = statement--- | @expressionP@ provides a parser for C expressions-expressionP :: P CExpr-expressionP = expression-}+----------------------------------------------------------------------------- +-- Module : Parser.y +-- Copyright : (c) 2005-2007 Duncan Coutts +-- (c) 2008 Benedikt Huber +-- (c) [1999..2004] Manuel M T Chakravarty +-- Portions copyright 1989, 1990 James A. Roskind +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Portability : portable +-- +-- Parser for C translation units, which have already been run through the C +-- preprocessor. It is recommended to use the `strict' flag for happy. +-- +-- The parser recognizes all of ISO C 99 and most GNU C extensions. +-- +-- With C99 we refer to the ISO C99 standard, specifically the section numbers +-- used below refer to this report: +-- +-- <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf> +-- +-- GNU extensions are documented in the gcc parser +-- +-- <http://gcc.gnu.org/viewcvs/trunk/gcc/c-parser.c> +-- +-- and in: <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html> +-- +-- The set of supported extensions is documented in +-- +-- <http://www.sivity.net/projects/language.c/wiki/Cee> +------------------------------------------------------------------ +{ +module Language.C.Parser.Parser ( + -- * Parse a C translation unit + parseC, + -- * Exposed Parsers + translUnitP, extDeclP, statementP, expressionP +) where + +-- Relevant C99 sections: +-- +-- 6.5 Expressions .1 - .17 and 6.6 (almost literally) +-- Supported GNU extensions: +-- - Allow a compound statement as an expression +-- - Various __builtin_* forms that take type parameters +-- - `alignof' expression or type +-- - `__extension__' to suppress warnings about extensions +-- - Allow taking address of a label with: && label +-- - Omitting the `then' part of conditional expressions +-- - complex numbers +-- +-- 6.7 C Declarations .1 -.8 +-- Supported GNU extensions: +-- - '__thread' thread local storage (6.7.1) +-- +-- 6.8 Statements .1 - .8 +-- Supported GNU extensions: +-- - case ranges (C99 6.8.1) +-- - '__label__ ident;' declarations (C99 6.8.2) +-- - computed gotos (C99 6.8.6) +-- +-- 6.9 Translation unit +-- Supported GNU extensions: +-- - allow empty translation_unit +-- - allow redundant ';' +-- - allow extension keyword before external declaration +-- - asm definitions +-- +-- Since some of the grammar productions are quite difficult to read, +-- (especially those involved with the decleration syntax) we document them +-- with an extended syntax that allows a more consise representation: +-- +-- Ordinary rules +-- +-- foo named terminal or non-terminal +-- +-- 'c' terminal, literal character token +-- +-- A B concatenation +-- +-- A | B alternation +-- +-- (A) grouping +-- +-- Extended rules +-- +-- A? optional, short hand for (A|) or [A]{ 0==A || 1==A } +-- +-- ... stands for some part of the grammar omitted for clarity +-- +-- {A} represents sequences, 0 or more. +-- +-- <permute> modifier which states that any permutation of the immediate subterms is valid +-- +-- +--- TODO ---------------------------------------------------------------------- +-- +-- !* We ignore C11 _Atomic type annotations +-- !* We ignore the C99 static keyword (see C99 6.7.5.3) +-- !* We do not distinguish in the AST between incomplete array types and +-- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2) +-- !* The AST doesn't allow recording __attribute__ of unnamed struct field +-- (see , struct_default_declaring_list, struct_identifier_declarator) +-- !* see `We're being far to liberal here' (... struct definition within structs) +-- * Documentation isn't complete and consistent yet. + +import Prelude hiding (reverse) +import qualified Data.List as List +import Control.Monad (mplus) +import Language.C.Parser.Builtin (builtinTypeNames) +import Language.C.Parser.Lexer (lexC, parseError) +import Language.C.Parser.Tokens (CToken(..), GnuCTok(..), ClangCTok (..), posLenOfTok) +import Language.C.Parser.ParserMonad (P, failP, execParser, getNewName, addTypedef, shadowTypedef, getCurrentPosition, + enterScope, leaveScope, getLastToken, getSavedToken, ParseError(..)) + +import Language.C.Data.RList +import Language.C.Data.InputStream +import Language.C.Data.Ident +import Language.C.Data.Name +import Language.C.Data.Node +import Language.C.Data.Position +import Language.C.Syntax + +} +-- in order to document the parsers, we have to alias them +%name translation_unit translation_unit +%name external_declaration external_declaration +%name statement statement +%name expression expression + +%tokentype { CToken } + +%monad { P } { >>= } { return } +%lexer { lexC } { CTokEof } + +%expect 1 + +%token + +'(' { CTokLParen _ } +')' { CTokRParen _ } +'[' { CTokLBracket _ } +']' { CTokRBracket _ } +"->" { CTokArrow _ } +'.' { CTokDot _ } +'!' { CTokExclam _ } +'~' { CTokTilde _ } +"++" { CTokInc _ } +"--" { CTokDec _ } +'+' { CTokPlus _ } +'-' { CTokMinus _ } +'*' { CTokStar _ } +'/' { CTokSlash _ } +'%' { CTokPercent _ } +'&' { CTokAmper _ } +"<<" { CTokShiftL _ } +">>" { CTokShiftR _ } +'<' { CTokLess _ } +"<=" { CTokLessEq _ } +'>' { CTokHigh _ } +">=" { CTokHighEq _ } +"==" { CTokEqual _ } +"!=" { CTokUnequal _ } +'^' { CTokHat _ } +'|' { CTokBar _ } +"&&" { CTokAnd _ } +"||" { CTokOr _ } +'?' { CTokQuest _ } +':' { CTokColon _ } +'=' { CTokAssign _ } +"+=" { CTokPlusAss _ } +"-=" { CTokMinusAss _ } +"*=" { CTokStarAss _ } +"/=" { CTokSlashAss _ } +"%=" { CTokPercAss _ } +"&=" { CTokAmpAss _ } +"^=" { CTokHatAss _ } +"|=" { CTokBarAss _ } +"<<=" { CTokSLAss _ } +">>=" { CTokSRAss _ } +',' { CTokComma _ } +';' { CTokSemic _ } +'{' { CTokLBrace _ } +'}' { CTokRBrace _ } +"..." { CTokEllipsis _ } +alignof { CTokAlignof _ } +alignas { CTokAlignas _ } +"_Atomic" { CTokAtomic _ } +asm { CTokAsm _ } +auto { CTokAuto _ } +break { CTokBreak _ } +"_Bool" { CTokBool _ } +case { CTokCase _ } +char { CTokChar _ } +const { CTokConst _ } +continue { CTokContinue _ } +"_Complex" { CTokComplex _ } +default { CTokDefault _ } +do { CTokDo _ } +double { CTokDouble _ } +else { CTokElse _ } +enum { CTokEnum _ } +extern { CTokExtern _ } +float { CTokFloat _ } +"__float128" { CTokFloat128 _ } +"_Float128" { CTokFloat128 _ } +for { CTokFor _ } +"_Generic" { CTokGeneric _ } +goto { CTokGoto _ } +if { CTokIf _ } +inline { CTokInline _ } +int { CTokInt _ } +"__int128" { CTokInt128 _ } +long { CTokLong _ } +"__label__" { CTokLabel _ } +"_Noreturn" { CTokNoreturn _ } +"_Nullable" { CTokNullable _ } +"_Nonnull" { CTokNonnull _ } +register { CTokRegister _ } +restrict { CTokRestrict _ } +return { CTokReturn _ } +short { CTokShort _ } +signed { CTokSigned _ } +sizeof { CTokSizeof _ } +static { CTokStatic _ } +"_Static_assert"{ CTokStaticAssert _ } +struct { CTokStruct _ } +switch { CTokSwitch _ } +typedef { CTokTypedef _ } +typeof { CTokTypeof _ } +"__thread" { CTokThread _ } +union { CTokUnion _ } +unsigned { CTokUnsigned _ } +void { CTokVoid _ } +volatile { CTokVolatile _ } +while { CTokWhile _ } +cchar { CTokCLit _ _ } -- character constant +cint { CTokILit _ _ } -- integer constant +cfloat { CTokFLit _ _ } -- float constant +cstr { CTokSLit _ _ } -- string constant (no escapes) +ident { CTokIdent _ $$ } -- identifier +tyident { CTokTyIdent _ $$ } -- `typedef-name' identifier +"__attribute__" { CTokGnuC GnuCAttrTok _ } -- special GNU C tokens +"__extension__" { CTokGnuC GnuCExtTok _ } -- special GNU C tokens +"__real__" { CTokGnuC GnuCComplexReal _ } +"__imag__" { CTokGnuC GnuCComplexImag _ } +-- special GNU C builtin 'functions' that actually take types as parameters: +"__builtin_va_arg" { CTokGnuC GnuCVaArg _ } +"__builtin_offsetof" { CTokGnuC GnuCOffsetof _ } +"__builtin_types_compatible_p" { CTokGnuC GnuCTyCompat _ } +"__builtin_convertvector" { CTokClangC _ ClangBuiltinConvertVector } +clangcversion { CTokClangC _ (ClangCVersionTok $$) } -- Clang version literal + +%% + + +-- parse a complete C translation unit +-- we have to take special care of empty translation units +translation_unit :: { CTranslUnit } +translation_unit + : ext_decl_list {% let decls = reverse $1 in + case decls of + [] -> do{ n <- getNewName; p <- getCurrentPosition; return $ CTranslUnit decls (mkNodeInfo' p (p,0) n) } + (d:ds) -> withNodeInfo d $ CTranslUnit decls } + + +-- parse a list of external declarations, making up a C translation unit (C99 6.9) +-- +-- * GNU extensions: +-- allow empty translation_unit +-- allow redundant ';' +ext_decl_list :: { Reversed [CExtDecl] } +ext_decl_list + : {- empty -} { empty } + | ext_decl_list ';' { $1 } + | ext_decl_list external_declaration { $1 `snoc` $2 } + + +-- parse external C declaration (C99 6.9) +-- +-- * GNU extensions: +-- allow extension keyword before external declaration (TODO: discarded) +-- asm definitions +external_declaration :: { CExtDecl } +external_declaration + : function_definition { CFDefExt $1 } + | declaration { CDeclExt $1 } + | "__extension__" external_declaration { $2 } + | asm '(' string_literal ')' ';' {% withNodeInfo $1 $ CAsmExt $3 } + + +-- parse C function definition (C99 6.9.1) +-- +-- function_definition :- specifiers? fun-declarator compound-statement +-- specifiers? old-fun-declarator declaration-list compound-statement +-- +-- The specifiers are a list consisting of type-names (int, struct foo, ...), +-- storage-class specifiers (extern, static,...) and type qualifiers (const, volatile, ...). +-- +-- declaration_specifier :- <permute> type-qualifier* storage-class+ typename+ "extern unsigned static volatile int f()" +-- type_specifier :- <permute> type-qualifier* typename+ "const int f()", "long int f()" +-- declaration_qualifier_list :- <permute> type_qualifier* storage-class+ "extern static const f()" +-- type_qualifier_list :- type-qualifier+ "const f()" +-- +-- * GNU extension: +-- __attribute__ annotations +-- +function_definition :: { CFunDef } +function_definition + : function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef [] $1 [] $2) } + + | attrs function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftCAttrs $1) $2 [] $3) } + + | declaration_specifier function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } + + | type_specifier function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } + + | declaration_qualifier_list function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) } + + | type_qualifier_list function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) } + + | type_qualifier_list attrs function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) } + + -- old function declarators + + | function_declarator_old declaration_list compound_statement + {% withNodeInfo $1 $ CFunDef [] $1 (reverse $2) $3 } + + | attrs function_declarator_old declaration_list compound_statement + {% withNodeInfo $2 $ CFunDef (liftCAttrs $1) $2 (reverse $3) $4 } + + | declaration_specifier function_declarator_old declaration_list compound_statement + {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 } + + | type_specifier function_declarator_old declaration_list compound_statement + {% withNodeInfo $1 $ CFunDef $1 $2 (reverse $3) $4 } + + | declaration_qualifier_list function_declarator_old declaration_list compound_statement + {% withNodeInfo $1 $ CFunDef (reverse $1) $2 (reverse $3) $4 } + + | type_qualifier_list function_declarator_old declaration_list compound_statement + {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 (reverse $3) $4 } + + | type_qualifier_list attrs function_declarator_old declaration_list compound_statement + {% withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 (reverse $4) $5 } + +-- Read declarator and put function +function_declarator :: { CDeclr } +function_declarator + : identifier_declarator + {% let declr = reverseDeclr $1 in + enterScope >> doFuncParamDeclIdent declr >> return declr } + + +-- parse C statement (C99 6.8) +-- +-- * GNU extension: ' __asm__ (...); ' statements +-- +statement :: { CStat } +statement + : labeled_statement { $1 } + | compound_statement { $1 } + | expression_statement { $1 } + | selection_statement { $1 } + | iteration_statement { $1 } + | jump_statement { $1 } + | asm_statement {% withNodeInfo $1 (CAsm $1) } + + +-- parse C labeled statement (C99 6.8.1) +-- +-- * GNU extension: case ranges +-- +labeled_statement :: { CStat } +labeled_statement + : identifier ':' attrs_opt statement {% withNodeInfo $1 $ CLabel $1 $4 $3 } + | case constant_expression ':' statement {% withNodeInfo $1 $ CCase $2 $4 } + | default ':' statement {% withNodeInfo $1 $ CDefault $3 } + | case constant_expression "..." constant_expression ':' statement + {% withNodeInfo $1 $ CCases $2 $4 $6 } + + +-- parse C compound statement (C99 6.8.2) +-- +-- * GNU extension: '__label__ ident;' declarations +-- +compound_statement :: { CStat } +compound_statement + : '{' enter_scope block_item_list leave_scope '}' + {% withNodeInfo $1 $ CCompound [] (reverse $3) } + + | '{' enter_scope label_declarations block_item_list leave_scope '}' + {% withNodeInfo $1 $ CCompound (reverse $3) (reverse $4) } + + +-- No syntax for these, just side effecting semantic actions. +-- +enter_scope :: { () } +enter_scope : {% enterScope } +leave_scope :: { () } +leave_scope : {% leaveScope } + + +block_item_list :: { Reversed [CBlockItem] } +block_item_list + : {- empty -} { empty } + | block_item_list block_item { $1 `snoc` $2 } + +block_item :: { CBlockItem } +block_item + : statement { CBlockStmt $1 } + | nested_declaration { $1 } + +nested_declaration :: { CBlockItem } +nested_declaration + : declaration { CBlockDecl $1 } + | nested_function_definition { CNestedFunDef $1 } + | "__extension__" nested_declaration { $2 } + +nested_function_definition :: { CFunDef } +nested_function_definition + : declaration_specifier function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } + + | type_specifier function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef $1 $2 [] $3) } + + | declaration_qualifier_list function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef (reverse $1) $2 [] $3) } + + | type_qualifier_list function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1) $2 [] $3) } + + | type_qualifier_list attrs function_declarator compound_statement + {% leaveScope >> (withNodeInfo $1 $ CFunDef (liftTypeQuals $1 ++ liftCAttrs $2) $3 [] $4) } + + +label_declarations :: { Reversed [Ident] } +label_declarations + : "__label__" identifier_list ';' { $2 } + | label_declarations "__label__" identifier_list ';' { $1 `rappendr` $3 } + + +-- parse C expression statement (C99 6.8.3) +-- +expression_statement :: { CStat } +expression_statement + : ';' {% withNodeInfo $1 $ CExpr Nothing } + | expression ';' {% withNodeInfo $1 $ CExpr (Just $1) } + + +-- parse C selection statement (C99 6.8.4) +-- +selection_statement :: { CStat } +selection_statement + : if '(' expression ')' statement + {% withNodeInfo $1 $ CIf $3 $5 Nothing } + + | if '(' expression ')' statement else statement + {% withNodeInfo $1 $ CIf $3 $5 (Just $7) } + + | switch '(' expression ')' statement + {% withNodeInfo $1 $ CSwitch $3 $5 } + + +-- parse C iteration statement (C99 6.8.5) +-- +iteration_statement :: { CStat } +iteration_statement + : while '(' expression ')' statement + {% withNodeInfo $1 $ CWhile $3 $5 False } + + | do statement while '(' expression ')' ';' + {% withNodeInfo $1 $ CWhile $5 $2 True } + + | for '(' expression_opt ';' expression_opt ';' expression_opt ')' statement + {% withNodeInfo $1 $ CFor (Left $3) $5 $7 $9 } + + | for '(' enter_scope declaration expression_opt ';' expression_opt ')' statement leave_scope + {% withNodeInfo $1 $ CFor (Right $4) $5 $7 $9 } + + +-- parse C jump statement (C99 6.8.6) +-- +-- * GNU extension: computed gotos +-- +jump_statement :: { CStat } +jump_statement + : goto identifier ';' {% withNodeInfo $1 $ CGoto $2 } + | goto '*' expression ';' {% withNodeInfo $1 $ CGotoPtr $3 } + | continue ';' {% withNodeInfo $1 $ CCont } + | break ';' {% withNodeInfo $1 $ CBreak } + | return expression_opt ';' {% withNodeInfo $1 $ CReturn $2 } + + +-- parse GNU C __asm__ statement (compatible with C99: J.5.10) +-- +-- asm_stmt :- asm volatile? ( "asm..." : output-operands : input-operands : asm-clobbers ) +-- asm_operand :- [operand-name] "constraint" ( expr ) +-- asm_clobber :- "r1", "r2", ... +-- +asm_statement :: { CAsmStmt } +asm_statement + : asm maybe_type_qualifier '(' string_literal ')' ';' + {% withNodeInfo $1 $ CAsmStmt $2 $4 [] [] [] } + + | asm maybe_type_qualifier '(' string_literal ':' asm_operands ')' ';' + {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 [] [] } + + | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ')' ';' + {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 [] } + + | asm maybe_type_qualifier '(' string_literal ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' + {% withNodeInfo $1 $ CAsmStmt $2 $4 $6 $8 (reverse $10) } + + +maybe_type_qualifier :: { Maybe CTypeQual } +maybe_type_qualifier + : {- empty -} { Nothing } + | type_qualifier { Just $1 } + +asm_operands :: { [CAsmOperand] } +asm_operands + : {- empty -} { [] } + | nonnull_asm_operands { reverse $1 } + +nonnull_asm_operands :: { Reversed [CAsmOperand] } +nonnull_asm_operands + : asm_operand { singleton $1 } + | nonnull_asm_operands ',' asm_operand { $1 `snoc` $3 } + +asm_operand :: { CAsmOperand } +asm_operand + : string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand Nothing $1 $3 } + | '[' ident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 } + | '[' tyident ']' string_literal '(' expression ')' {% withNodeInfo $1 $ CAsmOperand (Just $2) $4 $6 } + + +asm_clobbers :: { Reversed [CStrLit] } +asm_clobbers + : string_literal { singleton $1 } + | asm_clobbers ',' string_literal { $1 `snoc` $3 } + +{- +--------------------------------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------------------------------- +-- Declarations +--------------------------------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------------------------------- + +Declarations are the most complicated part of the grammar, and shall be summarized here. +To allow a lightweight notation, we will use the modifier <permute> to indicate that the order of the immidieate right-hand sides doesn't matter. + - <permute> a* b+ c === any sequence of a's, b's and c's, which contains exactly 1 'c' and at least one 'b' + +-- storage class and type qualifier +--------------------------------------------------------------------------------------------------------------- +attr :- __attribute__((..)) +storage_class :- typedef | extern | static | auto | register | _Thread_local +function_specifier :- inline | _Noreturn +alignment_specifier :- _Alignas (type_name) | _Alignas (constant_expr) + +type_qualifier :- const | volatile | restrict | _Atomic | _Nullable | _Nonnull +type_qualifier_list :- type_qualifier+ + +declaration_qualifier :- storage_class | type_qualifier | function_specifier | alginment_specifier +declaration_qualifier_list :- <permute> type_qualifier* storage_class+ + +qualifiers :- declaration_qualifier_list | type_qualifier_list + := <permute> (type_qualifier|storage_class)+ + +-- type names +--------------------------------------------------------------------------------------------------------------- +declaration_specifier :- <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident ) +type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | tyident) + +specifiers :- declaration_specifier | type_specifier + := <permute> type_qualifier* storage_class* (basic_type_name+ | elaborated_type_name | tyident ) + +-- struct/union/enum declarations +--------------------------------------------------------------------------------------------------------------- +sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name +sue_type_specifier :- <permute> type_qualifier* elaborated_type_name + +sue_declaration := sue_declaration_specifier | sue_type_specifier + :- <permute> type_qualifier* storage_class* elaborated_type_name + +-- declarators +--------------------------------------------------------------------------------------------------------------- +identifier_declarator :- ( '*' (type_qualifier | attr)* ) * ident [ array_decl | "(" parameter-list ")" ] + plus additional parenthesis' ending ^^ here +typedef_declartor :- +declarator :- identifier_declarator | typedef_declarator + +-- Declaration lists +--------------------------------------------------------------------------------------------------------------- +default_declaring_list :- qualifiers ( identifier_declarator asm*attrs* initializer? )_comma_list + +declaring_list :- specifiers ( declarator asm*attrs* initializer? )_comma_list + +declaration_list := default_declaring_list | declaring_list + +-- Declaration +--------------------------------------------------------------------------------------------------------------- +declaration = sue_declaration | declaration_list | _Static_assert(..) + +--------------------------------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------------------------------- +-- Attributes +-- (citing http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html) +--------------------------------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------------------------------------- + +"Attributes may appear after the colon following a label (expect case and default)" + +labeled_statement :- identifier ':' attrs_opt statement + +"Attributes may go either immediately after the struct/union/enum keyword or after the closing brace" + +struct attrs_opt ... +struct ... { } attrs_opt + +"In general: Attributes appear as part of declarations, either belonging to a declaration or declarator" + +"Any list of specifiers and qualifiers at the start of a declaration may contain attribute specifiers" +"An attribute list may appear immediately before the comma, = or semicolon terminating a declaration of an identifier" + +--------------------------------------------------------------------------------------------------------------- +For the parser, we modified the following rules to be interleaved with attributes: + +default_declaring_list' :- (declaration_qualifier_list' | type_qualifier_list' attr*) + identifier_declarator asm*attr* initializer? + { ',' attr* identifier_declarator asm*attr* initializer? } +declaring_list' :- specifier' declarator asm*attr* initializer? + { ',' attr* declarator asm*attr* initializer? } + + +type_qualifier_list' is like type_qualifier_list, but with preceeding and/or interleaving (but not terminating) __attribute__ annotations. +declaration_qualifier_list', declaration_specifier' and type_specifier' are like their unprimed variants, but with arbitrary preceeding, interleaving and/or terminating __attribute__ annotations. + +"An attribute list may appear immediately before a declarator other than the first in a comma seperated list of declarators" + +"The attribute specifiers may be the only specifiers present (implicit int)" [not supported] + +"Attribute specifiers may be mixed with type qualifiers appearing inside the [] of an parameter array declarator" + +tbc. +-} + + + +-- parse C declaration (C11 6.7) +-- +-- * new form in C11 +-- _Static_assert(expr,string_literal) +declaration :: { CDecl } +declaration + : sue_declaration_specifier ';' + {% withNodeInfo $1 $ CDecl (reverse $1) [] } + + | sue_type_specifier ';' + {% withNodeInfo $1 $ CDecl (reverse $1) [] } + + | declaring_list ';' + {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) } + + | default_declaring_list ';' + {% case $1 of CDecl declspecs dies at -> withLength at (CDecl declspecs (List.reverse dies)) } + | "_Static_assert" '(' constant_expression ',' string_literal ')' ';' + {% withNodeInfo $1 $ CStaticAssert $3 $5 } + +declaration_list :: { Reversed [CDecl] } +declaration_list + : {- empty -} { empty } + | declaration_list declaration { $1 `snoc` $2 } + + +-- * SUMMARY: default_declaring_list :- qualifier* identifier_declarator asm_attrs initializer? +-- { ',' identifier_declarator asm_attrs initializer? } +-- +-- * GNU extensions +-- __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11) +-- asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12) +-- The assembler annotation is used to specifiy an assembler name for the declarator. +-- +default_declaring_list :: { CDecl } +default_declaring_list + : declaration_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt + {% let declspecs = reverse $1 in + do{ declr <- withAsmNameAttrs $3 $2 + ; doDeclIdent declspecs declr + ; withNodeInfo $1 $ + CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }} + + | type_qualifier_list identifier_declarator asm_attrs_opt {-{}-} initializer_opt + {% let declspecs = liftTypeQuals $1 in + do{ declr <- withAsmNameAttrs $3 $2 + ; doDeclIdent declspecs declr + ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }} + + | type_qualifier_list attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt -- FIX 1600 + {% let declspecs = liftTypeQuals $1 in + do{ declr <- withAsmNameAttrs $4 $3 + ; doDeclIdent declspecs declr + ; withNodeInfo $1 $ CDecl (declspecs ++ liftCAttrs $2) [(Just (reverseDeclr declr), $5, Nothing)] }} + + -- GNU extension: __attribute__ as the only qualifier + | attrs identifier_declarator asm_attrs_opt {-{}-} initializer_opt + {% let declspecs = liftCAttrs $1 in + do{ declr <- withAsmNameAttrs $3 $2 + ; doDeclIdent declspecs declr + ; withNodeInfo $1 $ CDecl declspecs [(Just (reverseDeclr declr), $4, Nothing)] }} + + | default_declaring_list ',' attrs_opt identifier_declarator asm_attrs_opt {-{}-} initializer_opt + {% case $1 of + CDecl declspecs dies at -> do + declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4 + doDeclIdent declspecs declr + withLength at $ CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) } + +-- assembler, followed by attribute annotation +asm_attrs_opt :: { (Maybe CStrLit, [CAttr]) } +asm_attrs_opt + : asm_opt attrs_opt + { ($1,$2) } + +-- +-- SUMMARY: declaring_list :- specifier* declarator asm_attrs initializer? +-- { ',' declarator asm_attrs initializer? } +-- +-- GNU extensions: +-- __attribute__ annotations imm. before an declarator (see Attribute Syntax, paragraph 11) +-- asm + __attribute__ annotations (end of declarations, see Attribute Syntax, paragraph 12) +-- +declaring_list :: { CDecl } +declaring_list + : declaration_specifier declarator asm_attrs_opt initializer_opt + {% do{ + declr <- withAsmNameAttrs $3 $2; + doDeclIdent $1 declr; + withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] } + } + + | type_specifier declarator asm_attrs_opt initializer_opt + {% do{ + declr <- withAsmNameAttrs $3 $2; + doDeclIdent $1 declr; + withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr declr), $4, Nothing)] } + } + + | declaring_list ',' attrs_opt declarator asm_attrs_opt initializer_opt + {% case $1 of + CDecl declspecs dies at -> do + declr <- withAsmNameAttrs (fst $5, snd $5 ++ $3) $4 + doDeclIdent declspecs declr + return (CDecl declspecs ((Just (reverseDeclr declr), $6, Nothing) : dies) at) } + + +-- parse C declaration specifiers (C99 6.7) +-- +-- * <permute> type_qualifier* storage_class+ (basic_type_name+ | elaborated_type_name | tyident ) +-- +declaration_specifier :: { [CDeclSpec] } +declaration_specifier + : basic_declaration_specifier { reverse $1 } -- Arithmetic or void + | sue_declaration_specifier { reverse $1 } -- Struct/Union/Enum + | typedef_declaration_specifier { reverse $1 } -- Typedef + + +-- A mixture of type qualifiers (const, volatile, restrict, _Atomic, _Nonnull, _Nullable), +-- function specifiers (inline, _Noreturn), +-- alignment specifiers (_Alignas) and +-- storage class specifiers (extern, static, auto, register, _Thread_local), +-- in any order, but containing at least one storage class specifier. +-- +-- declaration_qualifier_list :- <permute> type_qualifier* alignment_specifier* function_specifier* storage_class+ +-- +-- GNU extensions +-- * arbitrary interleaved __attribute__ annotations +-- +declaration_qualifier_list :: { Reversed [CDeclSpec] } +declaration_qualifier_list + : declaration_qualifier_without_types + { singleton $1 } + + | attrs declaration_qualifier_without_types + { reverseList (liftCAttrs $1) `snoc` $2 } + + | type_qualifier_list declaration_qualifier_without_types + { rmap CTypeQual $1 `snoc` $2 } + + | type_qualifier_list attrs declaration_qualifier_without_types + { (rmap CTypeQual $1 `rappend` liftCAttrs $2) `snoc` $3 } + + | declaration_qualifier_list declaration_qualifier + { $1 `snoc` $2 } + + | declaration_qualifier_list attr + { addTrailingAttrs $1 $2 } + +-- +-- declaration_qualifier :- storage_class | type_qualifier | function_specifier | alignment_specifier +-- +declaration_qualifier :: { CDeclSpec } +declaration_qualifier + : storage_class { CStorageSpec $1 } + | type_qualifier { CTypeQual $1 } + | function_specifier { CFunSpec $1 } + | alignment_specifier { CAlignSpec $1 } + + +declaration_qualifier_without_types :: { CDeclSpec } + : storage_class { CStorageSpec $1 } + | function_specifier { CFunSpec $1 } + | alignment_specifier { CAlignSpec $1 } + + +-- parse C storage class specifier (C99 6.7.1) +-- +-- * GNU extensions: '__thread' thread local storage +-- +storage_class :: { CStorageSpec } +storage_class + : typedef {% withNodeInfo $1 $ CTypedef } + | extern {% withNodeInfo $1 $ CExtern } + | static {% withNodeInfo $1 $ CStatic } + | auto {% withNodeInfo $1 $ CAuto } + | register {% withNodeInfo $1 $ CRegister } + | "__thread" {% withNodeInfo $1 $ CThread } + +-- parse C function specifier (C11 6.7.4) +function_specifier :: { CFunSpec } +function_specifier + : inline {% withNodeInfo $1 $ CInlineQual } + | "_Noreturn" {% withNodeInfo $1 $ CNoreturnQual } + +-- parse C alignment specifier (C11 6.7.5) +alignment_specifier :: { CAlignSpec } +alignment_specifier + : alignas '(' type_name ')' {% withNodeInfo $1 $ CAlignAsType $3 } + | alignas '(' constant_expression ')' {% withNodeInfo $1 $ CAlignAsExpr $3 } + +-- parse C type specifier (C99 6.7.2) +-- +-- This recignises a whole list of type specifiers rather than just one +-- as in the C99 grammar. +-- +-- type_specifier :- <permute> type_qualifier* (basic_type_name+ | elaborated_type_name | g) +-- +-- Type specifier _Atomic(type) is not yet supported because of conflicts with type qualifier _Atomic +type_specifier :: { [CDeclSpec] } +type_specifier + : basic_type_specifier { reverse $1 } -- Arithmetic or void + | sue_type_specifier { reverse $1 } -- Struct/Union/Enum + | typedef_type_specifier { reverse $1 } -- Typedef +-- | "_Atomic" '(' type_name ')' -- _Atomic(type) +-- {% withNodeInfo $1 $ \at -> [CTypeSpec (CAtomicType $3 at)] } + +basic_type_name :: { CTypeSpec } +basic_type_name + : void {% withNodeInfo $1 $ CVoidType } + | char {% withNodeInfo $1 $ CCharType } + | short {% withNodeInfo $1 $ CShortType } + | int {% withNodeInfo $1 $ CIntType } + | long {% withNodeInfo $1 $ CLongType } + | float {% withNodeInfo $1 $ CFloatType } + | double {% withNodeInfo $1 $ CDoubleType } + | signed {% withNodeInfo $1 $ CSignedType } + | unsigned {% withNodeInfo $1 $ CUnsigType } + | "_Bool" {% withNodeInfo $1 $ CBoolType } + | "_Complex" {% withNodeInfo $1 $ CComplexType } + | "__int128" {% withNodeInfo $1 $ CInt128Type } + | "__float128" {% withNodeInfo $1 $ CFloat128Type } + | "_Float128" {% withNodeInfo $1 $ CFloat128Type } + + +-- A mixture of type qualifiers, storage class and basic type names in any +-- order, but containing at least one basic type name and at least one storage +-- class specifier. +-- +-- basic_declaration_specifier :- <permute> type_qualifier* storage_class+ basic_type_name+ +-- +-- GNU extensions +-- arbitrary interleaved __attribute__ annotations +-- +basic_declaration_specifier :: { Reversed [CDeclSpec] } +basic_declaration_specifier + : declaration_qualifier_list basic_type_name + { $1 `snoc` CTypeSpec $2 } + + | basic_type_specifier storage_class + { $1 `snoc` CStorageSpec $2 } + + | basic_declaration_specifier declaration_qualifier + { $1 `snoc` $2 } + + | basic_declaration_specifier basic_type_name + { $1 `snoc` CTypeSpec $2 } + + | basic_declaration_specifier attr + { addTrailingAttrs $1 $2 } + + +-- A mixture of type qualifiers and basic type names in any order, but +-- containing at least one basic type name. +-- +-- basic_type_specifier :- <permute> type_qualifier* basic_type_name+ +-- +-- GNU extensions +-- arbitrary interleaved __attribute__ annotations +-- +basic_type_specifier :: { Reversed [CDeclSpec] } +basic_type_specifier + -- Arithmetic or void + : basic_type_name + { singleton (CTypeSpec $1) } + + | attrs basic_type_name + { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) } + + | type_qualifier_list basic_type_name + { rmap CTypeQual $1 `snoc` CTypeSpec $2 } + + | type_qualifier_list attrs basic_type_name + { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 } + + | basic_type_specifier type_qualifier + { $1 `snoc` CTypeQual $2 } + + | basic_type_specifier basic_type_name + { $1 `snoc` CTypeSpec $2 } + + | basic_type_specifier attr + { addTrailingAttrs $1 $2 } + + +-- A named or anonymous struct, union or enum type along with at least one +-- storage class and any mix of type qualifiers. +-- +-- * Summary: +-- sue_declaration_specifier :- <permute> type_qualifier* storage_class+ elaborated_type_name +-- +sue_declaration_specifier :: { Reversed [CDeclSpec] } +sue_declaration_specifier + : declaration_qualifier_list elaborated_type_name + { $1 `snoc` CTypeSpec $2 } + + | sue_type_specifier storage_class + { $1 `snoc` CStorageSpec $2 } + + | sue_declaration_specifier declaration_qualifier + { $1 `snoc` $2 } + + | sue_declaration_specifier attr + { addTrailingAttrs $1 $2 } + + +-- A struct, union or enum type (named or anonymous) with optional leading and +-- trailing type qualifiers. +-- +-- * Summary: +-- sue_type_specifier :- <permute> type_qualifier* elaborated_type_name +-- +-- * GNU Extensions: records __attribute__ annotations +-- +sue_type_specifier :: { Reversed [CDeclSpec] } +sue_type_specifier + -- struct/union/enum + : elaborated_type_name + { singleton (CTypeSpec $1) } + + | attrs elaborated_type_name + { (reverseList $ liftCAttrs $1) `snoc` (CTypeSpec $2) } + + | type_qualifier_list elaborated_type_name + { rmap CTypeQual $1 `snoc` CTypeSpec $2 } + + | type_qualifier_list attrs elaborated_type_name + { rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec $3 } + + | sue_type_specifier type_qualifier + { $1 `snoc` CTypeQual $2 } + + | sue_type_specifier attr + { addTrailingAttrs $1 $2 } + +-- A typedef'ed type identifier with at least one storage qualifier and any +-- number of type qualifiers +-- +-- * Summary: +-- typedef_declaration_specifier :- <permute> type_qualifier* storage_class+ tyident +-- +-- * Note: +-- the tyident can also be a: typeof '(' ... ')' +-- +typedef_declaration_specifier :: { Reversed [CDeclSpec] } +typedef_declaration_specifier + : typedef_type_specifier storage_class + { $1 `snoc` CStorageSpec $2 } + + | declaration_qualifier_list tyident + {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeDef $2 at) } + + | declaration_qualifier_list typeof '(' expression ')' + {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) } + + | declaration_qualifier_list typeof '(' type_name ')' + {% withNodeInfo $2 $ \at -> $1 `snoc` CTypeSpec (CTypeOfType $4 at) } + + | typedef_declaration_specifier declaration_qualifier + { $1 `snoc` $2 } + + | typedef_declaration_specifier attr + { addTrailingAttrs $1 $2 } + + +-- typedef'ed type identifier with optional leading and trailing type qualifiers +-- +-- * Summary: +-- type_qualifier* ( tyident | typeof '('...')' ) type_qualifier* +-- +typedef_type_specifier :: { Reversed [CDeclSpec] } +typedef_type_specifier + : tyident + {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeDef $1 at)) } + + | typeof '(' expression ')' + {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfExpr $3 at)) } + + | typeof '(' type_name ')' + {% withNodeInfo $1 $ \at -> singleton (CTypeSpec (CTypeOfType $3 at)) } + + | type_qualifier_list tyident + {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeDef $2 at) } + + | type_qualifier_list typeof '(' expression ')' + {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfExpr $4 at) } + + | type_qualifier_list typeof '(' type_name ')' + {% withNodeInfo $2 $ \at -> rmap CTypeQual $1 `snoc` CTypeSpec (CTypeOfType $4 at) } + + -- repeat with attrs (this could be easier if type qualifier list wouldn't allow leading attributes) + | attrs tyident + {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeDef $2 at)) } + + | attrs typeof '(' expression ')' + {% withNodeInfo $1 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeOfExpr $4 at)) } + + | attrs typeof '(' type_name ')' + {% withNodeInfo $2 $ \at -> reverseList (liftCAttrs $1) `snoc` (CTypeSpec (CTypeOfType $4 at)) } + + | type_qualifier_list attrs tyident + {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeDef $3 at) } + + | type_qualifier_list attrs typeof '(' expression ')' + {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfExpr $5 at) } + + | type_qualifier_list attrs typeof '(' type_name ')' + {% withNodeInfo $3 $ \at -> rmap CTypeQual $1 `rappend` (liftCAttrs $2) `snoc` CTypeSpec (CTypeOfType $5 at) } + + | typedef_type_specifier type_qualifier + { $1 `snoc` CTypeQual $2 } + + | typedef_type_specifier attr + { addTrailingAttrs $1 $2 } + + +-- A named or anonymous struct, union or enum type. +-- +-- * Summary: +-- (struct|union|enum) (identifier? '{' ... '}' | identifier) +-- +elaborated_type_name :: { CTypeSpec } +elaborated_type_name + : struct_or_union_specifier {% withNodeInfo $1 $ CSUType $1 } + | enum_specifier {% withNodeInfo $1 $ CEnumType $1 } + + +-- parse C structure or union declaration (C99 6.7.2.1) +-- +-- * Summary: +-- (struct|union) (identifier? '{' ... '}' | identifier) +-- +struct_or_union_specifier :: { CStructUnion } +struct_or_union_specifier + : struct_or_union attrs_opt identifier '{' struct_declaration_list '}' + {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) (Just$ reverse $5) $2 } + + | struct_or_union attrs_opt '{' struct_declaration_list '}' + {% withNodeInfo $1 $ CStruct (unL $1) Nothing (Just$ reverse $4) $2 } + + | struct_or_union attrs_opt identifier + {% withNodeInfo $1 $ CStruct (unL $1) (Just $3) Nothing $2 } + + +struct_or_union :: { Located CStructTag } +struct_or_union + : struct { L CStructTag (posOf $1) } + | union { L CUnionTag (posOf $1) } + + +struct_declaration_list :: { Reversed [CDecl] } +struct_declaration_list + : {- empty -} { empty } + | struct_declaration_list ';' { $1 } + | struct_declaration_list struct_declaration { $1 `snoc` $2 } + + +-- parse C structure declaration (C99 6.7.2.1) +-- +struct_declaration :: { CDecl } +struct_declaration + : struct_declaring_list ';' + { case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at } + + | struct_default_declaring_list';' + { case $1 of CDecl declspecs dies at -> CDecl declspecs (List.reverse dies) at } + + | "__extension__" struct_declaration { $2 } + + +-- +-- * Note: doesn't redeclare typedef +-- +-- TODO: FIXME: AST doesn't allow recording attributes of unnamed struct members +struct_default_declaring_list :: { CDecl } +struct_default_declaring_list + : type_qualifier_list attrs_opt struct_identifier_declarator + {% withNodeInfo $1 $ case $3 of (d,s) -> CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [(d,Nothing,s)] } + + -- GNU extension: __attribute__ as only type qualifier + | attrs struct_identifier_declarator + {% withNodeInfo $1 $ case $2 of (d,s) -> CDecl (liftCAttrs $1) [(d,Nothing,s)] } + -- attrs_opt apply to the declared object + | struct_default_declaring_list ',' attrs_opt struct_identifier_declarator + { case $1 of + CDecl declspecs dies at -> + case $4 of + (Just d,s) -> CDecl declspecs ((Just $ appendObjAttrs $3 d,Nothing,s) : dies) at + (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) at } -- FIXME + +-- * GNU extensions: +-- allow anonymous nested structures and unions +-- FIXME: cannot record attribute of unnamed field +struct_declaring_list :: { CDecl } +struct_declaring_list + : type_specifier struct_declarator attrs_opt + {% withNodeInfo $1 $ case $2 of { (Just d,s) -> CDecl $1 [(Just $! appendObjAttrs $3 d,Nothing,s)] + ; (Nothing,s) -> CDecl $1 [(Nothing,Nothing,s)] } } {- DO FIXME -} + | struct_declaring_list ',' attrs_opt struct_declarator attrs_opt + { case $1 of + CDecl declspecs dies attr -> + case $4 of + (Just d,s) -> CDecl declspecs ((Just$ appendObjAttrs ($3++$5) d,Nothing,s) : dies) attr + (Nothing,s) -> CDecl declspecs ((Nothing,Nothing,s) : dies) attr } + + -- FIXME: We're being far too liberal in the parsing here, we really want to just + -- allow unnamed struct and union fields but we're actually allowing any + -- unnamed struct member. Making it allow only unnamed structs or unions in + -- the parser is far too tricky, it makes things ambiguous. So we'll have to + -- diagnose unnamed fields that are not structs/unions in a later stage. + + -- Note that a plain type specifier can have a trailing attribute + + | type_specifier + {% withNodeInfo $1 $ CDecl $1 [] } + + +-- parse C structure declarator (C99 6.7.2.1) +-- +struct_declarator :: { (Maybe CDeclr, Maybe CExpr) } +struct_declarator + : declarator { (Just (reverseDeclr $1), Nothing) } + | ':' constant_expression { (Nothing, Just $2) } + | declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) } + +-- FIXME: anonymous bitfield doesn't allow recording of attributes +struct_identifier_declarator :: { (Maybe CDeclr, Maybe CExpr) } +struct_identifier_declarator + : identifier_declarator { (Just (reverseDeclr $1), Nothing) } + | ':' constant_expression { (Nothing, Just $2) } + | identifier_declarator ':' constant_expression { (Just (reverseDeclr $1), Just $3) } + | struct_identifier_declarator attr + { case $1 of { (Nothing,expr) -> (Nothing,expr) {- FIXME -} + ; (Just (CDeclr name derived asmname attrs node), bsz) -> + (Just (CDeclr name derived asmname (attrs++$2) node),bsz) + } + } + +-- parse C enumeration declaration (C99 6.7.2.2) +-- +-- * Summary: +-- enum (identifier? '{' ... '}' | identifier) +-- +enum_specifier :: { CEnum } +enum_specifier + : enum attrs_opt '{' enumerator_list '}' + {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 } + + | enum attrs_opt '{' enumerator_list ',' '}' + {% withNodeInfo $1 $ CEnum Nothing (Just$ reverse $4) $2 } + + | enum attrs_opt identifier '{' enumerator_list '}' + {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 } + + | enum attrs_opt identifier '{' enumerator_list ',' '}' + {% withNodeInfo $1 $ CEnum (Just $3) (Just$ reverse $5) $2 } + + | enum attrs_opt identifier + {% withNodeInfo $1 $ CEnum (Just $3) Nothing $2 } + +enumerator_list :: { Reversed [(Ident, Maybe CExpr)] } +enumerator_list + : enumerator { singleton $1 } + | enumerator_list ',' enumerator { $1 `snoc` $3 } + + +enumerator :: { (Ident, Maybe CExpr) } +enumerator + : identifier { ($1, Nothing) } + | identifier attrs { ($1, Nothing) } + | identifier attrs '=' constant_expression { ($1, Just $4) } + | identifier '=' constant_expression { ($1, Just $3) } + + +-- parse C type qualifier (C11 6.7.3) +-- +-- concerning atomic, note: If the _Atomic keyword is immediately followed by a left +-- parenthesis, it should be interpreted as a type specifier (with a type name), not as a type qualifier +type_qualifier :: { CTypeQual } +type_qualifier + : const {% withNodeInfo $1 $ CConstQual } + | volatile {% withNodeInfo $1 $ CVolatQual } + | restrict {% withNodeInfo $1 $ CRestrQual } + | "_Nullable" {% withNodeInfo $1 $ CNullableQual } + | "_Nonnull" {% withNodeInfo $1 $ CNonnullQual } + | "_Atomic" {% withNodeInfo $1 $ CAtomicQual } + +-- a list containing at least one type_qualifier (const, volatile, restrict, inline, _Noreturn) +-- and additionally CAttrs +type_qualifier_list :: { Reversed [CTypeQual] } +type_qualifier_list + : attrs_opt type_qualifier { reverseList (map CAttrQual $1) `snoc` $2 } + | type_qualifier_list type_qualifier { $1 `snoc` $2 } + | type_qualifier_list attrs type_qualifier { ($1 `rappend` map CAttrQual $2) `snoc` $3} + +-- parse C declarator (C99 6.7.5) +-- +declarator :: { CDeclrR } +declarator + : identifier_declarator { $1 } + | typedef_declarator { $1 } + + +-- Parse GNU C's asm annotations +-- +-- Those annotations allow to give an assembler name to a function or identifier. +asm_opt :: { Maybe CStrLit } +asm_opt + : {- empty -} { Nothing } + | asm '(' string_literal ')' { Just $3 } + +-- +-- typedef_declarator :- + +typedef_declarator :: { CDeclrR } +typedef_declarator + -- would be ambiguous as parameter + : paren_typedef_declarator { $1 } + + -- not ambiguous as param + | parameter_typedef_declarator { $1 } + + +-- parameter_typedef_declarator :- tyident declarator_postfix? +-- | '(' attrs? clean_typedef_declarator ')' declarator_postfix? +-- | '*' attrs? type_qualifier_list? parameter_typedef_declarator +-- +parameter_typedef_declarator :: { CDeclrR } +parameter_typedef_declarator + : tyident + {% withNodeInfo $1 $ mkVarDeclr $1 } + + | tyident postfixing_abstract_declarator + {% withNodeInfo $1 $ \at -> $2 (mkVarDeclr $1 at) } + + | clean_typedef_declarator + { $1 } + + +-- The following have at least one '*'. +-- There is no (redundant) '(' between the '*' and the tyident. +-- +-- clean_typedef_declarator :- '(' attrs? clean_typedef_declarator ')' declarator_postfix? +-- | '*' attrs? type_qualifier_list? parameter_typedef_declarator +-- +clean_typedef_declarator :: { CDeclrR } +clean_typedef_declarator + : clean_postfix_typedef_declarator + { $1 } + + | '*' parameter_typedef_declarator + {% withNodeInfo $1 $ ptrDeclr $2 [] } + + | '*' attrs parameter_typedef_declarator + {% withAttribute $1 $2 $ ptrDeclr $3 [] } + + | '*' type_qualifier_list parameter_typedef_declarator + {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } + + | '*' type_qualifier_list attrs parameter_typedef_declarator + {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) } + +-- clean_postfix_typedef_declarator :- ( attrs? clean_typedef_declarator ) declarator_postfix? +-- +clean_postfix_typedef_declarator :: { CDeclrR } +clean_postfix_typedef_declarator + : '(' clean_typedef_declarator ')' { $2 } + | '(' clean_typedef_declarator ')' postfixing_abstract_declarator { $4 $2 } + | '(' attrs clean_typedef_declarator ')' { appendDeclrAttrs $2 $3 } + | '(' attrs clean_typedef_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) } + + +-- The following have a redundant '(' placed +-- immediately to the left of the tyident +-- +paren_typedef_declarator :: { CDeclrR } +paren_typedef_declarator + : paren_postfix_typedef_declarator + { $1 } + + -- redundant paren + | '*' '(' simple_paren_typedef_declarator ')' + {% withNodeInfo $1 $ ptrDeclr $3 [] } + + | '*' type_qualifier_list '(' simple_paren_typedef_declarator ')' + {% withNodeInfo $1 $ ptrDeclr $4 (reverse $2) } + | '*' type_qualifier_list attrs '(' simple_paren_typedef_declarator ')' + {% withAttribute $1 $3 $ ptrDeclr $5 (reverse $2) } + + | '*' paren_typedef_declarator + {% withNodeInfo $1 $ ptrDeclr $2 [] } + + | '*' type_qualifier_list paren_typedef_declarator + {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } + | '*' type_qualifier_list attrs paren_typedef_declarator + {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) } + +-- redundant paren to left of tname +paren_postfix_typedef_declarator :: { CDeclrR } +paren_postfix_typedef_declarator + : '(' paren_typedef_declarator ')' + { $2 } + + -- redundant paren + | '(' simple_paren_typedef_declarator postfixing_abstract_declarator ')' + { $3 $2 } + + | '(' paren_typedef_declarator ')' postfixing_abstract_declarator + { $4 $2 } + + +-- Just a type name in any number of nested brackets +-- +simple_paren_typedef_declarator :: { CDeclrR } +simple_paren_typedef_declarator + : tyident + {% withNodeInfo $1 $ mkVarDeclr $1 } + + | '(' simple_paren_typedef_declarator ')' + { $2 } + +-- +-- Declarators +-- * Summary +-- declarator :- ( '*' (type_qualifier | attr)* )* ident ( array_decl | "(" parameter-list ")" )? +-- + additional parenthesis +-- +identifier_declarator :: { CDeclrR } +identifier_declarator + : unary_identifier_declarator { $1 } + | paren_identifier_declarator { $1 } + + +unary_identifier_declarator :: { CDeclrR } +unary_identifier_declarator + : postfix_identifier_declarator + { $1 } + + | '*' identifier_declarator + {% withNodeInfo $1 $ ptrDeclr $2 [] } + + | '*' attrs identifier_declarator + {% withAttribute $1 $2 $ ptrDeclr $3 [] } + + | '*' type_qualifier_list identifier_declarator + {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } + + | '*' type_qualifier_list attrs identifier_declarator + {% withAttribute $1 $3 $ ptrDeclr $4 (reverse $2) } + +postfix_identifier_declarator :: { CDeclrR } +postfix_identifier_declarator + : paren_identifier_declarator postfixing_abstract_declarator + { $2 $1 } + + | '(' unary_identifier_declarator ')' + { $2 } + + | '(' unary_identifier_declarator ')' postfixing_abstract_declarator + { $4 $2 } + + | '(' attrs unary_identifier_declarator ')' + { appendDeclrAttrs $2 $3 } + + | '(' attrs unary_identifier_declarator ')' postfixing_abstract_declarator + { appendDeclrAttrs $2 ($5 $3) } + + +-- just an identifier in any number of nested parenthesis +paren_identifier_declarator :: { CDeclrR } +paren_identifier_declarator + : ident + {% withNodeInfo $1 $ mkVarDeclr $1 } + + | '(' paren_identifier_declarator ')' + { $2 } + + | '(' attrs paren_identifier_declarator ')' + { appendDeclrAttrs $2 $3 } + +function_declarator_old :: { CDeclr } +function_declarator_old + : old_function_declarator + { reverseDeclr $1 } + +old_function_declarator :: { CDeclrR } +old_function_declarator + : postfix_old_function_declarator + { $1 } + + | '*' old_function_declarator + {% withNodeInfo $1 $ ptrDeclr $2 [] } -- FIXME: no attr possible here ??? + + | '*' type_qualifier_list old_function_declarator + {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } + +postfix_old_function_declarator :: { CDeclrR } +postfix_old_function_declarator + : paren_identifier_declarator '(' identifier_list ')' + {% withNodeInfo $1 $ funDeclr $1 (Left $ reverse $3) [] } + + | '(' old_function_declarator ')' + { $2 } + + | '(' old_function_declarator ')' postfixing_abstract_declarator + { $4 $2 } + + +-- parse C parameter type list (C99 6.7.5) +-- +parameter_type_list :: { ([CDecl], Bool) } +parameter_type_list + : {- empty -} { ([], False)} + | parameter_list { (reverse $1, False) } + | parameter_list ',' "..." { (reverse $1, True) } + +parameter_list :: { Reversed [CDecl] } +parameter_list + : parameter_declaration { singleton $1 } + | parameter_list ',' parameter_declaration { $1 `snoc` $3 } + +parameter_declaration :: { CDecl } +parameter_declaration + : declaration_specifier + {% withNodeInfo $1 $ CDecl $1 [] } + + | declaration_specifier abstract_declarator + {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] } + + | declaration_specifier identifier_declarator attrs_opt + {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } + + | declaration_specifier parameter_typedef_declarator attrs_opt + {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } + + | declaration_qualifier_list + {% withNodeInfo $1 $ CDecl (reverse $1) [] } + + | declaration_qualifier_list abstract_declarator + {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $2), Nothing, Nothing)] } + + | declaration_qualifier_list identifier_declarator attrs_opt + {% withNodeInfo $1 $ CDecl (reverse $1) [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } + + | type_specifier + {% withNodeInfo $1 $ CDecl $1 [] } + + | type_specifier abstract_declarator + {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] } + + | type_specifier identifier_declarator attrs_opt + {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } + + | type_specifier parameter_typedef_declarator attrs_opt + {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $! appendDeclrAttrs $3 $2), Nothing, Nothing)] } + + | type_qualifier_list + {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [] } + | type_qualifier_list attr + {% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] } + + | type_qualifier_list abstract_declarator + {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] } + + | type_qualifier_list identifier_declarator attrs_opt + {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr$ appendDeclrAttrs $3 $2), Nothing, Nothing)] } + + +identifier_list :: { Reversed [Ident] } +identifier_list + : ident { singleton $1 } + | identifier_list ',' ident { $1 `snoc` $3 } + + +-- parse C type name (C99 6.7.6) +-- +type_name :: { CDecl } +type_name + : type_specifier + {% withNodeInfo $1 $ CDecl $1 [] } + + | type_specifier abstract_declarator + {% withNodeInfo $1 $ CDecl $1 [(Just (reverseDeclr $2), Nothing, Nothing)] } + + | type_qualifier_list attr + {% withNodeInfo $1 $ CDecl (liftTypeQuals $1 ++ liftCAttrs $2) [] } + + | type_qualifier_list abstract_declarator + {% withNodeInfo $1 $ CDecl (liftTypeQuals $1) [(Just (reverseDeclr $2), Nothing, Nothing)] } + +-- parse C abstract declarator (C99 6.7.6) +-- +-- postfix starts with '(' +-- postfixing starts with '(' or '[' +-- unary start with '*' +abstract_declarator :: { CDeclrR } +abstract_declarator + : unary_abstract_declarator { $1 } + | postfix_abstract_declarator { $1 } + | postfixing_abstract_declarator { $1 emptyDeclr } + +-- +-- FIXME +-- | postfixing_abstract_declarator attrs_opt { $1 emptyDeclr } + + +postfixing_abstract_declarator :: { CDeclrR -> CDeclrR } +postfixing_abstract_declarator + : array_abstract_declarator + { $1 } + + | '(' parameter_type_list ')' + {% withNodeInfo $1 $ \at declr -> case $2 of + (params, variadic) -> funDeclr declr (Right (params,variadic)) [] at } + + +-- * TODO: Note that we recognise but ignore the C99 static keyword (see C99 6.7.5.3) +-- +-- * TODO: We do not distinguish in the AST between incomplete array types and +-- complete variable length arrays ([ '*' ] means the latter). (see C99 6.7.5.2) +-- +array_abstract_declarator :: { CDeclrR -> CDeclrR } +array_abstract_declarator + : postfix_array_abstract_declarator + { $1 } + + | array_abstract_declarator postfix_array_abstract_declarator + { \decl -> $2 ($1 decl) } + +-- +-- TODO: record static +postfix_array_abstract_declarator :: { CDeclrR -> CDeclrR } +postfix_array_abstract_declarator + : '[' assignment_expression_opt ']' + {% withNodeInfo $1 $ \at declr -> arrDeclr declr [] False False $2 at } + + | '[' attrs assignment_expression_opt ']' + {% withAttributePF $1 $2 $ \at declr -> arrDeclr declr [] False False $3 at } + + | '[' type_qualifier_list assignment_expression_opt ']' + {% withNodeInfo $1 $ \at declr -> arrDeclr declr (reverse $2) False False $3 at } + + | '[' type_qualifier_list attrs assignment_expression_opt ']' + {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr (reverse $2) False False $4 at } + + | '[' static attrs_opt assignment_expression ']' + {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] False True (Just $4) at } + + | '[' static type_qualifier_list attrs_opt assignment_expression ']' + {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $3) False True (Just $5) at } + + | '[' type_qualifier_list attrs_opt static attrs_opt assignment_expression ']' + {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) False True (Just $6) at } + + | '[' '*' attrs_opt ']' + {% withAttributePF $1 $3 $ \at declr -> arrDeclr declr [] True False Nothing at } + | '[' attrs '*' attrs_opt ']' + {% withAttributePF $1 ($2 ++ $4) $ \at declr -> arrDeclr declr [] True False Nothing at } + + | '[' type_qualifier_list '*' attrs_opt ']' + {% withAttributePF $1 $4 $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at } + | '[' type_qualifier_list attrs '*' attrs_opt ']' + {% withAttributePF $1 ($3 ++ $5) $ \at declr -> arrDeclr declr (reverse $2) True False Nothing at } + +unary_abstract_declarator :: { CDeclrR } +unary_abstract_declarator + : '*' + {% withNodeInfo $1 $ ptrDeclr emptyDeclr [] } + + | '*' type_qualifier_list attrs_opt + {% withAttribute $1 $3 $ ptrDeclr emptyDeclr (reverse $2) } + + | '*' abstract_declarator + {% withNodeInfo $1 $ ptrDeclr $2 [] } + + | '*' type_qualifier_list abstract_declarator + {% withNodeInfo $1 $ ptrDeclr $3 (reverse $2) } + + | '*' attrs + {% withAttribute $1 $2 $ ptrDeclr emptyDeclr [] } + | '*' attrs abstract_declarator + {% withAttribute $1 $2 $ ptrDeclr $3 [] } + +-- postfix_ad starts with '(', postfixing with '(' or '[', unary_abstract starts with '*' +postfix_abstract_declarator :: { CDeclrR } +postfix_abstract_declarator + : '(' unary_abstract_declarator ')' { $2 } + | '(' postfix_abstract_declarator ')' { $2 } + | '(' postfixing_abstract_declarator ')' { $2 emptyDeclr } + | '(' unary_abstract_declarator ')' postfixing_abstract_declarator { $4 $2 } + +-- FIX 0700 + | '(' attrs unary_abstract_declarator ')' { appendDeclrAttrs $2 $3 } + | '(' attrs postfix_abstract_declarator ')' { appendDeclrAttrs $2 $3 } + | '(' attrs postfixing_abstract_declarator ')' { appendDeclrAttrs $2 ($3 emptyDeclr) } + | '(' attrs unary_abstract_declarator ')' postfixing_abstract_declarator { appendDeclrAttrs $2 ($5 $3) } + | postfix_abstract_declarator attr { appendDeclrAttrs $2 $1 } + + +-- parse C initializer (C99 6.7.8) +-- +initializer :: { CInit } +initializer + : assignment_expression {% withNodeInfo $1 $ CInitExpr $1 } + | '{' initializer_list '}' {% withNodeInfo $1 $ CInitList (reverse $2) } + | '{' initializer_list ',' '}' {% withNodeInfo $1 $ CInitList (reverse $2) } + + +initializer_opt :: { Maybe CInit } +initializer_opt + : {- empty -} { Nothing } + | '=' initializer { Just $2 } + + +initializer_list :: { Reversed CInitList } +initializer_list + : {- empty -} { empty } + | initializer { singleton ([],$1) } + | designation initializer { singleton ($1,$2) } + | initializer_list ',' initializer { $1 `snoc` ([],$3) } + | initializer_list ',' designation initializer { $1 `snoc` ($3,$4) } + + +-- designation +-- +-- * GNU extensions: +-- old style member designation: 'ident :' +-- array range designation +-- +designation :: { [CDesignator] } +designation + : designator_list '=' { reverse $1 } + | identifier ':' {% withNodeInfo $1 $ \at -> [CMemberDesig $1 at] } + | array_designator { [$1] } + + +designator_list :: { Reversed [CDesignator] } +designator_list + : designator { singleton $1 } + | designator_list designator { $1 `snoc` $2 } + + +designator :: { CDesignator } +designator + : '[' constant_expression ']' {% withNodeInfo $1 $ CArrDesig $2 } + | '.' identifier {% withNodeInfo $1 $ CMemberDesig $2 } + | array_designator { $1 } + + +array_designator :: { CDesignator } +array_designator + : '[' constant_expression "..." constant_expression ']' + {% withNodeInfo $1 $ CRangeDesig $2 $4 } + + +-- parse C primary expression (C11 6.5.1) +-- +-- We cannot use a typedef name as a variable +-- +-- * C11: generic selection +-- * GNU extensions: +-- allow a compound statement as an expression +-- __builtin_va_arg +-- __builtin_offsetof +-- __builtin_types_compatible_p +primary_expression :: { CExpr } +primary_expression + : ident {% withNodeInfo $1 $ CVar $1 } + | constant { CConst $1 } + | string_literal { CConst (liftStrLit $1) } + | '(' expression ')' { $2 } + | "_Generic" '(' assignment_expression ',' generic_assoc_list ')' + {% withNodeInfo $1 $ CGenericSelection $3 (reverse $5) } + -- GNU extensions + | '(' compound_statement ')' + {% withNodeInfo $1 $ CStatExpr $2 } + + | "__builtin_va_arg" '(' assignment_expression ',' type_name ')' + {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinVaArg $3 $5 } + + | "__builtin_offsetof" '(' type_name ',' offsetof_member_designator ')' + {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinOffsetOf $3 (reverse $5) } + + | "__builtin_types_compatible_p" '(' type_name ',' type_name ')' + {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinTypesCompatible $3 $5 } + + | "__builtin_convertvector" '(' assignment_expression ',' type_name ')' + {% withNodeInfo $1 $ CBuiltinExpr . CBuiltinConvertVector $3 $5 } + +-- Generic Selection association list (C11 6.5.1.1) +-- +-- TODO: introduce AST type for generic association +generic_assoc_list :: { Reversed [(Maybe CDecl, CExpr)] } + : generic_assoc_list ',' generic_assoc { $1 `snoc` $3 } + | generic_assoc { singleton $1 } +generic_assoc :: { (Maybe CDecl, CExpr) } +generic_assoc + : type_name ':' assignment_expression { (Just $1, $3) } + | default ':' assignment_expression { (Nothing, $3) } + +offsetof_member_designator :: { Reversed [CDesignator] } +offsetof_member_designator + : identifier {% withNodeInfo $1 $ singleton . CMemberDesig $1 } + | offsetof_member_designator '.' identifier {% withNodeInfo $3 $ ($1 `snoc`) . CMemberDesig $3 } + | offsetof_member_designator '[' expression ']' {% withNodeInfo $3 $ ($1 `snoc`) . CArrDesig $3 } + + +-- parse C postfix expression (C99 6.5.2) +-- +postfix_expression :: { CExpr } +postfix_expression + : primary_expression + { $1 } + + | postfix_expression '[' expression ']' + {% withNodeInfo $1 $ CIndex $1 $3 } + + | postfix_expression '(' ')' + {% withNodeInfo $1 $ CCall $1 [] } + + | postfix_expression '(' argument_expression_list ')' + {% withNodeInfo $1 $ CCall $1 (reverse $3) } + + | postfix_expression '.' identifier + {% withNodeInfo $1 $ CMember $1 $3 False } + + | postfix_expression "->" identifier + {% withNodeInfo $1 $ CMember $1 $3 True } + + | postfix_expression "++" + {% withNodeInfo $1 $ CUnary CPostIncOp $1 } + + | postfix_expression "--" + {% withNodeInfo $1 $ CUnary CPostDecOp $1 } + + | '(' type_name ')' '{' initializer_list '}' + {% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) } + + | '(' type_name ')' '{' initializer_list ',' '}' + {% withNodeInfo $1 $ CCompoundLit $2 (reverse $5) } + + +argument_expression_list :: { Reversed [CExpr] } +argument_expression_list + : assignment_expression { singleton $1 } + | argument_expression_list ',' assignment_expression { $1 `snoc` $3 } + + +-- parse C unary expression (C99 6.5.3) +-- +-- * GNU extensions: +-- 'alignof' expression or type +-- '__real' and '__imag' expression +-- '__extension__' to suppress warnings about extensions +-- allow taking address of a label with: && label +-- +unary_expression :: { CExpr } +unary_expression + : postfix_expression { $1 } + | "++" unary_expression {% withNodeInfo $1 $ CUnary CPreIncOp $2 } + | "--" unary_expression {% withNodeInfo $1 $ CUnary CPreDecOp $2 } + | "__extension__" cast_expression { $2 } + | unary_operator cast_expression {% withNodeInfo $1 $ CUnary (unL $1) $2 } + | sizeof unary_expression {% withNodeInfo $1 $ CSizeofExpr $2 } + | sizeof '(' type_name ')' {% withNodeInfo $1 $ CSizeofType $3 } + -- GNU: alignof, complex and && extension + | alignof unary_expression {% withNodeInfo $1 $ CAlignofExpr $2 } + | alignof '(' type_name ')' {% withNodeInfo $1 $ CAlignofType $3 } + | "__real__" unary_expression {% withNodeInfo $1 $ CComplexReal $2 } + | "__imag__" unary_expression {% withNodeInfo $1 $ CComplexImag $2 } + | "&&" identifier {% withNodeInfo $1 $ CLabAddrExpr $2 } + + +unary_operator :: { Located CUnaryOp } +unary_operator + : '&' { L CAdrOp (posOf $1) } + | '*' { L CIndOp (posOf $1) } + | '+' { L CPlusOp (posOf $1) } + | '-' { L CMinOp (posOf $1) } + | '~' { L CCompOp (posOf $1) } + | '!' { L CNegOp (posOf $1) } + + +-- parse C cast expression (C99 6.5.4) +-- +cast_expression :: { CExpr } +cast_expression + : unary_expression { $1 } + | '(' type_name ')' cast_expression {% withNodeInfo $1 $ CCast $2 $4 } + + +-- parse C multiplicative expression (C99 6.5.5) +-- +multiplicative_expression :: { CExpr } +multiplicative_expression + : cast_expression + { $1 } + + | multiplicative_expression '*' cast_expression + {% withNodeInfo $1 $ CBinary CMulOp $1 $3 } + + | multiplicative_expression '/' cast_expression + {% withNodeInfo $1 $ CBinary CDivOp $1 $3 } + + | multiplicative_expression '%' cast_expression + {% withNodeInfo $1 $ CBinary CRmdOp $1 $3 } + + +-- parse C additive expression (C99 6.5.6) +-- +additive_expression :: { CExpr } +additive_expression + : multiplicative_expression + { $1 } + + | additive_expression '+' multiplicative_expression + {% withNodeInfo $1 $ CBinary CAddOp $1 $3 } + + | additive_expression '-' multiplicative_expression + {% withNodeInfo $1 $ CBinary CSubOp $1 $3 } + + +-- parse C shift expression (C99 6.5.7) +-- +shift_expression :: { CExpr } +shift_expression + : additive_expression + { $1 } + + | shift_expression "<<" additive_expression + {% withNodeInfo $1 $ CBinary CShlOp $1 $3 } + + | shift_expression ">>" additive_expression + {% withNodeInfo $1 $ CBinary CShrOp $1 $3 } + + +-- parse C relational expression (C99 6.5.8) +-- +relational_expression :: { CExpr } +relational_expression + : shift_expression + { $1 } + + | relational_expression '<' shift_expression + {% withNodeInfo $1 $ CBinary CLeOp $1 $3 } + + | relational_expression '>' shift_expression + {% withNodeInfo $1 $ CBinary CGrOp $1 $3 } + + | relational_expression "<=" shift_expression + {% withNodeInfo $1 $ CBinary CLeqOp $1 $3 } + + | relational_expression ">=" shift_expression + {% withNodeInfo $1 $ CBinary CGeqOp $1 $3 } + + +-- parse C equality expression (C99 6.5.9) +-- +equality_expression :: { CExpr } +equality_expression + : relational_expression + { $1 } + + | equality_expression "==" relational_expression + {% withNodeInfo $1 $ CBinary CEqOp $1 $3 } + + | equality_expression "!=" relational_expression + {% withNodeInfo $1 $ CBinary CNeqOp $1 $3 } + + +-- parse C bitwise and expression (C99 6.5.10) +-- +and_expression :: { CExpr } +and_expression + : equality_expression + { $1 } + + | and_expression '&' equality_expression + {% withNodeInfo $1 $ CBinary CAndOp $1 $3 } + + +-- parse C bitwise exclusive or expression (C99 6.5.11) +-- +exclusive_or_expression :: { CExpr } +exclusive_or_expression + : and_expression + { $1 } + + | exclusive_or_expression '^' and_expression + {% withNodeInfo $1 $ CBinary CXorOp $1 $3 } + + +-- parse C bitwise or expression (C99 6.5.12) +-- +inclusive_or_expression :: { CExpr } +inclusive_or_expression + : exclusive_or_expression + { $1 } + + | inclusive_or_expression '|' exclusive_or_expression + {% withNodeInfo $1 $ CBinary COrOp $1 $3 } + + +-- parse C logical and expression (C99 6.5.13) +-- +logical_and_expression :: { CExpr } +logical_and_expression + : inclusive_or_expression + { $1 } + + | logical_and_expression "&&" inclusive_or_expression + {% withNodeInfo $1 $ CBinary CLndOp $1 $3 } + + +-- parse C logical or expression (C99 6.5.14) +-- +logical_or_expression :: { CExpr } +logical_or_expression + : logical_and_expression + { $1 } + + | logical_or_expression "||" logical_and_expression + {% withNodeInfo $1 $ CBinary CLorOp $1 $3 } + + +-- parse C conditional expression (C99 6.5.15) +-- +-- * GNU extensions: +-- omitting the `then' part +conditional_expression :: { CExpr } +conditional_expression + : logical_or_expression + { $1 } + + | logical_or_expression '?' expression ':' conditional_expression + {% withNodeInfo $1 $ CCond $1 (Just $3) $5 } + + | logical_or_expression '?' ':' conditional_expression + {% withNodeInfo $1 $ CCond $1 Nothing $4 } + + +-- parse C assignment expression (C99 6.5.16) +-- +-- * NOTE: LHS of assignment is more restricted than in gcc. +-- `x ? y : z = 3' parses in gcc as `(x ? y : z) = 3', +-- but `x ? y : z' is not an unary expression. +assignment_expression :: { CExpr } +assignment_expression + : conditional_expression + { $1 } + + | unary_expression assignment_operator assignment_expression + {% withNodeInfo $1 $ CAssign (unL $2) $1 $3 } + + +assignment_operator :: { Located CAssignOp } +assignment_operator + : '=' { L CAssignOp (posOf $1) } + | "*=" { L CMulAssOp (posOf $1) } + | "/=" { L CDivAssOp (posOf $1) } + | "%=" { L CRmdAssOp (posOf $1) } + | "+=" { L CAddAssOp (posOf $1) } + | "-=" { L CSubAssOp (posOf $1) } + | "<<=" { L CShlAssOp (posOf $1) } + | ">>=" { L CShrAssOp (posOf $1) } + | "&=" { L CAndAssOp (posOf $1) } + | "^=" { L CXorAssOp (posOf $1) } + | "|=" { L COrAssOp (posOf $1) } + + +-- parse C expression (C99 6.5.17) +-- +expression :: { CExpr } +expression + : assignment_expression + { $1 } + + | assignment_expression ',' comma_expression + {% let es = reverse $3 in withNodeInfo es $ CComma ($1:es) } + +comma_expression :: { Reversed [CExpr] } +comma_expression + : assignment_expression { singleton $1 } + | comma_expression ',' assignment_expression { $1 `snoc` $3 } + + +-- The following was used for clarity +expression_opt :: { Maybe CExpr } +expression_opt + : {- empty -} { Nothing } + | expression { Just $1 } + + +-- The following was used for clarity +assignment_expression_opt :: { Maybe CExpr } +assignment_expression_opt + : {- empty -} { Nothing } + | assignment_expression { Just $1 } + + +-- parse C constant expression (C99 6.6) +-- +constant_expression :: { CExpr } +constant_expression + : conditional_expression { $1 } + + +-- parse C constants +-- +constant :: { CConst } +constant + : cint {% withNodeInfo $1 $ case $1 of CTokILit _ i -> CIntConst i } + | cchar {% withNodeInfo $1 $ case $1 of CTokCLit _ c -> CCharConst c } + | cfloat {% withNodeInfo $1 $ case $1 of CTokFLit _ f -> CFloatConst f } + + +string_literal :: { CStrLit } +string_literal + : cstr + {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit s } + + | cstr string_literal_list + {% withNodeInfo $1 $ case $1 of CTokSLit _ s -> CStrLit (concatCStrings (s : reverse $2)) } + + +string_literal_list :: { Reversed [CString] } +string_literal_list + : cstr { case $1 of CTokSLit _ s -> singleton s } + | string_literal_list cstr { case $2 of CTokSLit _ s -> $1 `snoc` s } + +clang_version_literal :: { ClangCVersion } + : clangcversion { $1 } + +identifier :: { Ident } +identifier + : ident { $1 } + | tyident { $1 } + + +-- parse GNU C attribute annotation +attrs_opt :: { [CAttr] } +attrs_opt + : {- empty -} { [] } + | attrs { $1 } + +-- GNU C attribute annotation +attrs :: { [CAttr] } +attrs + : attr { $1 } + | attrs attr { $1 ++ $2 } + +attr :: { [CAttr] } +attr + : "__attribute__" '(' '(' attribute_list ')' ')' { reverse $4 } + +attribute_list :: { Reversed [CAttr] } + : attribute { case $1 of Nothing -> empty; Just attr -> singleton attr } + | attribute_list ',' attribute { (maybe id (flip snoc) $3) $1 } + + +attribute :: { Maybe CAttr } +attribute + : {- empty -} { Nothing } + | ident {% withNodeInfo $1 $ Just . CAttr $1 [] } + | const {% withNodeInfo $1 $ Just . CAttr (internalIdent "const") [] } + | ident '(' attribute_params ')' {% withNodeInfo $1 $ Just . CAttr $1 (reverse $3) } + | ident '(' ')' {% withNodeInfo $1 $ Just . CAttr $1 [] } + +-- OS X 10.9 (Mavericks) makes use of more liberal attribute syntax +-- that includes assignment-like expressions referencing version +-- numbers. + +attribute_params :: { Reversed [CExpr] } +attribute_params + : constant_expression { singleton $1 } + | unary_expression assignment_operator clang_version_literal { Reversed [] } + | unary_expression assignment_operator unary_expression { Reversed [] } + | attribute_params ',' constant_expression { $1 `snoc` $3 } + | attribute_params ',' unary_expression assignment_operator unary_expression { $1 } + | attribute_params ',' unary_expression assignment_operator clang_version_literal { $1 } + +{ + +-- sometimes it is neccessary to reverse an unreversed list +reverseList :: [a] -> Reversed [a] +reverseList = Reversed . List.reverse + +-- We occasionally need things to have a location when they don't naturally +-- have one built in as tokens and most AST elements do. +-- +data Located a = L !a !Position + +unL :: Located a -> a +unL (L a pos) = a + +instance Pos (Located a) where + posOf (L _ pos) = pos + +-- FIXME: the next 3 inlines here increase the object file size by 70% +-- Check whether the speed win is worth it +{-# INLINE withNodeInfo #-} +withNodeInfo :: Pos node => node -> (NodeInfo -> a) -> P a +withNodeInfo node mkAttrNode = do + name <- getNewName + lastTok <- getSavedToken + let firstPos = posOf node + let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) name + attrs `seq` return (mkAttrNode attrs) + +{-# INLINE withLength #-} +withLength :: NodeInfo -> (NodeInfo -> a) -> P a +withLength nodeinfo mkAttrNode = do + lastTok <- getSavedToken + let firstPos = posOfNode nodeinfo + let attrs = mkNodeInfo' firstPos (posLenOfTok $! lastTok) + (maybe (error "nameOfNode") id (nameOfNode nodeinfo)) + attrs `seq` return (mkAttrNode attrs) + +data CDeclrR = CDeclrR (Maybe Ident) (Reversed [CDerivedDeclr]) (Maybe CStrLit) [CAttr] NodeInfo +reverseDeclr :: CDeclrR -> CDeclr +reverseDeclr (CDeclrR ide reversedDDs asmname cattrs at) + = CDeclr ide (reverse reversedDDs) asmname cattrs at +instance CNode (CDeclrR) where + nodeInfo (CDeclrR _ _ _ _ n) = n +instance Pos (CDeclrR) where + posOf (CDeclrR _ _ _ _ n) = posOf n + +{-# INLINE withAttribute #-} +withAttribute :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR) -> P CDeclrR +withAttribute node cattrs mkDeclrNode = do + name <- getNewName + let attrs = mkNodeInfo (posOf node) name + let newDeclr = appendDeclrAttrs cattrs $ mkDeclrNode attrs + attrs `seq` newDeclr `seq` return newDeclr + +-- postfixing variant +{-# INLINE withAttributePF #-} +withAttributePF :: Pos node => node -> [CAttr] -> (NodeInfo -> CDeclrR -> CDeclrR) -> P (CDeclrR -> CDeclrR) +withAttributePF node cattrs mkDeclrCtor = do + name <- getNewName + let attrs = mkNodeInfo (posOf node) name + let newDeclr = appendDeclrAttrs cattrs . mkDeclrCtor attrs + attrs `seq` newDeclr `seq` return newDeclr + +-- add top level attributes for a declarator. +-- +-- In the following example +-- +-- > int declr1, __attribute__((a1)) * __attribute__((a2)) y() __asm__("$" "y") __attribute__((a3)); +-- +-- the attributes `a1' and `a3' are top-level attributes for y. +-- The (pseudo)-AST for the second declarator is +-- +-- > CDeclr "y" +-- > [CFunDeclr ..., CPtrDeclr __attribute__((a2)) ... ] +-- > (asm "$y") +-- > [__attribute__((a1)), __attribute__((a3)) ] +-- +-- So assembler names and preceeding and trailing attributes are recorded in object declarator. +-- +appendObjAttrs :: [CAttr] -> CDeclr -> CDeclr +appendObjAttrs newAttrs (CDeclr ident indirections asmname cAttrs at) + = CDeclr ident indirections asmname (cAttrs ++ newAttrs) at +appendObjAttrsR :: [CAttr] -> CDeclrR -> CDeclrR +appendObjAttrsR newAttrs (CDeclrR ident indirections asmname cAttrs at) + = CDeclrR ident indirections asmname (cAttrs ++ newAttrs) at + +setAsmName :: Maybe CStrLit -> CDeclrR -> P CDeclrR +setAsmName mAsmName (CDeclrR ident indirections oldName cattrs at) = + case combineName mAsmName oldName of + Left (n1,n2) -> failP (posOf n2) ["Duplicate assembler name: ",showName n1,showName n2] + Right newName -> return $ CDeclrR ident indirections newName cattrs at + where + combineName Nothing Nothing = Right Nothing + combineName Nothing oldname@(Just _) = Right oldname + combineName newname@(Just _) Nothing = Right newname + combineName (Just n1) (Just n2) = Left (n1,n2) + showName (CStrLit cstr _) = show cstr + +withAsmNameAttrs :: (Maybe CStrLit, [CAttr]) -> CDeclrR -> P CDeclrR +withAsmNameAttrs (mAsmName, newAttrs) declr = setAsmName mAsmName (appendObjAttrsR newAttrs declr) + +appendDeclrAttrs :: [CAttr] -> CDeclrR -> CDeclrR +appendDeclrAttrs newAttrs (CDeclrR ident (Reversed []) asmname cattrs at) + = CDeclrR ident empty asmname (cattrs ++ newAttrs) at +appendDeclrAttrs newAttrs (CDeclrR ident (Reversed (x:xs)) asmname cattrs at) + = CDeclrR ident (Reversed (appendAttrs x : xs)) asmname cattrs at where + appendAttrs (CPtrDeclr typeQuals at) = CPtrDeclr (typeQuals ++ map CAttrQual newAttrs) at + appendAttrs (CArrDeclr typeQuals arraySize at) = CArrDeclr (typeQuals ++ map CAttrQual newAttrs) arraySize at + appendAttrs (CFunDeclr parameters cattrs at) = CFunDeclr parameters (cattrs ++ newAttrs) at + +ptrDeclr :: CDeclrR -> [CTypeQual] -> NodeInfo -> CDeclrR +ptrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals at + = CDeclrR ident (derivedDeclrs `snoc` CPtrDeclr tyquals at) asmname cattrs dat +funDeclr :: CDeclrR -> (Either [Ident] ([CDecl],Bool)) -> [CAttr] -> NodeInfo -> CDeclrR +funDeclr (CDeclrR ident derivedDeclrs asmname dcattrs dat) params cattrs at + = CDeclrR ident (derivedDeclrs `snoc` CFunDeclr params cattrs at) asmname dcattrs dat +arrDeclr :: CDeclrR -> [CTypeQual] -> Bool -> Bool -> Maybe CExpr -> NodeInfo -> CDeclrR +arrDeclr (CDeclrR ident derivedDeclrs asmname cattrs dat) tyquals var_sized static_size size_expr_opt at + = arr_sz `seq` ( CDeclrR ident (derivedDeclrs `snoc` CArrDeclr tyquals arr_sz at) asmname cattrs dat ) + where + arr_sz = case size_expr_opt of + Just e -> CArrSize static_size e + Nothing -> CNoArrSize var_sized + +liftTypeQuals :: Reversed [CTypeQual] -> [CDeclSpec] +liftTypeQuals = map CTypeQual . reverse + +-- lift CAttrs to DeclSpecs +-- +liftCAttrs :: [CAttr] -> [CDeclSpec] +liftCAttrs = map (CTypeQual . CAttrQual) + +-- when we parsed (decl_spec_1,...,decl_spec_n,attrs), add the __attributes__s to the declspec list +-- needs special care when @decl_spec_n@ is a SUE definition +addTrailingAttrs :: Reversed [CDeclSpec] -> [CAttr] -> Reversed [CDeclSpec] +addTrailingAttrs declspecs new_attrs = + case viewr declspecs of + (specs_init, CTypeSpec (CSUType (CStruct tag name (Just def) def_attrs su_node) node)) + -> (specs_init `snoc` CTypeSpec (CSUType (CStruct tag name (Just def) (def_attrs ++ new_attrs) su_node) node)) + (specs_init, CTypeSpec (CEnumType (CEnum name (Just def) def_attrs e_node) node)) + -> (specs_init `snoc` CTypeSpec (CEnumType (CEnum name (Just def) (def_attrs ++ new_attrs) e_node) node)) + _ -> declspecs `rappend` (liftCAttrs new_attrs) + +-- convenient instance, the position of a list of things is the position of +-- the first thing in the list +-- +instance Pos a => Pos [a] where + posOf (x:_) = posOf x + +instance Pos a => Pos (Reversed a) where + posOf (Reversed x) = posOf x + +emptyDeclr :: CDeclrR +emptyDeclr = CDeclrR Nothing empty Nothing [] undefNode +mkVarDeclr :: Ident -> NodeInfo -> CDeclrR +mkVarDeclr ident = CDeclrR (Just ident) empty Nothing [] + +-- Take the identifiers and use them to update the typedef'ed identifier set +-- if the decl is defining a typedef then we add it to the set, +-- if it's a var decl then that shadows typedefed identifiers +-- +doDeclIdent :: [CDeclSpec] -> CDeclrR -> P () +doDeclIdent declspecs (CDeclrR mIdent _ _ _ _) = + case mIdent of + Nothing -> return () + Just ident | any iypedef declspecs -> addTypedef ident + | otherwise -> shadowTypedef ident + + where iypedef (CStorageSpec (CTypedef _)) = True + iypedef _ = False + +doFuncParamDeclIdent :: CDeclr -> P () +doFuncParamDeclIdent (CDeclr _ (CFunDeclr params _ _ : _) _ _ _) = + sequence_ + [ case getCDeclrIdent declr of + Nothing -> return () + Just ident -> shadowTypedef ident + | CDecl _ dle _ <- either (const []) fst params + , (Just declr, _, _) <- dle ] +doFuncParamDeclIdent _ = return () + +-- extract all identifiers +getCDeclrIdent :: CDeclr -> Maybe Ident +getCDeclrIdent (CDeclr mIdent _ _ _ _) = mIdent + +happyError :: P a +happyError = parseError + +-- * public interface + +-- | @parseC input initialPos@ parses the given preprocessed C-source input and returns the AST or a list of parse errors. +parseC :: InputStream -> Position -> Either ParseError CTranslUnit +parseC input initialPosition = + fmap fst $ execParser translUnitP input initialPosition builtinTypeNames (namesStartingFrom 0) + +-- | @translUnitP@ provides a parser for a complete C translation unit, i.e. a list of external declarations. +translUnitP :: P CTranslUnit +translUnitP = translation_unit +-- | @extDeclP@ provides a parser for an external (file-scope) declaration +extDeclP :: P CExtDecl +extDeclP = external_declaration +-- | @statementP@ provides a parser for C statements +statementP :: P CStat +statementP = statement +-- | @expressionP@ provides a parser for C expressions +expressionP :: P CExpr +expressionP = expression +}
src/Language/C/Parser/ParserMonad.hs view
@@ -1,181 +1,181 @@--------------------------------------------------------------------------------- |--- Module : Language.C.Syntax.ParserMonad--- Copyright : (c) [1999..2004] Manuel M T Chakravarty--- (c) 2005-2007 Duncan Coutts--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Portability : portable------ Monad for the C lexer and parser------ This monad has to be usable with Alex and Happy. Some things in it are--- dictated by that, eg having to be able to remember the last token.------ The monad also provides a unique name supply (via the Name module)------ For parsing C we have to maintain a set of identifiers that we know to be--- typedef'ed type identifiers. We also must deal correctly with scope so we--- keep a list of sets of identifiers so we can save the outer scope when we--- enter an inner scope.-module Language.C.Parser.ParserMonad (- P,- execParser,- failP,- getNewName, -- :: P Name- addTypedef, -- :: Ident -> P ()- shadowTypedef, -- :: Ident -> P ()- isTypeIdent, -- :: Ident -> P Bool- enterScope, -- :: P ()- leaveScope, -- :: P ()- setPos, -- :: Position -> P ()- getPos, -- :: P Position- getInput, -- :: P String- setInput, -- :: String -> P ()- getLastToken, -- :: P CToken- getSavedToken, -- :: P CToken- setLastToken, -- :: CToken -> P ()- handleEofToken, -- :: P ()- getCurrentPosition,-- :: P Position- ParseError(..),- ) where-import Language.C.Data.Error (internalErr, showErrorInfo,ErrorInfo(..),ErrorLevel(..))-import Language.C.Data.Position (Position(..))-import Language.C.Data.InputStream-import Language.C.Data.Name (Name)-import Language.C.Data.Ident (Ident)-import Language.C.Parser.Tokens (CToken(CTokEof))--import Control.Applicative (Applicative(..))-import Control.Monad (liftM, ap)-import Data.Set (Set)-import qualified Data.Set as Set (fromList, insert, member, delete)--newtype ParseError = ParseError ([String],Position)-instance Show ParseError where- show (ParseError (msgs,pos)) = showErrorInfo "Syntax Error !" (ErrorInfo LevelError pos msgs)---data ParseResult a- = POk !PState a- | PFailed [String] Position -- The error message and position--data PState = PState {- curPos :: !Position, -- position at current input location- curInput :: !InputStream, -- the current input- prevToken :: CToken, -- the previous token- savedToken :: CToken, -- and the token before that- namesupply :: ![Name], -- the name unique supply- tyidents :: !(Set Ident), -- the set of typedef'ed identifiers- scopes :: ![Set Ident] -- the tyident sets for outer scopes- }--newtype P a = P { unP :: PState -> ParseResult a }--instance Functor P where- fmap = liftM--instance Applicative P where- pure = return- (<*>) = ap--instance Monad P where- return = returnP- (>>=) = thenP- fail m = getPos >>= \pos -> failP pos [m]----- | execute the given parser on the supplied input stream.--- returns 'ParseError' if the parser failed, and a pair of--- result and remaining name supply otherwise------ Synopsis: @execParser parser inputStream initialPos predefinedTypedefs uniqNameSupply@-execParser :: P a -> InputStream -> Position -> [Ident] -> [Name]- -> Either ParseError (a,[Name])-execParser (P parser) input pos builtins names =- case parser initialState of- PFailed message errpos -> Left (ParseError (message,errpos))- POk st result -> Right (result, namesupply st)- where initialState = PState {- curPos = pos,- curInput = input,- prevToken = internalErr "CLexer.execParser: Touched undefined token!",- savedToken = internalErr "CLexer.execParser: Touched undefined token (safed token)!",- namesupply = names,- tyidents = Set.fromList builtins,- scopes = []- }--{-# INLINE returnP #-}-returnP :: a -> P a-returnP a = P $ \s -> POk s a--{-# INLINE thenP #-}-thenP :: P a -> (a -> P b) -> P b-(P m) `thenP` k = P $ \s ->- case m s of- POk s' a -> (unP (k a)) s'- PFailed err pos -> PFailed err pos--failP :: Position -> [String] -> P a-failP pos msg = P $ \_ -> PFailed msg pos--getNewName :: P Name-getNewName = P $ \s@PState{namesupply=(n:ns)} -> n `seq` POk s{namesupply=ns} n--setPos :: Position -> P ()-setPos pos = P $ \s -> POk s{curPos=pos} ()--getPos :: P Position-getPos = P $ \s@PState{curPos=pos} -> POk s pos--addTypedef :: Ident -> P ()-addTypedef ident = (P $ \s@PState{tyidents=tyids} ->- POk s{tyidents = ident `Set.insert` tyids} ())--shadowTypedef :: Ident -> P ()-shadowTypedef ident = (P $ \s@PState{tyidents=tyids} ->- -- optimisation: mostly the ident will not be in- -- the tyident set so do a member lookup to avoid- -- churn induced by calling delete- POk s{tyidents = if ident `Set.member` tyids- then ident `Set.delete` tyids- else tyids } ())--isTypeIdent :: Ident -> P Bool-isTypeIdent ident = P $ \s@PState{tyidents=tyids} ->- POk s $! Set.member ident tyids--enterScope :: P ()-enterScope = P $ \s@PState{tyidents=tyids,scopes=ss} ->- POk s{scopes=tyids:ss} ()--leaveScope :: P ()-leaveScope = P $ \s@PState{scopes=ss} ->- case ss of- [] -> error "leaveScope: already in global scope"- (tyids:ss') -> POk s{tyidents=tyids, scopes=ss'} ()--getInput :: P InputStream-getInput = P $ \s@PState{curInput=i} -> POk s i--setInput :: InputStream -> P ()-setInput i = P $ \s -> POk s{curInput=i} ()--getLastToken :: P CToken-getLastToken = P $ \s@PState{prevToken=tok} -> POk s tok--getSavedToken :: P CToken-getSavedToken = P $ \s@PState{savedToken=tok} -> POk s tok---- | @setLastToken modifyCache tok@-setLastToken :: CToken -> P ()-setLastToken CTokEof = P $ \s -> POk s{savedToken=(prevToken s)} ()-setLastToken tok = P $ \s -> POk s{prevToken=tok,savedToken=(prevToken s)} ()---- | handle an End-Of-File token (changes savedToken)-handleEofToken :: P ()-handleEofToken = P $ \s -> POk s{savedToken=(prevToken s)} ()--getCurrentPosition :: P Position-getCurrentPosition = P $ \s@PState{curPos=pos} -> POk s pos+----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Syntax.ParserMonad +-- Copyright : (c) [1999..2004] Manuel M T Chakravarty +-- (c) 2005-2007 Duncan Coutts +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Portability : portable +-- +-- Monad for the C lexer and parser +-- +-- This monad has to be usable with Alex and Happy. Some things in it are +-- dictated by that, eg having to be able to remember the last token. +-- +-- The monad also provides a unique name supply (via the Name module) +-- +-- For parsing C we have to maintain a set of identifiers that we know to be +-- typedef'ed type identifiers. We also must deal correctly with scope so we +-- keep a list of sets of identifiers so we can save the outer scope when we +-- enter an inner scope. +module Language.C.Parser.ParserMonad ( + P, + execParser, + failP, + getNewName, -- :: P Name + addTypedef, -- :: Ident -> P () + shadowTypedef, -- :: Ident -> P () + isTypeIdent, -- :: Ident -> P Bool + enterScope, -- :: P () + leaveScope, -- :: P () + setPos, -- :: Position -> P () + getPos, -- :: P Position + getInput, -- :: P String + setInput, -- :: String -> P () + getLastToken, -- :: P CToken + getSavedToken, -- :: P CToken + setLastToken, -- :: CToken -> P () + handleEofToken, -- :: P () + getCurrentPosition,-- :: P Position + ParseError(..), + ) where +import Language.C.Data.Error (internalErr, showErrorInfo,ErrorInfo(..),ErrorLevel(..)) +import Language.C.Data.Position (Position(..)) +import Language.C.Data.InputStream +import Language.C.Data.Name (Name) +import Language.C.Data.Ident (Ident) +import Language.C.Parser.Tokens (CToken(CTokEof)) + +import Control.Applicative (Applicative(..)) +import Control.Monad (liftM, ap) +import Data.Set (Set) +import qualified Data.Set as Set (fromList, insert, member, delete) + +newtype ParseError = ParseError ([String],Position) +instance Show ParseError where + show (ParseError (msgs,pos)) = showErrorInfo "Syntax Error !" (ErrorInfo LevelError pos msgs) + + +data ParseResult a + = POk !PState a + | PFailed [String] Position -- The error message and position + +data PState = PState { + curPos :: !Position, -- position at current input location + curInput :: !InputStream, -- the current input + prevToken :: CToken, -- the previous token + savedToken :: CToken, -- and the token before that + namesupply :: ![Name], -- the name unique supply + tyidents :: !(Set Ident), -- the set of typedef'ed identifiers + scopes :: ![Set Ident] -- the tyident sets for outer scopes + } + +newtype P a = P { unP :: PState -> ParseResult a } + +instance Functor P where + fmap = liftM + +instance Applicative P where + pure = return + (<*>) = ap + +instance Monad P where + return = returnP + (>>=) = thenP + fail m = getPos >>= \pos -> failP pos [m] + + +-- | execute the given parser on the supplied input stream. +-- returns 'ParseError' if the parser failed, and a pair of +-- result and remaining name supply otherwise +-- +-- Synopsis: @execParser parser inputStream initialPos predefinedTypedefs uniqNameSupply@ +execParser :: P a -> InputStream -> Position -> [Ident] -> [Name] + -> Either ParseError (a,[Name]) +execParser (P parser) input pos builtins names = + case parser initialState of + PFailed message errpos -> Left (ParseError (message,errpos)) + POk st result -> Right (result, namesupply st) + where initialState = PState { + curPos = pos, + curInput = input, + prevToken = internalErr "CLexer.execParser: Touched undefined token!", + savedToken = internalErr "CLexer.execParser: Touched undefined token (safed token)!", + namesupply = names, + tyidents = Set.fromList builtins, + scopes = [] + } + +{-# INLINE returnP #-} +returnP :: a -> P a +returnP a = P $ \s -> POk s a + +{-# INLINE thenP #-} +thenP :: P a -> (a -> P b) -> P b +(P m) `thenP` k = P $ \s -> + case m s of + POk s' a -> (unP (k a)) s' + PFailed err pos -> PFailed err pos + +failP :: Position -> [String] -> P a +failP pos msg = P $ \_ -> PFailed msg pos + +getNewName :: P Name +getNewName = P $ \s@PState{namesupply=(n:ns)} -> n `seq` POk s{namesupply=ns} n + +setPos :: Position -> P () +setPos pos = P $ \s -> POk s{curPos=pos} () + +getPos :: P Position +getPos = P $ \s@PState{curPos=pos} -> POk s pos + +addTypedef :: Ident -> P () +addTypedef ident = (P $ \s@PState{tyidents=tyids} -> + POk s{tyidents = ident `Set.insert` tyids} ()) + +shadowTypedef :: Ident -> P () +shadowTypedef ident = (P $ \s@PState{tyidents=tyids} -> + -- optimisation: mostly the ident will not be in + -- the tyident set so do a member lookup to avoid + -- churn induced by calling delete + POk s{tyidents = if ident `Set.member` tyids + then ident `Set.delete` tyids + else tyids } ()) + +isTypeIdent :: Ident -> P Bool +isTypeIdent ident = P $ \s@PState{tyidents=tyids} -> + POk s $! Set.member ident tyids + +enterScope :: P () +enterScope = P $ \s@PState{tyidents=tyids,scopes=ss} -> + POk s{scopes=tyids:ss} () + +leaveScope :: P () +leaveScope = P $ \s@PState{scopes=ss} -> + case ss of + [] -> error "leaveScope: already in global scope" + (tyids:ss') -> POk s{tyidents=tyids, scopes=ss'} () + +getInput :: P InputStream +getInput = P $ \s@PState{curInput=i} -> POk s i + +setInput :: InputStream -> P () +setInput i = P $ \s -> POk s{curInput=i} () + +getLastToken :: P CToken +getLastToken = P $ \s@PState{prevToken=tok} -> POk s tok + +getSavedToken :: P CToken +getSavedToken = P $ \s@PState{savedToken=tok} -> POk s tok + +-- | @setLastToken modifyCache tok@ +setLastToken :: CToken -> P () +setLastToken CTokEof = P $ \s -> POk s{savedToken=(prevToken s)} () +setLastToken tok = P $ \s -> POk s{prevToken=tok,savedToken=(prevToken s)} () + +-- | handle an End-Of-File token (changes savedToken) +handleEofToken :: P () +handleEofToken = P $ \s -> POk s{savedToken=(prevToken s)} () + +getCurrentPosition :: P Position +getCurrentPosition = P $ \s@PState{curPos=pos} -> POk s pos
src/Language/C/Parser/Tokens.hs view
@@ -1,382 +1,382 @@-{-# OPTIONS #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Parser.Tokens--- Copyright : [1999..2004] Manuel M T Chakravarty--- 2005 Duncan Coutts--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Portability : portable------ C Tokens for the C lexer.----------------------------------------------------------------------------------module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..), ClangCTok(..)) where--import Language.C.Data.Position (Position, Pos(..), PosLength)-import Language.C.Data.Ident (Ident, identToString)-import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString, ClangCVersion)---- token definition--- -------------------- possible tokens (EXPORTED)----data CToken = CTokLParen !PosLength -- `('- | CTokRParen !PosLength -- `)'- | CTokLBracket !PosLength -- `['- | CTokRBracket !PosLength -- `]'- | CTokArrow !PosLength -- `->'- | CTokDot !PosLength -- `.'- | CTokExclam !PosLength -- `!'- | CTokTilde !PosLength -- `~'- | CTokInc !PosLength -- `++'- | CTokDec !PosLength -- `--'- | CTokPlus !PosLength -- `+'- | CTokMinus !PosLength -- `-'- | CTokStar !PosLength -- `*'- | CTokSlash !PosLength -- `/'- | CTokPercent !PosLength -- `%'- | CTokAmper !PosLength -- `&'- | CTokShiftL !PosLength -- `<<'- | CTokShiftR !PosLength -- `>>'- | CTokLess !PosLength -- `<'- | CTokLessEq !PosLength -- `<='- | CTokHigh !PosLength -- `>'- | CTokHighEq !PosLength -- `>='- | CTokEqual !PosLength -- `=='- | CTokUnequal !PosLength -- `!='- | CTokHat !PosLength -- `^'- | CTokBar !PosLength -- `|'- | CTokAnd !PosLength -- `&&'- | CTokOr !PosLength -- `||'- | CTokQuest !PosLength -- `?'- | CTokColon !PosLength -- `:'- | CTokAssign !PosLength -- `='- | CTokPlusAss !PosLength -- `+='- | CTokMinusAss !PosLength -- `-='- | CTokStarAss !PosLength -- `*='- | CTokSlashAss !PosLength -- `/='- | CTokPercAss !PosLength -- `%='- | CTokAmpAss !PosLength -- `&='- | CTokHatAss !PosLength -- `^='- | CTokBarAss !PosLength -- `|='- | CTokSLAss !PosLength -- `<<='- | CTokSRAss !PosLength -- `>>='- | CTokComma !PosLength -- `,'- | CTokSemic !PosLength -- `;'- | CTokLBrace !PosLength -- `{'- | CTokRBrace !PosLength -- `}'- | CTokEllipsis !PosLength -- `...'- | CTokAlignof !PosLength -- `alignof'- -- (or `__alignof',- -- `__alignof__')- | CTokAlignas !PosLength -- `_Alignas'- | CTokAsm !PosLength -- `asm'- -- (or `__asm',- -- `__asm__')- | CTokAtomic !PosLength -- `_Atomic'- | CTokAuto !PosLength -- `auto'- | CTokBreak !PosLength -- `break'- | CTokBool !PosLength -- `_Bool'- | CTokCase !PosLength -- `case'- | CTokChar !PosLength -- `char'- | CTokConst !PosLength -- `const'- -- (or `__const', `__const__')- | CTokContinue !PosLength -- `continue'- | CTokComplex !PosLength -- `_Complex'- | CTokDefault !PosLength -- `default'- | CTokDo !PosLength -- `do'- | CTokDouble !PosLength -- `double'- | CTokElse !PosLength -- `else'- | CTokEnum !PosLength -- `enum'- | CTokExtern !PosLength -- `extern'- | CTokFloat !PosLength -- `float'- | CTokFloat128 !PosLength -- `__float128' or `_Float128`- | CTokFor !PosLength -- `for'- | CTokGeneric !PosLength -- `_Generic'- | CTokGoto !PosLength -- `goto'- | CTokIf !PosLength -- `if'- | CTokInline !PosLength -- `inline'- -- (or `__inline',- -- `__inline__')- | CTokInt !PosLength -- `int'- | CTokInt128 !PosLength -- `__int128`- | CTokLong !PosLength -- `long'- | CTokLabel !PosLength -- `__label__- | CTokNoreturn !PosLength -- `_Noreturn'- | CTokNullable !PosLength -- `_Nullable'- | CTokNonnull !PosLength -- `_Nonnull'- | CTokRegister !PosLength -- `register'- | CTokRestrict !PosLength -- `restrict'- -- (or `__restrict',- -- `__restrict__')- | CTokReturn !PosLength -- `return'- | CTokShort !PosLength -- `short'- | CTokSigned !PosLength -- `signed'- -- (or `__signed',- -- `__signed__')- | CTokSizeof !PosLength -- `sizeof'- | CTokStatic !PosLength -- `static'- | CTokStaticAssert !PosLength -- `_Static_assert'- | CTokStruct !PosLength -- `struct'- | CTokSwitch !PosLength -- `switch'- | CTokTypedef !PosLength -- `typedef'- | CTokTypeof !PosLength -- `typeof'- | CTokThread !PosLength -- `__thread'- | CTokUnion !PosLength -- `union'- | CTokUnsigned !PosLength -- `unsigned'- | CTokVoid !PosLength -- `void'- | CTokVolatile !PosLength -- `volatile'- -- (or `__volatile',- -- `__volatile__')- | CTokWhile !PosLength -- `while'- | CTokCLit !PosLength !CChar -- character constant- | CTokILit !PosLength !CInteger -- integer constant- | CTokFLit !PosLength CFloat -- float constant- | CTokSLit !PosLength CString -- string constant- | CTokIdent !PosLength !Ident -- identifier-- -- not generated here, but in `CParser.parseCHeader'- | CTokTyIdent !PosLength !Ident -- `typedef-name' identifier- | CTokGnuC !GnuCTok !PosLength -- special GNU C tokens- | CTokClangC !PosLength !ClangCTok -- special Clang 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'- | GnuCComplexReal -- `__real__'- | GnuCComplexImag -- `__imag__'--data ClangCTok = ClangCVersionTok !ClangCVersion -- version constant from 'availability' attribute- | ClangBuiltinConvertVector--instance Pos CToken where- posOf = fst . posLenOfTok---- token position and length-posLenOfTok :: CToken -> (Position,Int)-posLenOfTok (CTokLParen pos ) = pos-posLenOfTok (CTokRParen pos ) = pos-posLenOfTok (CTokLBracket pos ) = pos-posLenOfTok (CTokRBracket pos ) = pos-posLenOfTok (CTokArrow pos ) = pos-posLenOfTok (CTokDot pos ) = pos-posLenOfTok (CTokExclam pos ) = pos-posLenOfTok (CTokTilde pos ) = pos-posLenOfTok (CTokInc pos ) = pos-posLenOfTok (CTokDec pos ) = pos-posLenOfTok (CTokPlus pos ) = pos-posLenOfTok (CTokMinus pos ) = pos-posLenOfTok (CTokStar pos ) = pos-posLenOfTok (CTokSlash pos ) = pos-posLenOfTok (CTokPercent pos ) = pos-posLenOfTok (CTokAmper pos ) = pos-posLenOfTok (CTokShiftL pos ) = pos-posLenOfTok (CTokShiftR pos ) = pos-posLenOfTok (CTokLess pos ) = pos-posLenOfTok (CTokLessEq pos ) = pos-posLenOfTok (CTokHigh pos ) = pos-posLenOfTok (CTokHighEq pos ) = pos-posLenOfTok (CTokEqual pos ) = pos-posLenOfTok (CTokUnequal pos ) = pos-posLenOfTok (CTokHat pos ) = pos-posLenOfTok (CTokBar pos ) = pos-posLenOfTok (CTokAnd pos ) = pos-posLenOfTok (CTokOr pos ) = pos-posLenOfTok (CTokQuest pos ) = pos-posLenOfTok (CTokColon pos ) = pos-posLenOfTok (CTokAssign pos ) = pos-posLenOfTok (CTokPlusAss pos ) = pos-posLenOfTok (CTokMinusAss pos ) = pos-posLenOfTok (CTokStarAss pos ) = pos-posLenOfTok (CTokSlashAss pos ) = pos-posLenOfTok (CTokPercAss pos ) = pos-posLenOfTok (CTokAmpAss pos ) = pos-posLenOfTok (CTokHatAss pos ) = pos-posLenOfTok (CTokBarAss pos ) = pos-posLenOfTok (CTokSLAss pos ) = pos-posLenOfTok (CTokSRAss pos ) = pos-posLenOfTok (CTokComma pos ) = pos-posLenOfTok (CTokSemic pos ) = pos-posLenOfTok (CTokLBrace pos ) = pos-posLenOfTok (CTokRBrace pos ) = pos-posLenOfTok (CTokEllipsis pos ) = pos-posLenOfTok (CTokAlignof pos ) = pos-posLenOfTok (CTokAlignas pos ) = pos-posLenOfTok (CTokAsm pos ) = pos-posLenOfTok (CTokAtomic pos ) = pos-posLenOfTok (CTokAuto pos ) = pos-posLenOfTok (CTokBreak pos ) = pos-posLenOfTok (CTokBool pos ) = pos-posLenOfTok (CTokCase pos ) = pos-posLenOfTok (CTokChar pos ) = pos-posLenOfTok (CTokConst pos ) = pos-posLenOfTok (CTokContinue pos ) = pos-posLenOfTok (CTokComplex pos ) = pos-posLenOfTok (CTokDefault pos ) = pos-posLenOfTok (CTokDo pos ) = pos-posLenOfTok (CTokDouble pos ) = pos-posLenOfTok (CTokElse pos ) = pos-posLenOfTok (CTokEnum pos ) = pos-posLenOfTok (CTokExtern pos ) = pos-posLenOfTok (CTokFloat pos ) = pos-posLenOfTok (CTokFloat128 pos ) = pos-posLenOfTok (CTokFor pos ) = pos-posLenOfTok (CTokGeneric pos ) = pos-posLenOfTok (CTokGoto pos ) = pos-posLenOfTok (CTokInt pos ) = pos-posLenOfTok (CTokInt128 pos ) = pos-posLenOfTok (CTokInline pos ) = pos-posLenOfTok (CTokIf pos ) = pos-posLenOfTok (CTokLong pos ) = pos-posLenOfTok (CTokLabel pos ) = pos-posLenOfTok (CTokNoreturn pos ) = pos-posLenOfTok (CTokNullable pos ) = pos-posLenOfTok (CTokNonnull pos ) = pos-posLenOfTok (CTokRegister pos ) = pos-posLenOfTok (CTokRestrict pos ) = pos-posLenOfTok (CTokReturn pos ) = pos-posLenOfTok (CTokShort pos ) = pos-posLenOfTok (CTokSigned pos ) = pos-posLenOfTok (CTokSizeof pos ) = pos-posLenOfTok (CTokStatic pos ) = pos-posLenOfTok (CTokStaticAssert pos) = pos-posLenOfTok (CTokStruct pos ) = pos-posLenOfTok (CTokSwitch pos ) = pos-posLenOfTok (CTokTypedef pos ) = pos-posLenOfTok (CTokTypeof pos ) = pos-posLenOfTok (CTokThread pos ) = pos-posLenOfTok (CTokUnion pos ) = pos-posLenOfTok (CTokUnsigned pos ) = pos-posLenOfTok (CTokVoid pos ) = pos-posLenOfTok (CTokVolatile pos ) = pos-posLenOfTok (CTokWhile pos ) = pos-posLenOfTok (CTokCLit pos _) = pos-posLenOfTok (CTokILit pos _) = pos-posLenOfTok (CTokFLit pos _) = pos-posLenOfTok (CTokSLit pos _) = pos-posLenOfTok (CTokIdent pos _) = pos-posLenOfTok (CTokTyIdent pos _) = pos-posLenOfTok (CTokGnuC _ pos ) = pos-posLenOfTok (CTokClangC pos _) = pos-posLenOfTok CTokEof = error "tokenPos: Eof"--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 _ (CTokAlignas _ ) = showString "_Alignas"- showsPrec _ (CTokAsm _ ) = showString "asm"- showsPrec _ (CTokAtomic _ ) = showString "_Atomic"- showsPrec _ (CTokAuto _ ) = showString "auto"- showsPrec _ (CTokBool _) = showString "_Bool"- showsPrec _ (CTokBreak _ ) = showString "break"- showsPrec _ (CTokCase _ ) = showString "case"- showsPrec _ (CTokChar _ ) = showString "char"- showsPrec _ (CTokComplex _) = showString "_Complex"- 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 _ (CTokFloat128 _ ) = showString "__float128"- showsPrec _ (CTokFor _ ) = showString "for"- showsPrec _ (CTokGeneric _ ) = showString "_Generic"- showsPrec _ (CTokGoto _ ) = showString "goto"- showsPrec _ (CTokIf _ ) = showString "if"- showsPrec _ (CTokInline _ ) = showString "inline"- showsPrec _ (CTokInt _ ) = showString "int"- showsPrec _ (CTokInt128 _ ) = showString "__int128"- showsPrec _ (CTokLong _ ) = showString "long"- showsPrec _ (CTokLabel _ ) = showString "__label__"- showsPrec _ (CTokNoreturn _ ) = showString "_Noreturn"- showsPrec _ (CTokNullable _ ) = showString "_Nullable"- showsPrec _ (CTokNonnull _ ) = showString "_Nonnull"- 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 _ (CTokStaticAssert _ ) = showString "_Static_assert"- showsPrec _ (CTokStruct _ ) = showString "struct"- showsPrec _ (CTokSwitch _ ) = showString "switch"- showsPrec _ (CTokTypedef _ ) = showString "typedef"- showsPrec _ (CTokTypeof _ ) = showString "typeof"- showsPrec _ (CTokThread _ ) = showString "_Thread_local"- showsPrec _ (CTokUnion _ ) = showString "union"- showsPrec _ (CTokUnsigned _ ) = showString "unsigned"- showsPrec _ (CTokVoid _ ) = showString "void"- showsPrec _ (CTokVolatile _ ) = showString "volatile"- showsPrec _ (CTokWhile _ ) = showString "while"- showsPrec _ (CTokCLit _ c) = shows c- showsPrec _ (CTokILit _ i) = shows i- showsPrec _ (CTokFLit _ f) = shows f- showsPrec _ (CTokSLit _ s) = shows s- showsPrec _ (CTokIdent _ i) = (showString . identToString) i- showsPrec _ (CTokTyIdent _ i) = (showString . identToString) i- showsPrec _ (CTokGnuC GnuCAttrTok _) = showString "__attribute__"- showsPrec _ (CTokGnuC GnuCExtTok _) = showString "__extension__"- showsPrec _ (CTokGnuC GnuCComplexReal _) = showString "__real__"- showsPrec _ (CTokGnuC GnuCComplexImag _) = showString "__imag__"- showsPrec _ (CTokGnuC GnuCVaArg _) = showString "__builtin_va_arg"- showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof"- showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p"- showsPrec _ (CTokClangC _ (ClangCVersionTok v)) = shows v- showsPrec _ (CTokClangC _ ClangBuiltinConvertVector) = showString "__builtin_convertvector"- showsPrec _ CTokEof = error "show CToken : CTokEof"+{-# OPTIONS #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Parser.Tokens +-- Copyright : [1999..2004] Manuel M T Chakravarty +-- 2005 Duncan Coutts +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Portability : portable +-- +-- C Tokens for the C lexer. +-- +----------------------------------------------------------------------------- +module Language.C.Parser.Tokens (CToken(..), posLenOfTok, GnuCTok(..), ClangCTok(..)) where + +import Language.C.Data.Position (Position, Pos(..), PosLength) +import Language.C.Data.Ident (Ident, identToString) +import Language.C.Syntax.Constants (CChar, CInteger, CFloat, CString, ClangCVersion) + +-- token definition +-- ---------------- + +-- possible tokens (EXPORTED) +-- +data CToken = CTokLParen !PosLength -- `(' + | CTokRParen !PosLength -- `)' + | CTokLBracket !PosLength -- `[' + | CTokRBracket !PosLength -- `]' + | CTokArrow !PosLength -- `->' + | CTokDot !PosLength -- `.' + | CTokExclam !PosLength -- `!' + | CTokTilde !PosLength -- `~' + | CTokInc !PosLength -- `++' + | CTokDec !PosLength -- `--' + | CTokPlus !PosLength -- `+' + | CTokMinus !PosLength -- `-' + | CTokStar !PosLength -- `*' + | CTokSlash !PosLength -- `/' + | CTokPercent !PosLength -- `%' + | CTokAmper !PosLength -- `&' + | CTokShiftL !PosLength -- `<<' + | CTokShiftR !PosLength -- `>>' + | CTokLess !PosLength -- `<' + | CTokLessEq !PosLength -- `<=' + | CTokHigh !PosLength -- `>' + | CTokHighEq !PosLength -- `>=' + | CTokEqual !PosLength -- `==' + | CTokUnequal !PosLength -- `!=' + | CTokHat !PosLength -- `^' + | CTokBar !PosLength -- `|' + | CTokAnd !PosLength -- `&&' + | CTokOr !PosLength -- `||' + | CTokQuest !PosLength -- `?' + | CTokColon !PosLength -- `:' + | CTokAssign !PosLength -- `=' + | CTokPlusAss !PosLength -- `+=' + | CTokMinusAss !PosLength -- `-=' + | CTokStarAss !PosLength -- `*=' + | CTokSlashAss !PosLength -- `/=' + | CTokPercAss !PosLength -- `%=' + | CTokAmpAss !PosLength -- `&=' + | CTokHatAss !PosLength -- `^=' + | CTokBarAss !PosLength -- `|=' + | CTokSLAss !PosLength -- `<<=' + | CTokSRAss !PosLength -- `>>=' + | CTokComma !PosLength -- `,' + | CTokSemic !PosLength -- `;' + | CTokLBrace !PosLength -- `{' + | CTokRBrace !PosLength -- `}' + | CTokEllipsis !PosLength -- `...' + | CTokAlignof !PosLength -- `alignof' + -- (or `__alignof', + -- `__alignof__') + | CTokAlignas !PosLength -- `_Alignas' + | CTokAsm !PosLength -- `asm' + -- (or `__asm', + -- `__asm__') + | CTokAtomic !PosLength -- `_Atomic' + | CTokAuto !PosLength -- `auto' + | CTokBreak !PosLength -- `break' + | CTokBool !PosLength -- `_Bool' + | CTokCase !PosLength -- `case' + | CTokChar !PosLength -- `char' + | CTokConst !PosLength -- `const' + -- (or `__const', `__const__') + | CTokContinue !PosLength -- `continue' + | CTokComplex !PosLength -- `_Complex' + | CTokDefault !PosLength -- `default' + | CTokDo !PosLength -- `do' + | CTokDouble !PosLength -- `double' + | CTokElse !PosLength -- `else' + | CTokEnum !PosLength -- `enum' + | CTokExtern !PosLength -- `extern' + | CTokFloat !PosLength -- `float' + | CTokFloat128 !PosLength -- `__float128' or `_Float128` + | CTokFor !PosLength -- `for' + | CTokGeneric !PosLength -- `_Generic' + | CTokGoto !PosLength -- `goto' + | CTokIf !PosLength -- `if' + | CTokInline !PosLength -- `inline' + -- (or `__inline', + -- `__inline__') + | CTokInt !PosLength -- `int' + | CTokInt128 !PosLength -- `__int128` + | CTokLong !PosLength -- `long' + | CTokLabel !PosLength -- `__label__ + | CTokNoreturn !PosLength -- `_Noreturn' + | CTokNullable !PosLength -- `_Nullable' + | CTokNonnull !PosLength -- `_Nonnull' + | CTokRegister !PosLength -- `register' + | CTokRestrict !PosLength -- `restrict' + -- (or `__restrict', + -- `__restrict__') + | CTokReturn !PosLength -- `return' + | CTokShort !PosLength -- `short' + | CTokSigned !PosLength -- `signed' + -- (or `__signed', + -- `__signed__') + | CTokSizeof !PosLength -- `sizeof' + | CTokStatic !PosLength -- `static' + | CTokStaticAssert !PosLength -- `_Static_assert' + | CTokStruct !PosLength -- `struct' + | CTokSwitch !PosLength -- `switch' + | CTokTypedef !PosLength -- `typedef' + | CTokTypeof !PosLength -- `typeof' + | CTokThread !PosLength -- `__thread' + | CTokUnion !PosLength -- `union' + | CTokUnsigned !PosLength -- `unsigned' + | CTokVoid !PosLength -- `void' + | CTokVolatile !PosLength -- `volatile' + -- (or `__volatile', + -- `__volatile__') + | CTokWhile !PosLength -- `while' + | CTokCLit !PosLength !CChar -- character constant + | CTokILit !PosLength !CInteger -- integer constant + | CTokFLit !PosLength CFloat -- float constant + | CTokSLit !PosLength CString -- string constant + | CTokIdent !PosLength !Ident -- identifier + + -- not generated here, but in `CParser.parseCHeader' + | CTokTyIdent !PosLength !Ident -- `typedef-name' identifier + | CTokGnuC !GnuCTok !PosLength -- special GNU C tokens + | CTokClangC !PosLength !ClangCTok -- special Clang 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' + | GnuCComplexReal -- `__real__' + | GnuCComplexImag -- `__imag__' + +data ClangCTok = ClangCVersionTok !ClangCVersion -- version constant from 'availability' attribute + | ClangBuiltinConvertVector + +instance Pos CToken where + posOf = fst . posLenOfTok + +-- token position and length +posLenOfTok :: CToken -> (Position,Int) +posLenOfTok (CTokLParen pos ) = pos +posLenOfTok (CTokRParen pos ) = pos +posLenOfTok (CTokLBracket pos ) = pos +posLenOfTok (CTokRBracket pos ) = pos +posLenOfTok (CTokArrow pos ) = pos +posLenOfTok (CTokDot pos ) = pos +posLenOfTok (CTokExclam pos ) = pos +posLenOfTok (CTokTilde pos ) = pos +posLenOfTok (CTokInc pos ) = pos +posLenOfTok (CTokDec pos ) = pos +posLenOfTok (CTokPlus pos ) = pos +posLenOfTok (CTokMinus pos ) = pos +posLenOfTok (CTokStar pos ) = pos +posLenOfTok (CTokSlash pos ) = pos +posLenOfTok (CTokPercent pos ) = pos +posLenOfTok (CTokAmper pos ) = pos +posLenOfTok (CTokShiftL pos ) = pos +posLenOfTok (CTokShiftR pos ) = pos +posLenOfTok (CTokLess pos ) = pos +posLenOfTok (CTokLessEq pos ) = pos +posLenOfTok (CTokHigh pos ) = pos +posLenOfTok (CTokHighEq pos ) = pos +posLenOfTok (CTokEqual pos ) = pos +posLenOfTok (CTokUnequal pos ) = pos +posLenOfTok (CTokHat pos ) = pos +posLenOfTok (CTokBar pos ) = pos +posLenOfTok (CTokAnd pos ) = pos +posLenOfTok (CTokOr pos ) = pos +posLenOfTok (CTokQuest pos ) = pos +posLenOfTok (CTokColon pos ) = pos +posLenOfTok (CTokAssign pos ) = pos +posLenOfTok (CTokPlusAss pos ) = pos +posLenOfTok (CTokMinusAss pos ) = pos +posLenOfTok (CTokStarAss pos ) = pos +posLenOfTok (CTokSlashAss pos ) = pos +posLenOfTok (CTokPercAss pos ) = pos +posLenOfTok (CTokAmpAss pos ) = pos +posLenOfTok (CTokHatAss pos ) = pos +posLenOfTok (CTokBarAss pos ) = pos +posLenOfTok (CTokSLAss pos ) = pos +posLenOfTok (CTokSRAss pos ) = pos +posLenOfTok (CTokComma pos ) = pos +posLenOfTok (CTokSemic pos ) = pos +posLenOfTok (CTokLBrace pos ) = pos +posLenOfTok (CTokRBrace pos ) = pos +posLenOfTok (CTokEllipsis pos ) = pos +posLenOfTok (CTokAlignof pos ) = pos +posLenOfTok (CTokAlignas pos ) = pos +posLenOfTok (CTokAsm pos ) = pos +posLenOfTok (CTokAtomic pos ) = pos +posLenOfTok (CTokAuto pos ) = pos +posLenOfTok (CTokBreak pos ) = pos +posLenOfTok (CTokBool pos ) = pos +posLenOfTok (CTokCase pos ) = pos +posLenOfTok (CTokChar pos ) = pos +posLenOfTok (CTokConst pos ) = pos +posLenOfTok (CTokContinue pos ) = pos +posLenOfTok (CTokComplex pos ) = pos +posLenOfTok (CTokDefault pos ) = pos +posLenOfTok (CTokDo pos ) = pos +posLenOfTok (CTokDouble pos ) = pos +posLenOfTok (CTokElse pos ) = pos +posLenOfTok (CTokEnum pos ) = pos +posLenOfTok (CTokExtern pos ) = pos +posLenOfTok (CTokFloat pos ) = pos +posLenOfTok (CTokFloat128 pos ) = pos +posLenOfTok (CTokFor pos ) = pos +posLenOfTok (CTokGeneric pos ) = pos +posLenOfTok (CTokGoto pos ) = pos +posLenOfTok (CTokInt pos ) = pos +posLenOfTok (CTokInt128 pos ) = pos +posLenOfTok (CTokInline pos ) = pos +posLenOfTok (CTokIf pos ) = pos +posLenOfTok (CTokLong pos ) = pos +posLenOfTok (CTokLabel pos ) = pos +posLenOfTok (CTokNoreturn pos ) = pos +posLenOfTok (CTokNullable pos ) = pos +posLenOfTok (CTokNonnull pos ) = pos +posLenOfTok (CTokRegister pos ) = pos +posLenOfTok (CTokRestrict pos ) = pos +posLenOfTok (CTokReturn pos ) = pos +posLenOfTok (CTokShort pos ) = pos +posLenOfTok (CTokSigned pos ) = pos +posLenOfTok (CTokSizeof pos ) = pos +posLenOfTok (CTokStatic pos ) = pos +posLenOfTok (CTokStaticAssert pos) = pos +posLenOfTok (CTokStruct pos ) = pos +posLenOfTok (CTokSwitch pos ) = pos +posLenOfTok (CTokTypedef pos ) = pos +posLenOfTok (CTokTypeof pos ) = pos +posLenOfTok (CTokThread pos ) = pos +posLenOfTok (CTokUnion pos ) = pos +posLenOfTok (CTokUnsigned pos ) = pos +posLenOfTok (CTokVoid pos ) = pos +posLenOfTok (CTokVolatile pos ) = pos +posLenOfTok (CTokWhile pos ) = pos +posLenOfTok (CTokCLit pos _) = pos +posLenOfTok (CTokILit pos _) = pos +posLenOfTok (CTokFLit pos _) = pos +posLenOfTok (CTokSLit pos _) = pos +posLenOfTok (CTokIdent pos _) = pos +posLenOfTok (CTokTyIdent pos _) = pos +posLenOfTok (CTokGnuC _ pos ) = pos +posLenOfTok (CTokClangC pos _) = pos +posLenOfTok CTokEof = error "tokenPos: Eof" + +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 _ (CTokAlignas _ ) = showString "_Alignas" + showsPrec _ (CTokAsm _ ) = showString "asm" + showsPrec _ (CTokAtomic _ ) = showString "_Atomic" + showsPrec _ (CTokAuto _ ) = showString "auto" + showsPrec _ (CTokBool _) = showString "_Bool" + showsPrec _ (CTokBreak _ ) = showString "break" + showsPrec _ (CTokCase _ ) = showString "case" + showsPrec _ (CTokChar _ ) = showString "char" + showsPrec _ (CTokComplex _) = showString "_Complex" + 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 _ (CTokFloat128 _ ) = showString "__float128" + showsPrec _ (CTokFor _ ) = showString "for" + showsPrec _ (CTokGeneric _ ) = showString "_Generic" + showsPrec _ (CTokGoto _ ) = showString "goto" + showsPrec _ (CTokIf _ ) = showString "if" + showsPrec _ (CTokInline _ ) = showString "inline" + showsPrec _ (CTokInt _ ) = showString "int" + showsPrec _ (CTokInt128 _ ) = showString "__int128" + showsPrec _ (CTokLong _ ) = showString "long" + showsPrec _ (CTokLabel _ ) = showString "__label__" + showsPrec _ (CTokNoreturn _ ) = showString "_Noreturn" + showsPrec _ (CTokNullable _ ) = showString "_Nullable" + showsPrec _ (CTokNonnull _ ) = showString "_Nonnull" + 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 _ (CTokStaticAssert _ ) = showString "_Static_assert" + showsPrec _ (CTokStruct _ ) = showString "struct" + showsPrec _ (CTokSwitch _ ) = showString "switch" + showsPrec _ (CTokTypedef _ ) = showString "typedef" + showsPrec _ (CTokTypeof _ ) = showString "typeof" + showsPrec _ (CTokThread _ ) = showString "_Thread_local" + showsPrec _ (CTokUnion _ ) = showString "union" + showsPrec _ (CTokUnsigned _ ) = showString "unsigned" + showsPrec _ (CTokVoid _ ) = showString "void" + showsPrec _ (CTokVolatile _ ) = showString "volatile" + showsPrec _ (CTokWhile _ ) = showString "while" + showsPrec _ (CTokCLit _ c) = shows c + showsPrec _ (CTokILit _ i) = shows i + showsPrec _ (CTokFLit _ f) = shows f + showsPrec _ (CTokSLit _ s) = shows s + showsPrec _ (CTokIdent _ i) = (showString . identToString) i + showsPrec _ (CTokTyIdent _ i) = (showString . identToString) i + showsPrec _ (CTokGnuC GnuCAttrTok _) = showString "__attribute__" + showsPrec _ (CTokGnuC GnuCExtTok _) = showString "__extension__" + showsPrec _ (CTokGnuC GnuCComplexReal _) = showString "__real__" + showsPrec _ (CTokGnuC GnuCComplexImag _) = showString "__imag__" + showsPrec _ (CTokGnuC GnuCVaArg _) = showString "__builtin_va_arg" + showsPrec _ (CTokGnuC GnuCOffsetof _) = showString "__builtin_offsetof" + showsPrec _ (CTokGnuC GnuCTyCompat _) = showString "__builtin_types_compatible_p" + showsPrec _ (CTokClangC _ (ClangCVersionTok v)) = shows v + showsPrec _ (CTokClangC _ ClangBuiltinConvertVector) = showString "__builtin_convertvector" + showsPrec _ CTokEof = error "show CToken : CTokEof"
src/Language/C/Pretty.hs view
@@ -1,545 +1,546 @@-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, FlexibleContexts #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Pretty--- Copyright : Copyright (c) 2007 Bertram Felgenhauer--- (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : portable------ This module provides a pretty printer for the parse tree--- ('Language.C.Syntax.AST').-------------------------------------------------------------------------------module Language.C.Pretty (- -- * Pretty Printing- Pretty (..),- -- * Testing- prettyUsingInclude-) where-import Data.List (isSuffixOf)-import qualified Data.Set as Set-import Text.PrettyPrint.HughesPJ-import Debug.Trace {- for warnings -}--import Language.C.Data-import Language.C.Syntax---- | A class of types which can be pretty printed-class Pretty p where- -- | pretty print the given value- pretty :: p -> Doc- -- | @prettyPrec prec p@ pretty prints p assuming- -- that the surrounding context has a precedence of- -- @prec@- prettyPrec :: Int -> p -> Doc-- pretty = prettyPrec 0- prettyPrec _ = pretty---- pretty print optional chunk-maybeP :: (p -> Doc) -> Maybe p -> Doc-maybeP = maybe empty---- pretty print when flag is true-ifP :: Bool -> Doc -> Doc-ifP flag doc = if flag then doc else empty---- pretty print _optional_ list, i.e. [] ~ Nothing and (x:xs) ~ Just (x:xs)-mlistP :: ([p] -> Doc) -> [p] -> Doc-mlistP pp xs = maybeP pp (if null xs then Nothing else Just xs)---- pretty print identifier-identP :: Ident -> Doc-identP = text . identToString---- pretty print attribute annotations-attrlistP :: [CAttr] -> Doc-attrlistP [] = empty-attrlistP attrs = text "__attribute__" <> parens (parens (hcat . punctuate comma . map pretty $ attrs))---- analogous to showParen-parenPrec :: Int -> Int -> Doc -> Doc-parenPrec prec prec2 t = if prec <= prec2 then t else parens t---- indent a chunk of code-ii :: Doc -> Doc-ii = nest 4---- Pretty instances-instance Pretty CTranslUnit where- pretty (CTranslUnit edecls _) = vcat (map pretty edecls)---- | Pretty print the given tranlation unit, but replace declarations from header files with @#include@ directives.------ The resulting file may not compile (because of missing @#define@ directives and similar things), but is very useful--- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers.-prettyUsingInclude :: CTranslUnit -> Doc-prettyUsingInclude (CTranslUnit edecls _) =- includeWarning headerFiles- $$- vcat (map (either includeHeader pretty) mappedDecls)- where- (headerFiles,mappedDecls) = foldr (addDecl . tagIncludedDecls) (Set.empty,[]) edecls- tagIncludedDecls edecl | maybe False isHeaderFile (fileOfNode edecl) = Left ((posFile . posOf) edecl)- | otherwise = Right edecl- addDecl decl@(Left headerRef) (headerSet, ds)- | Set.member headerRef headerSet = (headerSet, ds)- | otherwise = (Set.insert headerRef headerSet, decl : ds)- addDecl decl (headerSet,ds) = (headerSet, decl : ds)- includeHeader hFile = text "#include" <+> doubleQuotes (text hFile)- isHeaderFile = (".h" `isSuffixOf`)- includeWarning hs | Set.null hs = empty- | otherwise = text "/* Warning: The #include directives in this file aren't necessarily correct. */"---- TODO: Check need of __extension__-instance Pretty CExtDecl where- pretty (CDeclExt decl) = pretty decl <> semi- pretty (CFDefExt fund) = pretty fund- pretty (CAsmExt asmStmt _) = text "asm" <> parens (pretty asmStmt) <> semi---- TODO: Check that old-style and new-style aren't mixed-instance Pretty CFunDef where- pretty (CFunDef declspecs declr decls stat _) = -- Example:- hsep (map pretty declspecs) -- __attribute__((noreturn)) static long- <+> pretty declr -- foo(b)- $+$ (ii . vcat . map ((<> semi) . pretty)) decls -- register long b;- $$ prettyPrec (-1) stat -- { ...- -- }--instance Pretty CStat where- pretty (CLabel ident stat cattrs _) = identP ident <> text ":" <+> attrlistP cattrs $$ pretty stat- pretty (CCase expr stat _) =- text "case" <+> pretty expr <> text ":" $$ pretty stat- pretty (CCases expr1 expr2 stat _) =- text "case" <+> pretty expr1 <+> text "..."- <+> pretty expr2 <> text ":" $$ pretty stat- pretty (CDefault stat _) = text "default:" $$ pretty stat- pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi- pretty c@(CCompound _ _ _) = prettyPrec 0 c- pretty (CIf expr stat estat _) =- ii $ text "if" <+> parens (pretty expr)- $+$ prettyBody stat- $$ maybeP prettyElse estat- where- prettyBody c@(CCompound _ _ _) = prettyPrec (-1) c- prettyBody nonCompound = prettyPrec (-1) (CCompound [] [CBlockStmt nonCompound] undefined)- prettyElse (CIf else_if_expr else_if_stat else_stat _) =- text "else if" <+> parens (pretty else_if_expr)- $+$ prettyBody else_if_stat- $$ maybeP prettyElse else_stat- prettyElse else_stmt =- text "else"- $+$ prettyBody else_stmt-- pretty (CSwitch expr stat _) =- ii $ text "switch" <+> text "(" <> pretty expr <> text ")"- $+$ prettyPrec (-1) stat- pretty (CWhile expr stat False _) =- ii $ text "while" <+> text "(" <> pretty expr <> text ")"- $+$ prettyPrec (-1) stat- pretty (CWhile expr stat True _) =- ii $ text "do" $+$ prettyPrec (-1) stat- $$ text "while" <+> text "(" <> pretty expr <> text ");"- pretty (CFor for_init cond step stat _) =- ii $ text "for" <+> text "("- <> either (maybeP pretty) pretty for_init <> semi- <+> maybeP pretty cond <> semi- <+> maybeP pretty step <> text ")" $+$ prettyPrec (-1) stat- pretty (CGoto ident _) = ii $ text "goto" <+> identP ident <> semi- pretty (CGotoPtr expr _) = ii $ text "goto" <+> text "*" <+> prettyPrec 30 expr <> semi- pretty (CCont _) = ii $ text "continue" <> semi- pretty (CBreak _) = ii $ text "break" <> semi- pretty (CReturn Nothing _) = ii $ text "return" <> semi- pretty (CReturn (Just e) _) = ii $ text "return" <+> pretty e <> semi- pretty (CAsm asmStmt _) = pretty asmStmt- prettyPrec p (CCompound localLabels bis _) =- let inner = text "{" $+$ mlistP ppLblDecls localLabels $+$ vcat (map pretty bis) $$ text "}"- in if p == -1 then inner else ii inner- where ppLblDecls = vcat . map (\l -> text "__label__" <+> identP l <+> semi)- prettyPrec _ p = pretty p--instance Pretty CAsmStmt where- pretty (CAsmStmt tyQual expr outOps inOps clobbers _) =- ii $ text "__asm__" <+>- maybeP pretty tyQual <>- parens asmStmt <> semi- where- asmStmt = pretty expr <+>- (if all null [inOps,outOps] && null clobbers then empty else ops)- ops = text ":" <+> hcat (punctuate comma (map pretty outOps)) <+>- text ":" <+> hcat (punctuate comma (map pretty inOps)) <+>- (if null clobbers then empty else clobs)- clobs = text ":" <+> hcat (punctuate comma (map pretty clobbers))--instance Pretty CAsmOperand where- -- asm_operand :~ [operand-name] "constraint" ( expr )- pretty (CAsmOperand mArgName cnstr expr _) =- maybeP (\argName -> text "[" <> identP argName <> text "]") mArgName <+>- pretty cnstr <+>- parens (pretty expr)---- TODO: Check need of __extension__-instance Pretty CBlockItem where- pretty (CBlockStmt stat) = pretty stat- pretty (CBlockDecl decl) = ii $ pretty decl <> semi- pretty (CNestedFunDef fundef) = ii $ pretty fundef--instance Pretty CDecl where- -- CAVEAT:- -- we may not print __attribute__s directly after typespecs,- -- as this may change the semantics of the declaration.- -- The parser fixes this, but to avoid hard-to-track code generator- -- errors, we enforce this invariant on the AST level.- pretty (CDecl specs divs _) =- hsep (map pretty checked_specs) <+> hsep (punctuate comma (map p divs))- where- -- possible hint for AST improvement - (declr, initializer, expr, attrs)- -- currently there are no sensible attributes for unnamed bitfields though- p (declr, initializer, expr) =- maybeP (prettyDeclr False 0) declr <+>- maybeP ((text ":" <+>) . pretty) expr <+>- attrlistP (getAttrs declr) <+>- maybeP ((text "=" <+>) . pretty) initializer- checked_specs =- if any isAttrAfterSUE (zip specs (tail specs))- then trace- ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:" ++- show (map pretty specs))- specs- else specs- isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty- isAttrAfterSUE _ = False- getAttrs Nothing = []- getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs- pretty (CStaticAssert expr str _) =- text "_Static_assert" <> parens (hsep (punctuate comma [pretty expr, pretty str]))--instance Pretty CDeclSpec where- pretty (CStorageSpec sp) = pretty sp- pretty (CTypeSpec sp) = pretty sp- pretty (CTypeQual qu) = pretty qu- pretty (CFunSpec fs) = pretty fs- pretty (CAlignSpec sa) = pretty sa--instance Pretty CAlignSpec where- pretty (CAlignAsType decl _) =- text "_Alignas" <> parens (pretty decl)- pretty (CAlignAsExpr expr _) =- text "_Alignas" <> parens (pretty expr)--instance Pretty CStorageSpec where- pretty (CAuto _) = text "auto"- pretty (CRegister _) = text "register"- pretty (CStatic _) = text "static"- pretty (CExtern _) = text "extern"- pretty (CTypedef _) = text "typedef"- pretty (CThread _) = text "_Thread_local"--instance Pretty CTypeSpec where- pretty (CVoidType _) = text "void"- pretty (CCharType _) = text "char"- pretty (CShortType _) = text "short"- pretty (CIntType _) = text "int"- pretty (CLongType _) = text "long"- pretty (CFloatType _) = text "float"- pretty (CFloat128Type _) = text "__float128"- pretty (CDoubleType _) = text "double"- pretty (CSignedType _) = text "signed"- pretty (CUnsigType _) = text "unsigned"- pretty (CBoolType _) = text "_Bool"- pretty (CComplexType _) = text "_Complex"- pretty (CInt128Type _) = text "__int128"- pretty (CSUType union _) = pretty union- pretty (CEnumType enum _) = pretty enum- pretty (CTypeDef ident _) = identP ident- pretty (CTypeOfExpr expr _) =- text "typeof" <> parens (pretty expr)- pretty (CTypeOfType decl _) =- text "typeof" <> parens (pretty decl)- pretty (CAtomicType decl _) =- text "_Atomic" <> parens (pretty decl)--instance Pretty CTypeQual where- pretty (CConstQual _) = text "const"- pretty (CVolatQual _) = text "volatile"- pretty (CRestrQual _) = text "__restrict"- pretty (CAtomicQual _) = text "_Atomic"- pretty (CAttrQual a) = attrlistP [a]- pretty (CNullableQual _) = text "_Nullable"- pretty (CNonnullQual _) = text "_Nonnull"--instance Pretty CFunSpec where- pretty (CInlineQual _) = text "inline"- pretty (CNoreturnQual _) = text "_Noreturn"--instance Pretty CStructUnion where- pretty (CStruct tag ident Nothing cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident- pretty (CStruct tag ident (Just []) cattrs _) =- pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{ }"- pretty (CStruct tag ident (Just decls) cattrs _) = vcat [- pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{",- ii $ sep (map ((<> semi) . pretty) decls),- text "}"]--instance Pretty CStructTag where- pretty CStructTag = text "struct"- pretty CUnionTag = text "union"--instance Pretty CEnum where- pretty (CEnum enum_ident Nothing cattrs _) = text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident- pretty (CEnum enum_ident (Just vals) cattrs _) = vcat [- text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident <+> text "{",- ii $ sep (punctuate comma (map p vals)),- text "}"] where- p (ident, expr) = identP ident <+> maybeP ((text "=" <+>) . pretty) expr---- Analyze a declarator and return a human-readable description--- See C99 Spec p 115ff.--- describeDeclr :: CDeclr -> Doc--- describeDeclr declr =--- let declrs = reverse (declrChain declr) in--- endDescr (foldl descrDeclr undefined declrs)------ where--- declrChain declr@(CVarDeclr _ _ _ _) = [declr]--- declrChain declr@(CPtrDeclr _ ideclr _) = declr : declrChain ideclr--- declrChain declr@(CArrDeclr ideclr _ _ _) = declr : declrChain ideclr--- declrChain declr@(CFunDeclr ideclr _ _ _) = declr : declrChain ideclr------ descrDeclr _ (CVarDeclr ident asm cattrs _) = single False $ \_ ->--- maybe (text "<anonymous>") identP ident <+>--- maybeP (\asmname -> parens (text "asm:" <+> pretty asmname)) asm <+>--- text "is" <+> (if null cattrs then empty else prettyList (map CAttrQual cattrs) <> comma)--- descrDeclr (pre,isPlural) (CPtrDeclr quals declr _) = single isPlural $ \pluralize ->--- pre <+> indefArticle isPlural <> prettyList quals <+> pluralize "pointer to" "pointers to"--- descrDeclr (pre,isPlural) (CArrDeclr declr quals expr _) = plural isPlural $ \pluralize ->--- pre <+> indefArticle' isPlural <> prettyList quals <+> pluralize "array of" "arrays of"--- descrDeclr (pre,isPlural) (CFunDeclr declr params cattrs _) = single isPlural $ \pluralize ->--- pre <+> indefArticle isPlural <> prettyList (map CAttrQual cattrs) <+> pluralize "function returning" "functions returning"--- endDescr (pre, isPlural) = pre <+> text (if isPlural then "<typed objects>" else "a <typed object>")--- single :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)--- single isPlural mkDescr = (mkDescr (pluralize isPlural), isPlural)--- plural :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool)--- plural isPlural mkDescr = (mkDescr (pluralize isPlural), True)--- indefArticle isPlural = text$ if isPlural then "" else "a "--- indefArticle' isPlural = text$ if isPlural then "" else "an "--- pluralize isPlural s p = text (if isPlural then p else s)--- prettyList :: (Pretty a) => [a] -> Doc--- prettyList = hsep . punctuate comma . map pretty-instance Pretty CDeclr where- prettyPrec prec declr = prettyDeclr True prec declr--prettyDeclr :: Bool -> Int -> CDeclr -> Doc-prettyDeclr show_attrs prec (CDeclr name derived_declrs asmname cattrs _) =- ppDeclr prec (reverse derived_declrs) <+> prettyAsmName asmname <+> ifP show_attrs (attrlistP cattrs)- where- ppDeclr _ [] = maybeP identP name- --'*' __attribute__? qualifiers declarator- ppDeclr p (CPtrDeclr quals _ : declrs) =- parenPrec p 5 $ text "*" <+> hsep (map pretty quals) <+> ppDeclr 5 declrs-- -- declarator[ __attribute__? qualifiers expr ]- ppDeclr p (CArrDeclr quals size _ : declrs) =- parenPrec p 6 $ ppDeclr 6 declrs <> brackets (hsep (map pretty quals) <+> pretty size)- -- declarator ( arguments )- -- or (__attribute__ declarator) (arguments)- ppDeclr _ (CFunDeclr params fun_attrs _ : declrs) =- (if not (null fun_attrs) then parens (attrlistP fun_attrs <+> ppDeclr 5 declrs) else ppDeclr 6 declrs)- <> parens (prettyParams params)- prettyParams (Right (decls, isVariadic)) =- sep (punctuate comma (map pretty decls))- <> (if isVariadic then text "," <+> text "..." else empty)- prettyParams (Left oldStyleIds) =- hsep (punctuate comma (map identP oldStyleIds))- prettyAsmName asm_name_opt- = maybe empty (\asm_name -> text "__asm__" <> parens (pretty asm_name)) asm_name_opt--instance Pretty CArrSize where- pretty (CNoArrSize completeType) = ifP completeType (text "*")- pretty (CArrSize staticMod expr) = ifP staticMod (text "static") <+> pretty expr--- initializer :: { CInit }--- initializer :- assignment_expression--- | '{' (designation? initializer)_cs_list '}'-instance Pretty CInit where- pretty (CInitExpr expr _) = pretty expr- pretty (CInitList initl _) =- text "{" <+> hsep (punctuate comma (map p initl)) <+> text "}" where- p ([], initializer) = pretty initializer- p (desigs, initializer) = hsep (map pretty desigs) <+> text "=" <+> pretty initializer---- designation :- designator_list '='--- | array_range_designator--- arr_designator :- '[' constant_expression ']'--- member_designator :- '.' identifier--- arr_range _designator :- '[' constant_expression "..." constant_expression ']'--instance Pretty CDesignator where- pretty (CArrDesig expr _) = text "[" <> pretty expr <> text "]"- pretty (CMemberDesig ident _) = text "." <> identP ident- pretty (CRangeDesig expr1 expr2 _) =- text "[" <> pretty expr1 <+> text "..." <+> pretty expr2 <> text "]"--instance Pretty CAttr where- pretty (CAttr attrName [] _) = identP attrName- pretty (CAttr attrName attrParams _) = identP attrName <> parens (hsep . punctuate comma . map pretty $ attrParams)--instance Pretty CExpr where- prettyPrec p (CComma exprs _) =- parenPrec p (-1) $ hsep (punctuate comma (map (prettyPrec 2) exprs))- prettyPrec p (CAssign op expr1 expr2 _) =- parenPrec p 2 $ prettyPrec 3 expr1 <+> pretty op <+> prettyPrec 2 expr2- prettyPrec p (CCond expr1 expr2 expr3 _) =- parenPrec p 2 $ prettyPrec 4 expr1 <+> text "?" -- NB: assignment only has a higher precedence if cond is on the rhs- <+> maybeP pretty expr2 <+> text ":" <+> prettyPrec 4 expr3- prettyPrec p (CBinary op expr1 expr2 _) =- let prec = binPrec op- in parenPrec p prec $ prettyPrec prec expr1- <+> pretty op <+> prettyPrec (prec + 1) expr2- prettyPrec p (CCast decl expr _) =- parenPrec p 25 $ text "(" <> pretty decl <> text ")"- <+> prettyPrec 25 expr- prettyPrec p (CUnary CPostIncOp expr _) =- parenPrec p 26 $ prettyPrec 26 expr <> text "++"- prettyPrec p (CUnary CPostDecOp expr _) =- parenPrec p 26 $ prettyPrec 26 expr <> text "--"- prettyPrec p (CUnary op expr@(CUnary _ _ _) _) =- -- parens aren't necessary, but look nicer imho- parenPrec p 25 $ pretty op <+> parens (prettyPrec 25 expr)- prettyPrec p (CUnary op expr _) =- parenPrec p 25 $ pretty op <> prettyPrec 25 expr- prettyPrec p (CSizeofExpr expr _) =- parenPrec p 25 $ text "sizeof" <> parens (pretty expr)- prettyPrec p (CSizeofType decl _) =- parenPrec p 25 $ text "sizeof" <> parens (pretty decl)- prettyPrec p (CAlignofExpr expr _) =- parenPrec p 25 $ text "__alignof" <> parens (pretty expr)- prettyPrec p (CAlignofType decl _) =- parenPrec p 25 $ text "__alignof" <> parens (pretty decl)- prettyPrec p (CComplexReal expr _) =- parenPrec p 25 $ text "__real" <+> prettyPrec 25 expr- prettyPrec p (CComplexImag expr _) =- parenPrec p 25 $ text "__imag" <+> prettyPrec 25 expr- prettyPrec p (CIndex expr1 expr2 _) =- parenPrec p 26 $ prettyPrec 26 expr1- <> text "[" <> pretty expr2 <> text "]"- prettyPrec p (CCall expr args _) =- parenPrec p 30 $ prettyPrec 30 expr <> text "("- <> (sep . punctuate comma . map pretty) args <> text ")"- prettyPrec p (CMember expr ident deref _) =- parenPrec p 26 $ prettyPrec 26 expr- <> text (if deref then "->" else ".") <> identP ident- prettyPrec _p (CVar ident _) = identP ident- prettyPrec _p (CConst constant) = pretty constant- prettyPrec _p (CCompoundLit decl initl _) =- parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where- p ([], initializer) = pretty initializer- p (mems, initializer) = hcat (punctuate (text ".") (map pretty mems)) <+> text "=" <+> pretty initializer-- prettyPrec _p (CStatExpr stat _) =- text "(" <> pretty stat <> text ")"-- -- unary_expr :- && ident {- address of label -}- prettyPrec _p (CLabAddrExpr ident _) = text "&&" <> identP ident- prettyPrec _p (CGenericSelection expr assoc_list _) =- text "_Generic" <> (parens.hsep.punctuate comma) (pretty expr : map pAssoc assoc_list)- where- pAssoc (mty, expr1) = maybe (text "default") pretty mty <> text ":" <+> pretty expr1- prettyPrec _p (CBuiltinExpr builtin) = pretty builtin--instance Pretty CBuiltin where- pretty (CBuiltinVaArg expr ty_name _) =- text "__builtin_va_arg" <+>- parens (pretty expr <> comma <+> pretty ty_name)- -- The first desig has to be a member field.- pretty (CBuiltinOffsetOf ty_name (CMemberDesig field1 _ : desigs) _) =- text "__builtin_offsetof" <+>- parens (pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) )- pretty (CBuiltinOffsetOf _ty_name otherDesigs _) =- error $ "Inconsistent AST: Cannot interpret designators in offsetOf: " ++- show (hcat $ map pretty otherDesigs)- pretty (CBuiltinTypesCompatible ty1 ty2 _) =- text "__builtin_types_compatible_p" <+>- parens (pretty ty1 <> comma <+> pretty ty2)- pretty (CBuiltinConvertVector expr ty _) =- text "__builtin_convertvector" <+>- parens (pretty expr <> comma <+> pretty ty)--instance Pretty CAssignOp where- pretty op = text $ case op of- CAssignOp -> "="- CMulAssOp -> "*="- CDivAssOp -> "/="- CRmdAssOp -> "%="- CAddAssOp -> "+="- CSubAssOp -> "-="- CShlAssOp -> "<<="- CShrAssOp -> ">>="- CAndAssOp -> "&="- CXorAssOp -> "^="- COrAssOp -> "|="--instance Pretty CBinaryOp where- pretty op = text $ case op of- CMulOp -> "*"- CDivOp -> "/"- CRmdOp -> "%"- CAddOp -> "+"- CSubOp -> "-"- CShlOp -> "<<"- CShrOp -> ">>"- CLeOp -> "<"- CGrOp -> ">"- CLeqOp -> "<="- CGeqOp -> ">="- CEqOp -> "=="- CNeqOp -> "!="- CAndOp -> "&"- CXorOp -> "^"- COrOp -> "|"- CLndOp -> "&&"- CLorOp -> "||"--instance Pretty CUnaryOp where- pretty op = text $ case op of- CPreIncOp -> "++"- CPreDecOp -> "--"- CPostIncOp -> "++"- CPostDecOp -> "--"- CAdrOp -> "&"- CIndOp -> "*"- CPlusOp -> "+"- CMinOp -> "-"- CCompOp -> "~"- CNegOp -> "!"--instance Pretty CConst where- pretty (CIntConst int_const _) = text (show int_const)- pretty (CCharConst chr _) = text (show chr)- pretty (CFloatConst flt _) = text (show flt)- pretty (CStrConst str _) = text (show str)--instance Pretty CStrLit where- pretty (CStrLit str _) = text (show str)---- precedence of C operators-binPrec :: CBinaryOp -> Int-binPrec CMulOp = 20-binPrec CDivOp = 20-binPrec CRmdOp = 20-binPrec CAddOp = 19-binPrec CSubOp = 19-binPrec CShlOp = 18-binPrec CShrOp = 18-binPrec CLeOp = 17-binPrec CGrOp = 17-binPrec CLeqOp = 17-binPrec CGeqOp = 17-binPrec CEqOp = 16-binPrec CNeqOp = 16-binPrec CAndOp = 15-binPrec CXorOp = 14-binPrec COrOp = 13-binPrec CLndOp = 12-binPrec CLorOp = 11+{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, FlexibleContexts #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Pretty +-- Copyright : Copyright (c) 2007 Bertram Felgenhauer +-- (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : portable +-- +-- This module provides a pretty printer for the parse tree +-- ('Language.C.Syntax.AST'). +----------------------------------------------------------------------------- +module Language.C.Pretty ( + -- * Pretty Printing + Pretty (..), + -- * Testing + prettyUsingInclude +) where +import Data.List (isSuffixOf) +import qualified Data.Set as Set +import Text.PrettyPrint.HughesPJ +import Debug.Trace {- for warnings -} +import Prelude hiding ((<>)) + +import Language.C.Data +import Language.C.Syntax + +-- | A class of types which can be pretty printed +class Pretty p where + -- | pretty print the given value + pretty :: p -> Doc + -- | @prettyPrec prec p@ pretty prints p assuming + -- that the surrounding context has a precedence of + -- @prec@ + prettyPrec :: Int -> p -> Doc + + pretty = prettyPrec 0 + prettyPrec _ = pretty + +-- pretty print optional chunk +maybeP :: (p -> Doc) -> Maybe p -> Doc +maybeP = maybe empty + +-- pretty print when flag is true +ifP :: Bool -> Doc -> Doc +ifP flag doc = if flag then doc else empty + +-- pretty print _optional_ list, i.e. [] ~ Nothing and (x:xs) ~ Just (x:xs) +mlistP :: ([p] -> Doc) -> [p] -> Doc +mlistP pp xs = maybeP pp (if null xs then Nothing else Just xs) + +-- pretty print identifier +identP :: Ident -> Doc +identP = text . identToString + +-- pretty print attribute annotations +attrlistP :: [CAttr] -> Doc +attrlistP [] = empty +attrlistP attrs = text "__attribute__" <> parens (parens (hcat . punctuate comma . map pretty $ attrs)) + +-- analogous to showParen +parenPrec :: Int -> Int -> Doc -> Doc +parenPrec prec prec2 t = if prec <= prec2 then t else parens t + +-- indent a chunk of code +ii :: Doc -> Doc +ii = nest 4 + +-- Pretty instances +instance Pretty CTranslUnit where + pretty (CTranslUnit edecls _) = vcat (map pretty edecls) + +-- | Pretty print the given tranlation unit, but replace declarations from header files with @#include@ directives. +-- +-- The resulting file may not compile (because of missing @#define@ directives and similar things), but is very useful +-- for testing, as otherwise the pretty printed file will be cluttered with declarations from system headers. +prettyUsingInclude :: CTranslUnit -> Doc +prettyUsingInclude (CTranslUnit edecls _) = + includeWarning headerFiles + $$ + vcat (map (either includeHeader pretty) mappedDecls) + where + (headerFiles,mappedDecls) = foldr (addDecl . tagIncludedDecls) (Set.empty,[]) edecls + tagIncludedDecls edecl | maybe False isHeaderFile (fileOfNode edecl) = Left ((posFile . posOf) edecl) + | otherwise = Right edecl + addDecl decl@(Left headerRef) (headerSet, ds) + | Set.member headerRef headerSet = (headerSet, ds) + | otherwise = (Set.insert headerRef headerSet, decl : ds) + addDecl decl (headerSet,ds) = (headerSet, decl : ds) + includeHeader hFile = text "#include" <+> doubleQuotes (text hFile) + isHeaderFile = (".h" `isSuffixOf`) + includeWarning hs | Set.null hs = empty + | otherwise = text "/* Warning: The #include directives in this file aren't necessarily correct. */" + +-- TODO: Check need of __extension__ +instance Pretty CExtDecl where + pretty (CDeclExt decl) = pretty decl <> semi + pretty (CFDefExt fund) = pretty fund + pretty (CAsmExt asmStmt _) = text "asm" <> parens (pretty asmStmt) <> semi + +-- TODO: Check that old-style and new-style aren't mixed +instance Pretty CFunDef where + pretty (CFunDef declspecs declr decls stat _) = -- Example: + hsep (map pretty declspecs) -- __attribute__((noreturn)) static long + <+> pretty declr -- foo(b) + $+$ (ii . vcat . map ((<> semi) . pretty)) decls -- register long b; + $$ prettyPrec (-1) stat -- { ... + -- } + +instance Pretty CStat where + pretty (CLabel ident stat cattrs _) = identP ident <> text ":" <+> attrlistP cattrs $$ pretty stat + pretty (CCase expr stat _) = + text "case" <+> pretty expr <> text ":" $$ pretty stat + pretty (CCases expr1 expr2 stat _) = + text "case" <+> pretty expr1 <+> text "..." + <+> pretty expr2 <> text ":" $$ pretty stat + pretty (CDefault stat _) = text "default:" $$ pretty stat + pretty (CExpr expr _) = ii $ maybeP pretty expr <> semi + pretty c@(CCompound _ _ _) = prettyPrec 0 c + pretty (CIf expr stat estat _) = + ii $ text "if" <+> parens (pretty expr) + $+$ prettyBody stat + $$ maybeP prettyElse estat + where + prettyBody c@(CCompound _ _ _) = prettyPrec (-1) c + prettyBody nonCompound = prettyPrec (-1) (CCompound [] [CBlockStmt nonCompound] undefined) + prettyElse (CIf else_if_expr else_if_stat else_stat _) = + text "else if" <+> parens (pretty else_if_expr) + $+$ prettyBody else_if_stat + $$ maybeP prettyElse else_stat + prettyElse else_stmt = + text "else" + $+$ prettyBody else_stmt + + pretty (CSwitch expr stat _) = + ii $ text "switch" <+> text "(" <> pretty expr <> text ")" + $+$ prettyPrec (-1) stat + pretty (CWhile expr stat False _) = + ii $ text "while" <+> text "(" <> pretty expr <> text ")" + $+$ prettyPrec (-1) stat + pretty (CWhile expr stat True _) = + ii $ text "do" $+$ prettyPrec (-1) stat + $$ text "while" <+> text "(" <> pretty expr <> text ");" + pretty (CFor for_init cond step stat _) = + ii $ text "for" <+> text "(" + <> either (maybeP pretty) pretty for_init <> semi + <+> maybeP pretty cond <> semi + <+> maybeP pretty step <> text ")" $+$ prettyPrec (-1) stat + pretty (CGoto ident _) = ii $ text "goto" <+> identP ident <> semi + pretty (CGotoPtr expr _) = ii $ text "goto" <+> text "*" <+> prettyPrec 30 expr <> semi + pretty (CCont _) = ii $ text "continue" <> semi + pretty (CBreak _) = ii $ text "break" <> semi + pretty (CReturn Nothing _) = ii $ text "return" <> semi + pretty (CReturn (Just e) _) = ii $ text "return" <+> pretty e <> semi + pretty (CAsm asmStmt _) = pretty asmStmt + prettyPrec p (CCompound localLabels bis _) = + let inner = text "{" $+$ mlistP ppLblDecls localLabels $+$ vcat (map pretty bis) $$ text "}" + in if p == -1 then inner else ii inner + where ppLblDecls = vcat . map (\l -> text "__label__" <+> identP l <+> semi) + prettyPrec _ p = pretty p + +instance Pretty CAsmStmt where + pretty (CAsmStmt tyQual expr outOps inOps clobbers _) = + ii $ text "__asm__" <+> + maybeP pretty tyQual <> + parens asmStmt <> semi + where + asmStmt = pretty expr <+> + (if all null [inOps,outOps] && null clobbers then empty else ops) + ops = text ":" <+> hcat (punctuate comma (map pretty outOps)) <+> + text ":" <+> hcat (punctuate comma (map pretty inOps)) <+> + (if null clobbers then empty else clobs) + clobs = text ":" <+> hcat (punctuate comma (map pretty clobbers)) + +instance Pretty CAsmOperand where + -- asm_operand :~ [operand-name] "constraint" ( expr ) + pretty (CAsmOperand mArgName cnstr expr _) = + maybeP (\argName -> text "[" <> identP argName <> text "]") mArgName <+> + pretty cnstr <+> + parens (pretty expr) + +-- TODO: Check need of __extension__ +instance Pretty CBlockItem where + pretty (CBlockStmt stat) = pretty stat + pretty (CBlockDecl decl) = ii $ pretty decl <> semi + pretty (CNestedFunDef fundef) = ii $ pretty fundef + +instance Pretty CDecl where + -- CAVEAT: + -- we may not print __attribute__s directly after typespecs, + -- as this may change the semantics of the declaration. + -- The parser fixes this, but to avoid hard-to-track code generator + -- errors, we enforce this invariant on the AST level. + pretty (CDecl specs divs _) = + hsep (map pretty checked_specs) <+> hsep (punctuate comma (map p divs)) + where + -- possible hint for AST improvement - (declr, initializer, expr, attrs) + -- currently there are no sensible attributes for unnamed bitfields though + p (declr, initializer, expr) = + maybeP (prettyDeclr False 0) declr <+> + maybeP ((text ":" <+>) . pretty) expr <+> + attrlistP (getAttrs declr) <+> + maybeP ((text "=" <+>) . pretty) initializer + checked_specs = + if any isAttrAfterSUE (zip specs (tail specs)) + then trace + ("Warning: AST Invariant violated: __attribute__ specifier following struct/union/enum:" ++ + show (map pretty specs)) + specs + else specs + isAttrAfterSUE (CTypeSpec ty,CTypeQual (CAttrQual _)) = isSUEDef ty + isAttrAfterSUE _ = False + getAttrs Nothing = [] + getAttrs (Just (CDeclr _ _ _ cattrs _)) = cattrs + pretty (CStaticAssert expr str _) = + text "_Static_assert" <> parens (hsep (punctuate comma [pretty expr, pretty str])) + +instance Pretty CDeclSpec where + pretty (CStorageSpec sp) = pretty sp + pretty (CTypeSpec sp) = pretty sp + pretty (CTypeQual qu) = pretty qu + pretty (CFunSpec fs) = pretty fs + pretty (CAlignSpec sa) = pretty sa + +instance Pretty CAlignSpec where + pretty (CAlignAsType decl _) = + text "_Alignas" <> parens (pretty decl) + pretty (CAlignAsExpr expr _) = + text "_Alignas" <> parens (pretty expr) + +instance Pretty CStorageSpec where + pretty (CAuto _) = text "auto" + pretty (CRegister _) = text "register" + pretty (CStatic _) = text "static" + pretty (CExtern _) = text "extern" + pretty (CTypedef _) = text "typedef" + pretty (CThread _) = text "_Thread_local" + +instance Pretty CTypeSpec where + pretty (CVoidType _) = text "void" + pretty (CCharType _) = text "char" + pretty (CShortType _) = text "short" + pretty (CIntType _) = text "int" + pretty (CLongType _) = text "long" + pretty (CFloatType _) = text "float" + pretty (CFloat128Type _) = text "__float128" + pretty (CDoubleType _) = text "double" + pretty (CSignedType _) = text "signed" + pretty (CUnsigType _) = text "unsigned" + pretty (CBoolType _) = text "_Bool" + pretty (CComplexType _) = text "_Complex" + pretty (CInt128Type _) = text "__int128" + pretty (CSUType union _) = pretty union + pretty (CEnumType enum _) = pretty enum + pretty (CTypeDef ident _) = identP ident + pretty (CTypeOfExpr expr _) = + text "typeof" <> parens (pretty expr) + pretty (CTypeOfType decl _) = + text "typeof" <> parens (pretty decl) + pretty (CAtomicType decl _) = + text "_Atomic" <> parens (pretty decl) + +instance Pretty CTypeQual where + pretty (CConstQual _) = text "const" + pretty (CVolatQual _) = text "volatile" + pretty (CRestrQual _) = text "__restrict" + pretty (CAtomicQual _) = text "_Atomic" + pretty (CAttrQual a) = attrlistP [a] + pretty (CNullableQual _) = text "_Nullable" + pretty (CNonnullQual _) = text "_Nonnull" + +instance Pretty CFunSpec where + pretty (CInlineQual _) = text "inline" + pretty (CNoreturnQual _) = text "_Noreturn" + +instance Pretty CStructUnion where + pretty (CStruct tag ident Nothing cattrs _) = pretty tag <+> attrlistP cattrs <+> maybeP identP ident + pretty (CStruct tag ident (Just []) cattrs _) = + pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{ }" + pretty (CStruct tag ident (Just decls) cattrs _) = vcat [ + pretty tag <+> attrlistP cattrs <+> maybeP identP ident <+> text "{", + ii $ sep (map ((<> semi) . pretty) decls), + text "}"] + +instance Pretty CStructTag where + pretty CStructTag = text "struct" + pretty CUnionTag = text "union" + +instance Pretty CEnum where + pretty (CEnum enum_ident Nothing cattrs _) = text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident + pretty (CEnum enum_ident (Just vals) cattrs _) = vcat [ + text "enum" <+> attrlistP cattrs <+> maybeP identP enum_ident <+> text "{", + ii $ sep (punctuate comma (map p vals)), + text "}"] where + p (ident, expr) = identP ident <+> maybeP ((text "=" <+>) . pretty) expr + +-- Analyze a declarator and return a human-readable description +-- See C99 Spec p 115ff. +-- describeDeclr :: CDeclr -> Doc +-- describeDeclr declr = +-- let declrs = reverse (declrChain declr) in +-- endDescr (foldl descrDeclr undefined declrs) +-- +-- where +-- declrChain declr@(CVarDeclr _ _ _ _) = [declr] +-- declrChain declr@(CPtrDeclr _ ideclr _) = declr : declrChain ideclr +-- declrChain declr@(CArrDeclr ideclr _ _ _) = declr : declrChain ideclr +-- declrChain declr@(CFunDeclr ideclr _ _ _) = declr : declrChain ideclr +-- +-- descrDeclr _ (CVarDeclr ident asm cattrs _) = single False $ \_ -> +-- maybe (text "<anonymous>") identP ident <+> +-- maybeP (\asmname -> parens (text "asm:" <+> pretty asmname)) asm <+> +-- text "is" <+> (if null cattrs then empty else prettyList (map CAttrQual cattrs) <> comma) +-- descrDeclr (pre,isPlural) (CPtrDeclr quals declr _) = single isPlural $ \pluralize -> +-- pre <+> indefArticle isPlural <> prettyList quals <+> pluralize "pointer to" "pointers to" +-- descrDeclr (pre,isPlural) (CArrDeclr declr quals expr _) = plural isPlural $ \pluralize -> +-- pre <+> indefArticle' isPlural <> prettyList quals <+> pluralize "array of" "arrays of" +-- descrDeclr (pre,isPlural) (CFunDeclr declr params cattrs _) = single isPlural $ \pluralize -> +-- pre <+> indefArticle isPlural <> prettyList (map CAttrQual cattrs) <+> pluralize "function returning" "functions returning" +-- endDescr (pre, isPlural) = pre <+> text (if isPlural then "<typed objects>" else "a <typed object>") +-- single :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool) +-- single isPlural mkDescr = (mkDescr (pluralize isPlural), isPlural) +-- plural :: Bool -> ( (String -> String -> Doc) -> a ) -> (a, Bool) +-- plural isPlural mkDescr = (mkDescr (pluralize isPlural), True) +-- indefArticle isPlural = text$ if isPlural then "" else "a " +-- indefArticle' isPlural = text$ if isPlural then "" else "an " +-- pluralize isPlural s p = text (if isPlural then p else s) +-- prettyList :: (Pretty a) => [a] -> Doc +-- prettyList = hsep . punctuate comma . map pretty +instance Pretty CDeclr where + prettyPrec prec declr = prettyDeclr True prec declr + +prettyDeclr :: Bool -> Int -> CDeclr -> Doc +prettyDeclr show_attrs prec (CDeclr name derived_declrs asmname cattrs _) = + ppDeclr prec (reverse derived_declrs) <+> prettyAsmName asmname <+> ifP show_attrs (attrlistP cattrs) + where + ppDeclr _ [] = maybeP identP name + --'*' __attribute__? qualifiers declarator + ppDeclr p (CPtrDeclr quals _ : declrs) = + parenPrec p 5 $ text "*" <+> hsep (map pretty quals) <+> ppDeclr 5 declrs + + -- declarator[ __attribute__? qualifiers expr ] + ppDeclr p (CArrDeclr quals size _ : declrs) = + parenPrec p 6 $ ppDeclr 6 declrs <> brackets (hsep (map pretty quals) <+> pretty size) + -- declarator ( arguments ) + -- or (__attribute__ declarator) (arguments) + ppDeclr _ (CFunDeclr params fun_attrs _ : declrs) = + (if not (null fun_attrs) then parens (attrlistP fun_attrs <+> ppDeclr 5 declrs) else ppDeclr 6 declrs) + <> parens (prettyParams params) + prettyParams (Right (decls, isVariadic)) = + sep (punctuate comma (map pretty decls)) + <> (if isVariadic then text "," <+> text "..." else empty) + prettyParams (Left oldStyleIds) = + hsep (punctuate comma (map identP oldStyleIds)) + prettyAsmName asm_name_opt + = maybe empty (\asm_name -> text "__asm__" <> parens (pretty asm_name)) asm_name_opt + +instance Pretty CArrSize where + pretty (CNoArrSize completeType) = ifP completeType (text "*") + pretty (CArrSize staticMod expr) = ifP staticMod (text "static") <+> pretty expr +-- initializer :: { CInit } +-- initializer :- assignment_expression +-- | '{' (designation? initializer)_cs_list '}' +instance Pretty CInit where + pretty (CInitExpr expr _) = pretty expr + pretty (CInitList initl _) = + text "{" <+> hsep (punctuate comma (map p initl)) <+> text "}" where + p ([], initializer) = pretty initializer + p (desigs, initializer) = hsep (map pretty desigs) <+> text "=" <+> pretty initializer + +-- designation :- designator_list '=' +-- | array_range_designator +-- arr_designator :- '[' constant_expression ']' +-- member_designator :- '.' identifier +-- arr_range _designator :- '[' constant_expression "..." constant_expression ']' + +instance Pretty CDesignator where + pretty (CArrDesig expr _) = text "[" <> pretty expr <> text "]" + pretty (CMemberDesig ident _) = text "." <> identP ident + pretty (CRangeDesig expr1 expr2 _) = + text "[" <> pretty expr1 <+> text "..." <+> pretty expr2 <> text "]" + +instance Pretty CAttr where + pretty (CAttr attrName [] _) = identP attrName + pretty (CAttr attrName attrParams _) = identP attrName <> parens (hsep . punctuate comma . map pretty $ attrParams) + +instance Pretty CExpr where + prettyPrec p (CComma exprs _) = + parenPrec p (-1) $ hsep (punctuate comma (map (prettyPrec 2) exprs)) + prettyPrec p (CAssign op expr1 expr2 _) = + parenPrec p 2 $ prettyPrec 3 expr1 <+> pretty op <+> prettyPrec 2 expr2 + prettyPrec p (CCond expr1 expr2 expr3 _) = + parenPrec p 2 $ prettyPrec 4 expr1 <+> text "?" -- NB: assignment only has a higher precedence if cond is on the rhs + <+> maybeP pretty expr2 <+> text ":" <+> prettyPrec 4 expr3 + prettyPrec p (CBinary op expr1 expr2 _) = + let prec = binPrec op + in parenPrec p prec $ prettyPrec prec expr1 + <+> pretty op <+> prettyPrec (prec + 1) expr2 + prettyPrec p (CCast decl expr _) = + parenPrec p 25 $ text "(" <> pretty decl <> text ")" + <+> prettyPrec 25 expr + prettyPrec p (CUnary CPostIncOp expr _) = + parenPrec p 26 $ prettyPrec 26 expr <> text "++" + prettyPrec p (CUnary CPostDecOp expr _) = + parenPrec p 26 $ prettyPrec 26 expr <> text "--" + prettyPrec p (CUnary op expr@(CUnary _ _ _) _) = + -- parens aren't necessary, but look nicer imho + parenPrec p 25 $ pretty op <+> parens (prettyPrec 25 expr) + prettyPrec p (CUnary op expr _) = + parenPrec p 25 $ pretty op <> prettyPrec 25 expr + prettyPrec p (CSizeofExpr expr _) = + parenPrec p 25 $ text "sizeof" <> parens (pretty expr) + prettyPrec p (CSizeofType decl _) = + parenPrec p 25 $ text "sizeof" <> parens (pretty decl) + prettyPrec p (CAlignofExpr expr _) = + parenPrec p 25 $ text "__alignof" <> parens (pretty expr) + prettyPrec p (CAlignofType decl _) = + parenPrec p 25 $ text "__alignof" <> parens (pretty decl) + prettyPrec p (CComplexReal expr _) = + parenPrec p 25 $ text "__real" <+> prettyPrec 25 expr + prettyPrec p (CComplexImag expr _) = + parenPrec p 25 $ text "__imag" <+> prettyPrec 25 expr + prettyPrec p (CIndex expr1 expr2 _) = + parenPrec p 26 $ prettyPrec 26 expr1 + <> text "[" <> pretty expr2 <> text "]" + prettyPrec p (CCall expr args _) = + parenPrec p 30 $ prettyPrec 30 expr <> text "(" + <> (sep . punctuate comma . map pretty) args <> text ")" + prettyPrec p (CMember expr ident deref _) = + parenPrec p 26 $ prettyPrec 26 expr + <> text (if deref then "->" else ".") <> identP ident + prettyPrec _p (CVar ident _) = identP ident + prettyPrec _p (CConst constant) = pretty constant + prettyPrec _p (CCompoundLit decl initl _) = + parens (pretty decl) <+> (braces . hsep . punctuate comma) (map p initl) where + p ([], initializer) = pretty initializer + p (mems, initializer) = hcat (punctuate (text ".") (map pretty mems)) <+> text "=" <+> pretty initializer + + prettyPrec _p (CStatExpr stat _) = + text "(" <> pretty stat <> text ")" + + -- unary_expr :- && ident {- address of label -} + prettyPrec _p (CLabAddrExpr ident _) = text "&&" <> identP ident + prettyPrec _p (CGenericSelection expr assoc_list _) = + text "_Generic" <> (parens.hsep.punctuate comma) (pretty expr : map pAssoc assoc_list) + where + pAssoc (mty, expr1) = maybe (text "default") pretty mty <> text ":" <+> pretty expr1 + prettyPrec _p (CBuiltinExpr builtin) = pretty builtin + +instance Pretty CBuiltin where + pretty (CBuiltinVaArg expr ty_name _) = + text "__builtin_va_arg" <+> + parens (pretty expr <> comma <+> pretty ty_name) + -- The first desig has to be a member field. + pretty (CBuiltinOffsetOf ty_name (CMemberDesig field1 _ : desigs) _) = + text "__builtin_offsetof" <+> + parens (pretty ty_name <> comma <+> identP field1 <> hcat (map pretty desigs) ) + pretty (CBuiltinOffsetOf _ty_name otherDesigs _) = + error $ "Inconsistent AST: Cannot interpret designators in offsetOf: " ++ + show (hcat $ map pretty otherDesigs) + pretty (CBuiltinTypesCompatible ty1 ty2 _) = + text "__builtin_types_compatible_p" <+> + parens (pretty ty1 <> comma <+> pretty ty2) + pretty (CBuiltinConvertVector expr ty _) = + text "__builtin_convertvector" <+> + parens (pretty expr <> comma <+> pretty ty) + +instance Pretty CAssignOp where + pretty op = text $ case op of + CAssignOp -> "=" + CMulAssOp -> "*=" + CDivAssOp -> "/=" + CRmdAssOp -> "%=" + CAddAssOp -> "+=" + CSubAssOp -> "-=" + CShlAssOp -> "<<=" + CShrAssOp -> ">>=" + CAndAssOp -> "&=" + CXorAssOp -> "^=" + COrAssOp -> "|=" + +instance Pretty CBinaryOp where + pretty op = text $ case op of + CMulOp -> "*" + CDivOp -> "/" + CRmdOp -> "%" + CAddOp -> "+" + CSubOp -> "-" + CShlOp -> "<<" + CShrOp -> ">>" + CLeOp -> "<" + CGrOp -> ">" + CLeqOp -> "<=" + CGeqOp -> ">=" + CEqOp -> "==" + CNeqOp -> "!=" + CAndOp -> "&" + CXorOp -> "^" + COrOp -> "|" + CLndOp -> "&&" + CLorOp -> "||" + +instance Pretty CUnaryOp where + pretty op = text $ case op of + CPreIncOp -> "++" + CPreDecOp -> "--" + CPostIncOp -> "++" + CPostDecOp -> "--" + CAdrOp -> "&" + CIndOp -> "*" + CPlusOp -> "+" + CMinOp -> "-" + CCompOp -> "~" + CNegOp -> "!" + +instance Pretty CConst where + pretty (CIntConst int_const _) = text (show int_const) + pretty (CCharConst chr _) = text (show chr) + pretty (CFloatConst flt _) = text (show flt) + pretty (CStrConst str _) = text (show str) + +instance Pretty CStrLit where + pretty (CStrLit str _) = text (show str) + +-- precedence of C operators +binPrec :: CBinaryOp -> Int +binPrec CMulOp = 20 +binPrec CDivOp = 20 +binPrec CRmdOp = 20 +binPrec CAddOp = 19 +binPrec CSubOp = 19 +binPrec CShlOp = 18 +binPrec CShrOp = 18 +binPrec CLeOp = 17 +binPrec CGrOp = 17 +binPrec CLeqOp = 17 +binPrec CGeqOp = 17 +binPrec CEqOp = 16 +binPrec CNeqOp = 16 +binPrec CAndOp = 15 +binPrec CXorOp = 14 +binPrec COrOp = 13 +binPrec CLndOp = 12 +binPrec CLorOp = 11
src/Language/C/Syntax.hs view
@@ -1,20 +1,20 @@--------------------------------------------------------------------------------- |--- Module : Language.C.Syntax--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Syntax of C files: The abstract syntax tree and constants.-------------------------------------------------------------------------------module Language.C.Syntax (- -- * Constants- module Language.C.Syntax.Constants,- -- * Syntax tree- module Language.C.Syntax.AST,-)-where-import Language.C.Syntax.AST-import Language.C.Syntax.Constants+----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Syntax +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Syntax of C files: The abstract syntax tree and constants. +----------------------------------------------------------------------------- +module Language.C.Syntax ( + -- * Constants + module Language.C.Syntax.Constants, + -- * Syntax tree + module Language.C.Syntax.AST, +) +where +import Language.C.Syntax.AST +import Language.C.Syntax.Constants
src/Language/C/Syntax/AST.hs view
@@ -1,1393 +1,1393 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE TypeSynonymInstances #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Syntax.AST--- Copyright : (c) [1999..2007] Manuel M T Chakravarty--- (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Abstract syntax of C source and header files.------ The tree structure is based on the grammar in Appendix A of K&R. The--- abstract syntax simplifies the concrete syntax by merging similar concrete--- constructs into a single type of abstract tree structure: declarations are--- merged with structure declarations, parameter declarations and type names,--- and declarators are merged with abstract declarators.------ With K&R we refer to ``The C Programming Language'', second edition, Brain--- W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all--- of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several--- GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>.-------------------------------------------------------------------------------module Language.C.Syntax.AST (- -- * C translation units- CTranslUnit, CExtDecl,- CTranslationUnit(..), CExternalDeclaration(..),- -- * Declarations- CFunDef, CDecl, CStructUnion, CEnum,- CFunctionDef(..), CDeclaration(..),- CStructTag(..), CStructureUnion(..), CEnumeration(..),- -- * Declaration attributes- CDeclSpec, partitionDeclSpecs,- CStorageSpec, CTypeSpec, isSUEDef, CTypeQual, CFunSpec, CAlignSpec, CAttr,- CFunctionSpecifier(..), CDeclarationSpecifier(..), CStorageSpecifier(..), CTypeSpecifier(..),- CAlignmentSpecifier(..),- CTypeQualifier(..), CAttribute(..),- -- * Declarators- CDeclr,CDerivedDeclr,CArrSize,- CDeclarator(..), CDerivedDeclarator(..), CArraySize(..),- -- * Initialization- CInit, CInitList, CDesignator,- CInitializer(..), CInitializerList, CPartDesignator(..),- -- * Statements- CStat, CBlockItem, CAsmStmt, CAsmOperand,- CStatement(..), CCompoundBlockItem(..),- CAssemblyStatement(..), CAssemblyOperand(..),- -- * Expressions- CExpr, CExpression(..),- CAssignOp(..), CBinaryOp(..), CUnaryOp(..),- CBuiltin, CBuiltinThing(..),- -- * Constants- CConst, CStrLit, cstringOfLit, liftStrLit,- CConstant(..), CStringLiteral(..),- -- * Annoated type class- Annotated(..)-) where-import Language.C.Syntax.Constants-import Language.C.Syntax.Ops-import Language.C.Data.Ident-import Language.C.Data.Node-import Language.C.Data.Position-import Data.Generics---- | Complete C tranlsation unit (C99 6.9, K&R A10)------ A complete C translation unit, for example representing a C header or source file.--- It consists of a list of external (i.e. toplevel) declarations.-type CTranslUnit = CTranslationUnit NodeInfo-data CTranslationUnit a- = CTranslUnit [CExternalDeclaration a] a- deriving (Show, Data, Typeable {-! ,CNode ,Functor, Annotated !-})---- | External C declaration (C99 6.9, K&R A10)------ Either a toplevel declaration, function definition or external assembler.-type CExtDecl = CExternalDeclaration NodeInfo-data CExternalDeclaration a- = CDeclExt (CDeclaration a)- | CFDefExt (CFunctionDef a)- | CAsmExt (CStringLiteral a) a- deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-})---- | C function definition (C99 6.9.1, K&R A10.1)------ A function definition is of the form @CFunDef specifiers declarator decllist? stmt@.------ * @specifiers@ are the type and storage-class specifiers of the function.--- The only storage-class specifiers allowed are /extern/ and /static/.------ * The @declarator@ must be such that the declared identifier has /function type/.--- The return type shall be void or an object type other than array type.------ * The optional declaration list @decllist@ is for old-style function declarations.------ * The statement @stmt@ is a compound statement.-type CFunDef = CFunctionDef NodeInfo-data CFunctionDef a- = CFunDef- [CDeclarationSpecifier a] -- type specifier and qualifier- (CDeclarator a) -- declarator- [CDeclaration a] -- optional declaration list- (CStatement a) -- compound statement- a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter--- declarations and type names.------ A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's--- elements depends on the kind of declaration:------ 1) Toplevel declarations (K&R A8, C99 6.7 declaration)------ * C99 requires that there is at least one specifier, though this is merely a syntactic restriction------ * at most one storage class specifier is allowed per declaration------ * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@.--- The declarator @declr@ has to be present and non-abstract and the initialization expression is--- optional.------ 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration)------ Those are the declarations of a structure's members.------ * do not allow storage specifiers------ * in strict C99, the list of declarators has to be non-empty------ * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@,--- representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@,--- for unnamed bitfields. @declr@ has to be non-abstract.------ * no member of a structure shall have incomplete type------ 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration)------ * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@,--- i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed).------ 4) Type names (A8.8, C99 6.7.6)------ * do not allow storage specifiers------ * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@.--- where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier)----type CDecl = CDeclaration NodeInfo-data CDeclaration a- = CDecl- [CDeclarationSpecifier a] -- type specifier and qualifier, __attribute__- [(Maybe (CDeclarator a), -- declarator (may be omitted)- Maybe (CInitializer a), -- optional initialize- Maybe (CExpression a))] -- optional size (const expr)- a -- annotation- | CStaticAssert- (CExpression a) -- assert expression- (CStringLiteral a) -- assert text- a -- annotation- deriving (Show, Data,Typeable {-! ,CNode ,Annotated !-})---- Derive instance is a little bit ugly-instance Functor CDeclaration where- fmap f (CDecl specs declarators annot) =- CDecl (map (fmap f) specs) (map fmap3m declarators) (f annot)- where fmap3m (a,b,c) = (fmap (fmap f) a, fmap (fmap f) b, fmap (fmap f) c)- fmap f (CStaticAssert expression strlit annot) =- CStaticAssert (fmap f expression) (fmap f strlit) (f annot)---- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6)------ A declarator declares a single object, function, or type. It is always associated with--- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and--- attributes, which apply to the declared object.------ A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where--- @name@ is the name of the declared object (missing for abstract declarators),--- @declquals@ is a set of additional declaration specifiers,--- @asm-name@ is the optional assembler name and attributes is a set of--- attrs is a set of @__attribute__@ annotations for the declared object.------ @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as--- described below. If the /declaration/ specifies the non-derived type @T@,--- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type--- @(D1 `indirect` (D2 `indirect` ... (Dn `indirect` T)))@, where------ * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/------ * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/------ * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/------ Examples (simplified attributes):------ * /x/ is an int------ > int x;--- > CDeclr "x" []------ * /x/ is a restrict pointer to a const pointer to int------ > const int * const * restrict x;--- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]]------ * /f/ is an function return a constant pointer to int------ > int* const f();--- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]]------ * /f/ is a constant pointer to a function returning int------ > int (* const f)(); ==>--- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []]-type CDeclr = CDeclarator NodeInfo-data CDeclarator a- = CDeclr (Maybe Ident) [CDerivedDeclarator a] (Maybe (CStringLiteral a)) [CAttribute a] a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | Derived declarators, see 'CDeclr'------ Indirections are qualified using type-qualifiers and generic attributes, and additionally------ * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the--- type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that--- the supplied argument is an array of at least the given size.------ * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the--- form @Left (parameter-names)@-type CDerivedDeclr = CDerivedDeclarator NodeInfo-data CDerivedDeclarator a- = CPtrDeclr [CTypeQualifier a] a- -- ^ Pointer declarator @CPtrDeclr tyquals declr@- | CArrDeclr [CTypeQualifier a] (CArraySize a) a- -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@- | CFunDeclr (Either [Ident] ([CDeclaration a],Bool)) [CAttribute a] a- -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@- deriving (Show, Data,Typeable {-! ,CNode , Annotated !-})---- Derived instance relies on fmap2-instance Functor CDerivedDeclarator where- fmap _f (CPtrDeclr a1 a2) = CPtrDeclr (fmap (fmap _f) a1) (_f a2)- fmap _f (CArrDeclr a1 a2 a3)- = CArrDeclr (fmap (fmap _f) a1) (fmap _f a2) (_f a3)- fmap _f (CFunDeclr a1 a2 a3)- = CFunDeclr (fmap (fmapFirst (fmap (fmap _f))) a1) (fmap (fmap _f) a2)- (_f a3)- where fmapFirst f (a,b) = (f a, b)---- | Size of an array-type CArrSize = CArraySize NodeInfo-data CArraySize a- = CNoArrSize Bool -- ^ @CUnknownSize isCompleteType@- | CArrSize Bool (CExpression a) -- ^ @CArrSize isStatic expr@- deriving (Show, Data,Typeable {-! , Functor !-})----- | C statement (K&R A9, C99 6.8)----type CStat = CStatement NodeInfo-data CStatement a- -- | An (attributed) label followed by a statement- = CLabel Ident (CStatement a) [CAttribute a] a- -- | A statement of the form @case expr : stmt@- | CCase (CExpression a) (CStatement a) a- -- | A case range of the form @case lower ... upper : stmt@- | CCases (CExpression a) (CExpression a) (CStatement a) a- -- | The default case @default : stmt@- | CDefault (CStatement a) a- -- | A simple statement, that is in C: evaluating an expression with- -- side-effects and discarding the result.- | CExpr (Maybe (CExpression a)) a- -- | compound statement @CCompound localLabels blockItems at@- | CCompound [Ident] [CCompoundBlockItem a] a- -- | conditional statement @CIf ifExpr thenStmt maybeElseStmt at@- | CIf (CExpression a) (CStatement a) (Maybe (CStatement a)) a- -- | switch statement @CSwitch selectorExpr switchStmt@, where- -- @switchStmt@ usually includes /case/, /break/ and /default/- -- statements- | CSwitch (CExpression a) (CStatement a) a- -- | while or do-while statement @CWhile guard stmt isDoWhile at@- | CWhile (CExpression a) (CStatement a) Bool a- -- | for statement @CFor init expr-2 expr-3 stmt@, where @init@ is- -- either a declaration or initializing expression- | CFor (Either (Maybe (CExpression a)) (CDeclaration a))- (Maybe (CExpression a))- (Maybe (CExpression a))- (CStatement a)- a- -- | goto statement @CGoto label@- | CGoto Ident a- -- | computed goto @CGotoPtr labelExpr@- | CGotoPtr (CExpression a) a- -- | continue statement- | CCont a- -- | break statement- | CBreak a- -- | return statement @CReturn returnExpr@- | CReturn (Maybe (CExpression a)) a- -- | assembly statement- | CAsm (CAssemblyStatement a) a- deriving (Show, Data,Typeable {-! , CNode , Annotated !-})---- Derived instance relies on fmap2 :(-instance Functor CStatement where- fmap _f (CLabel a1 a2 a3 a4)- = CLabel a1 (fmap _f a2) (fmap (fmap _f) a3) (_f a4)- fmap _f (CCase a1 a2 a3) = CCase (fmap _f a1) (fmap _f a2) (_f a3)- fmap _f (CCases a1 a2 a3 a4)- = CCases (fmap _f a1) (fmap _f a2) (fmap _f a3) (_f a4)- fmap _f (CDefault a1 a2) = CDefault (fmap _f a1) (_f a2)- fmap _f (CExpr a1 a2) = CExpr (fmap (fmap _f) a1) (_f a2)- fmap _f (CCompound a1 a2 a3)- = CCompound a1 (fmap (fmap _f) a2) (_f a3)- fmap _f (CIf a1 a2 a3 a4)- = CIf (fmap _f a1) (fmap _f a2) (fmap (fmap _f) a3) (_f a4)- fmap _f (CSwitch a1 a2 a3)- = CSwitch (fmap _f a1) (fmap _f a2) (_f a3)- fmap _f (CWhile a1 a2 a3 a4)- = CWhile (fmap _f a1) (fmap _f a2) a3 (_f a4)- fmap _f (CFor a1 a2 a3 a4 a5)- = CFor (mapEither (fmap (fmap _f)) (fmap _f) a1)- (fmap (fmap _f) a2) (fmap (fmap _f) a3) (fmap _f a4)- (_f a5)- where mapEither f1 f2 = either (Left . f1) (Right . f2)- fmap _f (CGoto a1 a2) = CGoto a1 (_f a2)- fmap _f (CGotoPtr a1 a2) = CGotoPtr (fmap _f a1) (_f a2)- fmap _f (CCont a1) = CCont (_f a1)- fmap _f (CBreak a1) = CBreak (_f a1)- fmap _f (CReturn a1 a2) = CReturn (fmap (fmap _f) a1) (_f a2)- fmap _f (CAsm a1 a2) = CAsm (fmap _f a1) (_f a2)---- | GNU Assembler statement------ > CAssemblyStatement type-qual? asm-expr out-ops in-ops clobbers _------ is an inline assembler statement.--- The only type-qualifier (if any) allowed is /volatile/.--- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input--- and output operands of the statement.--- @clobbers@ is a list of registers which are clobbered when executing the assembler statement-type CAsmStmt = CAssemblyStatement NodeInfo-data CAssemblyStatement a- = CAsmStmt- (Maybe (CTypeQualifier a)) -- maybe volatile- (CStringLiteral a) -- assembler expression (String)- [CAssemblyOperand a] -- output operands- [CAssemblyOperand a] -- input operands- [CStringLiteral a] -- Clobbers- a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---- | Assembler operand------ @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler--- statement.-type CAsmOperand = CAssemblyOperand NodeInfo-data CAssemblyOperand a- = CAsmOperand- (Maybe Ident) -- argument name- (CStringLiteral a) -- constraint expr- (CExpression a) -- argument- a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---- | C99 Block items------ Things that may appear in compound statements: either statements, declarations--- or nested function definitions.-type CBlockItem = CCompoundBlockItem NodeInfo-data CCompoundBlockItem a- = CBlockStmt (CStatement a) -- ^ A statement- | CBlockDecl (CDeclaration a) -- ^ A local declaration- | CNestedFunDef (CFunctionDef a) -- ^ A nested function (GNU C)- deriving (Show, Data,Typeable {-! , CNode , Functor, Annotated !-})---- | C declaration specifiers and qualifiers------ Declaration specifiers include at most one storage-class specifier (C99 6.7.1),--- type specifiers (6.7.2) and type qualifiers (6.7.3).-type CDeclSpec = CDeclarationSpecifier NodeInfo-data CDeclarationSpecifier a- = CStorageSpec (CStorageSpecifier a) -- ^ storage-class specifier or typedef- | CTypeSpec (CTypeSpecifier a) -- ^ type name- | CTypeQual (CTypeQualifier a) -- ^ type qualifier- | CFunSpec (CFunctionSpecifier a) -- ^ function specifier- | CAlignSpec (CAlignmentSpecifier a) -- ^ alignment specifier- deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-})----- | Separate the declaration specifiers------ @__attribute__@ of a declaration qualify declarations or declarators (but not types),--- and are therefore separated as well.-partitionDeclSpecs :: [CDeclarationSpecifier a]- -> ( [CStorageSpecifier a], [CAttribute a]- , [CTypeQualifier a], [CTypeSpecifier a]- , [CFunctionSpecifier a], [CAlignmentSpecifier a])-partitionDeclSpecs = foldr deals ([],[],[],[],[],[]) where- deals (CStorageSpec sp) (sts,ats,tqs,tss,fss,ass) = (sp:sts,ats,tqs,tss,fss,ass)- deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,fss,ass) = (sts,attr:ats,tqs,tss,fss,ass)- deals (CTypeQual tq) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tq:tqs,tss,fss,ass)- deals (CTypeSpec ts) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,ts:tss,fss,ass)- deals (CFunSpec fs) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fs:fss,ass)- deals (CAlignSpec as) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fss,as:ass)---- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1)-type CStorageSpec = CStorageSpecifier NodeInfo-data CStorageSpecifier a- = CAuto a -- ^ auto- | CRegister a -- ^ register- | CStatic a -- ^ static- | CExtern a -- ^ extern- | CTypedef a -- ^ typedef- | CThread a -- ^ C11/GNUC thread local storage- deriving (Show, Eq,Ord,Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C type specifier (K&R A8.2, C99 6.7.2)------ Type specifiers are either basic types such as @char@ or @int@,--- @struct@, @union@ or @enum@ specifiers or typedef names.------ As a GNU extension, a @typeof@ expression also is a type specifier.-type CTypeSpec = CTypeSpecifier NodeInfo-data CTypeSpecifier a- = CVoidType a- | CCharType a- | CShortType a- | CIntType a- | CLongType a- | CFloatType a- | CFloat128Type a- | CDoubleType a- | CSignedType a- | CUnsigType a- | CBoolType a- | CComplexType a- | CInt128Type a- | CSUType (CStructureUnion a) a -- ^ Struct or Union specifier- | CEnumType (CEnumeration a) a -- ^ Enumeration specifier- | CTypeDef Ident a -- ^ Typedef name- | CTypeOfExpr (CExpression a) a -- ^ @typeof(expr)@- | CTypeOfType (CDeclaration a) a -- ^ @typeof(type)@- | CAtomicType (CDeclaration a) a -- ^ @_Atomic(type)@- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | returns @True@ if the given typespec is a struct, union or enum /definition/-isSUEDef :: CTypeSpecifier a -> Bool-isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True-isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True-isSUEDef _ = False---- | C type qualifiers (K&R A8.2, C99 6.7.3) and attributes.------ @const@, @volatile@ and @restrict@ type qualifiers--- Additionally, @__attribute__@ annotations for declarations and declarators, and--- function specifiers-type CTypeQual = CTypeQualifier NodeInfo-data CTypeQualifier a- = CConstQual a- | CVolatQual a- | CRestrQual a- | CAtomicQual a- | CAttrQual (CAttribute a)- | CNullableQual a- | CNonnullQual a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---- | C function specifiers (C99 6.7.4)------ function specifiers @inline@ and @_Noreturn@-type CFunSpec = CFunctionSpecifier NodeInfo-data CFunctionSpecifier a- = CInlineQual a- | CNoreturnQual a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---- | C alignment specifiers (C99 6.7.5)----type CAlignSpec = CAlignmentSpecifier NodeInfo-data CAlignmentSpecifier a- = CAlignAsType (CDeclaration a) a -- ^ @_Alignas(type)@- | CAlignAsExpr (CExpression a) a -- ^ @_Alignas(expr)@- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1)------ @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@).------ * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present.------ Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and--- in @struct foo { int y; } x;@ both of them.------ * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier-type CStructUnion = CStructureUnion NodeInfo-data CStructureUnion a- = CStruct- CStructTag- (Maybe Ident)- (Maybe [CDeclaration a]) -- member declarations- [CAttribute a] -- __attribute__s- a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'.-data CStructTag = CStructTag- | CUnionTag- deriving (Show, Eq,Data,Typeable)----- | C enumeration specifier (K&R A8.4, C99 6.7.2.2)------ @CEnum identifier enumerator-list attrs@ represent as enum specifier------ * Either the identifier or the enumerator-list (or both) have to be present.------ * If @enumerator-list@ is present, it has to be non-empty.------ * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter--- is an optional constant integral expression.------ * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier-type CEnum = CEnumeration NodeInfo-data CEnumeration a- = CEnum- (Maybe Ident)- (Maybe [(Ident, -- variant name- Maybe (CExpression a))]) -- explicit variant value- [CAttribute a] -- __attribute__s- a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})------ | C initialization (K&R A8.7, C99 6.7.8)------ Initializers are either assignment expressions or initializer lists--- (surrounded in curly braces), whose elements are themselves--- initializers, paired with an optional list of designators.-type CInit = CInitializer NodeInfo-data CInitializer a- -- | assignment expression- = CInitExpr (CExpression a) a- -- | initialization list (see 'CInitList')- | CInitList (CInitializerList a) a- deriving (Show, Data,Typeable {-! ,CNode , Annotated !-})---- deriving Functor does not work (type synonym)-instance Functor CInitializer where- fmap _f (CInitExpr a1 a2) = CInitExpr (fmap _f a1) (_f a2)- fmap _f (CInitList a1 a2) = CInitList (fmapInitList _f a1) (_f a2)-fmapInitList :: (a->b) -> (CInitializerList a) -> (CInitializerList b)-fmapInitList _f = map (\(desigs, initializer) -> (fmap (fmap _f) desigs, fmap _f initializer))---- | Initializer List------ The members of an initializer list are of the form @(designator-list,initializer)@.--- The @designator-list@ specifies one member of the compound type which is initialized.--- It is allowed to be empty - in this case the initializer refers to the--- ''next'' member of the compound type (see C99 6.7.8).------ Examples (simplified expressions and identifiers):------ > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };--- > -- corresponds to the assignments--- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;--- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)--- > init2 = ([CArrDesig 2] , CInitExpr 5)--- > init3 = ([] , CInitExpr 8)--- > in CInitList [init1, init2, init3]------ > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };--- > -- corresponds to the assignments--- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;--- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]--- > init_s = CInitList [--- > ([], init_s_0),--- > ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)--- > ]--- > in CInitList [(CMemberDesig "s", init_s)]-type CInitList = CInitializerList NodeInfo-type CInitializerList a = [([CPartDesignator a], CInitializer a)]---- | Designators------ A designator specifies a member of an object, either an element or range of an array,--- or the named member of a struct \/ union.-type CDesignator = CPartDesignator NodeInfo-data CPartDesignator a- -- | array position designator- = CArrDesig (CExpression a) a- -- | member designator- | CMemberDesig Ident a- -- | array range designator @CRangeDesig from to _@ (GNU C)- | CRangeDesig (CExpression a) (CExpression a) a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | @__attribute__@ annotations------ Those are of the form @CAttr attribute-name attribute-parameters@,--- and serve as generic properties of some syntax tree elements.-type CAttr = CAttribute NodeInfo-data CAttribute a = CAttr Ident [CExpression a] a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C expression (K&R A7)------ * these can be arbitrary expression, as the argument of `sizeof' can be--- arbitrary, even if appearing in a constant expression------ * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins----type CExpr = CExpression NodeInfo-data CExpression a- = CComma [CExpression a] -- comma expression list, n >= 2- a- | CAssign CAssignOp -- assignment operator- (CExpression a) -- l-value- (CExpression a) -- r-value- a- | CCond (CExpression a) -- conditional- (Maybe (CExpression a)) -- true-expression (GNU allows omitting)- (CExpression a) -- false-expression- a- | CBinary CBinaryOp -- binary operator- (CExpression a) -- lhs- (CExpression a) -- rhs- a- | CCast (CDeclaration a) -- type name- (CExpression a)- a- | CUnary CUnaryOp -- unary operator- (CExpression a)- a- | CSizeofExpr (CExpression a)- a- | CSizeofType (CDeclaration a) -- type name- a- | CAlignofExpr (CExpression a)- a- | CAlignofType (CDeclaration a) -- type name- a- | CComplexReal (CExpression a) -- real part of complex number- a- | CComplexImag (CExpression a) -- imaginary part of complex number- a- | CIndex (CExpression a) -- array- (CExpression a) -- index- a- | CCall (CExpression a) -- function- [CExpression a] -- arguments- a- | CMember (CExpression a) -- structure- Ident -- member name- Bool -- deref structure? (True for `->')- a- | CVar Ident -- identifier (incl. enumeration const)- a- | CConst (CConstant a) -- ^ integer, character, floating point and string constants- | CCompoundLit (CDeclaration a)- (CInitializerList a) -- type name & initialiser list- a -- ^ C99 compound literal- | CGenericSelection (CExpression a) [(Maybe (CDeclaration a), CExpression a)] a -- ^ C11 generic selection- | CStatExpr (CStatement a) a -- ^ GNU C compound statement as expr- | CLabAddrExpr Ident a -- ^ GNU C address of label- | CBuiltinExpr (CBuiltinThing a) -- ^ builtin expressions, see 'CBuiltin'- deriving (Data,Typeable,Show {-! ,CNode , Annotated !-})---- deriving Functor does not work (type synonyms)-instance Functor CExpression where- fmap _f (CComma a1 a2) = CComma (fmap (fmap _f) a1) (_f a2)- fmap _f (CAssign a1 a2 a3 a4)- = CAssign a1 (fmap _f a2) (fmap _f a3) (_f a4)- fmap _f (CCond a1 a2 a3 a4)- = CCond (fmap _f a1) (fmap (fmap _f) a2) (fmap _f a3) (_f a4)- fmap _f (CBinary a1 a2 a3 a4)- = CBinary a1 (fmap _f a2) (fmap _f a3) (_f a4)- fmap _f (CCast a1 a2 a3) = CCast (fmap _f a1) (fmap _f a2) (_f a3)- fmap _f (CUnary a1 a2 a3) = CUnary a1 (fmap _f a2) (_f a3)- fmap _f (CSizeofExpr a1 a2) = CSizeofExpr (fmap _f a1) (_f a2)- fmap _f (CSizeofType a1 a2) = CSizeofType (fmap _f a1) (_f a2)- fmap _f (CAlignofExpr a1 a2) = CAlignofExpr (fmap _f a1) (_f a2)- fmap _f (CAlignofType a1 a2) = CAlignofType (fmap _f a1) (_f a2)- fmap _f (CComplexReal a1 a2) = CComplexReal (fmap _f a1) (_f a2)- fmap _f (CComplexImag a1 a2) = CComplexImag (fmap _f a1) (_f a2)- fmap _f (CIndex a1 a2 a3)- = CIndex (fmap _f a1) (fmap _f a2) (_f a3)- fmap _f (CCall a1 a2 a3)- = CCall (fmap _f a1) (fmap (fmap _f) a2) (_f a3)- fmap _f (CMember a1 a2 a3 a4) = CMember (fmap _f a1) a2 a3 (_f a4)- fmap _f (CVar a1 a2) = CVar a1 (_f a2)- fmap _f (CConst a1) = CConst (fmap _f a1)- fmap _f (CCompoundLit a1 a2 a3)- = CCompoundLit (fmap _f a1) (fmapInitList _f a2) (_f a3)- fmap _f (CStatExpr a1 a2) = CStatExpr (fmap _f a1) (_f a2)- fmap _f (CLabAddrExpr a1 a2) = CLabAddrExpr a1 (_f a2)- fmap _f (CBuiltinExpr a1) = CBuiltinExpr (fmap _f a1)- fmap _f (CGenericSelection expr list annot) =- CGenericSelection (fmap _f expr) (map fmap_helper list) (_f annot)- where- fmap_helper (ma1, a2) = (fmap (fmap _f) ma1, fmap _f a2)---- | GNU Builtins, which cannot be typed in C99-type CBuiltin = CBuiltinThing NodeInfo-data CBuiltinThing a- = CBuiltinVaArg (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@- | CBuiltinOffsetOf (CDeclaration a) [CPartDesignator a] a -- ^ @(type, designator-list)@- | CBuiltinTypesCompatible (CDeclaration a) (CDeclaration a) a -- ^ @(type,type)@- | CBuiltinConvertVector (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | C constant (K&R A2.5 & A7.2)-type CConst = CConstant NodeInfo-data CConstant a- = CIntConst CInteger a- | CCharConst CChar a- | CFloatConst CFloat a- | CStrConst CString a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})----- | Attributed string literals-type CStrLit = CStringLiteral NodeInfo-data CStringLiteral a = CStrLit CString a- deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-})---cstringOfLit :: CStringLiteral a -> CString-cstringOfLit (CStrLit cstr _) = cstr---- | Lift a string literal to a C constant-liftStrLit :: CStringLiteral a -> CConstant a-liftStrLit (CStrLit str at) = CStrConst str at---- | All AST nodes are annotated. Inspired by the Annotated--- class of Niklas Broberg's haskell-src-exts package.--- In principle, we could have Copointed superclass instead--- of @ann@, for the price of another dependency.-class (Functor ast) => Annotated ast where- -- | get the annotation of an AST node- annotation :: ast a -> a- -- | change the annotation (non-recursively)- -- of an AST node. Use fmap for recursively- -- modifying the annotation.- amap :: (a->a) -> ast a -> ast a---- fmap2 :: (a->a') -> (a,b) -> (a',b)--- fmap2 f (a,b) = (f a, b)---- Instances generated using derive-2.*--- GENERATED START--instance CNode t1 => CNode (CTranslationUnit t1) where- nodeInfo (CTranslUnit _ n) = nodeInfo n-instance CNode t1 => Pos (CTranslationUnit t1) where- posOf x = posOf (nodeInfo x)--instance Functor CTranslationUnit where- fmap _f (CTranslUnit a1 a2)- = CTranslUnit (fmap (fmap _f) a1) (_f a2)--instance Annotated CTranslationUnit where- annotation (CTranslUnit _ n) = n- amap f (CTranslUnit a_1 a_2) = CTranslUnit a_1 (f a_2)--instance CNode t1 => CNode (CExternalDeclaration t1) where- nodeInfo (CDeclExt d) = nodeInfo d- nodeInfo (CFDefExt d) = nodeInfo d- nodeInfo (CAsmExt _ n) = nodeInfo n-instance CNode t1 => Pos (CExternalDeclaration t1) where- posOf x = posOf (nodeInfo x)--instance Functor CExternalDeclaration where- fmap _f (CDeclExt a1) = CDeclExt (fmap _f a1)- fmap _f (CFDefExt a1) = CFDefExt (fmap _f a1)- fmap _f (CAsmExt a1 a2) = CAsmExt (fmap _f a1) (_f a2)--instance Annotated CExternalDeclaration where- annotation (CDeclExt n) = annotation n- annotation (CFDefExt n) = annotation n- annotation (CAsmExt _ n) = n- amap f (CDeclExt n) = CDeclExt (amap f n)- amap f (CFDefExt n) = CFDefExt (amap f n)- amap f (CAsmExt a_1 a_2) = CAsmExt a_1 (f a_2)--instance CNode t1 => CNode (CFunctionDef t1) where- nodeInfo (CFunDef _ _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CFunctionDef t1) where- posOf x = posOf (nodeInfo x)--instance Functor CFunctionDef where- fmap _f (CFunDef a1 a2 a3 a4 a5)- = CFunDef (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)- (fmap _f a4)- (_f a5)--instance Annotated CFunctionDef where- annotation (CFunDef _ _ _ _ n) = n- amap f (CFunDef a_1 a_2 a_3 a_4 a_5)- = CFunDef a_1 a_2 a_3 a_4 (f a_5)--instance CNode t1 => CNode (CDeclaration t1) where- nodeInfo (CDecl _ _ n) = nodeInfo n- nodeInfo (CStaticAssert _ _ n) = nodeInfo n-instance CNode t1 => Pos (CDeclaration t1) where- posOf x = posOf (nodeInfo x)--instance Annotated CDeclaration where- annotation (CDecl _ _ n) = n- annotation (CStaticAssert _ _ n) = n- amap f (CDecl a_1 a_2 a_3) = CDecl a_1 a_2 (f a_3)- amap f (CStaticAssert a_1 a_2 a_3) = CStaticAssert a_1 a_2 (f a_3)--instance CNode t1 => CNode (CDeclarator t1) where- nodeInfo (CDeclr _ _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CDeclarator t1) where- posOf x = posOf (nodeInfo x)--instance Functor CDeclarator where- fmap _f (CDeclr a1 a2 a3 a4 a5)- = CDeclr a1 (fmap (fmap _f) a2) (fmap (fmap _f) a3)- (fmap (fmap _f) a4)- (_f a5)--instance Annotated CDeclarator where- annotation (CDeclr _ _ _ _ n) = n- amap f (CDeclr a_1 a_2 a_3 a_4 a_5)- = CDeclr a_1 a_2 a_3 a_4 (f a_5)--instance CNode t1 => CNode (CDerivedDeclarator t1) where- nodeInfo (CPtrDeclr _ n) = nodeInfo n- nodeInfo (CArrDeclr _ _ n) = nodeInfo n- nodeInfo (CFunDeclr _ _ n) = nodeInfo n-instance CNode t1 => Pos (CDerivedDeclarator t1) where- posOf x = posOf (nodeInfo x)--instance Annotated CDerivedDeclarator where- annotation (CPtrDeclr _ n) = n- annotation (CArrDeclr _ _ n) = n- annotation (CFunDeclr _ _ n) = n- amap f (CPtrDeclr a_1 a_2) = CPtrDeclr a_1 (f a_2)- amap f (CArrDeclr a_1 a_2 a_3) = CArrDeclr a_1 a_2 (f a_3)- amap f (CFunDeclr a_1 a_2 a_3) = CFunDeclr a_1 a_2 (f a_3)--instance Functor CArraySize where- fmap _ (CNoArrSize a1) = CNoArrSize a1- fmap _f (CArrSize a1 a2) = CArrSize a1 (fmap _f a2)--instance CNode t1 => CNode (CStatement t1) where- nodeInfo (CLabel _ _ _ n) = nodeInfo n- nodeInfo (CCase _ _ n) = nodeInfo n- nodeInfo (CCases _ _ _ n) = nodeInfo n- nodeInfo (CDefault _ n) = nodeInfo n- nodeInfo (CExpr _ n) = nodeInfo n- nodeInfo (CCompound _ _ n) = nodeInfo n- nodeInfo (CIf _ _ _ n) = nodeInfo n- nodeInfo (CSwitch _ _ n) = nodeInfo n- nodeInfo (CWhile _ _ _ n) = nodeInfo n- nodeInfo (CFor _ _ _ _ n) = nodeInfo n- nodeInfo (CGoto _ n) = nodeInfo n- nodeInfo (CGotoPtr _ n) = nodeInfo n- nodeInfo (CCont d) = nodeInfo d- nodeInfo (CBreak d) = nodeInfo d- nodeInfo (CReturn _ n) = nodeInfo n- nodeInfo (CAsm _ n) = nodeInfo n-instance CNode t1 => Pos (CStatement t1) where- posOf x = posOf (nodeInfo x)--instance Annotated CStatement where- annotation (CLabel _ _ _ n) = n- annotation (CCase _ _ n) = n- annotation (CCases _ _ _ n) = n- annotation (CDefault _ n) = n- annotation (CExpr _ n) = n- annotation (CCompound _ _ n) = n- annotation (CIf _ _ _ n) = n- annotation (CSwitch _ _ n) = n- annotation (CWhile _ _ _ n) = n- annotation (CFor _ _ _ _ n) = n- annotation (CGoto _ n) = n- annotation (CGotoPtr _ n) = n- annotation (CCont n) = n- annotation (CBreak n) = n- annotation (CReturn _ n) = n- annotation (CAsm _ n) = n- amap f (CLabel a_1 a_2 a_3 a_4) = CLabel a_1 a_2 a_3 (f a_4)- amap f (CCase a_1 a_2 a_3) = CCase a_1 a_2 (f a_3)- amap f (CCases a_1 a_2 a_3 a_4) = CCases a_1 a_2 a_3 (f a_4)- amap f (CDefault a_1 a_2) = CDefault a_1 (f a_2)- amap f (CExpr a_1 a_2) = CExpr a_1 (f a_2)- amap f (CCompound a_1 a_2 a_3) = CCompound a_1 a_2 (f a_3)- amap f (CIf a_1 a_2 a_3 a_4) = CIf a_1 a_2 a_3 (f a_4)- amap f (CSwitch a_1 a_2 a_3) = CSwitch a_1 a_2 (f a_3)- amap f (CWhile a_1 a_2 a_3 a_4) = CWhile a_1 a_2 a_3 (f a_4)- amap f (CFor a_1 a_2 a_3 a_4 a_5) = CFor a_1 a_2 a_3 a_4 (f a_5)- amap f (CGoto a_1 a_2) = CGoto a_1 (f a_2)- amap f (CGotoPtr a_1 a_2) = CGotoPtr a_1 (f a_2)- amap f (CCont a_1) = CCont (f a_1)- amap f (CBreak a_1) = CBreak (f a_1)- amap f (CReturn a_1 a_2) = CReturn a_1 (f a_2)- amap f (CAsm a_1 a_2) = CAsm a_1 (f a_2)--instance CNode t1 => CNode (CAssemblyStatement t1) where- nodeInfo (CAsmStmt _ _ _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CAssemblyStatement t1) where- posOf x = posOf (nodeInfo x)--instance Functor CAssemblyStatement where- fmap _f (CAsmStmt a1 a2 a3 a4 a5 a6)- = CAsmStmt (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3)- (fmap (fmap _f) a4)- (fmap (fmap _f) a5)- (_f a6)--instance Annotated CAssemblyStatement where- annotation (CAsmStmt _ _ _ _ _ n) = n- amap f (CAsmStmt a_1 a_2 a_3 a_4 a_5 a_6)- = CAsmStmt a_1 a_2 a_3 a_4 a_5 (f a_6)--instance CNode t1 => CNode (CAssemblyOperand t1) where- nodeInfo (CAsmOperand _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CAssemblyOperand t1) where- posOf x = posOf (nodeInfo x)--instance Functor CAssemblyOperand where- fmap _f (CAsmOperand a1 a2 a3 a4)- = CAsmOperand a1 (fmap _f a2) (fmap _f a3) (_f a4)--instance Annotated CAssemblyOperand where- annotation (CAsmOperand _ _ _ n) = n- amap f (CAsmOperand a_1 a_2 a_3 a_4)- = CAsmOperand a_1 a_2 a_3 (f a_4)--instance CNode t1 => CNode (CCompoundBlockItem t1) where- nodeInfo (CBlockStmt d) = nodeInfo d- nodeInfo (CBlockDecl d) = nodeInfo d- nodeInfo (CNestedFunDef d) = nodeInfo d-instance CNode t1 => Pos (CCompoundBlockItem t1) where- posOf x = posOf (nodeInfo x)--instance Functor CCompoundBlockItem where- fmap _f (CBlockStmt a1) = CBlockStmt (fmap _f a1)- fmap _f (CBlockDecl a1) = CBlockDecl (fmap _f a1)- fmap _f (CNestedFunDef a1) = CNestedFunDef (fmap _f a1)--instance Annotated CCompoundBlockItem where- annotation (CBlockStmt n) = annotation n- annotation (CBlockDecl n) = annotation n- annotation (CNestedFunDef n) = annotation n- amap f (CBlockStmt n) = CBlockStmt (amap f n)- amap f (CBlockDecl n) = CBlockDecl (amap f n)- amap f (CNestedFunDef n) = CNestedFunDef (amap f n)--instance CNode t1 => CNode (CDeclarationSpecifier t1) where- nodeInfo (CStorageSpec d) = nodeInfo d- nodeInfo (CTypeSpec d) = nodeInfo d- nodeInfo (CTypeQual d) = nodeInfo d- nodeInfo (CFunSpec d) = nodeInfo d- nodeInfo (CAlignSpec d) = nodeInfo d-instance CNode t1 => Pos (CDeclarationSpecifier t1) where- posOf x = posOf (nodeInfo x)--instance Functor CDeclarationSpecifier where- fmap _f (CStorageSpec a1) = CStorageSpec (fmap _f a1)- fmap _f (CTypeSpec a1) = CTypeSpec (fmap _f a1)- fmap _f (CTypeQual a1) = CTypeQual (fmap _f a1)- fmap _f (CFunSpec a1) = CFunSpec (fmap _f a1)- fmap _f (CAlignSpec a1) = CAlignSpec (fmap _f a1)--instance Annotated CDeclarationSpecifier where- annotation (CStorageSpec n) = annotation n- annotation (CTypeSpec n) = annotation n- annotation (CTypeQual n) = annotation n- annotation (CFunSpec n) = annotation n- annotation (CAlignSpec n) = annotation n- amap f (CStorageSpec n) = CStorageSpec (amap f n)- amap f (CTypeSpec n) = CTypeSpec (amap f n)- amap f (CTypeQual n) = CTypeQual (amap f n)- amap f (CFunSpec n) = CFunSpec (amap f n)- amap f (CAlignSpec n) = CAlignSpec (amap f n)--instance CNode t1 => CNode (CStorageSpecifier t1) where- nodeInfo (CAuto d) = nodeInfo d- nodeInfo (CRegister d) = nodeInfo d- nodeInfo (CStatic d) = nodeInfo d- nodeInfo (CExtern d) = nodeInfo d- nodeInfo (CTypedef d) = nodeInfo d- nodeInfo (CThread d) = nodeInfo d-instance CNode t1 => Pos (CStorageSpecifier t1) where- posOf x = posOf (nodeInfo x)--instance Functor CStorageSpecifier where- fmap _f (CAuto a1) = CAuto (_f a1)- fmap _f (CRegister a1) = CRegister (_f a1)- fmap _f (CStatic a1) = CStatic (_f a1)- fmap _f (CExtern a1) = CExtern (_f a1)- fmap _f (CTypedef a1) = CTypedef (_f a1)- fmap _f (CThread a1) = CThread (_f a1)--instance Annotated CStorageSpecifier where- annotation (CAuto n) = n- annotation (CRegister n) = n- annotation (CStatic n) = n- annotation (CExtern n) = n- annotation (CTypedef n) = n- annotation (CThread n) = n- amap f (CAuto a_1) = CAuto (f a_1)- amap f (CRegister a_1) = CRegister (f a_1)- amap f (CStatic a_1) = CStatic (f a_1)- amap f (CExtern a_1) = CExtern (f a_1)- amap f (CTypedef a_1) = CTypedef (f a_1)- amap f (CThread a_1) = CThread (f a_1)--instance CNode t1 => CNode (CTypeSpecifier t1) where- nodeInfo (CVoidType d) = nodeInfo d- nodeInfo (CCharType d) = nodeInfo d- nodeInfo (CShortType d) = nodeInfo d- nodeInfo (CIntType d) = nodeInfo d- nodeInfo (CLongType d) = nodeInfo d- nodeInfo (CFloatType d) = nodeInfo d- nodeInfo (CFloat128Type d) = nodeInfo d- nodeInfo (CDoubleType d) = nodeInfo d- nodeInfo (CSignedType d) = nodeInfo d- nodeInfo (CUnsigType d) = nodeInfo d- nodeInfo (CBoolType d) = nodeInfo d- nodeInfo (CComplexType d) = nodeInfo d- nodeInfo (CInt128Type d) = nodeInfo d- nodeInfo (CSUType _ n) = nodeInfo n- nodeInfo (CEnumType _ n) = nodeInfo n- nodeInfo (CTypeDef _ n) = nodeInfo n- nodeInfo (CTypeOfExpr _ n) = nodeInfo n- nodeInfo (CTypeOfType _ n) = nodeInfo n- nodeInfo (CAtomicType _ n) = nodeInfo n-instance CNode t1 => Pos (CTypeSpecifier t1) where- posOf x = posOf (nodeInfo x)--instance Functor CTypeSpecifier where- fmap _f (CVoidType a1) = CVoidType (_f a1)- fmap _f (CCharType a1) = CCharType (_f a1)- fmap _f (CShortType a1) = CShortType (_f a1)- fmap _f (CIntType a1) = CIntType (_f a1)- fmap _f (CLongType a1) = CLongType (_f a1)- fmap _f (CFloatType a1) = CFloatType (_f a1)- fmap _f (CFloat128Type a1) = CFloat128Type (_f a1)- fmap _f (CDoubleType a1) = CDoubleType (_f a1)- fmap _f (CSignedType a1) = CSignedType (_f a1)- fmap _f (CUnsigType a1) = CUnsigType (_f a1)- fmap _f (CBoolType a1) = CBoolType (_f a1)- fmap _f (CComplexType a1) = CComplexType (_f a1)- fmap _f (CInt128Type a1) = CInt128Type (_f a1)- fmap _f (CSUType a1 a2) = CSUType (fmap _f a1) (_f a2)- fmap _f (CEnumType a1 a2) = CEnumType (fmap _f a1) (_f a2)- fmap _f (CTypeDef a1 a2) = CTypeDef a1 (_f a2)- fmap _f (CTypeOfExpr a1 a2) = CTypeOfExpr (fmap _f a1) (_f a2)- fmap _f (CTypeOfType a1 a2) = CTypeOfType (fmap _f a1) (_f a2)- fmap _f (CAtomicType a1 a2) = CAtomicType (fmap _f a1) (_f a2)--instance Annotated CTypeSpecifier where- annotation (CVoidType n) = n- annotation (CCharType n) = n- annotation (CShortType n) = n- annotation (CIntType n) = n- annotation (CLongType n) = n- annotation (CFloatType n) = n- annotation (CFloat128Type n) = n- annotation (CDoubleType n) = n- annotation (CSignedType n) = n- annotation (CUnsigType n) = n- annotation (CBoolType n) = n- annotation (CComplexType n) = n- annotation (CInt128Type n) = n- annotation (CSUType _ n) = n- annotation (CEnumType _ n) = n- annotation (CTypeDef _ n) = n- annotation (CTypeOfExpr _ n) = n- annotation (CTypeOfType _ n) = n- annotation (CAtomicType _ n) = n- amap f (CVoidType a_1) = CVoidType (f a_1)- amap f (CCharType a_1) = CCharType (f a_1)- amap f (CShortType a_1) = CShortType (f a_1)- amap f (CIntType a_1) = CIntType (f a_1)- amap f (CLongType a_1) = CLongType (f a_1)- amap f (CFloatType a_1) = CFloatType (f a_1)- amap f (CFloat128Type a_1) = CFloat128Type (f a_1)- amap f (CDoubleType a_1) = CDoubleType (f a_1)- amap f (CSignedType a_1) = CSignedType (f a_1)- amap f (CUnsigType a_1) = CUnsigType (f a_1)- amap f (CBoolType a_1) = CBoolType (f a_1)- amap f (CComplexType a_1) = CComplexType (f a_1)- amap f (CInt128Type a_1) = CInt128Type (f a_1)- amap f (CSUType a_1 a_2) = CSUType a_1 (f a_2)- amap f (CEnumType a_1 a_2) = CEnumType a_1 (f a_2)- amap f (CTypeDef a_1 a_2) = CTypeDef a_1 (f a_2)- amap f (CTypeOfExpr a_1 a_2) = CTypeOfExpr a_1 (f a_2)- amap f (CTypeOfType a_1 a_2) = CTypeOfType a_1 (f a_2)- amap f (CAtomicType a_1 a_2) = CAtomicType a_1 (f a_2)--instance CNode t1 => CNode (CTypeQualifier t1) where- nodeInfo (CConstQual d) = nodeInfo d- nodeInfo (CVolatQual d) = nodeInfo d- nodeInfo (CRestrQual d) = nodeInfo d- nodeInfo (CAtomicQual d) = nodeInfo d- nodeInfo (CAttrQual d) = nodeInfo d- nodeInfo (CNullableQual d) = nodeInfo d- nodeInfo (CNonnullQual d) = nodeInfo d--instance CNode t1 => Pos (CTypeQualifier t1) where- posOf x = posOf (nodeInfo x)--instance Functor CTypeQualifier where- fmap _f (CConstQual a1) = CConstQual (_f a1)- fmap _f (CVolatQual a1) = CVolatQual (_f a1)- fmap _f (CRestrQual a1) = CRestrQual (_f a1)- fmap _f (CAtomicQual a1) = CAtomicQual (_f a1)- fmap _f (CAttrQual a1) = CAttrQual (fmap _f a1)- fmap _f (CNullableQual a1) = CNullableQual (_f a1)- fmap _f (CNonnullQual a1) = CNonnullQual (_f a1)--instance Annotated CTypeQualifier where- annotation (CConstQual n) = n- annotation (CVolatQual n) = n- annotation (CRestrQual n) = n- annotation (CAtomicQual n) = n- annotation (CAttrQual n) = annotation n- annotation (CNullableQual n) = n- annotation (CNonnullQual n) = n- amap f (CConstQual a_1) = CConstQual (f a_1)- amap f (CVolatQual a_1) = CVolatQual (f a_1)- amap f (CRestrQual a_1) = CRestrQual (f a_1)- amap f (CAtomicQual a_1) = CAtomicQual (f a_1)- amap f (CAttrQual n) = CAttrQual (amap f n)- amap f (CNullableQual a_1) = CNullableQual (f a_1)- amap f (CNonnullQual a_1) = CNonnullQual (f a_1)--instance CNode t1 => CNode (CFunctionSpecifier t1) where- nodeInfo (CInlineQual d) = nodeInfo d- nodeInfo (CNoreturnQual d) = nodeInfo d-instance CNode t1 => Pos (CFunctionSpecifier t1) where- posOf x = posOf (nodeInfo x)--instance Functor CFunctionSpecifier where- fmap _f (CInlineQual a1) = CInlineQual (_f a1)- fmap _f (CNoreturnQual a1) = CNoreturnQual (_f a1)--instance Annotated CFunctionSpecifier where- annotation (CInlineQual n) = n- annotation (CNoreturnQual n) = n- amap f (CInlineQual a_1) = CInlineQual (f a_1)- amap f (CNoreturnQual a_1) = CNoreturnQual (f a_1)--instance CNode t1 => CNode (CAlignmentSpecifier t1) where- nodeInfo (CAlignAsType _ n) = nodeInfo n- nodeInfo (CAlignAsExpr _ n) = nodeInfo n-instance CNode t1 => Pos (CAlignmentSpecifier t1) where- posOf x = posOf (nodeInfo x)--instance Functor CAlignmentSpecifier where- fmap _f (CAlignAsType a1 a2) = CAlignAsType (fmap _f a1) (_f a2)- fmap _f (CAlignAsExpr a1 a2) = CAlignAsExpr (fmap _f a1) (_f a2)--instance Annotated CAlignmentSpecifier where- annotation (CAlignAsType _ n) = n- annotation (CAlignAsExpr _ n) = n- amap f (CAlignAsType a_1 a_2) = CAlignAsType a_1 (f a_2)- amap f (CAlignAsExpr a_1 a_2) = CAlignAsExpr a_1 (f a_2)--instance CNode t1 => CNode (CStructureUnion t1) where- nodeInfo (CStruct _ _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CStructureUnion t1) where- posOf x = posOf (nodeInfo x)--instance Functor CStructureUnion where- fmap _f (CStruct a1 a2 a3 a4 a5)- = CStruct a1 a2 (fmap (fmap (fmap _f)) a3) (fmap (fmap _f) a4)- (_f a5)--instance Annotated CStructureUnion where- annotation (CStruct _ _ _ _ n) = n- amap f (CStruct a_1 a_2 a_3 a_4 a_5)- = CStruct a_1 a_2 a_3 a_4 (f a_5)--instance CNode t1 => CNode (CEnumeration t1) where- nodeInfo (CEnum _ _ _ n) = nodeInfo n-instance CNode t1 => Pos (CEnumeration t1) where- posOf x = posOf (nodeInfo x)--instance Functor CEnumeration where- fmap _f (CEnum a1 a2 a3 a4)- = CEnum a1 (fmap (fmap (fmap (fmap (fmap _f)))) a2)- (fmap (fmap _f) a3)- (_f a4)--instance Annotated CEnumeration where- annotation (CEnum _ _ _ n) = n- amap f (CEnum a_1 a_2 a_3 a_4) = CEnum a_1 a_2 a_3 (f a_4)--instance CNode t1 => CNode (CInitializer t1) where- nodeInfo (CInitExpr _ n) = nodeInfo n- nodeInfo (CInitList _ n) = nodeInfo n-instance CNode t1 => Pos (CInitializer t1) where- posOf x = posOf (nodeInfo x)--instance Annotated CInitializer where- annotation (CInitExpr _ n) = n- annotation (CInitList _ n) = n- amap f (CInitExpr a_1 a_2) = CInitExpr a_1 (f a_2)- amap f (CInitList a_1 a_2) = CInitList a_1 (f a_2)--instance CNode t1 => CNode (CPartDesignator t1) where- nodeInfo (CArrDesig _ n) = nodeInfo n- nodeInfo (CMemberDesig _ n) = nodeInfo n- nodeInfo (CRangeDesig _ _ n) = nodeInfo n-instance CNode t1 => Pos (CPartDesignator t1) where- posOf x = posOf (nodeInfo x)--instance Functor CPartDesignator where- fmap _f (CArrDesig a1 a2) = CArrDesig (fmap _f a1) (_f a2)- fmap _f (CMemberDesig a1 a2) = CMemberDesig a1 (_f a2)- fmap _f (CRangeDesig a1 a2 a3)- = CRangeDesig (fmap _f a1) (fmap _f a2) (_f a3)--instance Annotated CPartDesignator where- annotation (CArrDesig _ n) = n- annotation (CMemberDesig _ n) = n- annotation (CRangeDesig _ _ n) = n- amap f (CArrDesig a_1 a_2) = CArrDesig a_1 (f a_2)- amap f (CMemberDesig a_1 a_2) = CMemberDesig a_1 (f a_2)- amap f (CRangeDesig a_1 a_2 a_3) = CRangeDesig a_1 a_2 (f a_3)--instance CNode t1 => CNode (CAttribute t1) where- nodeInfo (CAttr _ _ n) = nodeInfo n-instance CNode t1 => Pos (CAttribute t1) where- posOf x = posOf (nodeInfo x)--instance Functor CAttribute where- fmap _f (CAttr a1 a2 a3) = CAttr a1 (fmap (fmap _f) a2) (_f a3)--instance Annotated CAttribute where- annotation (CAttr _ _ n) = n- amap f (CAttr a_1 a_2 a_3) = CAttr a_1 a_2 (f a_3)--instance CNode t1 => CNode (CExpression t1) where- nodeInfo (CComma _ n) = nodeInfo n- nodeInfo (CAssign _ _ _ n) = nodeInfo n- nodeInfo (CCond _ _ _ n) = nodeInfo n- nodeInfo (CBinary _ _ _ n) = nodeInfo n- nodeInfo (CCast _ _ n) = nodeInfo n- nodeInfo (CUnary _ _ n) = nodeInfo n- nodeInfo (CSizeofExpr _ n) = nodeInfo n- nodeInfo (CSizeofType _ n) = nodeInfo n- nodeInfo (CAlignofExpr _ n) = nodeInfo n- nodeInfo (CAlignofType _ n) = nodeInfo n- nodeInfo (CComplexReal _ n) = nodeInfo n- nodeInfo (CComplexImag _ n) = nodeInfo n- nodeInfo (CIndex _ _ n) = nodeInfo n- nodeInfo (CCall _ _ n) = nodeInfo n- nodeInfo (CMember _ _ _ n) = nodeInfo n- nodeInfo (CVar _ n) = nodeInfo n- nodeInfo (CConst d) = nodeInfo d- nodeInfo (CCompoundLit _ _ n) = nodeInfo n- nodeInfo (CGenericSelection _ _ n) = nodeInfo n- nodeInfo (CStatExpr _ n) = nodeInfo n- nodeInfo (CLabAddrExpr _ n) = nodeInfo n- nodeInfo (CBuiltinExpr d) = nodeInfo d-instance CNode t1 => Pos (CExpression t1) where- posOf x = posOf (nodeInfo x)--instance Annotated CExpression where- annotation (CComma _ n) = n- annotation (CAssign _ _ _ n) = n- annotation (CCond _ _ _ n) = n- annotation (CBinary _ _ _ n) = n- annotation (CCast _ _ n) = n- annotation (CUnary _ _ n) = n- annotation (CSizeofExpr _ n) = n- annotation (CSizeofType _ n) = n- annotation (CAlignofExpr _ n) = n- annotation (CAlignofType _ n) = n- annotation (CComplexReal _ n) = n- annotation (CComplexImag _ n) = n- annotation (CIndex _ _ n) = n- annotation (CCall _ _ n) = n- annotation (CMember _ _ _ n) = n- annotation (CVar _ n) = n- annotation (CConst n) = annotation n- annotation (CCompoundLit _ _ n) = n- annotation (CGenericSelection _ _ n) = n- annotation (CStatExpr _ n) = n- annotation (CLabAddrExpr _ n) = n- annotation (CBuiltinExpr n) = annotation n- amap f (CComma a_1 a_2) = CComma a_1 (f a_2)- amap f (CAssign a_1 a_2 a_3 a_4) = CAssign a_1 a_2 a_3 (f a_4)- amap f (CCond a_1 a_2 a_3 a_4) = CCond a_1 a_2 a_3 (f a_4)- amap f (CBinary a_1 a_2 a_3 a_4) = CBinary a_1 a_2 a_3 (f a_4)- amap f (CCast a_1 a_2 a_3) = CCast a_1 a_2 (f a_3)- amap f (CUnary a_1 a_2 a_3) = CUnary a_1 a_2 (f a_3)- amap f (CSizeofExpr a_1 a_2) = CSizeofExpr a_1 (f a_2)- amap f (CSizeofType a_1 a_2) = CSizeofType a_1 (f a_2)- amap f (CAlignofExpr a_1 a_2) = CAlignofExpr a_1 (f a_2)- amap f (CAlignofType a_1 a_2) = CAlignofType a_1 (f a_2)- amap f (CComplexReal a_1 a_2) = CComplexReal a_1 (f a_2)- amap f (CComplexImag a_1 a_2) = CComplexImag a_1 (f a_2)- amap f (CIndex a_1 a_2 a_3) = CIndex a_1 a_2 (f a_3)- amap f (CCall a_1 a_2 a_3) = CCall a_1 a_2 (f a_3)- amap f (CMember a_1 a_2 a_3 a_4) = CMember a_1 a_2 a_3 (f a_4)- amap f (CVar a_1 a_2) = CVar a_1 (f a_2)- amap f (CConst n) = CConst (amap f n)- amap f (CCompoundLit a_1 a_2 a_3) = CCompoundLit a_1 a_2 (f a_3)- amap f (CGenericSelection a_1 a_2 a_3)- = CGenericSelection a_1 a_2 (f a_3)- amap f (CStatExpr a_1 a_2) = CStatExpr a_1 (f a_2)- amap f (CLabAddrExpr a_1 a_2) = CLabAddrExpr a_1 (f a_2)- amap f (CBuiltinExpr n) = CBuiltinExpr (amap f n)--instance CNode t1 => CNode (CBuiltinThing t1) where- nodeInfo (CBuiltinVaArg _ _ n) = nodeInfo n- nodeInfo (CBuiltinOffsetOf _ _ n) = nodeInfo n- nodeInfo (CBuiltinTypesCompatible _ _ n) = nodeInfo n- nodeInfo (CBuiltinConvertVector _ _ n) = nodeInfo n-instance CNode t1 => Pos (CBuiltinThing t1) where- posOf x = posOf (nodeInfo x)--instance Functor CBuiltinThing where- fmap _f (CBuiltinVaArg a1 a2 a3)- = CBuiltinVaArg (fmap _f a1) (fmap _f a2) (_f a3)- fmap _f (CBuiltinOffsetOf a1 a2 a3)- = CBuiltinOffsetOf (fmap _f a1) (fmap (fmap _f) a2) (_f a3)- fmap _f (CBuiltinTypesCompatible a1 a2 a3)- = CBuiltinTypesCompatible (fmap _f a1) (fmap _f a2) (_f a3)- fmap _f (CBuiltinConvertVector a1 a2 a3)- = CBuiltinConvertVector (fmap _f a1) (fmap _f a2) (_f a3)--instance Annotated CBuiltinThing where- annotation (CBuiltinVaArg _ _ n) = n- annotation (CBuiltinOffsetOf _ _ n) = n- annotation (CBuiltinTypesCompatible _ _ n) = n- annotation (CBuiltinConvertVector _ _ n) = n- amap f (CBuiltinVaArg a_1 a_2 a_3) = CBuiltinVaArg a_1 a_2 (f a_3)- amap f (CBuiltinOffsetOf a_1 a_2 a_3)- = CBuiltinOffsetOf a_1 a_2 (f a_3)- amap f (CBuiltinTypesCompatible a_1 a_2 a_3)- = CBuiltinTypesCompatible a_1 a_2 (f a_3)- amap f (CBuiltinConvertVector a_1 a_2 a_3) =- CBuiltinConvertVector a_1 a_2 (f a_3)--instance CNode t1 => CNode (CConstant t1) where- nodeInfo (CIntConst _ n) = nodeInfo n- nodeInfo (CCharConst _ n) = nodeInfo n- nodeInfo (CFloatConst _ n) = nodeInfo n- nodeInfo (CStrConst _ n) = nodeInfo n-instance CNode t1 => Pos (CConstant t1) where- posOf x = posOf (nodeInfo x)--instance Functor CConstant where- fmap _f (CIntConst a1 a2) = CIntConst a1 (_f a2)- fmap _f (CCharConst a1 a2) = CCharConst a1 (_f a2)- fmap _f (CFloatConst a1 a2) = CFloatConst a1 (_f a2)- fmap _f (CStrConst a1 a2) = CStrConst a1 (_f a2)--instance Annotated CConstant where- annotation (CIntConst _ n) = n- annotation (CCharConst _ n) = n- annotation (CFloatConst _ n) = n- annotation (CStrConst _ n) = n- amap f (CIntConst a_1 a_2) = CIntConst a_1 (f a_2)- amap f (CCharConst a_1 a_2) = CCharConst a_1 (f a_2)- amap f (CFloatConst a_1 a_2) = CFloatConst a_1 (f a_2)- amap f (CStrConst a_1 a_2) = CStrConst a_1 (f a_2)--instance CNode t1 => CNode (CStringLiteral t1) where- nodeInfo (CStrLit _ n) = nodeInfo n-instance CNode t1 => Pos (CStringLiteral t1) where- posOf x = posOf (nodeInfo x)--instance Functor CStringLiteral where- fmap _f (CStrLit a1 a2) = CStrLit a1 (_f a2)--instance Annotated CStringLiteral where- annotation (CStrLit _ n) = n- amap f (CStrLit a_1 a_2) = CStrLit a_1 (f a_2)--- GENERATED STOP+{-# LANGUAGE DeriveDataTypeable #-} +{-# LANGUAGE TypeSynonymInstances #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Syntax.AST +-- Copyright : (c) [1999..2007] Manuel M T Chakravarty +-- (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Abstract syntax of C source and header files. +-- +-- The tree structure is based on the grammar in Appendix A of K&R. The +-- abstract syntax simplifies the concrete syntax by merging similar concrete +-- constructs into a single type of abstract tree structure: declarations are +-- merged with structure declarations, parameter declarations and type names, +-- and declarators are merged with abstract declarators. +-- +-- With K&R we refer to ``The C Programming Language'', second edition, Brain +-- W. Kernighan and Dennis M. Ritchie, Prentice Hall, 1988. The AST supports all +-- of C99 <http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf> and several +-- GNU extensions <http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html>. +----------------------------------------------------------------------------- +module Language.C.Syntax.AST ( + -- * C translation units + CTranslUnit, CExtDecl, + CTranslationUnit(..), CExternalDeclaration(..), + -- * Declarations + CFunDef, CDecl, CStructUnion, CEnum, + CFunctionDef(..), CDeclaration(..), + CStructTag(..), CStructureUnion(..), CEnumeration(..), + -- * Declaration attributes + CDeclSpec, partitionDeclSpecs, + CStorageSpec, CTypeSpec, isSUEDef, CTypeQual, CFunSpec, CAlignSpec, CAttr, + CFunctionSpecifier(..), CDeclarationSpecifier(..), CStorageSpecifier(..), CTypeSpecifier(..), + CAlignmentSpecifier(..), + CTypeQualifier(..), CAttribute(..), + -- * Declarators + CDeclr,CDerivedDeclr,CArrSize, + CDeclarator(..), CDerivedDeclarator(..), CArraySize(..), + -- * Initialization + CInit, CInitList, CDesignator, + CInitializer(..), CInitializerList, CPartDesignator(..), + -- * Statements + CStat, CBlockItem, CAsmStmt, CAsmOperand, + CStatement(..), CCompoundBlockItem(..), + CAssemblyStatement(..), CAssemblyOperand(..), + -- * Expressions + CExpr, CExpression(..), + CAssignOp(..), CBinaryOp(..), CUnaryOp(..), + CBuiltin, CBuiltinThing(..), + -- * Constants + CConst, CStrLit, cstringOfLit, liftStrLit, + CConstant(..), CStringLiteral(..), + -- * Annoated type class + Annotated(..) +) where +import Language.C.Syntax.Constants +import Language.C.Syntax.Ops +import Language.C.Data.Ident +import Language.C.Data.Node +import Language.C.Data.Position +import Data.Generics + +-- | Complete C tranlsation unit (C99 6.9, K&R A10) +-- +-- A complete C translation unit, for example representing a C header or source file. +-- It consists of a list of external (i.e. toplevel) declarations. +type CTranslUnit = CTranslationUnit NodeInfo +data CTranslationUnit a + = CTranslUnit [CExternalDeclaration a] a + deriving (Show, Data, Typeable {-! ,CNode ,Functor, Annotated !-}) + +-- | External C declaration (C99 6.9, K&R A10) +-- +-- Either a toplevel declaration, function definition or external assembler. +type CExtDecl = CExternalDeclaration NodeInfo +data CExternalDeclaration a + = CDeclExt (CDeclaration a) + | CFDefExt (CFunctionDef a) + | CAsmExt (CStringLiteral a) a + deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-}) + +-- | C function definition (C99 6.9.1, K&R A10.1) +-- +-- A function definition is of the form @CFunDef specifiers declarator decllist? stmt@. +-- +-- * @specifiers@ are the type and storage-class specifiers of the function. +-- The only storage-class specifiers allowed are /extern/ and /static/. +-- +-- * The @declarator@ must be such that the declared identifier has /function type/. +-- The return type shall be void or an object type other than array type. +-- +-- * The optional declaration list @decllist@ is for old-style function declarations. +-- +-- * The statement @stmt@ is a compound statement. +type CFunDef = CFunctionDef NodeInfo +data CFunctionDef a + = CFunDef + [CDeclarationSpecifier a] -- type specifier and qualifier + (CDeclarator a) -- declarator + [CDeclaration a] -- optional declaration list + (CStatement a) -- compound statement + a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | C declarations (K&R A8, C99 6.7), including structure declarations, parameter +-- declarations and type names. +-- +-- A declaration is of the form @CDecl specifiers init-declarator-list@, where the form of the declarator list's +-- elements depends on the kind of declaration: +-- +-- 1) Toplevel declarations (K&R A8, C99 6.7 declaration) +-- +-- * C99 requires that there is at least one specifier, though this is merely a syntactic restriction +-- +-- * at most one storage class specifier is allowed per declaration +-- +-- * the elements of the non-empty @init-declarator-list@ are of the form @(Just declr, init?, Nothing)@. +-- The declarator @declr@ has to be present and non-abstract and the initialization expression is +-- optional. +-- +-- 2) Structure declarations (K&R A8.3, C99 6.7.2.1 struct-declaration) +-- +-- Those are the declarations of a structure's members. +-- +-- * do not allow storage specifiers +-- +-- * in strict C99, the list of declarators has to be non-empty +-- +-- * the elements of @init-declarator-list@ are either of the form @(Just declr, Nothing, size?)@, +-- representing a member with optional bit-field size, or of the form @(Nothing, Nothing, Just size)@, +-- for unnamed bitfields. @declr@ has to be non-abstract. +-- +-- * no member of a structure shall have incomplete type +-- +-- 3) Parameter declarations (K&R A8.6.3, C99 6.7.5 parameter-declaration) +-- +-- * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@, +-- i.e. consist of a single declarator, which is allowed to be abstract (i.e. unnamed). +-- +-- 4) Type names (A8.8, C99 6.7.6) +-- +-- * do not allow storage specifiers +-- +-- * @init-declarator-list@ must contain at most one triple of the form @(Just declr, Nothing, Nothing)@. +-- where @declr@ is an abstract declarator (i.e. doesn't contain a declared identifier) +-- +type CDecl = CDeclaration NodeInfo +data CDeclaration a + = CDecl + [CDeclarationSpecifier a] -- type specifier and qualifier, __attribute__ + [(Maybe (CDeclarator a), -- declarator (may be omitted) + Maybe (CInitializer a), -- optional initialize + Maybe (CExpression a))] -- optional size (const expr) + a -- annotation + | CStaticAssert + (CExpression a) -- assert expression + (CStringLiteral a) -- assert text + a -- annotation + deriving (Show, Data,Typeable {-! ,CNode ,Annotated !-}) + +-- Derive instance is a little bit ugly +instance Functor CDeclaration where + fmap f (CDecl specs declarators annot) = + CDecl (map (fmap f) specs) (map fmap3m declarators) (f annot) + where fmap3m (a,b,c) = (fmap (fmap f) a, fmap (fmap f) b, fmap (fmap f) c) + fmap f (CStaticAssert expression strlit annot) = + CStaticAssert (fmap f expression) (fmap f strlit) (f annot) + +-- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator (K&R A8.8, C99 6.7.6) +-- +-- A declarator declares a single object, function, or type. It is always associated with +-- a declaration ('CDecl'), which specifies the declaration's type and the additional storage qualifiers and +-- attributes, which apply to the declared object. +-- +-- A declarator is of the form @CDeclr name? indirections asm-name? attrs _@, where +-- @name@ is the name of the declared object (missing for abstract declarators), +-- @declquals@ is a set of additional declaration specifiers, +-- @asm-name@ is the optional assembler name and attributes is a set of +-- attrs is a set of @__attribute__@ annotations for the declared object. +-- +-- @indirections@ is a set of pointer, array and function declarators, which modify the type of the declared object as +-- described below. If the /declaration/ specifies the non-derived type @T@, +-- and we have @indirections = [D1, D2, ..., Dn]@ than the declared object has type +-- @(D1 `indirect` (D2 `indirect` ... (Dn `indirect` T)))@, where +-- +-- * @(CPtrDeclr attrs) `indirect` T@ is /attributed pointer to T/ +-- +-- * @(CFunDeclr attrs) `indirect` T@ is /attributed function returning T/ +-- +-- * @(CArrayDeclr attrs) `indirect` T@ is /attributed array of elemements of type T/ +-- +-- Examples (simplified attributes): +-- +-- * /x/ is an int +-- +-- > int x; +-- > CDeclr "x" [] +-- +-- * /x/ is a restrict pointer to a const pointer to int +-- +-- > const int * const * restrict x; +-- > CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]] +-- +-- * /f/ is an function return a constant pointer to int +-- +-- > int* const f(); +-- > CDeclr "f" [CFunDeclr [],CPtrDeclr [const]] +-- +-- * /f/ is a constant pointer to a function returning int +-- +-- > int (* const f)(); ==> +-- > CDeclr "f" [CPtrDeclr [const], CFunDeclr []] +type CDeclr = CDeclarator NodeInfo +data CDeclarator a + = CDeclr (Maybe Ident) [CDerivedDeclarator a] (Maybe (CStringLiteral a)) [CAttribute a] a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | Derived declarators, see 'CDeclr' +-- +-- Indirections are qualified using type-qualifiers and generic attributes, and additionally +-- +-- * The size of an array is either a constant expression, variable length ('*') or missing; in the last case, the +-- type of the array is incomplete. The qualifier static is allowed for function arguments only, indicating that +-- the supplied argument is an array of at least the given size. +-- +-- * New style parameter lists have the form @Right (declarations, isVariadic)@, old style parameter lists have the +-- form @Left (parameter-names)@ +type CDerivedDeclr = CDerivedDeclarator NodeInfo +data CDerivedDeclarator a + = CPtrDeclr [CTypeQualifier a] a + -- ^ Pointer declarator @CPtrDeclr tyquals declr@ + | CArrDeclr [CTypeQualifier a] (CArraySize a) a + -- ^ Array declarator @CArrDeclr declr tyquals size-expr?@ + | CFunDeclr (Either [Ident] ([CDeclaration a],Bool)) [CAttribute a] a + -- ^ Function declarator @CFunDeclr declr (old-style-params | new-style-params) c-attrs@ + deriving (Show, Data,Typeable {-! ,CNode , Annotated !-}) + +-- Derived instance relies on fmap2 +instance Functor CDerivedDeclarator where + fmap _f (CPtrDeclr a1 a2) = CPtrDeclr (fmap (fmap _f) a1) (_f a2) + fmap _f (CArrDeclr a1 a2 a3) + = CArrDeclr (fmap (fmap _f) a1) (fmap _f a2) (_f a3) + fmap _f (CFunDeclr a1 a2 a3) + = CFunDeclr (fmap (fmapFirst (fmap (fmap _f))) a1) (fmap (fmap _f) a2) + (_f a3) + where fmapFirst f (a,b) = (f a, b) + +-- | Size of an array +type CArrSize = CArraySize NodeInfo +data CArraySize a + = CNoArrSize Bool -- ^ @CUnknownSize isCompleteType@ + | CArrSize Bool (CExpression a) -- ^ @CArrSize isStatic expr@ + deriving (Show, Data,Typeable {-! , Functor !-}) + + +-- | C statement (K&R A9, C99 6.8) +-- +type CStat = CStatement NodeInfo +data CStatement a + -- | An (attributed) label followed by a statement + = CLabel Ident (CStatement a) [CAttribute a] a + -- | A statement of the form @case expr : stmt@ + | CCase (CExpression a) (CStatement a) a + -- | A case range of the form @case lower ... upper : stmt@ + | CCases (CExpression a) (CExpression a) (CStatement a) a + -- | The default case @default : stmt@ + | CDefault (CStatement a) a + -- | A simple statement, that is in C: evaluating an expression with + -- side-effects and discarding the result. + | CExpr (Maybe (CExpression a)) a + -- | compound statement @CCompound localLabels blockItems at@ + | CCompound [Ident] [CCompoundBlockItem a] a + -- | conditional statement @CIf ifExpr thenStmt maybeElseStmt at@ + | CIf (CExpression a) (CStatement a) (Maybe (CStatement a)) a + -- | switch statement @CSwitch selectorExpr switchStmt@, where + -- @switchStmt@ usually includes /case/, /break/ and /default/ + -- statements + | CSwitch (CExpression a) (CStatement a) a + -- | while or do-while statement @CWhile guard stmt isDoWhile at@ + | CWhile (CExpression a) (CStatement a) Bool a + -- | for statement @CFor init expr-2 expr-3 stmt@, where @init@ is + -- either a declaration or initializing expression + | CFor (Either (Maybe (CExpression a)) (CDeclaration a)) + (Maybe (CExpression a)) + (Maybe (CExpression a)) + (CStatement a) + a + -- | goto statement @CGoto label@ + | CGoto Ident a + -- | computed goto @CGotoPtr labelExpr@ + | CGotoPtr (CExpression a) a + -- | continue statement + | CCont a + -- | break statement + | CBreak a + -- | return statement @CReturn returnExpr@ + | CReturn (Maybe (CExpression a)) a + -- | assembly statement + | CAsm (CAssemblyStatement a) a + deriving (Show, Data,Typeable {-! , CNode , Annotated !-}) + +-- Derived instance relies on fmap2 :( +instance Functor CStatement where + fmap _f (CLabel a1 a2 a3 a4) + = CLabel a1 (fmap _f a2) (fmap (fmap _f) a3) (_f a4) + fmap _f (CCase a1 a2 a3) = CCase (fmap _f a1) (fmap _f a2) (_f a3) + fmap _f (CCases a1 a2 a3 a4) + = CCases (fmap _f a1) (fmap _f a2) (fmap _f a3) (_f a4) + fmap _f (CDefault a1 a2) = CDefault (fmap _f a1) (_f a2) + fmap _f (CExpr a1 a2) = CExpr (fmap (fmap _f) a1) (_f a2) + fmap _f (CCompound a1 a2 a3) + = CCompound a1 (fmap (fmap _f) a2) (_f a3) + fmap _f (CIf a1 a2 a3 a4) + = CIf (fmap _f a1) (fmap _f a2) (fmap (fmap _f) a3) (_f a4) + fmap _f (CSwitch a1 a2 a3) + = CSwitch (fmap _f a1) (fmap _f a2) (_f a3) + fmap _f (CWhile a1 a2 a3 a4) + = CWhile (fmap _f a1) (fmap _f a2) a3 (_f a4) + fmap _f (CFor a1 a2 a3 a4 a5) + = CFor (mapEither (fmap (fmap _f)) (fmap _f) a1) + (fmap (fmap _f) a2) (fmap (fmap _f) a3) (fmap _f a4) + (_f a5) + where mapEither f1 f2 = either (Left . f1) (Right . f2) + fmap _f (CGoto a1 a2) = CGoto a1 (_f a2) + fmap _f (CGotoPtr a1 a2) = CGotoPtr (fmap _f a1) (_f a2) + fmap _f (CCont a1) = CCont (_f a1) + fmap _f (CBreak a1) = CBreak (_f a1) + fmap _f (CReturn a1 a2) = CReturn (fmap (fmap _f) a1) (_f a2) + fmap _f (CAsm a1 a2) = CAsm (fmap _f a1) (_f a2) + +-- | GNU Assembler statement +-- +-- > CAssemblyStatement type-qual? asm-expr out-ops in-ops clobbers _ +-- +-- is an inline assembler statement. +-- The only type-qualifier (if any) allowed is /volatile/. +-- @asm-expr@ is the actual assembler epxression (a string), @out-ops@ and @in-ops@ are the input +-- and output operands of the statement. +-- @clobbers@ is a list of registers which are clobbered when executing the assembler statement +type CAsmStmt = CAssemblyStatement NodeInfo +data CAssemblyStatement a + = CAsmStmt + (Maybe (CTypeQualifier a)) -- maybe volatile + (CStringLiteral a) -- assembler expression (String) + [CAssemblyOperand a] -- output operands + [CAssemblyOperand a] -- input operands + [CStringLiteral a] -- Clobbers + a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + +-- | Assembler operand +-- +-- @CAsmOperand argName? constraintExpr arg@ specifies an operand for an assembler +-- statement. +type CAsmOperand = CAssemblyOperand NodeInfo +data CAssemblyOperand a + = CAsmOperand + (Maybe Ident) -- argument name + (CStringLiteral a) -- constraint expr + (CExpression a) -- argument + a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + +-- | C99 Block items +-- +-- Things that may appear in compound statements: either statements, declarations +-- or nested function definitions. +type CBlockItem = CCompoundBlockItem NodeInfo +data CCompoundBlockItem a + = CBlockStmt (CStatement a) -- ^ A statement + | CBlockDecl (CDeclaration a) -- ^ A local declaration + | CNestedFunDef (CFunctionDef a) -- ^ A nested function (GNU C) + deriving (Show, Data,Typeable {-! , CNode , Functor, Annotated !-}) + +-- | C declaration specifiers and qualifiers +-- +-- Declaration specifiers include at most one storage-class specifier (C99 6.7.1), +-- type specifiers (6.7.2) and type qualifiers (6.7.3). +type CDeclSpec = CDeclarationSpecifier NodeInfo +data CDeclarationSpecifier a + = CStorageSpec (CStorageSpecifier a) -- ^ storage-class specifier or typedef + | CTypeSpec (CTypeSpecifier a) -- ^ type name + | CTypeQual (CTypeQualifier a) -- ^ type qualifier + | CFunSpec (CFunctionSpecifier a) -- ^ function specifier + | CAlignSpec (CAlignmentSpecifier a) -- ^ alignment specifier + deriving (Show, Data,Typeable {-! ,CNode ,Functor, Annotated !-}) + + +-- | Separate the declaration specifiers +-- +-- @__attribute__@ of a declaration qualify declarations or declarators (but not types), +-- and are therefore separated as well. +partitionDeclSpecs :: [CDeclarationSpecifier a] + -> ( [CStorageSpecifier a], [CAttribute a] + , [CTypeQualifier a], [CTypeSpecifier a] + , [CFunctionSpecifier a], [CAlignmentSpecifier a]) +partitionDeclSpecs = foldr deals ([],[],[],[],[],[]) where + deals (CStorageSpec sp) (sts,ats,tqs,tss,fss,ass) = (sp:sts,ats,tqs,tss,fss,ass) + deals (CTypeQual (CAttrQual attr)) (sts,ats,tqs,tss,fss,ass) = (sts,attr:ats,tqs,tss,fss,ass) + deals (CTypeQual tq) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tq:tqs,tss,fss,ass) + deals (CTypeSpec ts) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,ts:tss,fss,ass) + deals (CFunSpec fs) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fs:fss,ass) + deals (CAlignSpec as) (sts,ats,tqs,tss,fss,ass) = (sts,ats,tqs,tss,fss,as:ass) + +-- | C storage class specifier (and typedefs) (K&R A8.1, C99 6.7.1) +type CStorageSpec = CStorageSpecifier NodeInfo +data CStorageSpecifier a + = CAuto a -- ^ auto + | CRegister a -- ^ register + | CStatic a -- ^ static + | CExtern a -- ^ extern + | CTypedef a -- ^ typedef + | CThread a -- ^ C11/GNUC thread local storage + deriving (Show, Eq,Ord,Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | C type specifier (K&R A8.2, C99 6.7.2) +-- +-- Type specifiers are either basic types such as @char@ or @int@, +-- @struct@, @union@ or @enum@ specifiers or typedef names. +-- +-- As a GNU extension, a @typeof@ expression also is a type specifier. +type CTypeSpec = CTypeSpecifier NodeInfo +data CTypeSpecifier a + = CVoidType a + | CCharType a + | CShortType a + | CIntType a + | CLongType a + | CFloatType a + | CFloat128Type a + | CDoubleType a + | CSignedType a + | CUnsigType a + | CBoolType a + | CComplexType a + | CInt128Type a + | CSUType (CStructureUnion a) a -- ^ Struct or Union specifier + | CEnumType (CEnumeration a) a -- ^ Enumeration specifier + | CTypeDef Ident a -- ^ Typedef name + | CTypeOfExpr (CExpression a) a -- ^ @typeof(expr)@ + | CTypeOfType (CDeclaration a) a -- ^ @typeof(type)@ + | CAtomicType (CDeclaration a) a -- ^ @_Atomic(type)@ + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | returns @True@ if the given typespec is a struct, union or enum /definition/ +isSUEDef :: CTypeSpecifier a -> Bool +isSUEDef (CSUType (CStruct _ _ (Just _) _ _) _) = True +isSUEDef (CEnumType (CEnum _ (Just _) _ _) _) = True +isSUEDef _ = False + +-- | C type qualifiers (K&R A8.2, C99 6.7.3) and attributes. +-- +-- @const@, @volatile@ and @restrict@ type qualifiers +-- Additionally, @__attribute__@ annotations for declarations and declarators, and +-- function specifiers +type CTypeQual = CTypeQualifier NodeInfo +data CTypeQualifier a + = CConstQual a + | CVolatQual a + | CRestrQual a + | CAtomicQual a + | CAttrQual (CAttribute a) + | CNullableQual a + | CNonnullQual a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + +-- | C function specifiers (C99 6.7.4) +-- +-- function specifiers @inline@ and @_Noreturn@ +type CFunSpec = CFunctionSpecifier NodeInfo +data CFunctionSpecifier a + = CInlineQual a + | CNoreturnQual a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + +-- | C alignment specifiers (C99 6.7.5) +-- +type CAlignSpec = CAlignmentSpecifier NodeInfo +data CAlignmentSpecifier a + = CAlignAsType (CDeclaration a) a -- ^ @_Alignas(type)@ + | CAlignAsExpr (CExpression a) a -- ^ @_Alignas(expr)@ + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | C structure or union specifiers (K&R A8.3, C99 6.7.2.1) +-- +-- @CStruct tag identifier struct-decls c-attrs@ represents a struct or union specifier (depending on @tag@). +-- +-- * either @identifier@ or the declaration list @struct-decls@ (or both) have to be present. +-- +-- Example: in @struct foo x;@, the identifier is present, in @struct { int y; } x@ the declaration list, and +-- in @struct foo { int y; } x;@ both of them. +-- +-- * @c-attrs@ is a list of @__attribute__@ annotations associated with the struct or union specifier +type CStructUnion = CStructureUnion NodeInfo +data CStructureUnion a + = CStruct + CStructTag + (Maybe Ident) + (Maybe [CDeclaration a]) -- member declarations + [CAttribute a] -- __attribute__s + a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | A tag to determine wheter we refer to a @struct@ or @union@, see 'CStructUnion'. +data CStructTag = CStructTag + | CUnionTag + deriving (Show, Eq,Data,Typeable) + + +-- | C enumeration specifier (K&R A8.4, C99 6.7.2.2) +-- +-- @CEnum identifier enumerator-list attrs@ represent as enum specifier +-- +-- * Either the identifier or the enumerator-list (or both) have to be present. +-- +-- * If @enumerator-list@ is present, it has to be non-empty. +-- +-- * The enumerator list is of the form @(enumeration-constant, enumeration-value?)@, where the latter +-- is an optional constant integral expression. +-- +-- * @attrs@ is a list of @__attribute__@ annotations associated with the enumeration specifier +type CEnum = CEnumeration NodeInfo +data CEnumeration a + = CEnum + (Maybe Ident) + (Maybe [(Ident, -- variant name + Maybe (CExpression a))]) -- explicit variant value + [CAttribute a] -- __attribute__s + a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + + +-- | C initialization (K&R A8.7, C99 6.7.8) +-- +-- Initializers are either assignment expressions or initializer lists +-- (surrounded in curly braces), whose elements are themselves +-- initializers, paired with an optional list of designators. +type CInit = CInitializer NodeInfo +data CInitializer a + -- | assignment expression + = CInitExpr (CExpression a) a + -- | initialization list (see 'CInitList') + | CInitList (CInitializerList a) a + deriving (Show, Data,Typeable {-! ,CNode , Annotated !-}) + +-- deriving Functor does not work (type synonym) +instance Functor CInitializer where + fmap _f (CInitExpr a1 a2) = CInitExpr (fmap _f a1) (_f a2) + fmap _f (CInitList a1 a2) = CInitList (fmapInitList _f a1) (_f a2) +fmapInitList :: (a->b) -> (CInitializerList a) -> (CInitializerList b) +fmapInitList _f = map (\(desigs, initializer) -> (fmap (fmap _f) desigs, fmap _f initializer)) + +-- | Initializer List +-- +-- The members of an initializer list are of the form @(designator-list,initializer)@. +-- The @designator-list@ specifies one member of the compound type which is initialized. +-- It is allowed to be empty - in this case the initializer refers to the +-- ''next'' member of the compound type (see C99 6.7.8). +-- +-- Examples (simplified expressions and identifiers): +-- +-- > -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 }; +-- > -- corresponds to the assignments +-- > -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8; +-- > let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4) +-- > init2 = ([CArrDesig 2] , CInitExpr 5) +-- > init3 = ([] , CInitExpr 8) +-- > in CInitList [init1, init2, init3] +-- +-- > -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } }; +-- > -- corresponds to the assignments +-- > -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1; +-- > let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)] +-- > init_s = CInitList [ +-- > ([], init_s_0), +-- > ([CMemberDesig "c", CArrDesig 0], CInitExpr 1) +-- > ] +-- > in CInitList [(CMemberDesig "s", init_s)] +type CInitList = CInitializerList NodeInfo +type CInitializerList a = [([CPartDesignator a], CInitializer a)] + +-- | Designators +-- +-- A designator specifies a member of an object, either an element or range of an array, +-- or the named member of a struct \/ union. +type CDesignator = CPartDesignator NodeInfo +data CPartDesignator a + -- | array position designator + = CArrDesig (CExpression a) a + -- | member designator + | CMemberDesig Ident a + -- | array range designator @CRangeDesig from to _@ (GNU C) + | CRangeDesig (CExpression a) (CExpression a) a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | @__attribute__@ annotations +-- +-- Those are of the form @CAttr attribute-name attribute-parameters@, +-- and serve as generic properties of some syntax tree elements. +type CAttr = CAttribute NodeInfo +data CAttribute a = CAttr Ident [CExpression a] a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | C expression (K&R A7) +-- +-- * these can be arbitrary expression, as the argument of `sizeof' can be +-- arbitrary, even if appearing in a constant expression +-- +-- * GNU C extensions: @alignof@, @__real@, @__imag@, @({ stmt-expr })@, @&& label@ and built-ins +-- +type CExpr = CExpression NodeInfo +data CExpression a + = CComma [CExpression a] -- comma expression list, n >= 2 + a + | CAssign CAssignOp -- assignment operator + (CExpression a) -- l-value + (CExpression a) -- r-value + a + | CCond (CExpression a) -- conditional + (Maybe (CExpression a)) -- true-expression (GNU allows omitting) + (CExpression a) -- false-expression + a + | CBinary CBinaryOp -- binary operator + (CExpression a) -- lhs + (CExpression a) -- rhs + a + | CCast (CDeclaration a) -- type name + (CExpression a) + a + | CUnary CUnaryOp -- unary operator + (CExpression a) + a + | CSizeofExpr (CExpression a) + a + | CSizeofType (CDeclaration a) -- type name + a + | CAlignofExpr (CExpression a) + a + | CAlignofType (CDeclaration a) -- type name + a + | CComplexReal (CExpression a) -- real part of complex number + a + | CComplexImag (CExpression a) -- imaginary part of complex number + a + | CIndex (CExpression a) -- array + (CExpression a) -- index + a + | CCall (CExpression a) -- function + [CExpression a] -- arguments + a + | CMember (CExpression a) -- structure + Ident -- member name + Bool -- deref structure? (True for `->') + a + | CVar Ident -- identifier (incl. enumeration const) + a + | CConst (CConstant a) -- ^ integer, character, floating point and string constants + | CCompoundLit (CDeclaration a) + (CInitializerList a) -- type name & initialiser list + a -- ^ C99 compound literal + | CGenericSelection (CExpression a) [(Maybe (CDeclaration a), CExpression a)] a -- ^ C11 generic selection + | CStatExpr (CStatement a) a -- ^ GNU C compound statement as expr + | CLabAddrExpr Ident a -- ^ GNU C address of label + | CBuiltinExpr (CBuiltinThing a) -- ^ builtin expressions, see 'CBuiltin' + deriving (Data,Typeable,Show {-! ,CNode , Annotated !-}) + +-- deriving Functor does not work (type synonyms) +instance Functor CExpression where + fmap _f (CComma a1 a2) = CComma (fmap (fmap _f) a1) (_f a2) + fmap _f (CAssign a1 a2 a3 a4) + = CAssign a1 (fmap _f a2) (fmap _f a3) (_f a4) + fmap _f (CCond a1 a2 a3 a4) + = CCond (fmap _f a1) (fmap (fmap _f) a2) (fmap _f a3) (_f a4) + fmap _f (CBinary a1 a2 a3 a4) + = CBinary a1 (fmap _f a2) (fmap _f a3) (_f a4) + fmap _f (CCast a1 a2 a3) = CCast (fmap _f a1) (fmap _f a2) (_f a3) + fmap _f (CUnary a1 a2 a3) = CUnary a1 (fmap _f a2) (_f a3) + fmap _f (CSizeofExpr a1 a2) = CSizeofExpr (fmap _f a1) (_f a2) + fmap _f (CSizeofType a1 a2) = CSizeofType (fmap _f a1) (_f a2) + fmap _f (CAlignofExpr a1 a2) = CAlignofExpr (fmap _f a1) (_f a2) + fmap _f (CAlignofType a1 a2) = CAlignofType (fmap _f a1) (_f a2) + fmap _f (CComplexReal a1 a2) = CComplexReal (fmap _f a1) (_f a2) + fmap _f (CComplexImag a1 a2) = CComplexImag (fmap _f a1) (_f a2) + fmap _f (CIndex a1 a2 a3) + = CIndex (fmap _f a1) (fmap _f a2) (_f a3) + fmap _f (CCall a1 a2 a3) + = CCall (fmap _f a1) (fmap (fmap _f) a2) (_f a3) + fmap _f (CMember a1 a2 a3 a4) = CMember (fmap _f a1) a2 a3 (_f a4) + fmap _f (CVar a1 a2) = CVar a1 (_f a2) + fmap _f (CConst a1) = CConst (fmap _f a1) + fmap _f (CCompoundLit a1 a2 a3) + = CCompoundLit (fmap _f a1) (fmapInitList _f a2) (_f a3) + fmap _f (CStatExpr a1 a2) = CStatExpr (fmap _f a1) (_f a2) + fmap _f (CLabAddrExpr a1 a2) = CLabAddrExpr a1 (_f a2) + fmap _f (CBuiltinExpr a1) = CBuiltinExpr (fmap _f a1) + fmap _f (CGenericSelection expr list annot) = + CGenericSelection (fmap _f expr) (map fmap_helper list) (_f annot) + where + fmap_helper (ma1, a2) = (fmap (fmap _f) ma1, fmap _f a2) + +-- | GNU Builtins, which cannot be typed in C99 +type CBuiltin = CBuiltinThing NodeInfo +data CBuiltinThing a + = CBuiltinVaArg (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@ + | CBuiltinOffsetOf (CDeclaration a) [CPartDesignator a] a -- ^ @(type, designator-list)@ + | CBuiltinTypesCompatible (CDeclaration a) (CDeclaration a) a -- ^ @(type,type)@ + | CBuiltinConvertVector (CExpression a) (CDeclaration a) a -- ^ @(expr, type)@ + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | C constant (K&R A2.5 & A7.2) +type CConst = CConstant NodeInfo +data CConstant a + = CIntConst CInteger a + | CCharConst CChar a + | CFloatConst CFloat a + | CStrConst CString a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +-- | Attributed string literals +type CStrLit = CStringLiteral NodeInfo +data CStringLiteral a = CStrLit CString a + deriving (Show, Data,Typeable {-! ,CNode ,Functor ,Annotated !-}) + + +cstringOfLit :: CStringLiteral a -> CString +cstringOfLit (CStrLit cstr _) = cstr + +-- | Lift a string literal to a C constant +liftStrLit :: CStringLiteral a -> CConstant a +liftStrLit (CStrLit str at) = CStrConst str at + +-- | All AST nodes are annotated. Inspired by the Annotated +-- class of Niklas Broberg's haskell-src-exts package. +-- In principle, we could have Copointed superclass instead +-- of @ann@, for the price of another dependency. +class (Functor ast) => Annotated ast where + -- | get the annotation of an AST node + annotation :: ast a -> a + -- | change the annotation (non-recursively) + -- of an AST node. Use fmap for recursively + -- modifying the annotation. + amap :: (a->a) -> ast a -> ast a + +-- fmap2 :: (a->a') -> (a,b) -> (a',b) +-- fmap2 f (a,b) = (f a, b) + +-- Instances generated using derive-2.* +-- GENERATED START + +instance CNode t1 => CNode (CTranslationUnit t1) where + nodeInfo (CTranslUnit _ n) = nodeInfo n +instance CNode t1 => Pos (CTranslationUnit t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CTranslationUnit where + fmap _f (CTranslUnit a1 a2) + = CTranslUnit (fmap (fmap _f) a1) (_f a2) + +instance Annotated CTranslationUnit where + annotation (CTranslUnit _ n) = n + amap f (CTranslUnit a_1 a_2) = CTranslUnit a_1 (f a_2) + +instance CNode t1 => CNode (CExternalDeclaration t1) where + nodeInfo (CDeclExt d) = nodeInfo d + nodeInfo (CFDefExt d) = nodeInfo d + nodeInfo (CAsmExt _ n) = nodeInfo n +instance CNode t1 => Pos (CExternalDeclaration t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CExternalDeclaration where + fmap _f (CDeclExt a1) = CDeclExt (fmap _f a1) + fmap _f (CFDefExt a1) = CFDefExt (fmap _f a1) + fmap _f (CAsmExt a1 a2) = CAsmExt (fmap _f a1) (_f a2) + +instance Annotated CExternalDeclaration where + annotation (CDeclExt n) = annotation n + annotation (CFDefExt n) = annotation n + annotation (CAsmExt _ n) = n + amap f (CDeclExt n) = CDeclExt (amap f n) + amap f (CFDefExt n) = CFDefExt (amap f n) + amap f (CAsmExt a_1 a_2) = CAsmExt a_1 (f a_2) + +instance CNode t1 => CNode (CFunctionDef t1) where + nodeInfo (CFunDef _ _ _ _ n) = nodeInfo n +instance CNode t1 => Pos (CFunctionDef t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CFunctionDef where + fmap _f (CFunDef a1 a2 a3 a4 a5) + = CFunDef (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3) + (fmap _f a4) + (_f a5) + +instance Annotated CFunctionDef where + annotation (CFunDef _ _ _ _ n) = n + amap f (CFunDef a_1 a_2 a_3 a_4 a_5) + = CFunDef a_1 a_2 a_3 a_4 (f a_5) + +instance CNode t1 => CNode (CDeclaration t1) where + nodeInfo (CDecl _ _ n) = nodeInfo n + nodeInfo (CStaticAssert _ _ n) = nodeInfo n +instance CNode t1 => Pos (CDeclaration t1) where + posOf x = posOf (nodeInfo x) + +instance Annotated CDeclaration where + annotation (CDecl _ _ n) = n + annotation (CStaticAssert _ _ n) = n + amap f (CDecl a_1 a_2 a_3) = CDecl a_1 a_2 (f a_3) + amap f (CStaticAssert a_1 a_2 a_3) = CStaticAssert a_1 a_2 (f a_3) + +instance CNode t1 => CNode (CDeclarator t1) where + nodeInfo (CDeclr _ _ _ _ n) = nodeInfo n +instance CNode t1 => Pos (CDeclarator t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CDeclarator where + fmap _f (CDeclr a1 a2 a3 a4 a5) + = CDeclr a1 (fmap (fmap _f) a2) (fmap (fmap _f) a3) + (fmap (fmap _f) a4) + (_f a5) + +instance Annotated CDeclarator where + annotation (CDeclr _ _ _ _ n) = n + amap f (CDeclr a_1 a_2 a_3 a_4 a_5) + = CDeclr a_1 a_2 a_3 a_4 (f a_5) + +instance CNode t1 => CNode (CDerivedDeclarator t1) where + nodeInfo (CPtrDeclr _ n) = nodeInfo n + nodeInfo (CArrDeclr _ _ n) = nodeInfo n + nodeInfo (CFunDeclr _ _ n) = nodeInfo n +instance CNode t1 => Pos (CDerivedDeclarator t1) where + posOf x = posOf (nodeInfo x) + +instance Annotated CDerivedDeclarator where + annotation (CPtrDeclr _ n) = n + annotation (CArrDeclr _ _ n) = n + annotation (CFunDeclr _ _ n) = n + amap f (CPtrDeclr a_1 a_2) = CPtrDeclr a_1 (f a_2) + amap f (CArrDeclr a_1 a_2 a_3) = CArrDeclr a_1 a_2 (f a_3) + amap f (CFunDeclr a_1 a_2 a_3) = CFunDeclr a_1 a_2 (f a_3) + +instance Functor CArraySize where + fmap _ (CNoArrSize a1) = CNoArrSize a1 + fmap _f (CArrSize a1 a2) = CArrSize a1 (fmap _f a2) + +instance CNode t1 => CNode (CStatement t1) where + nodeInfo (CLabel _ _ _ n) = nodeInfo n + nodeInfo (CCase _ _ n) = nodeInfo n + nodeInfo (CCases _ _ _ n) = nodeInfo n + nodeInfo (CDefault _ n) = nodeInfo n + nodeInfo (CExpr _ n) = nodeInfo n + nodeInfo (CCompound _ _ n) = nodeInfo n + nodeInfo (CIf _ _ _ n) = nodeInfo n + nodeInfo (CSwitch _ _ n) = nodeInfo n + nodeInfo (CWhile _ _ _ n) = nodeInfo n + nodeInfo (CFor _ _ _ _ n) = nodeInfo n + nodeInfo (CGoto _ n) = nodeInfo n + nodeInfo (CGotoPtr _ n) = nodeInfo n + nodeInfo (CCont d) = nodeInfo d + nodeInfo (CBreak d) = nodeInfo d + nodeInfo (CReturn _ n) = nodeInfo n + nodeInfo (CAsm _ n) = nodeInfo n +instance CNode t1 => Pos (CStatement t1) where + posOf x = posOf (nodeInfo x) + +instance Annotated CStatement where + annotation (CLabel _ _ _ n) = n + annotation (CCase _ _ n) = n + annotation (CCases _ _ _ n) = n + annotation (CDefault _ n) = n + annotation (CExpr _ n) = n + annotation (CCompound _ _ n) = n + annotation (CIf _ _ _ n) = n + annotation (CSwitch _ _ n) = n + annotation (CWhile _ _ _ n) = n + annotation (CFor _ _ _ _ n) = n + annotation (CGoto _ n) = n + annotation (CGotoPtr _ n) = n + annotation (CCont n) = n + annotation (CBreak n) = n + annotation (CReturn _ n) = n + annotation (CAsm _ n) = n + amap f (CLabel a_1 a_2 a_3 a_4) = CLabel a_1 a_2 a_3 (f a_4) + amap f (CCase a_1 a_2 a_3) = CCase a_1 a_2 (f a_3) + amap f (CCases a_1 a_2 a_3 a_4) = CCases a_1 a_2 a_3 (f a_4) + amap f (CDefault a_1 a_2) = CDefault a_1 (f a_2) + amap f (CExpr a_1 a_2) = CExpr a_1 (f a_2) + amap f (CCompound a_1 a_2 a_3) = CCompound a_1 a_2 (f a_3) + amap f (CIf a_1 a_2 a_3 a_4) = CIf a_1 a_2 a_3 (f a_4) + amap f (CSwitch a_1 a_2 a_3) = CSwitch a_1 a_2 (f a_3) + amap f (CWhile a_1 a_2 a_3 a_4) = CWhile a_1 a_2 a_3 (f a_4) + amap f (CFor a_1 a_2 a_3 a_4 a_5) = CFor a_1 a_2 a_3 a_4 (f a_5) + amap f (CGoto a_1 a_2) = CGoto a_1 (f a_2) + amap f (CGotoPtr a_1 a_2) = CGotoPtr a_1 (f a_2) + amap f (CCont a_1) = CCont (f a_1) + amap f (CBreak a_1) = CBreak (f a_1) + amap f (CReturn a_1 a_2) = CReturn a_1 (f a_2) + amap f (CAsm a_1 a_2) = CAsm a_1 (f a_2) + +instance CNode t1 => CNode (CAssemblyStatement t1) where + nodeInfo (CAsmStmt _ _ _ _ _ n) = nodeInfo n +instance CNode t1 => Pos (CAssemblyStatement t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CAssemblyStatement where + fmap _f (CAsmStmt a1 a2 a3 a4 a5 a6) + = CAsmStmt (fmap (fmap _f) a1) (fmap _f a2) (fmap (fmap _f) a3) + (fmap (fmap _f) a4) + (fmap (fmap _f) a5) + (_f a6) + +instance Annotated CAssemblyStatement where + annotation (CAsmStmt _ _ _ _ _ n) = n + amap f (CAsmStmt a_1 a_2 a_3 a_4 a_5 a_6) + = CAsmStmt a_1 a_2 a_3 a_4 a_5 (f a_6) + +instance CNode t1 => CNode (CAssemblyOperand t1) where + nodeInfo (CAsmOperand _ _ _ n) = nodeInfo n +instance CNode t1 => Pos (CAssemblyOperand t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CAssemblyOperand where + fmap _f (CAsmOperand a1 a2 a3 a4) + = CAsmOperand a1 (fmap _f a2) (fmap _f a3) (_f a4) + +instance Annotated CAssemblyOperand where + annotation (CAsmOperand _ _ _ n) = n + amap f (CAsmOperand a_1 a_2 a_3 a_4) + = CAsmOperand a_1 a_2 a_3 (f a_4) + +instance CNode t1 => CNode (CCompoundBlockItem t1) where + nodeInfo (CBlockStmt d) = nodeInfo d + nodeInfo (CBlockDecl d) = nodeInfo d + nodeInfo (CNestedFunDef d) = nodeInfo d +instance CNode t1 => Pos (CCompoundBlockItem t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CCompoundBlockItem where + fmap _f (CBlockStmt a1) = CBlockStmt (fmap _f a1) + fmap _f (CBlockDecl a1) = CBlockDecl (fmap _f a1) + fmap _f (CNestedFunDef a1) = CNestedFunDef (fmap _f a1) + +instance Annotated CCompoundBlockItem where + annotation (CBlockStmt n) = annotation n + annotation (CBlockDecl n) = annotation n + annotation (CNestedFunDef n) = annotation n + amap f (CBlockStmt n) = CBlockStmt (amap f n) + amap f (CBlockDecl n) = CBlockDecl (amap f n) + amap f (CNestedFunDef n) = CNestedFunDef (amap f n) + +instance CNode t1 => CNode (CDeclarationSpecifier t1) where + nodeInfo (CStorageSpec d) = nodeInfo d + nodeInfo (CTypeSpec d) = nodeInfo d + nodeInfo (CTypeQual d) = nodeInfo d + nodeInfo (CFunSpec d) = nodeInfo d + nodeInfo (CAlignSpec d) = nodeInfo d +instance CNode t1 => Pos (CDeclarationSpecifier t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CDeclarationSpecifier where + fmap _f (CStorageSpec a1) = CStorageSpec (fmap _f a1) + fmap _f (CTypeSpec a1) = CTypeSpec (fmap _f a1) + fmap _f (CTypeQual a1) = CTypeQual (fmap _f a1) + fmap _f (CFunSpec a1) = CFunSpec (fmap _f a1) + fmap _f (CAlignSpec a1) = CAlignSpec (fmap _f a1) + +instance Annotated CDeclarationSpecifier where + annotation (CStorageSpec n) = annotation n + annotation (CTypeSpec n) = annotation n + annotation (CTypeQual n) = annotation n + annotation (CFunSpec n) = annotation n + annotation (CAlignSpec n) = annotation n + amap f (CStorageSpec n) = CStorageSpec (amap f n) + amap f (CTypeSpec n) = CTypeSpec (amap f n) + amap f (CTypeQual n) = CTypeQual (amap f n) + amap f (CFunSpec n) = CFunSpec (amap f n) + amap f (CAlignSpec n) = CAlignSpec (amap f n) + +instance CNode t1 => CNode (CStorageSpecifier t1) where + nodeInfo (CAuto d) = nodeInfo d + nodeInfo (CRegister d) = nodeInfo d + nodeInfo (CStatic d) = nodeInfo d + nodeInfo (CExtern d) = nodeInfo d + nodeInfo (CTypedef d) = nodeInfo d + nodeInfo (CThread d) = nodeInfo d +instance CNode t1 => Pos (CStorageSpecifier t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CStorageSpecifier where + fmap _f (CAuto a1) = CAuto (_f a1) + fmap _f (CRegister a1) = CRegister (_f a1) + fmap _f (CStatic a1) = CStatic (_f a1) + fmap _f (CExtern a1) = CExtern (_f a1) + fmap _f (CTypedef a1) = CTypedef (_f a1) + fmap _f (CThread a1) = CThread (_f a1) + +instance Annotated CStorageSpecifier where + annotation (CAuto n) = n + annotation (CRegister n) = n + annotation (CStatic n) = n + annotation (CExtern n) = n + annotation (CTypedef n) = n + annotation (CThread n) = n + amap f (CAuto a_1) = CAuto (f a_1) + amap f (CRegister a_1) = CRegister (f a_1) + amap f (CStatic a_1) = CStatic (f a_1) + amap f (CExtern a_1) = CExtern (f a_1) + amap f (CTypedef a_1) = CTypedef (f a_1) + amap f (CThread a_1) = CThread (f a_1) + +instance CNode t1 => CNode (CTypeSpecifier t1) where + nodeInfo (CVoidType d) = nodeInfo d + nodeInfo (CCharType d) = nodeInfo d + nodeInfo (CShortType d) = nodeInfo d + nodeInfo (CIntType d) = nodeInfo d + nodeInfo (CLongType d) = nodeInfo d + nodeInfo (CFloatType d) = nodeInfo d + nodeInfo (CFloat128Type d) = nodeInfo d + nodeInfo (CDoubleType d) = nodeInfo d + nodeInfo (CSignedType d) = nodeInfo d + nodeInfo (CUnsigType d) = nodeInfo d + nodeInfo (CBoolType d) = nodeInfo d + nodeInfo (CComplexType d) = nodeInfo d + nodeInfo (CInt128Type d) = nodeInfo d + nodeInfo (CSUType _ n) = nodeInfo n + nodeInfo (CEnumType _ n) = nodeInfo n + nodeInfo (CTypeDef _ n) = nodeInfo n + nodeInfo (CTypeOfExpr _ n) = nodeInfo n + nodeInfo (CTypeOfType _ n) = nodeInfo n + nodeInfo (CAtomicType _ n) = nodeInfo n +instance CNode t1 => Pos (CTypeSpecifier t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CTypeSpecifier where + fmap _f (CVoidType a1) = CVoidType (_f a1) + fmap _f (CCharType a1) = CCharType (_f a1) + fmap _f (CShortType a1) = CShortType (_f a1) + fmap _f (CIntType a1) = CIntType (_f a1) + fmap _f (CLongType a1) = CLongType (_f a1) + fmap _f (CFloatType a1) = CFloatType (_f a1) + fmap _f (CFloat128Type a1) = CFloat128Type (_f a1) + fmap _f (CDoubleType a1) = CDoubleType (_f a1) + fmap _f (CSignedType a1) = CSignedType (_f a1) + fmap _f (CUnsigType a1) = CUnsigType (_f a1) + fmap _f (CBoolType a1) = CBoolType (_f a1) + fmap _f (CComplexType a1) = CComplexType (_f a1) + fmap _f (CInt128Type a1) = CInt128Type (_f a1) + fmap _f (CSUType a1 a2) = CSUType (fmap _f a1) (_f a2) + fmap _f (CEnumType a1 a2) = CEnumType (fmap _f a1) (_f a2) + fmap _f (CTypeDef a1 a2) = CTypeDef a1 (_f a2) + fmap _f (CTypeOfExpr a1 a2) = CTypeOfExpr (fmap _f a1) (_f a2) + fmap _f (CTypeOfType a1 a2) = CTypeOfType (fmap _f a1) (_f a2) + fmap _f (CAtomicType a1 a2) = CAtomicType (fmap _f a1) (_f a2) + +instance Annotated CTypeSpecifier where + annotation (CVoidType n) = n + annotation (CCharType n) = n + annotation (CShortType n) = n + annotation (CIntType n) = n + annotation (CLongType n) = n + annotation (CFloatType n) = n + annotation (CFloat128Type n) = n + annotation (CDoubleType n) = n + annotation (CSignedType n) = n + annotation (CUnsigType n) = n + annotation (CBoolType n) = n + annotation (CComplexType n) = n + annotation (CInt128Type n) = n + annotation (CSUType _ n) = n + annotation (CEnumType _ n) = n + annotation (CTypeDef _ n) = n + annotation (CTypeOfExpr _ n) = n + annotation (CTypeOfType _ n) = n + annotation (CAtomicType _ n) = n + amap f (CVoidType a_1) = CVoidType (f a_1) + amap f (CCharType a_1) = CCharType (f a_1) + amap f (CShortType a_1) = CShortType (f a_1) + amap f (CIntType a_1) = CIntType (f a_1) + amap f (CLongType a_1) = CLongType (f a_1) + amap f (CFloatType a_1) = CFloatType (f a_1) + amap f (CFloat128Type a_1) = CFloat128Type (f a_1) + amap f (CDoubleType a_1) = CDoubleType (f a_1) + amap f (CSignedType a_1) = CSignedType (f a_1) + amap f (CUnsigType a_1) = CUnsigType (f a_1) + amap f (CBoolType a_1) = CBoolType (f a_1) + amap f (CComplexType a_1) = CComplexType (f a_1) + amap f (CInt128Type a_1) = CInt128Type (f a_1) + amap f (CSUType a_1 a_2) = CSUType a_1 (f a_2) + amap f (CEnumType a_1 a_2) = CEnumType a_1 (f a_2) + amap f (CTypeDef a_1 a_2) = CTypeDef a_1 (f a_2) + amap f (CTypeOfExpr a_1 a_2) = CTypeOfExpr a_1 (f a_2) + amap f (CTypeOfType a_1 a_2) = CTypeOfType a_1 (f a_2) + amap f (CAtomicType a_1 a_2) = CAtomicType a_1 (f a_2) + +instance CNode t1 => CNode (CTypeQualifier t1) where + nodeInfo (CConstQual d) = nodeInfo d + nodeInfo (CVolatQual d) = nodeInfo d + nodeInfo (CRestrQual d) = nodeInfo d + nodeInfo (CAtomicQual d) = nodeInfo d + nodeInfo (CAttrQual d) = nodeInfo d + nodeInfo (CNullableQual d) = nodeInfo d + nodeInfo (CNonnullQual d) = nodeInfo d + +instance CNode t1 => Pos (CTypeQualifier t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CTypeQualifier where + fmap _f (CConstQual a1) = CConstQual (_f a1) + fmap _f (CVolatQual a1) = CVolatQual (_f a1) + fmap _f (CRestrQual a1) = CRestrQual (_f a1) + fmap _f (CAtomicQual a1) = CAtomicQual (_f a1) + fmap _f (CAttrQual a1) = CAttrQual (fmap _f a1) + fmap _f (CNullableQual a1) = CNullableQual (_f a1) + fmap _f (CNonnullQual a1) = CNonnullQual (_f a1) + +instance Annotated CTypeQualifier where + annotation (CConstQual n) = n + annotation (CVolatQual n) = n + annotation (CRestrQual n) = n + annotation (CAtomicQual n) = n + annotation (CAttrQual n) = annotation n + annotation (CNullableQual n) = n + annotation (CNonnullQual n) = n + amap f (CConstQual a_1) = CConstQual (f a_1) + amap f (CVolatQual a_1) = CVolatQual (f a_1) + amap f (CRestrQual a_1) = CRestrQual (f a_1) + amap f (CAtomicQual a_1) = CAtomicQual (f a_1) + amap f (CAttrQual n) = CAttrQual (amap f n) + amap f (CNullableQual a_1) = CNullableQual (f a_1) + amap f (CNonnullQual a_1) = CNonnullQual (f a_1) + +instance CNode t1 => CNode (CFunctionSpecifier t1) where + nodeInfo (CInlineQual d) = nodeInfo d + nodeInfo (CNoreturnQual d) = nodeInfo d +instance CNode t1 => Pos (CFunctionSpecifier t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CFunctionSpecifier where + fmap _f (CInlineQual a1) = CInlineQual (_f a1) + fmap _f (CNoreturnQual a1) = CNoreturnQual (_f a1) + +instance Annotated CFunctionSpecifier where + annotation (CInlineQual n) = n + annotation (CNoreturnQual n) = n + amap f (CInlineQual a_1) = CInlineQual (f a_1) + amap f (CNoreturnQual a_1) = CNoreturnQual (f a_1) + +instance CNode t1 => CNode (CAlignmentSpecifier t1) where + nodeInfo (CAlignAsType _ n) = nodeInfo n + nodeInfo (CAlignAsExpr _ n) = nodeInfo n +instance CNode t1 => Pos (CAlignmentSpecifier t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CAlignmentSpecifier where + fmap _f (CAlignAsType a1 a2) = CAlignAsType (fmap _f a1) (_f a2) + fmap _f (CAlignAsExpr a1 a2) = CAlignAsExpr (fmap _f a1) (_f a2) + +instance Annotated CAlignmentSpecifier where + annotation (CAlignAsType _ n) = n + annotation (CAlignAsExpr _ n) = n + amap f (CAlignAsType a_1 a_2) = CAlignAsType a_1 (f a_2) + amap f (CAlignAsExpr a_1 a_2) = CAlignAsExpr a_1 (f a_2) + +instance CNode t1 => CNode (CStructureUnion t1) where + nodeInfo (CStruct _ _ _ _ n) = nodeInfo n +instance CNode t1 => Pos (CStructureUnion t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CStructureUnion where + fmap _f (CStruct a1 a2 a3 a4 a5) + = CStruct a1 a2 (fmap (fmap (fmap _f)) a3) (fmap (fmap _f) a4) + (_f a5) + +instance Annotated CStructureUnion where + annotation (CStruct _ _ _ _ n) = n + amap f (CStruct a_1 a_2 a_3 a_4 a_5) + = CStruct a_1 a_2 a_3 a_4 (f a_5) + +instance CNode t1 => CNode (CEnumeration t1) where + nodeInfo (CEnum _ _ _ n) = nodeInfo n +instance CNode t1 => Pos (CEnumeration t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CEnumeration where + fmap _f (CEnum a1 a2 a3 a4) + = CEnum a1 (fmap (fmap (fmap (fmap (fmap _f)))) a2) + (fmap (fmap _f) a3) + (_f a4) + +instance Annotated CEnumeration where + annotation (CEnum _ _ _ n) = n + amap f (CEnum a_1 a_2 a_3 a_4) = CEnum a_1 a_2 a_3 (f a_4) + +instance CNode t1 => CNode (CInitializer t1) where + nodeInfo (CInitExpr _ n) = nodeInfo n + nodeInfo (CInitList _ n) = nodeInfo n +instance CNode t1 => Pos (CInitializer t1) where + posOf x = posOf (nodeInfo x) + +instance Annotated CInitializer where + annotation (CInitExpr _ n) = n + annotation (CInitList _ n) = n + amap f (CInitExpr a_1 a_2) = CInitExpr a_1 (f a_2) + amap f (CInitList a_1 a_2) = CInitList a_1 (f a_2) + +instance CNode t1 => CNode (CPartDesignator t1) where + nodeInfo (CArrDesig _ n) = nodeInfo n + nodeInfo (CMemberDesig _ n) = nodeInfo n + nodeInfo (CRangeDesig _ _ n) = nodeInfo n +instance CNode t1 => Pos (CPartDesignator t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CPartDesignator where + fmap _f (CArrDesig a1 a2) = CArrDesig (fmap _f a1) (_f a2) + fmap _f (CMemberDesig a1 a2) = CMemberDesig a1 (_f a2) + fmap _f (CRangeDesig a1 a2 a3) + = CRangeDesig (fmap _f a1) (fmap _f a2) (_f a3) + +instance Annotated CPartDesignator where + annotation (CArrDesig _ n) = n + annotation (CMemberDesig _ n) = n + annotation (CRangeDesig _ _ n) = n + amap f (CArrDesig a_1 a_2) = CArrDesig a_1 (f a_2) + amap f (CMemberDesig a_1 a_2) = CMemberDesig a_1 (f a_2) + amap f (CRangeDesig a_1 a_2 a_3) = CRangeDesig a_1 a_2 (f a_3) + +instance CNode t1 => CNode (CAttribute t1) where + nodeInfo (CAttr _ _ n) = nodeInfo n +instance CNode t1 => Pos (CAttribute t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CAttribute where + fmap _f (CAttr a1 a2 a3) = CAttr a1 (fmap (fmap _f) a2) (_f a3) + +instance Annotated CAttribute where + annotation (CAttr _ _ n) = n + amap f (CAttr a_1 a_2 a_3) = CAttr a_1 a_2 (f a_3) + +instance CNode t1 => CNode (CExpression t1) where + nodeInfo (CComma _ n) = nodeInfo n + nodeInfo (CAssign _ _ _ n) = nodeInfo n + nodeInfo (CCond _ _ _ n) = nodeInfo n + nodeInfo (CBinary _ _ _ n) = nodeInfo n + nodeInfo (CCast _ _ n) = nodeInfo n + nodeInfo (CUnary _ _ n) = nodeInfo n + nodeInfo (CSizeofExpr _ n) = nodeInfo n + nodeInfo (CSizeofType _ n) = nodeInfo n + nodeInfo (CAlignofExpr _ n) = nodeInfo n + nodeInfo (CAlignofType _ n) = nodeInfo n + nodeInfo (CComplexReal _ n) = nodeInfo n + nodeInfo (CComplexImag _ n) = nodeInfo n + nodeInfo (CIndex _ _ n) = nodeInfo n + nodeInfo (CCall _ _ n) = nodeInfo n + nodeInfo (CMember _ _ _ n) = nodeInfo n + nodeInfo (CVar _ n) = nodeInfo n + nodeInfo (CConst d) = nodeInfo d + nodeInfo (CCompoundLit _ _ n) = nodeInfo n + nodeInfo (CGenericSelection _ _ n) = nodeInfo n + nodeInfo (CStatExpr _ n) = nodeInfo n + nodeInfo (CLabAddrExpr _ n) = nodeInfo n + nodeInfo (CBuiltinExpr d) = nodeInfo d +instance CNode t1 => Pos (CExpression t1) where + posOf x = posOf (nodeInfo x) + +instance Annotated CExpression where + annotation (CComma _ n) = n + annotation (CAssign _ _ _ n) = n + annotation (CCond _ _ _ n) = n + annotation (CBinary _ _ _ n) = n + annotation (CCast _ _ n) = n + annotation (CUnary _ _ n) = n + annotation (CSizeofExpr _ n) = n + annotation (CSizeofType _ n) = n + annotation (CAlignofExpr _ n) = n + annotation (CAlignofType _ n) = n + annotation (CComplexReal _ n) = n + annotation (CComplexImag _ n) = n + annotation (CIndex _ _ n) = n + annotation (CCall _ _ n) = n + annotation (CMember _ _ _ n) = n + annotation (CVar _ n) = n + annotation (CConst n) = annotation n + annotation (CCompoundLit _ _ n) = n + annotation (CGenericSelection _ _ n) = n + annotation (CStatExpr _ n) = n + annotation (CLabAddrExpr _ n) = n + annotation (CBuiltinExpr n) = annotation n + amap f (CComma a_1 a_2) = CComma a_1 (f a_2) + amap f (CAssign a_1 a_2 a_3 a_4) = CAssign a_1 a_2 a_3 (f a_4) + amap f (CCond a_1 a_2 a_3 a_4) = CCond a_1 a_2 a_3 (f a_4) + amap f (CBinary a_1 a_2 a_3 a_4) = CBinary a_1 a_2 a_3 (f a_4) + amap f (CCast a_1 a_2 a_3) = CCast a_1 a_2 (f a_3) + amap f (CUnary a_1 a_2 a_3) = CUnary a_1 a_2 (f a_3) + amap f (CSizeofExpr a_1 a_2) = CSizeofExpr a_1 (f a_2) + amap f (CSizeofType a_1 a_2) = CSizeofType a_1 (f a_2) + amap f (CAlignofExpr a_1 a_2) = CAlignofExpr a_1 (f a_2) + amap f (CAlignofType a_1 a_2) = CAlignofType a_1 (f a_2) + amap f (CComplexReal a_1 a_2) = CComplexReal a_1 (f a_2) + amap f (CComplexImag a_1 a_2) = CComplexImag a_1 (f a_2) + amap f (CIndex a_1 a_2 a_3) = CIndex a_1 a_2 (f a_3) + amap f (CCall a_1 a_2 a_3) = CCall a_1 a_2 (f a_3) + amap f (CMember a_1 a_2 a_3 a_4) = CMember a_1 a_2 a_3 (f a_4) + amap f (CVar a_1 a_2) = CVar a_1 (f a_2) + amap f (CConst n) = CConst (amap f n) + amap f (CCompoundLit a_1 a_2 a_3) = CCompoundLit a_1 a_2 (f a_3) + amap f (CGenericSelection a_1 a_2 a_3) + = CGenericSelection a_1 a_2 (f a_3) + amap f (CStatExpr a_1 a_2) = CStatExpr a_1 (f a_2) + amap f (CLabAddrExpr a_1 a_2) = CLabAddrExpr a_1 (f a_2) + amap f (CBuiltinExpr n) = CBuiltinExpr (amap f n) + +instance CNode t1 => CNode (CBuiltinThing t1) where + nodeInfo (CBuiltinVaArg _ _ n) = nodeInfo n + nodeInfo (CBuiltinOffsetOf _ _ n) = nodeInfo n + nodeInfo (CBuiltinTypesCompatible _ _ n) = nodeInfo n + nodeInfo (CBuiltinConvertVector _ _ n) = nodeInfo n +instance CNode t1 => Pos (CBuiltinThing t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CBuiltinThing where + fmap _f (CBuiltinVaArg a1 a2 a3) + = CBuiltinVaArg (fmap _f a1) (fmap _f a2) (_f a3) + fmap _f (CBuiltinOffsetOf a1 a2 a3) + = CBuiltinOffsetOf (fmap _f a1) (fmap (fmap _f) a2) (_f a3) + fmap _f (CBuiltinTypesCompatible a1 a2 a3) + = CBuiltinTypesCompatible (fmap _f a1) (fmap _f a2) (_f a3) + fmap _f (CBuiltinConvertVector a1 a2 a3) + = CBuiltinConvertVector (fmap _f a1) (fmap _f a2) (_f a3) + +instance Annotated CBuiltinThing where + annotation (CBuiltinVaArg _ _ n) = n + annotation (CBuiltinOffsetOf _ _ n) = n + annotation (CBuiltinTypesCompatible _ _ n) = n + annotation (CBuiltinConvertVector _ _ n) = n + amap f (CBuiltinVaArg a_1 a_2 a_3) = CBuiltinVaArg a_1 a_2 (f a_3) + amap f (CBuiltinOffsetOf a_1 a_2 a_3) + = CBuiltinOffsetOf a_1 a_2 (f a_3) + amap f (CBuiltinTypesCompatible a_1 a_2 a_3) + = CBuiltinTypesCompatible a_1 a_2 (f a_3) + amap f (CBuiltinConvertVector a_1 a_2 a_3) = + CBuiltinConvertVector a_1 a_2 (f a_3) + +instance CNode t1 => CNode (CConstant t1) where + nodeInfo (CIntConst _ n) = nodeInfo n + nodeInfo (CCharConst _ n) = nodeInfo n + nodeInfo (CFloatConst _ n) = nodeInfo n + nodeInfo (CStrConst _ n) = nodeInfo n +instance CNode t1 => Pos (CConstant t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CConstant where + fmap _f (CIntConst a1 a2) = CIntConst a1 (_f a2) + fmap _f (CCharConst a1 a2) = CCharConst a1 (_f a2) + fmap _f (CFloatConst a1 a2) = CFloatConst a1 (_f a2) + fmap _f (CStrConst a1 a2) = CStrConst a1 (_f a2) + +instance Annotated CConstant where + annotation (CIntConst _ n) = n + annotation (CCharConst _ n) = n + annotation (CFloatConst _ n) = n + annotation (CStrConst _ n) = n + amap f (CIntConst a_1 a_2) = CIntConst a_1 (f a_2) + amap f (CCharConst a_1 a_2) = CCharConst a_1 (f a_2) + amap f (CFloatConst a_1 a_2) = CFloatConst a_1 (f a_2) + amap f (CStrConst a_1 a_2) = CStrConst a_1 (f a_2) + +instance CNode t1 => CNode (CStringLiteral t1) where + nodeInfo (CStrLit _ n) = nodeInfo n +instance CNode t1 => Pos (CStringLiteral t1) where + posOf x = posOf (nodeInfo x) + +instance Functor CStringLiteral where + fmap _f (CStrLit a1 a2) = CStrLit a1 (_f a2) + +instance Annotated CStringLiteral where + annotation (CStrLit _ n) = n + amap f (CStrLit a_1 a_2) = CStrLit a_1 (f a_2) +-- GENERATED STOP
src/Language/C/Syntax/Constants.hs view
@@ -1,296 +1,296 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Syntax.Constants--- Copyright : (c) 2007..2008 Duncan Coutts, Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ This module provides support for representing, checking and exporting c--- constants, i.e. integral, float, character and string constants.-------------------------------------------------------------------------------module Language.C.Syntax.Constants (- -- * Utilities- escapeChar, unescapeChar, unescapeString,- Flags(..), noFlags, setFlag, clearFlag, testFlag,- -- * C char constants (and multi-character character constants)- cChar, cChar_w, cChars, CChar(..), getCChar, getCCharAsInt, isWideChar, showCharConst,- -- * C integral constants- CIntFlag(..), CIntRepr(..), cInteger, CInteger(..), getCInteger,readCInteger,- -- * C floating point constants- cFloat, CFloat(..), readCFloat,- -- * C string literals- cString, cString_w, CString(..), getCString, showStringLit, concatCStrings,- -- * Clang C version literals- ClangCVersion(..), readClangCVersion,-)-where-import Data.Bits-import Data.Char-import Numeric (showOct, showHex, readHex, readOct, readDec)-import Data.Generics---- | C char constants (abstract)-data CChar = CChar- !Char- !Bool -- wide flag- | CChars- [Char] -- multi-character character constant- !Bool -- wide flag- deriving (Eq,Ord,Data,Typeable)--instance Show CChar where- showsPrec _ (CChar c wideflag) = _showWideFlag wideflag . showCharConst c- showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . sQuote (concatMap escapeCChar cs)---- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@.--- If necessary uses octal or hexadecimal escape sequences.-showCharConst :: Char -> ShowS-showCharConst c = sQuote $ escapeCChar c--_showWideFlag :: Bool -> ShowS-_showWideFlag flag = if flag then showString "L" else id---- | get the haskell representation of a char constant-getCChar :: CChar -> String-getCChar (CChar c _) = [c]-getCChar (CChars cs _) = cs---- | get integer value of a C char constant--- undefined result for multi-char char constants-getCCharAsInt :: CChar -> Integer-getCCharAsInt (CChar c _) = fromIntegral (fromEnum c)-getCCharAsInt (CChars _cs _) = error "integer value of multi-character character constants is implementation defined"---- | return @true@ if the character constant is /wide/.-isWideChar :: CChar -> Bool-isWideChar (CChar _ wideFlag) = wideFlag-isWideChar (CChars _ wideFlag) = wideFlag---- | construct a character constant from a haskell 'Char'--- Use 'cchar_w' if you want a wide character constant.-cChar :: Char -> CChar-cChar c = CChar c False---- | construct a wide chararacter constant-cChar_w :: Char -> CChar-cChar_w c = CChar c True---- | create a multi-character character constant-cChars :: String -> Bool -> CChar-cChars = CChars---- | datatype for memorizing the representation of an integer-data CIntRepr = DecRepr | HexRepr | OctalRepr deriving (Eq,Ord,Enum,Bounded,Data,Typeable)---- | datatype representing type flags for integers-data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag deriving (Eq,Ord,Enum,Bounded,Data,Typeable)-instance Show CIntFlag where- show FlagUnsigned = "u"- show FlagLong = "L"- show FlagLongLong = "LL"- show FlagImag = "i"--{-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}-{-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-}-{-# SPECIALIZE testFlag :: CIntFlag -> Flags CIntFlag -> Bool #-}--data CInteger = CInteger- !Integer- !CIntRepr- !(Flags CIntFlag) -- integer flags- deriving (Eq,Ord,Data,Typeable)-instance Show CInteger where- showsPrec _ (CInteger ig repr flags) = showInt ig . showString (concatMap showIFlag [FlagUnsigned .. ]) where- showIFlag f = if testFlag f flags then show f else []- showInt num = case repr of DecRepr -> shows num- OctalRepr -> showString "0" . showOct num- HexRepr -> showString "0x" . showHex num---- To be used in the lexer--- Note that the flag lexer won't scale-readCInteger :: CIntRepr -> String -> Either String CInteger-readCInteger repr str =- case readNum str of- [(n,suffix)] -> mkCInt n suffix- parseFailed -> Left $ "Bad Integer literal: "++show parseFailed- where- readNum = case repr of DecRepr -> readDec; HexRepr -> readHex; OctalRepr -> readOct- mkCInt n suffix = either Left (Right . CInteger n repr) $ readSuffix suffix- readSuffix = parseFlags noFlags- parseFlags flags [] = Right flags- parseFlags flags ('l':'l':fs) = parseFlags (setFlag FlagLongLong flags) fs- parseFlags flags ('L':'L':fs) = parseFlags (setFlag FlagLongLong flags) fs- parseFlags flags (f:fs) =- let go1 flag = parseFlags (setFlag flag flags) fs in- case f of- 'l' -> go1 FlagLong ; 'L' -> go1 FlagLong- 'u' -> go1 FlagUnsigned ; 'U' -> go1 FlagUnsigned- 'i' -> go1 FlagImag ; 'I' -> go1 FlagImag; 'j' -> go1 FlagImag; 'J' -> go1 FlagImag- _ -> Left $ "Unexpected flag " ++ show f--getCInteger :: CInteger -> Integer-getCInteger (CInteger i _ _) = i---- | construct a integer constant (without type flags) from a haskell integer-cInteger :: Integer -> CInteger-cInteger i = CInteger i DecRepr noFlags----- | Floats (represented as strings)-data CFloat = CFloat- !String- deriving (Eq,Ord,Data,Typeable)-instance Show CFloat where- showsPrec _ (CFloat internal) = showString internal--cFloat :: Float -> CFloat-cFloat = CFloat . show---- dummy implementation-readCFloat :: String -> CFloat-readCFloat = CFloat---- | Clang dotted version literal--- <https://clang.llvm.org/docs/AttributeReference.html#availability>-data ClangCVersion = ClangCVersion- !String- deriving (Eq,Ord,Data,Typeable)-instance Show ClangCVersion where- showsPrec _ (ClangCVersion internal) = showString internal--readClangCVersion :: String -> ClangCVersion-readClangCVersion = ClangCVersion---- | C String literals-data CString = CString- String -- characters- Bool -- wide flag- deriving (Eq,Ord,Data,Typeable)-instance Show CString where- showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str---- construction-cString :: String -> CString-cString str = CString str False-cString_w :: String -> CString-cString_w str = CString str True---- selectors-getCString :: CString -> String-getCString (CString str _) = str-isWideString :: CString -> Bool-isWideString (CString _ wideflag) = wideflag---- | concatenate a list of C string literals-concatCStrings :: [CString] -> CString-concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs)---- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@.--- If necessary it uses octal or hexadecimal escape sequences.-showStringLit :: String -> ShowS-showStringLit = dQuote . concatMap showStringChar- where- showStringChar c | isSChar c = return c- | c == '"' = "\\\""- | otherwise = escapeChar c------ | @isAsciiSourceChar b@ returns @True@ if the given character is a character which--- may appear in a ASCII C source file and is printable.-isAsciiSourceChar :: Char -> Bool-isAsciiSourceChar c = isAscii c && isPrint c---- | @isCChar c@ returns true, if c is a source character which does not have to be escaped in--- C char constants (C99: 6.4.4.4)-isCChar :: Char -> Bool-isCChar '\\' = False-isCChar '\'' = False-isCChar '\n' = False-isCChar c = isAsciiSourceChar c---- | @escapeCChar c@ escapes c for use in a char constant-escapeCChar :: Char -> String-escapeCChar '\'' = "\\'"-escapeCChar c | isCChar c = [c]- | otherwise = escapeChar c---- | @isSChar c@ returns true if c is a source character which does not have to be escaped in C string--- literals (C99: 6.4.5)-isSChar :: Char -> Bool-isSChar '\\' = False-isSChar '\"' = False-isSChar '\n' = False-isSChar c = isAsciiSourceChar c--showOct' :: Int -> String-showOct' i = replicate (3 - length s) '0' ++ s- where s = showOct i ""--escapeChar :: Char -> String-escapeChar '\\' = "\\\\"-escapeChar '\a' = "\\a"-escapeChar '\b' = "\\b"-escapeChar '\ESC' = "\\e";-escapeChar '\f' = "\\f"-escapeChar '\n' = "\\n"-escapeChar '\r' = "\\r"-escapeChar '\t' = "\\t"-escapeChar '\v' = "\\v"-escapeChar c | (ord c) < 512 = '\\' : showOct' (ord c)- | otherwise = '\\' : 'x' : showHex (ord c) ""--unescapeChar :: String -> (Char, String)-unescapeChar ('\\':c:cs) = case c of- 'n' -> ('\n', cs)- 't' -> ('\t', cs)- 'v' -> ('\v', cs)- 'b' -> ('\b', cs)- 'r' -> ('\r', cs)- 'f' -> ('\f', cs)- 'a' -> ('\a', cs)- 'e' -> ('\ESC', cs) -- GNU extension- 'E' -> ('\ESC', cs) -- GNU extension- '\\' -> ('\\', cs)- '?' -> ('?', cs)- '\'' -> ('\'', cs)- '"' -> ('"', cs)- 'x' -> case head' "bad escape sequence" (readHex cs) of- (i, cs') -> (toEnum i, cs')- _ -> case head' "bad escape sequence" (readOct' (c:cs)) of- (i, cs') -> (toEnum i, cs')-unescapeChar (c :cs) = (c, cs)-unescapeChar [] = error $ "unescape char: empty string"--readOct' :: ReadS Int-readOct' s = map (\(i, cs) -> (i, cs ++ rest)) (readOct octStr)- where octStr = takeWhile isOctDigit $ take 3 s- rest = drop (length octStr) s--unescapeString :: String -> String-unescapeString [] = []-unescapeString cs = case unescapeChar cs of- (c, cs') -> c : unescapeString cs'---- helpers-sQuote :: String -> ShowS-sQuote s t = "'" ++ s ++ "'" ++ t-dQuote :: String -> ShowS-dQuote s t = ('"' : s) ++ "\"" ++ t-head' :: String -> [a] -> a-head' err [] = error err-head' _ (x:_) = x---- TODO: Move to separate file ?-newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable)-noFlags :: Flags f-noFlags = Flags 0-setFlag :: (Enum f) => f -> Flags f -> Flags f-setFlag flag (Flags k) = Flags$ k `setBit` fromEnum flag-clearFlag :: (Enum f) => f -> Flags f -> Flags f-clearFlag flag (Flags k) = Flags$ k `clearBit` fromEnum flag-testFlag :: (Enum f) => f -> Flags f -> Bool-testFlag flag (Flags k) = k `testBit` fromEnum flag+{-# LANGUAGE DeriveDataTypeable #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Syntax.Constants +-- Copyright : (c) 2007..2008 Duncan Coutts, Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- This module provides support for representing, checking and exporting c +-- constants, i.e. integral, float, character and string constants. +----------------------------------------------------------------------------- +module Language.C.Syntax.Constants ( + -- * Utilities + escapeChar, unescapeChar, unescapeString, + Flags(..), noFlags, setFlag, clearFlag, testFlag, + -- * C char constants (and multi-character character constants) + cChar, cChar_w, cChars, CChar(..), getCChar, getCCharAsInt, isWideChar, showCharConst, + -- * C integral constants + CIntFlag(..), CIntRepr(..), cInteger, CInteger(..), getCInteger,readCInteger, + -- * C floating point constants + cFloat, CFloat(..), readCFloat, + -- * C string literals + cString, cString_w, CString(..), getCString, showStringLit, concatCStrings, + -- * Clang C version literals + ClangCVersion(..), readClangCVersion, +) +where +import Data.Bits +import Data.Char +import Numeric (showOct, showHex, readHex, readOct, readDec) +import Data.Generics + +-- | C char constants (abstract) +data CChar = CChar + !Char + !Bool -- wide flag + | CChars + [Char] -- multi-character character constant + !Bool -- wide flag + deriving (Eq,Ord,Data,Typeable) + +instance Show CChar where + showsPrec _ (CChar c wideflag) = _showWideFlag wideflag . showCharConst c + showsPrec _ (CChars cs wideflag) = _showWideFlag wideflag . sQuote (concatMap escapeCChar cs) + +-- | @showCharConst c@ prepends _a_ String representing the C char constant corresponding to @c@. +-- If necessary uses octal or hexadecimal escape sequences. +showCharConst :: Char -> ShowS +showCharConst c = sQuote $ escapeCChar c + +_showWideFlag :: Bool -> ShowS +_showWideFlag flag = if flag then showString "L" else id + +-- | get the haskell representation of a char constant +getCChar :: CChar -> String +getCChar (CChar c _) = [c] +getCChar (CChars cs _) = cs + +-- | get integer value of a C char constant +-- undefined result for multi-char char constants +getCCharAsInt :: CChar -> Integer +getCCharAsInt (CChar c _) = fromIntegral (fromEnum c) +getCCharAsInt (CChars _cs _) = error "integer value of multi-character character constants is implementation defined" + +-- | return @true@ if the character constant is /wide/. +isWideChar :: CChar -> Bool +isWideChar (CChar _ wideFlag) = wideFlag +isWideChar (CChars _ wideFlag) = wideFlag + +-- | construct a character constant from a haskell 'Char' +-- Use 'cchar_w' if you want a wide character constant. +cChar :: Char -> CChar +cChar c = CChar c False + +-- | construct a wide chararacter constant +cChar_w :: Char -> CChar +cChar_w c = CChar c True + +-- | create a multi-character character constant +cChars :: String -> Bool -> CChar +cChars = CChars + +-- | datatype for memorizing the representation of an integer +data CIntRepr = DecRepr | HexRepr | OctalRepr deriving (Eq,Ord,Enum,Bounded,Data,Typeable) + +-- | datatype representing type flags for integers +data CIntFlag = FlagUnsigned | FlagLong | FlagLongLong | FlagImag deriving (Eq,Ord,Enum,Bounded,Data,Typeable) +instance Show CIntFlag where + show FlagUnsigned = "u" + show FlagLong = "L" + show FlagLongLong = "LL" + show FlagImag = "i" + +{-# SPECIALIZE setFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-} +{-# SPECIALIZE clearFlag :: CIntFlag -> Flags CIntFlag -> Flags CIntFlag #-} +{-# SPECIALIZE testFlag :: CIntFlag -> Flags CIntFlag -> Bool #-} + +data CInteger = CInteger + !Integer + !CIntRepr + !(Flags CIntFlag) -- integer flags + deriving (Eq,Ord,Data,Typeable) +instance Show CInteger where + showsPrec _ (CInteger ig repr flags) = showInt ig . showString (concatMap showIFlag [FlagUnsigned .. ]) where + showIFlag f = if testFlag f flags then show f else [] + showInt num = case repr of DecRepr -> shows num + OctalRepr -> showString "0" . showOct num + HexRepr -> showString "0x" . showHex num + +-- To be used in the lexer +-- Note that the flag lexer won't scale +readCInteger :: CIntRepr -> String -> Either String CInteger +readCInteger repr str = + case readNum str of + [(n,suffix)] -> mkCInt n suffix + parseFailed -> Left $ "Bad Integer literal: "++show parseFailed + where + readNum = case repr of DecRepr -> readDec; HexRepr -> readHex; OctalRepr -> readOct + mkCInt n suffix = either Left (Right . CInteger n repr) $ readSuffix suffix + readSuffix = parseFlags noFlags + parseFlags flags [] = Right flags + parseFlags flags ('l':'l':fs) = parseFlags (setFlag FlagLongLong flags) fs + parseFlags flags ('L':'L':fs) = parseFlags (setFlag FlagLongLong flags) fs + parseFlags flags (f:fs) = + let go1 flag = parseFlags (setFlag flag flags) fs in + case f of + 'l' -> go1 FlagLong ; 'L' -> go1 FlagLong + 'u' -> go1 FlagUnsigned ; 'U' -> go1 FlagUnsigned + 'i' -> go1 FlagImag ; 'I' -> go1 FlagImag; 'j' -> go1 FlagImag; 'J' -> go1 FlagImag + _ -> Left $ "Unexpected flag " ++ show f + +getCInteger :: CInteger -> Integer +getCInteger (CInteger i _ _) = i + +-- | construct a integer constant (without type flags) from a haskell integer +cInteger :: Integer -> CInteger +cInteger i = CInteger i DecRepr noFlags + + +-- | Floats (represented as strings) +data CFloat = CFloat + !String + deriving (Eq,Ord,Data,Typeable) +instance Show CFloat where + showsPrec _ (CFloat internal) = showString internal + +cFloat :: Float -> CFloat +cFloat = CFloat . show + +-- dummy implementation +readCFloat :: String -> CFloat +readCFloat = CFloat + +-- | Clang dotted version literal +-- <https://clang.llvm.org/docs/AttributeReference.html#availability> +data ClangCVersion = ClangCVersion + !String + deriving (Eq,Ord,Data,Typeable) +instance Show ClangCVersion where + showsPrec _ (ClangCVersion internal) = showString internal + +readClangCVersion :: String -> ClangCVersion +readClangCVersion = ClangCVersion + +-- | C String literals +data CString = CString + String -- characters + Bool -- wide flag + deriving (Eq,Ord,Data,Typeable) +instance Show CString where + showsPrec _ (CString str wideflag) = _showWideFlag wideflag . showStringLit str + +-- construction +cString :: String -> CString +cString str = CString str False +cString_w :: String -> CString +cString_w str = CString str True + +-- selectors +getCString :: CString -> String +getCString (CString str _) = str +isWideString :: CString -> Bool +isWideString (CString _ wideflag) = wideflag + +-- | concatenate a list of C string literals +concatCStrings :: [CString] -> CString +concatCStrings cs = CString (concatMap getCString cs) (any isWideString cs) + +-- | @showStringLiteral s@ prepends a String representing the C string literal corresponding to @s@. +-- If necessary it uses octal or hexadecimal escape sequences. +showStringLit :: String -> ShowS +showStringLit = dQuote . concatMap showStringChar + where + showStringChar c | isSChar c = return c + | c == '"' = "\\\"" + | otherwise = escapeChar c + + + +-- | @isAsciiSourceChar b@ returns @True@ if the given character is a character which +-- may appear in a ASCII C source file and is printable. +isAsciiSourceChar :: Char -> Bool +isAsciiSourceChar c = isAscii c && isPrint c + +-- | @isCChar c@ returns true, if c is a source character which does not have to be escaped in +-- C char constants (C99: 6.4.4.4) +isCChar :: Char -> Bool +isCChar '\\' = False +isCChar '\'' = False +isCChar '\n' = False +isCChar c = isAsciiSourceChar c + +-- | @escapeCChar c@ escapes c for use in a char constant +escapeCChar :: Char -> String +escapeCChar '\'' = "\\'" +escapeCChar c | isCChar c = [c] + | otherwise = escapeChar c + +-- | @isSChar c@ returns true if c is a source character which does not have to be escaped in C string +-- literals (C99: 6.4.5) +isSChar :: Char -> Bool +isSChar '\\' = False +isSChar '\"' = False +isSChar '\n' = False +isSChar c = isAsciiSourceChar c + +showOct' :: Int -> String +showOct' i = replicate (3 - length s) '0' ++ s + where s = showOct i "" + +escapeChar :: Char -> String +escapeChar '\\' = "\\\\" +escapeChar '\a' = "\\a" +escapeChar '\b' = "\\b" +escapeChar '\ESC' = "\\e"; +escapeChar '\f' = "\\f" +escapeChar '\n' = "\\n" +escapeChar '\r' = "\\r" +escapeChar '\t' = "\\t" +escapeChar '\v' = "\\v" +escapeChar c | (ord c) < 512 = '\\' : showOct' (ord c) + | otherwise = '\\' : 'x' : showHex (ord c) "" + +unescapeChar :: String -> (Char, String) +unescapeChar ('\\':c:cs) = case c of + 'n' -> ('\n', cs) + 't' -> ('\t', cs) + 'v' -> ('\v', cs) + 'b' -> ('\b', cs) + 'r' -> ('\r', cs) + 'f' -> ('\f', cs) + 'a' -> ('\a', cs) + 'e' -> ('\ESC', cs) -- GNU extension + 'E' -> ('\ESC', cs) -- GNU extension + '\\' -> ('\\', cs) + '?' -> ('?', cs) + '\'' -> ('\'', cs) + '"' -> ('"', cs) + 'x' -> case head' "bad escape sequence" (readHex cs) of + (i, cs') -> (toEnum i, cs') + _ -> case head' "bad escape sequence" (readOct' (c:cs)) of + (i, cs') -> (toEnum i, cs') +unescapeChar (c :cs) = (c, cs) +unescapeChar [] = error $ "unescape char: empty string" + +readOct' :: ReadS Int +readOct' s = map (\(i, cs) -> (i, cs ++ rest)) (readOct octStr) + where octStr = takeWhile isOctDigit $ take 3 s + rest = drop (length octStr) s + +unescapeString :: String -> String +unescapeString [] = [] +unescapeString cs = case unescapeChar cs of + (c, cs') -> c : unescapeString cs' + +-- helpers +sQuote :: String -> ShowS +sQuote s t = "'" ++ s ++ "'" ++ t +dQuote :: String -> ShowS +dQuote s t = ('"' : s) ++ "\"" ++ t +head' :: String -> [a] -> a +head' err [] = error err +head' _ (x:_) = x + +-- TODO: Move to separate file ? +newtype Flags f = Flags Integer deriving (Eq,Ord,Data,Typeable) +noFlags :: Flags f +noFlags = Flags 0 +setFlag :: (Enum f) => f -> Flags f -> Flags f +setFlag flag (Flags k) = Flags$ k `setBit` fromEnum flag +clearFlag :: (Enum f) => f -> Flags f -> Flags f +clearFlag flag (Flags k) = Flags$ k `clearBit` fromEnum flag +testFlag :: (Enum f) => f -> Flags f -> Bool +testFlag flag (Flags k) = k `testBit` fromEnum flag
src/Language/C/Syntax/Ops.hs view
@@ -1,105 +1,105 @@-{-# LANGUAGE DeriveDataTypeable #-}--------------------------------------------------------------------------------- |--- Module : Language.C.Syntax.Ops--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : ghc------ Unary, binary and asssignment operators. Exported via AST.-------------------------------------------------------------------------------module Language.C.Syntax.Ops (--- * Assignment operators-CAssignOp(..),-assignBinop,--- * Binary operators-CBinaryOp(..),-isCmpOp,-isPtrOp,-isBitOp,-isLogicOp,--- * Unary operators-CUnaryOp(..),-isEffectfulOp-)-where-import Data.Generics--- | C assignment operators (K&R A7.17)-data CAssignOp = CAssignOp- | CMulAssOp- | CDivAssOp- | CRmdAssOp -- ^ remainder and assignment- | CAddAssOp- | CSubAssOp- | CShlAssOp- | CShrAssOp- | CAndAssOp- | CXorAssOp- | COrAssOp- deriving (Eq,Ord,Show,Data,Typeable)--assignBinop :: CAssignOp -> CBinaryOp-assignBinop CAssignOp = error "direct assignment has no binary operator"-assignBinop CMulAssOp = CMulOp-assignBinop CDivAssOp = CDivOp-assignBinop CRmdAssOp = CRmdOp-assignBinop CAddAssOp = CAddOp-assignBinop CSubAssOp = CSubOp-assignBinop CShlAssOp = CShlOp-assignBinop CShrAssOp = CShrOp-assignBinop CAndAssOp = CAndOp-assignBinop CXorAssOp = CXorOp-assignBinop COrAssOp = COrOp---- | C binary operators (K&R A7.6-15)----data CBinaryOp = CMulOp- | CDivOp- | CRmdOp -- ^ remainder of division- | CAddOp- | CSubOp- | CShlOp -- ^ shift left- | CShrOp -- ^ shift right- | CLeOp -- ^ less- | CGrOp -- ^ greater- | CLeqOp -- ^ less or equal- | CGeqOp -- ^ greater or equal- | CEqOp -- ^ equal- | CNeqOp -- ^ not equal- | CAndOp -- ^ bitwise and- | CXorOp -- ^ exclusive bitwise or- | COrOp -- ^ inclusive bitwise or- | CLndOp -- ^ logical and- | CLorOp -- ^ logical or- deriving (Eq,Ord,Show,Data,Typeable)--isCmpOp :: CBinaryOp -> Bool-isCmpOp op = op `elem` [ CLeqOp, CGeqOp, CLeOp, CGrOp, CEqOp, CNeqOp ]--isPtrOp :: CBinaryOp -> Bool-isPtrOp op = op `elem` [ CAddOp, CSubOp ]--isBitOp :: CBinaryOp -> Bool-isBitOp op = op `elem` [ CShlOp, CShrOp, CAndOp, COrOp, CXorOp ]--isLogicOp :: CBinaryOp -> Bool-isLogicOp op = op `elem` [ CLndOp, CLorOp ]---- | C unary operator (K&R A7.3-4)----data CUnaryOp = CPreIncOp -- ^ prefix increment operator- | CPreDecOp -- ^ prefix decrement operator- | CPostIncOp -- ^ postfix increment operator- | CPostDecOp -- ^ postfix decrement operator- | CAdrOp -- ^ address operator- | CIndOp -- ^ indirection operator- | CPlusOp -- ^ prefix plus- | CMinOp -- ^ prefix minus- | CCompOp -- ^ one's complement- | CNegOp -- ^ logical negation- deriving (Eq,Ord,Show,Data,Typeable)--isEffectfulOp :: CUnaryOp -> Bool-isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ]+{-# LANGUAGE DeriveDataTypeable #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Syntax.Ops +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : ghc +-- +-- Unary, binary and asssignment operators. Exported via AST. +----------------------------------------------------------------------------- +module Language.C.Syntax.Ops ( +-- * Assignment operators +CAssignOp(..), +assignBinop, +-- * Binary operators +CBinaryOp(..), +isCmpOp, +isPtrOp, +isBitOp, +isLogicOp, +-- * Unary operators +CUnaryOp(..), +isEffectfulOp +) +where +import Data.Generics +-- | C assignment operators (K&R A7.17) +data CAssignOp = CAssignOp + | CMulAssOp + | CDivAssOp + | CRmdAssOp -- ^ remainder and assignment + | CAddAssOp + | CSubAssOp + | CShlAssOp + | CShrAssOp + | CAndAssOp + | CXorAssOp + | COrAssOp + deriving (Eq,Ord,Show,Data,Typeable) + +assignBinop :: CAssignOp -> CBinaryOp +assignBinop CAssignOp = error "direct assignment has no binary operator" +assignBinop CMulAssOp = CMulOp +assignBinop CDivAssOp = CDivOp +assignBinop CRmdAssOp = CRmdOp +assignBinop CAddAssOp = CAddOp +assignBinop CSubAssOp = CSubOp +assignBinop CShlAssOp = CShlOp +assignBinop CShrAssOp = CShrOp +assignBinop CAndAssOp = CAndOp +assignBinop CXorAssOp = CXorOp +assignBinop COrAssOp = COrOp + +-- | C binary operators (K&R A7.6-15) +-- +data CBinaryOp = CMulOp + | CDivOp + | CRmdOp -- ^ remainder of division + | CAddOp + | CSubOp + | CShlOp -- ^ shift left + | CShrOp -- ^ shift right + | CLeOp -- ^ less + | CGrOp -- ^ greater + | CLeqOp -- ^ less or equal + | CGeqOp -- ^ greater or equal + | CEqOp -- ^ equal + | CNeqOp -- ^ not equal + | CAndOp -- ^ bitwise and + | CXorOp -- ^ exclusive bitwise or + | COrOp -- ^ inclusive bitwise or + | CLndOp -- ^ logical and + | CLorOp -- ^ logical or + deriving (Eq,Ord,Show,Data,Typeable) + +isCmpOp :: CBinaryOp -> Bool +isCmpOp op = op `elem` [ CLeqOp, CGeqOp, CLeOp, CGrOp, CEqOp, CNeqOp ] + +isPtrOp :: CBinaryOp -> Bool +isPtrOp op = op `elem` [ CAddOp, CSubOp ] + +isBitOp :: CBinaryOp -> Bool +isBitOp op = op `elem` [ CShlOp, CShrOp, CAndOp, COrOp, CXorOp ] + +isLogicOp :: CBinaryOp -> Bool +isLogicOp op = op `elem` [ CLndOp, CLorOp ] + +-- | C unary operator (K&R A7.3-4) +-- +data CUnaryOp = CPreIncOp -- ^ prefix increment operator + | CPreDecOp -- ^ prefix decrement operator + | CPostIncOp -- ^ postfix increment operator + | CPostDecOp -- ^ postfix decrement operator + | CAdrOp -- ^ address operator + | CIndOp -- ^ indirection operator + | CPlusOp -- ^ prefix plus + | CMinOp -- ^ prefix minus + | CCompOp -- ^ one's complement + | CNegOp -- ^ logical negation + deriving (Eq,Ord,Show,Data,Typeable) + +isEffectfulOp :: CUnaryOp -> Bool +isEffectfulOp op = op `elem` [ CPreIncOp, CPreDecOp, CPostIncOp, CPostDecOp ]
src/Language/C/Syntax/Utils.hs view
@@ -1,76 +1,76 @@-module Language.C.Syntax.Utils (- -- * Generic operations- getSubStmts,- mapSubStmts,- mapBlockItemStmts,- -- * Concrete operations- getLabels-) where--import Data.List-import Language.C.Data.Ident-import Language.C.Syntax.AST---- XXX: This is should be generalized !!!--- Data.Generics sounds attractive, but we really need to control the evaluation order--- XXX: Expression statements (which are somewhat problematic anyway), aren't handled yet-getSubStmts :: CStat -> [CStat]-getSubStmts (CLabel _ s _ _) = [s]-getSubStmts (CCase _ s _) = [s]-getSubStmts (CCases _ _ s _) = [s]-getSubStmts (CDefault s _) = [s]-getSubStmts (CExpr _ _) = []-getSubStmts (CCompound _ body _) = concatMap compoundSubStmts body-getSubStmts (CIf _ sthen selse _) = maybe [sthen] (\s -> [sthen,s]) selse-getSubStmts (CSwitch _ s _) = [s]-getSubStmts (CWhile _ s _ _) = [s]-getSubStmts (CFor _ _ _ s _) = [s]-getSubStmts (CGoto _ _) = []-getSubStmts (CGotoPtr _ _) = []-getSubStmts (CCont _) = []-getSubStmts (CBreak _) = []-getSubStmts (CReturn _ _) = []-getSubStmts (CAsm _ _) = []--mapSubStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CStat -> CStat-mapSubStmts stop _ s | stop s = s-mapSubStmts stop f (CLabel i s attrs ni) =- f (CLabel i (mapSubStmts stop f s) attrs ni)-mapSubStmts stop f (CCase e s ni) =- f (CCase e (mapSubStmts stop f s) ni)-mapSubStmts stop f (CCases e1 e2 s ni) =- f (CCases e1 e2 (mapSubStmts stop f s) ni)-mapSubStmts stop f (CDefault s ni) =- f (CDefault (mapSubStmts stop f s) ni)-mapSubStmts stop f (CCompound ls body ni) =- f (CCompound ls (map (mapBlockItemStmts stop f) body) ni)-mapSubStmts stop f (CIf e sthen selse ni) =- f (CIf e- (mapSubStmts stop f sthen)- (fmap (mapSubStmts stop f) selse)- ni)-mapSubStmts stop f (CSwitch e s ni) =- f (CSwitch e (mapSubStmts stop f s) ni)-mapSubStmts stop f (CWhile e s isdo ni) =- f (CWhile e (mapSubStmts stop f s) isdo ni)-mapSubStmts stop f (CFor i t a s ni) =- f (CFor i t a (mapSubStmts stop f s) ni)-mapSubStmts _ f s = f s--mapBlockItemStmts :: (CStat -> Bool)- -> (CStat -> CStat)- -> CBlockItem- -> CBlockItem-mapBlockItemStmts stop f (CBlockStmt s) = CBlockStmt (mapSubStmts stop f s)-mapBlockItemStmts _ _ bi = bi--compoundSubStmts :: CBlockItem -> [CStat]-compoundSubStmts (CBlockStmt s) = [s]-compoundSubStmts (CBlockDecl _) = []-compoundSubStmts (CNestedFunDef _) = []--getLabels :: CStat -> [Ident]-getLabels (CLabel l s _ _) = l : getLabels s-getLabels (CCompound ls body _) =- concatMap (concatMap getLabels . compoundSubStmts) body \\ ls-getLabels stmt = concatMap getLabels (getSubStmts stmt)+module Language.C.Syntax.Utils ( + -- * Generic operations + getSubStmts, + mapSubStmts, + mapBlockItemStmts, + -- * Concrete operations + getLabels +) where + +import Data.List +import Language.C.Data.Ident +import Language.C.Syntax.AST + +-- XXX: This is should be generalized !!! +-- Data.Generics sounds attractive, but we really need to control the evaluation order +-- XXX: Expression statements (which are somewhat problematic anyway), aren't handled yet +getSubStmts :: CStat -> [CStat] +getSubStmts (CLabel _ s _ _) = [s] +getSubStmts (CCase _ s _) = [s] +getSubStmts (CCases _ _ s _) = [s] +getSubStmts (CDefault s _) = [s] +getSubStmts (CExpr _ _) = [] +getSubStmts (CCompound _ body _) = concatMap compoundSubStmts body +getSubStmts (CIf _ sthen selse _) = maybe [sthen] (\s -> [sthen,s]) selse +getSubStmts (CSwitch _ s _) = [s] +getSubStmts (CWhile _ s _ _) = [s] +getSubStmts (CFor _ _ _ s _) = [s] +getSubStmts (CGoto _ _) = [] +getSubStmts (CGotoPtr _ _) = [] +getSubStmts (CCont _) = [] +getSubStmts (CBreak _) = [] +getSubStmts (CReturn _ _) = [] +getSubStmts (CAsm _ _) = [] + +mapSubStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CStat -> CStat +mapSubStmts stop _ s | stop s = s +mapSubStmts stop f (CLabel i s attrs ni) = + f (CLabel i (mapSubStmts stop f s) attrs ni) +mapSubStmts stop f (CCase e s ni) = + f (CCase e (mapSubStmts stop f s) ni) +mapSubStmts stop f (CCases e1 e2 s ni) = + f (CCases e1 e2 (mapSubStmts stop f s) ni) +mapSubStmts stop f (CDefault s ni) = + f (CDefault (mapSubStmts stop f s) ni) +mapSubStmts stop f (CCompound ls body ni) = + f (CCompound ls (map (mapBlockItemStmts stop f) body) ni) +mapSubStmts stop f (CIf e sthen selse ni) = + f (CIf e + (mapSubStmts stop f sthen) + (fmap (mapSubStmts stop f) selse) + ni) +mapSubStmts stop f (CSwitch e s ni) = + f (CSwitch e (mapSubStmts stop f s) ni) +mapSubStmts stop f (CWhile e s isdo ni) = + f (CWhile e (mapSubStmts stop f s) isdo ni) +mapSubStmts stop f (CFor i t a s ni) = + f (CFor i t a (mapSubStmts stop f s) ni) +mapSubStmts _ f s = f s + +mapBlockItemStmts :: (CStat -> Bool) + -> (CStat -> CStat) + -> CBlockItem + -> CBlockItem +mapBlockItemStmts stop f (CBlockStmt s) = CBlockStmt (mapSubStmts stop f s) +mapBlockItemStmts _ _ bi = bi + +compoundSubStmts :: CBlockItem -> [CStat] +compoundSubStmts (CBlockStmt s) = [s] +compoundSubStmts (CBlockDecl _) = [] +compoundSubStmts (CNestedFunDef _) = [] + +getLabels :: CStat -> [Ident] +getLabels (CLabel l s _ _) = l : getLabels s +getLabels (CCompound ls body _) = + concatMap (concatMap getLabels . compoundSubStmts) body \\ ls +getLabels stmt = concatMap getLabels (getSubStmts stmt)
src/Language/C/System/GCC.hs view
@@ -1,114 +1,114 @@-{-# LANGUAGE PatternGuards #-}--------------------------------------------------------------------------------- |--- Module : Language.C.System.Gcc--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : portable------ Invoking gcc for preprocessing and compiling.-------------------------------------------------------------------------------module Language.C.System.GCC (- GCC,newGCC,-)-where-import Language.C.Data.RList as RList-import Language.C.System.Preprocess-import Data.Maybe-import System.Process-import System.Directory-import Data.List---- | @GCC@ represents a reference to the gcc compiler-newtype GCC = GCC { gccPath :: FilePath }---- | create a reference to @gcc@-newGCC :: FilePath -> GCC-newGCC = GCC--instance Preprocessor GCC where- parseCPPArgs _ = gccParseCPPArgs- runCPP gcc cpp_args =- do -- copy the input to the outputfile, because in case the input is preprocessed,- -- gcc -E will do nothing.- maybe (return()) (copyWritable (inputFile cpp_args)) (outputFile cpp_args)- rawSystem (gccPath gcc) (buildCppArgs cpp_args)- where copyWritable source target = do copyFile source target- p <- getPermissions target- setPermissions target p{writable=True}---- | Parse arguments for preprocessing via GCC.--- At least one .c, .hc or .h file has to be present.--- For now we only support the most important gcc options.------ 1) Parse all flags relevant to CppArgs--- 2) Move -c,-S,-M? to other_args--- 3) Strip -E--- 4) The rest goes into extra_args-gccParseCPPArgs :: [String] -> Either String (CppArgs, [String])-gccParseCPPArgs args =- case mungeArgs ((Nothing,Nothing,RList.empty),(RList.empty,RList.empty)) args of- Left err -> Left err- Right ((Nothing,_,_),_) -> Left "No .c / .hc / .h source file given"- Right ((Just input_file,output_file_opt,cpp_opts),(extra_args,other_args))- -> Right ((rawCppArgs (RList.reverse extra_args) input_file)- { outputFile = output_file_opt, cppOptions = RList.reverse cpp_opts },- RList.reverse other_args)- where- mungeArgs :: ParseArgsState -> [String] -> Either String ParseArgsState- mungeArgs parsed@( cpp_args@(inp,out,cpp_opts),- unparsed@(extra,other))- unparsed_args =- case unparsed_args of- ("-E":rest) -> mungeArgs parsed rest-- (flag:flagArg:rest) | flag == "-MF"- || flag == "-MT"- || flag == "-MQ"- -> mungeArgs (cpp_args,(extra,other `snoc` flag `snoc` flagArg)) rest-- (flag:rest) | flag == "-c"- || flag == "-S"- || "-M" `isPrefixOf` flag- -> mungeArgs (cpp_args,(extra,other `snoc` flag)) rest-- ("-o":file:rest) | isJust out -> Left "two output files given"- | otherwise -> mungeArgs ((inp,Just file,cpp_opts),unparsed) rest-- (cpp_opt:rest) | Just (opt,rest') <- getArgOpt cpp_opt rest- -> mungeArgs ((inp,out,cpp_opts `snoc` opt),unparsed) rest'-- (cfile:rest) | any (`isSuffixOf` cfile) (words ".c .hc .h")- -> if isJust inp- then Left "two input files given"- else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest-- (unknown:rest) -> mungeArgs (cpp_args,(extra `snoc` unknown,other)) rest-- [] -> Right parsed-- getArgOpt cpp_opt rest | "-I" `isPrefixOf` cpp_opt = Just (IncludeDir (drop 2 cpp_opt),rest)- | "-U" `isPrefixOf` cpp_opt = Just (Undefine (drop 2 cpp_opt),rest)- | "-D" `isPrefixOf` cpp_opt = Just (getDefine (drop 2 cpp_opt),rest)- getArgOpt "-include" (f:rest') = Just (IncludeFile f, rest')- getArgOpt _ _ = Nothing- getDefine opt = let (key,val) = break (== '=') opt in Define key (if null val then "" else tail val)--type ParseArgsState = ((Maybe FilePath, Maybe FilePath, RList CppOption), (RList String, RList String))---buildCppArgs :: CppArgs -> [String]-buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) =- (concatMap tOption options)- ++ outputFileOpt- ++ ["-E", input_file]- ++ extra_args- where- tOption (IncludeDir incl) = ["-I",incl]- tOption (Define key value) = [ "-D" ++ key ++ (if null value then "" else "=" ++ value) ]- tOption (Undefine key) = [ "-U" ++ key ]- tOption (IncludeFile f) = [ "-include", f]- outputFileOpt = concat [ ["-o",output_file] | output_file <- maybeToList output_file_opt ]-+{-# LANGUAGE PatternGuards #-} +----------------------------------------------------------------------------- +-- | +-- Module : Language.C.System.Gcc +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : portable +-- +-- Invoking gcc for preprocessing and compiling. +----------------------------------------------------------------------------- +module Language.C.System.GCC ( + GCC,newGCC, +) +where +import Language.C.Data.RList as RList +import Language.C.System.Preprocess +import Data.Maybe +import System.Process +import System.Directory +import Data.List + +-- | @GCC@ represents a reference to the gcc compiler +newtype GCC = GCC { gccPath :: FilePath } + +-- | create a reference to @gcc@ +newGCC :: FilePath -> GCC +newGCC = GCC + +instance Preprocessor GCC where + parseCPPArgs _ = gccParseCPPArgs + runCPP gcc cpp_args = + do -- copy the input to the outputfile, because in case the input is preprocessed, + -- gcc -E will do nothing. + maybe (return()) (copyWritable (inputFile cpp_args)) (outputFile cpp_args) + rawSystem (gccPath gcc) (buildCppArgs cpp_args) + where copyWritable source target = do copyFile source target + p <- getPermissions target + setPermissions target p{writable=True} + +-- | Parse arguments for preprocessing via GCC. +-- At least one .c, .hc or .h file has to be present. +-- For now we only support the most important gcc options. +-- +-- 1) Parse all flags relevant to CppArgs +-- 2) Move -c,-S,-M? to other_args +-- 3) Strip -E +-- 4) The rest goes into extra_args +gccParseCPPArgs :: [String] -> Either String (CppArgs, [String]) +gccParseCPPArgs args = + case mungeArgs ((Nothing,Nothing,RList.empty),(RList.empty,RList.empty)) args of + Left err -> Left err + Right ((Nothing,_,_),_) -> Left "No .c / .hc / .h source file given" + Right ((Just input_file,output_file_opt,cpp_opts),(extra_args,other_args)) + -> Right ((rawCppArgs (RList.reverse extra_args) input_file) + { outputFile = output_file_opt, cppOptions = RList.reverse cpp_opts }, + RList.reverse other_args) + where + mungeArgs :: ParseArgsState -> [String] -> Either String ParseArgsState + mungeArgs parsed@( cpp_args@(inp,out,cpp_opts), + unparsed@(extra,other)) + unparsed_args = + case unparsed_args of + ("-E":rest) -> mungeArgs parsed rest + + (flag:flagArg:rest) | flag == "-MF" + || flag == "-MT" + || flag == "-MQ" + -> mungeArgs (cpp_args,(extra,other `snoc` flag `snoc` flagArg)) rest + + (flag:rest) | flag == "-c" + || flag == "-S" + || "-M" `isPrefixOf` flag + -> mungeArgs (cpp_args,(extra,other `snoc` flag)) rest + + ("-o":file:rest) | isJust out -> Left "two output files given" + | otherwise -> mungeArgs ((inp,Just file,cpp_opts),unparsed) rest + + (cpp_opt:rest) | Just (opt,rest') <- getArgOpt cpp_opt rest + -> mungeArgs ((inp,out,cpp_opts `snoc` opt),unparsed) rest' + + (cfile:rest) | any (`isSuffixOf` cfile) (words ".c .hc .h") + -> if isJust inp + then Left "two input files given" + else mungeArgs ((Just cfile,out,cpp_opts),unparsed) rest + + (unknown:rest) -> mungeArgs (cpp_args,(extra `snoc` unknown,other)) rest + + [] -> Right parsed + + getArgOpt cpp_opt rest | "-I" `isPrefixOf` cpp_opt = Just (IncludeDir (drop 2 cpp_opt),rest) + | "-U" `isPrefixOf` cpp_opt = Just (Undefine (drop 2 cpp_opt),rest) + | "-D" `isPrefixOf` cpp_opt = Just (getDefine (drop 2 cpp_opt),rest) + getArgOpt "-include" (f:rest') = Just (IncludeFile f, rest') + getArgOpt _ _ = Nothing + getDefine opt = let (key,val) = break (== '=') opt in Define key (if null val then "" else tail val) + +type ParseArgsState = ((Maybe FilePath, Maybe FilePath, RList CppOption), (RList String, RList String)) + + +buildCppArgs :: CppArgs -> [String] +buildCppArgs (CppArgs options extra_args _tmpdir input_file output_file_opt) = + (concatMap tOption options) + ++ outputFileOpt + ++ ["-E", input_file] + ++ extra_args + where + tOption (IncludeDir incl) = ["-I",incl] + tOption (Define key value) = [ "-D" ++ key ++ (if null value then "" else "=" ++ value) ] + tOption (Undefine key) = [ "-U" ++ key ] + tOption (IncludeFile f) = [ "-include", f] + outputFileOpt = concat [ ["-o",output_file] | output_file <- maybeToList output_file_opt ] +
src/Language/C/System/Preprocess.hs view
@@ -1,123 +1,123 @@--------------------------------------------------------------------------------- |--- Module : Language.C.Wrapper.Preprocess--- Copyright : (c) 2008 Benedikt Huber--- License : BSD-style--- Maintainer : benedikt.huber@gmail.com--- Stability : experimental--- Portability : portable------ Invoking external preprocessors.-------------------------------------------------------------------------------module Language.C.System.Preprocess (- Preprocessor(..),- CppOption(..),- CppArgs(..),rawCppArgs,addCppOption,addExtraOption,cppFile,- runPreprocessor,- isPreprocessed,-)-where-import Language.C.Data.InputStream-import System.Exit-import System.Directory-import System.FilePath-import System.IO-import Control.Exception-import Control.Monad-import Data.List---- | 'Preprocessor' encapsulates the abstract interface for invoking C preprocessors-class Preprocessor cpp where- -- | parse the given command line arguments, and return a pair of parsed and ignored arguments- parseCPPArgs :: cpp -> [String] -> Either String (CppArgs, [String])- -- | run the preprocessor- runCPP :: cpp -> CppArgs -> IO ExitCode---- | file extension of a preprocessed file-preprocessedExt :: String-preprocessedExt = ".i"---- | Generic Options for the preprocessor-data CppOption =- IncludeDir FilePath- | Define String String- | Undefine String- | IncludeFile FilePath---- | Generic arguments for the preprocessor-data CppArgs = CppArgs {- cppOptions :: [CppOption],- extraOptions :: [String],- cppTmpDir :: Maybe FilePath,- inputFile :: FilePath,- outputFile :: Maybe FilePath- }---- | Cpp arguments that only specify the input file name.-cppFile :: FilePath -> CppArgs-cppFile input_file = CppArgs { cppOptions = [], extraOptions = [], cppTmpDir = Nothing, inputFile = input_file, outputFile = Nothing }----- | use the given preprocessor arguments without analyzing them-rawCppArgs :: [String] -> FilePath -> CppArgs-rawCppArgs opts input_file =- CppArgs { inputFile = input_file, cppOptions = [], extraOptions = opts, outputFile = Nothing, cppTmpDir = Nothing }---- | add a typed option to the given preprocessor arguments-addCppOption :: CppArgs -> CppOption -> CppArgs-addCppOption cpp_args opt =- cpp_args { cppOptions = opt : cppOptions cpp_args }---- | add a string option to the given preprocessor arguments-addExtraOption :: CppArgs -> String -> CppArgs-addExtraOption cpp_args extra =- cpp_args { extraOptions = extra : extraOptions cpp_args }---- | run the preprocessor and return an 'InputStream' if preprocesssing succeeded-runPreprocessor :: (Preprocessor cpp) => cpp -> CppArgs -> IO (Either ExitCode InputStream)-runPreprocessor cpp cpp_args =- bracket- getActualOutFile- -- remove outfile if it was temporary- removeTmpOutFile- -- invoke preprocessor- invokeCpp- where- getActualOutFile :: IO FilePath- getActualOutFile = maybe (mkOutputFile (cppTmpDir cpp_args) (inputFile cpp_args)) return (outputFile cpp_args)- invokeCpp actual_out_file = do- exit_code <- runCPP cpp (cpp_args { outputFile = Just actual_out_file})- case exit_code of- ExitSuccess -> liftM Right (readInputStream actual_out_file)- ExitFailure _ -> return $ Left exit_code- removeTmpOutFile out_file = maybe (removeFile out_file) (\_ -> return ()) (outputFile cpp_args)---- | create an output file, given @Maybe tmpdir@ and @inputfile@-mkOutputFile :: Maybe FilePath -> FilePath -> IO FilePath-mkOutputFile tmp_dir_opt input_file =- do tmpDir <- getTempDir tmp_dir_opt- mkTmpFile tmpDir (getOutputFileName input_file)- where- getTempDir (Just tmpdir) = return tmpdir- getTempDir Nothing = getTemporaryDirectory---- | compute output file name from input file name-getOutputFileName :: FilePath -> FilePath-getOutputFileName fp | hasExtension fp = replaceExtension filename preprocessedExt- | otherwise = addExtension filename preprocessedExt- where- filename = takeFileName fp---- | create a temporary file-mkTmpFile :: FilePath -> FilePath -> IO FilePath-mkTmpFile tmp_dir file_templ = do- -- putStrLn $ "TmpDir: "++tmp_dir- -- putStrLn $ "FileTempl: "++file_templ- (path,file_handle) <- openTempFile tmp_dir file_templ- hClose file_handle- return path---- | guess whether a file is preprocessed (file end with .i)-isPreprocessed :: FilePath -> Bool-isPreprocessed = (".i" `isSuffixOf`)-+----------------------------------------------------------------------------- +-- | +-- Module : Language.C.Wrapper.Preprocess +-- Copyright : (c) 2008 Benedikt Huber +-- License : BSD-style +-- Maintainer : benedikt.huber@gmail.com +-- Stability : experimental +-- Portability : portable +-- +-- Invoking external preprocessors. +----------------------------------------------------------------------------- +module Language.C.System.Preprocess ( + Preprocessor(..), + CppOption(..), + CppArgs(..),rawCppArgs,addCppOption,addExtraOption,cppFile, + runPreprocessor, + isPreprocessed, +) +where +import Language.C.Data.InputStream +import System.Exit +import System.Directory +import System.FilePath +import System.IO +import Control.Exception +import Control.Monad +import Data.List + +-- | 'Preprocessor' encapsulates the abstract interface for invoking C preprocessors +class Preprocessor cpp where + -- | parse the given command line arguments, and return a pair of parsed and ignored arguments + parseCPPArgs :: cpp -> [String] -> Either String (CppArgs, [String]) + -- | run the preprocessor + runCPP :: cpp -> CppArgs -> IO ExitCode + +-- | file extension of a preprocessed file +preprocessedExt :: String +preprocessedExt = ".i" + +-- | Generic Options for the preprocessor +data CppOption = + IncludeDir FilePath + | Define String String + | Undefine String + | IncludeFile FilePath + +-- | Generic arguments for the preprocessor +data CppArgs = CppArgs { + cppOptions :: [CppOption], + extraOptions :: [String], + cppTmpDir :: Maybe FilePath, + inputFile :: FilePath, + outputFile :: Maybe FilePath + } + +-- | Cpp arguments that only specify the input file name. +cppFile :: FilePath -> CppArgs +cppFile input_file = CppArgs { cppOptions = [], extraOptions = [], cppTmpDir = Nothing, inputFile = input_file, outputFile = Nothing } + + +-- | use the given preprocessor arguments without analyzing them +rawCppArgs :: [String] -> FilePath -> CppArgs +rawCppArgs opts input_file = + CppArgs { inputFile = input_file, cppOptions = [], extraOptions = opts, outputFile = Nothing, cppTmpDir = Nothing } + +-- | add a typed option to the given preprocessor arguments +addCppOption :: CppArgs -> CppOption -> CppArgs +addCppOption cpp_args opt = + cpp_args { cppOptions = opt : cppOptions cpp_args } + +-- | add a string option to the given preprocessor arguments +addExtraOption :: CppArgs -> String -> CppArgs +addExtraOption cpp_args extra = + cpp_args { extraOptions = extra : extraOptions cpp_args } + +-- | run the preprocessor and return an 'InputStream' if preprocesssing succeeded +runPreprocessor :: (Preprocessor cpp) => cpp -> CppArgs -> IO (Either ExitCode InputStream) +runPreprocessor cpp cpp_args = + bracket + getActualOutFile + -- remove outfile if it was temporary + removeTmpOutFile + -- invoke preprocessor + invokeCpp + where + getActualOutFile :: IO FilePath + getActualOutFile = maybe (mkOutputFile (cppTmpDir cpp_args) (inputFile cpp_args)) return (outputFile cpp_args) + invokeCpp actual_out_file = do + exit_code <- runCPP cpp (cpp_args { outputFile = Just actual_out_file}) + case exit_code of + ExitSuccess -> liftM Right (readInputStream actual_out_file) + ExitFailure _ -> return $ Left exit_code + removeTmpOutFile out_file = maybe (removeFile out_file) (\_ -> return ()) (outputFile cpp_args) + +-- | create an output file, given @Maybe tmpdir@ and @inputfile@ +mkOutputFile :: Maybe FilePath -> FilePath -> IO FilePath +mkOutputFile tmp_dir_opt input_file = + do tmpDir <- getTempDir tmp_dir_opt + mkTmpFile tmpDir (getOutputFileName input_file) + where + getTempDir (Just tmpdir) = return tmpdir + getTempDir Nothing = getTemporaryDirectory + +-- | compute output file name from input file name +getOutputFileName :: FilePath -> FilePath +getOutputFileName fp | hasExtension fp = replaceExtension filename preprocessedExt + | otherwise = addExtension filename preprocessedExt + where + filename = takeFileName fp + +-- | create a temporary file +mkTmpFile :: FilePath -> FilePath -> IO FilePath +mkTmpFile tmp_dir file_templ = do + -- putStrLn $ "TmpDir: "++tmp_dir + -- putStrLn $ "FileTempl: "++file_templ + (path,file_handle) <- openTempFile tmp_dir file_templ + hClose file_handle + return path + +-- | guess whether a file is preprocessed (file end with .i) +isPreprocessed :: FilePath -> Bool +isPreprocessed = (".i" `isSuffixOf`) +
test/harness/run-harness.hs view
@@ -1,70 +1,70 @@-module Main where--import Data.List (intercalate)-import System.Exit (ExitCode(..), exitFailure, exitSuccess, exitWith)-import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory, setCurrentDirectory,- getDirectoryContents)-import System.FilePath ((</>))-import System.Process (readProcessWithExitCode, callProcess)-import System.IO (hPutStrLn, hPrint, stderr)-import Control.Monad (filterM, liftM, when)--testDirs :: [String]-testDirs = ["test/harness","harness","."]--getActualTestDirectory :: [String] -> IO FilePath-getActualTestDirectory test_dirs = do- validDirs <- filterM (doesFileExist . (</> "run-harness.hs")) test_dirs- case validDirs of- [] -> ioError (userError ("run-harness.hs not found in " ++ intercalate " or " test_dirs))- (d:_) -> return d--subdirectoriesOf :: FilePath -> IO [FilePath]-subdirectoriesOf fp = do- entries <- getDirectoryContents fp- filterM (doesDirectoryExist . (fp </>)) (filter (not . isSpecialDir) entries)- where- isSpecialDir "." = True- isSpecialDir ".." = True- isSpecialDir _ = False---- from Control.Monad.Extra-findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)-findM _ [] = return Nothing-findM p (x:xs) = do guard <- p x ; if guard then (return $ Just x) else (findM p xs)--main :: IO ExitCode-main = do- actual_test_dir <- getActualTestDirectory testDirs- has_makefile <- doesFileExist (actual_test_dir </> "Makefile")- when (not has_makefile) $ do- hPutStrLn stderr "No Makefile found (out of source tree)"- hPutStrLn stderr "Skipping harness test"- exitWith ExitSuccess- tests <- subdirectoriesOf actual_test_dir- cdir <- getCurrentDirectory- hPutStrLn stderr ("Changing to test directory " ++ actual_test_dir ++ " and compiling")- -- build test executables- setCurrentDirectory (cdir</>actual_test_dir)- callProcess "make" ["prepare"]- -- run harness tests- hasFailure <- findM (liftM (/= ExitSuccess) . runTest . (cdir</>) . (actual_test_dir</>)) tests- setCurrentDirectory cdir- case hasFailure of- Nothing -> exitSuccess- Just _failed -> exitFailure- where- runTest :: FilePath -> IO ExitCode- runTest dir = do- setCurrentDirectory dir- (exitCode, _outp, _errp) <- readProcessWithExitCode "make" [] ""- hPutStrLn stderr ("cd " ++ dir ++ " && make: " ++ show exitCode)- when (exitCode /= ExitSuccess) $ do- hPutStrLn stderr "=== Standard Output ==="- hPutStrLn stderr _outp- hPutStrLn stderr "=== Error Output ==="- hPutStrLn stderr _errp- hPutStrLn stderr "=== End of Output ==="- return exitCode--+module Main where + +import Data.List (intercalate) +import System.Exit (ExitCode(..), exitFailure, exitSuccess, exitWith) +import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory, setCurrentDirectory, + getDirectoryContents) +import System.FilePath ((</>)) +import System.Process (readProcessWithExitCode, callProcess) +import System.IO (hPutStrLn, hPrint, stderr) +import Control.Monad (filterM, liftM, when) + +testDirs :: [String] +testDirs = ["test/harness","harness","."] + +getActualTestDirectory :: [String] -> IO FilePath +getActualTestDirectory test_dirs = do + validDirs <- filterM (doesFileExist . (</> "run-harness.hs")) test_dirs + case validDirs of + [] -> ioError (userError ("run-harness.hs not found in " ++ intercalate " or " test_dirs)) + (d:_) -> return d + +subdirectoriesOf :: FilePath -> IO [FilePath] +subdirectoriesOf fp = do + entries <- getDirectoryContents fp + filterM (doesDirectoryExist . (fp </>)) (filter (not . isSpecialDir) entries) + where + isSpecialDir "." = True + isSpecialDir ".." = True + isSpecialDir _ = False + +-- from Control.Monad.Extra +findM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a) +findM _ [] = return Nothing +findM p (x:xs) = do guard <- p x ; if guard then (return $ Just x) else (findM p xs) + +main :: IO ExitCode +main = do + actual_test_dir <- getActualTestDirectory testDirs + has_makefile <- doesFileExist (actual_test_dir </> "Makefile") + when (not has_makefile) $ do + hPutStrLn stderr "No Makefile found (out of source tree)" + hPutStrLn stderr "Skipping harness test" + exitWith ExitSuccess + tests <- subdirectoriesOf actual_test_dir + cdir <- getCurrentDirectory + hPutStrLn stderr ("Changing to test directory " ++ actual_test_dir ++ " and compiling") + -- build test executables + setCurrentDirectory (cdir</>actual_test_dir) + callProcess "make" ["prepare"] + -- run harness tests + hasFailure <- findM (liftM (/= ExitSuccess) . runTest . (cdir</>) . (actual_test_dir</>)) tests + setCurrentDirectory cdir + case hasFailure of + Nothing -> exitSuccess + Just _failed -> exitFailure + where + runTest :: FilePath -> IO ExitCode + runTest dir = do + setCurrentDirectory dir + (exitCode, _outp, _errp) <- readProcessWithExitCode "make" [] "" + hPutStrLn stderr ("cd " ++ dir ++ " && make: " ++ show exitCode) + when (exitCode /= ExitSuccess) $ do + hPutStrLn stderr "=== Standard Output ===" + hPutStrLn stderr _outp + hPutStrLn stderr "=== Error Output ===" + hPutStrLn stderr _errp + hPutStrLn stderr "=== End of Output ===" + return exitCode + +