content: -- |
  -- Module      :  Language.C.Quote
  -- Copyright   :  (c) 2010-2011 Harvard University
  --                (c) 2011-2013 Geoffrey Mainland
  --             :  (c) 2013-2015 Drexel University
  -- License     :  BSD-style
  -- Maintainer  :  mainland@drexel.edu
  --
  -- There are five modules that provide quasiquoters, each for a different C
  -- variant. 'Language.C.Quote.C' parses C99, 'Language.C.Quote.GCC' parses C99
  -- plus GNU extensions, 'Language.C.Quote.CUDA' parses C99 plus GNU and CUDA
  -- extensions, 'Language.C.Quote.OpenCL' parses C99 plus GNU and OpenCL
  -- extensions and, 'Language.C.Quote.ObjC' parses C99 plus a subset of Objective-C
  --
  -- For version of GHC prior to 7.4, the quasiquoters generate Template Haskell
  -- expressions that use data constructors that must be in scope where the
  -- quasiquoted expression occurs. You will be safe if you add the following
  -- imports to any module using the quasiquoters provided by this package:
  --
  -- > import qualified Data.Loc
  -- > import qualified Language.C.Syntax
  --
  -- These modules may also be imported unqualified, of course. The quasiquoters
  -- also use some constructors defined in the standard Prelude, so if it is not
  -- imported by default, it must be imported qualified. On GHC 7.4 and above, you
  -- can use the quasiquoters without worrying about what names are in scope.
  --
  -- The following quasiquoters are defined:
  --
  -- [@cdecl@] Declaration, of type @'InitGroup'@.
  --
  -- [@cedecl@] External declarations (top-level declarations in a C file,
  -- including function definitions and declarations), of type @'Definition'@.
  --
  -- [@cenum@] Component of an @enum@ definition, of type @'CEnum'@.
  --
  -- [@cexp@] Expression, of type @'Exp'@.
  --
  -- [@cstm@] Statement, of type @'Stm'@.
  --
  -- [@cstms@] A list of statements, of type @['Stm']@.
  --
  -- [@citem@] Block item, of type @'BlockItem'@. A block item is either a
  -- declaration or a statement.
  --
  -- [@citems@] A list of block items, of type @['BlockItem'].
  --
  -- [@cfun@] Function definition, of type @'Func'@.
  --
  -- [@cinit@] Initializer, of type @'Initializer'@.
  --
  -- [@cparam@] Declaration of a function parameter, of type @'Param'@.
  --
  -- [@cparams@] Declaration of function parameters, of type @['Param']@.
  --
  -- [@csdecl@] Declaration of a struct member, of type @'FieldGroup'@.
  --
  -- [@ctyquals@] A list of type qualifiers, of type @['TyQual']@.
  --
  -- [@cty@] A C type, of type @'Type'@.
  --
  -- [@cunit@] A compilation unit, of type @['Definition']@.
  --
  -- In addition, Objective-C support defines the following quasiquoters:
  --
  -- [@objcprop@] Property declaration of type @'ObjCIfaceDecl'@.
  --
  -- [@objcifdecls@] Interface declarations of type @['ObjCIfaceDecl']@
  --
  -- [@objcimdecls@] Class implementation declarations of type @['Definition']@
  --
  -- [@objcdictelem@] Dictionary element, of type @'ObjCDictElem'@
  --
  -- [@objcpropattr@] Property attribute element, of type @'ObjCPropAttr'@
  --
  -- [@objcmethparam@] Method parameter, of type @'ObjCParam'@
  --
  -- [@objcmethproto@] Method prototype, of type @'ObjCMethodProto'@
  --
  -- [@objcmethdef@] Method definition, of type @'Definition'@
  --
  -- [@objcrecv@] Receiver, of type @'ObjCRecv'@
  --
  -- [@objcarg@] Keyword argument, of type @'ObjCArg'@
  --
  --
  -- Antiquotations allow splicing in subterms during quotation. These subterms
  -- may bound to a Haskell variable or may be the value of a Haskell
  -- expression. Antiquotations appear in a quasiquotation in the form
  -- @$ANTI:VARID@, where @ANTI@ is a valid antiquote specifier and @VARID@ is a
  -- Haskell variable identifier, or in the form @$ANTI:(EXP)@, where @EXP@ is a
  -- Haskell expressions (the parentheses must appear in this case). The Haskell
  -- expression may itself contain a quasiquote, but in that case the final @|]@
  -- must be escaped as @\\|\\]@. Additionally, @$VARID@ is shorthand for
  -- @$exp:VARID@ and @$(EXP)@ is shorthand for @$exp:(EXP)@, i.e., @exp@ is the
  -- default antiquote specifier.
  --
  -- It is often useful to use typedefs that aren't in scope when quasiquoting,
  -- e.g., @[cdecl|uint32_t foo;|]@. The quasiquoter will complain when it sees
  -- this because it thinks @uint32_t@ is an identifier. The solution is to use
  -- the @typename@ keyword, borrowed from C++, to tell the parser that the
  -- identifier is actually a type name. That is, we can write @[cdecl|typename
  -- uint32_t foo;|]@ to get the desired behavior.
  --
  -- Valid antiquote specifiers are:
  --
  -- [@id@] A C identifier. The argument must be an instance of @'ToIdent'@.
  --
  -- [@comment@] A comment to be attached to a statement. The argument must have
  -- type @'String'@, and the antiquote must appear in a statement context.
  --
  -- [@const@] A constant. The argument must be an instance of @'ToConst'@.
  --
  -- [@int@] An @integer@ constant. The argument must be an instance of
  -- @'Integral'@.
  --
  -- [@uint@] An @unsigned integer@ constant. The argument must be an instance of
  -- @'Integral'@.
  --
  -- [@lint@] A @long integer@ constant. The argument must be an instance of
  -- @'Integral'@.
  --
  -- [@ulint@] An @unsigned long integer@ constant. The argument must be an
  -- instance of @'Integral'@.
  --
  -- [@llint@] A @long long integer@ constant. The argument must be an instance of
  -- @'Integral'@.
  --
  -- [@ullint@] An @unsigned long long integer@ constant. The argument must be an
  -- instance of @'Integral'@.
  --
  -- [@float@] A @float@ constant. The argument must be an instance of
  -- @'Fractional'@.
  --
  -- [@double@] A @double@ constant. The argument must be an instance of
  -- @'Fractional'@.
  --
  -- [@long double@] A @long double@ constant. The argument must be an instance
  -- of @'Fractional'@.
  --
  -- [@char@] A @char@ constant. The argument must have type @'Char'@.
  --
  -- [@string@] A string (@char*@) constant. The argument must have type
  -- @'String'@.
  --
  -- [@exp@] A C expression. The argument must be an instance of @'ToExp'@.
  --
  -- [@func@] A function definition. The argument must have type @'Func'@.
  --
  -- [@args@] A list of function arguments. The argument must have type @['Exp']@.
  --
  -- [@decl@] A declaration. The argument must have type @'InitGroup'@.
  --
  -- [@decls@] A list of declarations. The argument must have type
  -- @['InitGroup']@.
  --
  -- [@sdecl@] A struct member declaration. The argument must have type
  -- @'FieldGroup'@.
  --
  -- [@sdecls@] A list of struct member declarations. The argument must have type
  -- @['FieldGroup']@.
  --
  -- [@enum@] An enum member. The argument must have type @'CEnum'@.
  --
  -- [@enums@] An list of enum members. The argument must have type @['CEnum']@.
  --
  -- [@esc@] An arbitrary top-level C "definition," such as an @#include@ or a
  -- @#define@. The argument must have type @'String'@.  Also: an uninterpreted,
  -- expression-level C escape hatch, which is useful for passing through macro
  -- calls. The argument must have type @'String'@.
  --
  -- [@escstm@] An uninterpreted, statement-level C escape hatch, which is useful
  -- for passing through macro calls. The argument must have type @'String'@.
  --
  -- [@edecl@] An external definition. The argument must have type @'Definition'@.
  --
  -- [@edecls@] An list of external definitions. The argument must have type
  -- @['Definition']@.
  --
  -- [@item@] A statement block item. The argument must have type @'BlockItem'@.
  --
  -- [@items@] A list of statement block item. The argument must have type
  -- @['BlockItem']@.
  --
  -- [@stm@] A statement. The argument must have type @'Stm'@.
  --
  -- [@stms@] A list of statements. The argument must have type @['Stm']@.
  --
  -- [@tyqual@] A type qualifier. The argument must have type @'TyQual'@.
  --
  -- [@tyquals@] A list of type qualifiers. The argument must have type
  -- @['TyQual']@.
  --
  -- [@ty@] A C type. The argument must have type @'Type'@.
  --
  -- [@spec@] A declaration specifier. The argument must have type @'DeclSpec'@.
  --
  -- [@param@] A function parameter. The argument must have type @'Param'@.
  --
  -- [@params@] A list of function parameters. The argument must have type
  -- @['Param']@.
  --
  -- [@pragma@] A pragma statement. The argument must have type @'String'@.
  --
  -- [@init@] An initializer. The argument must have type @'Initializer'@.
  --
  -- [@inits@] A list of initializers. The argument must have type
  -- @['Initializer']@.
  --
  -- In addition, Objective-C code can use these antiquote specifiers:
  --
  -- [@ifdecl@] A class interface declaration. The argument must have type
  -- @'ObjCIfaceDecl'@.
  --
  -- [@ifdecls@] A list of class interface declaration. The argument must have
  -- type @['ObjCIfaceDecl']@.
  --
  -- [@prop@] A property declaration. The argument must have type
  -- @'ObjCIfaceDecl'@.
  --
  -- [@props@] A list of property declarations. The argument must have type
  -- @['ObjCIfaceDecl']@.
  --
  -- [@propattr@] A property attribute. The argument must have type
  -- @'ObjCPropAttr'@.
  --
  -- [@propattrs@] A list of property attribute. The argument must have type
  -- @['ObjCPropAttr']@.
  --
  -- [@dictelems@] A list dictionary elements. The argument must have type
  -- @['ObjCDictElem']@.
  --
  -- [@methparam@] A method parameter. The argument must have type
  -- @'ObjCParam'@.
  --
  -- [@methparams@] A list of method parameters. The argument must have type
  -- @['ObjCParam']@.
  --
  -- [@methproto@] A method prototype. The argument must have type
  -- @'ObjCMethodProto'@.
  --
  -- [@methdef@] A method definition. The argument must have type
  -- @['Definition']@.
  --
  -- [@methdefs@] A list of method definitions. The argument must have type
  -- @['Definition']@.
  --
  -- [@recv@] A receiver. The argument must have type @'ObjCRecv'@.
  --
  -- [@kwarg@] A keywords argument. The argument must have type
  -- @'ObjCArg'@.
  --
  -- [@kwargs@] A list of keyword arguments. The argument must have type
  -- @['ObjCArg']@.
  --
  --------------------------------------------------------------------------------
  
  module Language.C.Quote (
      module Language.C.Quote.Base,
      module Language.C.Syntax
    ) where
  
  import Language.C.Quote.Base
  import Language.C.Syntax
  