language-c99 (empty) → 0.1.0.0
raw patch · 7 files changed
+1388/−0 lines, 7 filesdep +basedep +prettysetup-changed
Dependencies added: base, pretty
Files
- ChangeLog.md +5/−0
- LICENSE +20/−0
- Setup.hs +2/−0
- language-c99.cabal +44/−0
- src/Language/C99.hs +5/−0
- src/Language/C99/AST.hs +672/−0
- src/Language/C99/Pretty.hs +640/−0
+ ChangeLog.md view
@@ -0,0 +1,5 @@+# Revision history for language-c99++## 0.1.0.0 -- 2019-03-30++* First version. Containing full AST, but only a part of the pretty printer.
+ LICENSE view
@@ -0,0 +1,20 @@+Copyright (c) 2018-2019 Frank Dedden++Permission is hereby granted, free of charge, to any person obtaining+a copy of this software and associated documentation files (the+"Software"), to deal in the Software without restriction, including+without limitation the rights to use, copy, modify, merge, publish,+distribute, sublicense, and/or sell copies of the Software, and to+permit persons to whom the Software is furnished to do so, subject to+the following conditions:++The above copyright notice and this permission notice shall be included+in all copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ language-c99.cabal view
@@ -0,0 +1,44 @@+-- Initial language-c99.cabal generated by cabal init. For further +-- documentation, see http://haskell.org/cabal/users-guide/++name: language-c99+version: 0.1.0.0+synopsis: An implementation of the C99 AST that strictly follows the+ standard.+description:+ This package contains an implementation of the C99 AST as described in+ <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf>. Sticking closely+ to this standard assures us that the program we deal with is a valid C99+ program.+ .+ Additionally the library comes with a pretty printer.+ .+ The package does not come with handy wrapper and utility functions to write a+ C99 program, it just contains the bare AST. It is highly recommended to use+ the wrapper provided by 'language-c99-simple' and 'language-c99-util' for+ writing programs.++license: MIT+license-file: LICENSE+author: Frank Dedden+maintainer: Frank Dedden <dev@dedden.net>+-- copyright: +category: Language+build-type: Simple+extra-source-files: ChangeLog.md+cabal-version: >=1.10++source-repository head+ type: git+ location: git://github.com:fdedden/language-c99.git++library+ exposed-modules: Language.C99+ , Language.C99.AST+ , Language.C99.Pretty+ -- other-modules: + -- other-extensions: + build-depends: base >=4.9 && <5,+ pretty >= 1.1.3 && < 1.2+ hs-source-dirs: src+ default-language: Haskell2010
+ src/Language/C99.hs view
@@ -0,0 +1,5 @@+module Language.C99+ ( module Language.C99.AST+ ) where++import Language.C99.AST
+ src/Language/C99/AST.hs view
@@ -0,0 +1,672 @@+module Language.C99.AST where++{- LEXICAL ELEMENTS -}+{- 6.4 -}++-- We omit Token as there is no usage to in the AST++data PreprocToken = PreprocHeader HeaderName+ | PreprocIdent Ident+ | PreprocNumber PPNumber+ | PreprocChar CharConst+ | PreprocString StringLit+ | PreprocPunc Punc+ | PreprocNoneWhite+++{- IDENTIFIERS -}+{- 6.4.2.1 -}+data Ident = IdentBase IdentNonDigit+ | IdentConsNonDigit Ident IdentNonDigit+ | IdentCons Ident Digit++data IdentNonDigit = IdentNonDigit NonDigit+ | IdentNonDigitUniv UnivCharName+ {- Other implementation-defined characters -}++data NonDigit = NDUnderscore+ | NDa | NDA+ | NDb | NDB+ | NDc | NDC+ | NDd | NDD+ | NDe | NDE+ | NDf | NDF+ | NDg | NDG+ | NDh | NDH+ | NDi | NDI+ | NDj | NDJ+ | NDk | NDK+ | NDl | NDL+ | NDm | NDM+ | NDn | NDN+ | NDo | NDO+ | NDp | NDP+ | NDq | NDQ+ | NDr | NDR+ | NDs | NDS+ | NDt | NDT+ | NDu | NDU+ | NDv | NDV+ | NDw | NDW+ | NDx | NDX+ | NDy | NDY+ | NDz | NDZ++data Digit = DZero+ | DOne+ | DTwo+ | DThree+ | DFour+ | DFive+ | DSix+ | DSeven+ | DEight+ | DNine+++{- UNIVERSAL CHARACTER NAMES -}+{- 6.4.3 -}+data UnivCharName = UnivCharName1 HexQuad+ | UnivCharName2 HexQuad HexQuad++data HexQuad = HexQuad HexDigit HexDigit HexDigit HexDigit+++{- CONSTANTS -}+{- 6.4.4 -}+data Const = ConstInt IntConst+ | ConstFloat FloatConst+ | ConstEnum EnumConst+ | ConstChar CharConst++{- 6.4.4.1 -}+data IntConst = IntDec DecConst (Maybe IntSuffix)+ | IntOc OcConst (Maybe IntSuffix)+ | IntHex HexConst (Maybe IntSuffix)++data DecConst = DecBase NonZeroDigit+ | DecCons DecConst Digit++data OcConst = Oc0+ | OcCons OcConst OcDigit++data HexConst = HexBase HexPrefix HexDigit+ | HexCons HexConst HexDigit++data HexPrefix = OX++data NonZeroDigit = NZOne+ | NZTwo+ | NZThree+ | NZFour+ | NZFive+ | NZSix+ | NZSeven+ | NZEight+ | NZNine++data OcDigit = OcZero+ | OcOne+ | OcTwo+ | OcThree+ | OcFour+ | OcFive+ | OcSix+ | OcSeven++data HexDigit = HexZero+ | HexOne+ | HexTwo+ | HexThree+ | HexFour+ | HexFive+ | HexSix+ | HexSeven+ | HexEight+ | HexNine+ | Hexa | HexA+ | Hexb | HexB+ | Hexc | HexC+ | Hexd | HexD+ | Hexe | HexE+ | Hexf | HexF++data IntSuffix+ = IntSuffixUnsignedLong UnsignedSuffix (Maybe LongSuffix)+ | IntSuffixUnsignedLongLong UnsignedSuffix LongLongSuffix+ | IntSuffixLong LongSuffix (Maybe UnsignedSuffix)+ | IntSuffixLongLong LongLongSuffix (Maybe UnsignedSuffix)++data UnsignedSuffix = U+data LongSuffix = L+data LongLongSuffix = LL++{- 6.4.4.2 -}+data FloatConst = FloatDec DecFloatConst+ | FloatHex HexFloatConst++data DecFloatConst+ = DecFloatFrac FracConst (Maybe ExpPart) (Maybe FloatSuffix)+ | DecFloatDigits DigitSeq ExpPart (Maybe FloatSuffix)++data HexFloatConst+ = HexFloatFrac HexPrefix HexFracConst BinExpPart (Maybe FloatSuffix)+ | HexFloatDigits HexPrefix HexDigitSeq BinExpPart (Maybe FloatSuffix)++data FracConst = FracZero (Maybe DigitSeq) DigitSeq+ | Frac DigitSeq++data ExpPart = E (Maybe Sign) DigitSeq++data Sign = SPlus+ | SMinus++data DigitSeq = DigitBase Digit+ | DigitCons DigitSeq Digit++data HexFracConst = HexFracZero (Maybe HexDigitSeq) HexDigitSeq+ | HexFrac HexDigitSeq++data BinExpPart = P (Maybe Sign) DigitSeq++data HexDigitSeq = HexDigitBase HexDigit+ | HexDigitCons HexDigitSeq HexDigit++data FloatSuffix = FF+ | FL++{- 6.4.4.3 -}+data EnumConst = Enum Ident++{- 6.4.4.4 -}+data CharConst = Char CCharSeq+ | CharL CCharSeq++data CCharSeq = CCharBase CChar+ | CCharCons CCharSeq CChar++data CChar = CChar Char -- We are a bit lenient here+ | CCharEsc EscSeq++data EscSeq = EscSimple SimpleEscSeq+ | EscOc OcEscSeq+ | EscHex HexEscSeq+ | EscUniv UnivCharName++data SimpleEscSeq = SEQuote+ | SEDQuote+ | SEQuestion+ | SEBackSlash+ | SEa+ | SEb+ | SEf+ | SEn+ | SEr+ | SEt+ | SEv++data OcEscSeq = OcEsc1 OcDigit+ | OcEsc2 OcDigit OcDigit+ | OcEsc3 OcDigit OcDigit OcDigit++data HexEscSeq = HexEscBase HexDigit+ | HexEscCons HexEscSeq HexDigit+++{- STRING LITERALS -}+{- 6.4.5 -}+data StringLit = StringLit (Maybe SCharSeq)+ | StringLitL (Maybe SCharSeq)++data SCharSeq = SCharBase SChar+ | SCharCons SCharSeq SChar++data SChar = SChar Char -- We are a bit lenient here+ | SCharEsc EscSeq+++{- PUNCTUATORS -}+{- 6.4.6 -}+data Punc = PuncSquareL | PuncSquareR+ | PuncParenL | PuncParenR+ | PuncBraceL | PuncBraceR+ | PuncDot+ | PuncArrow+ | PuncPlusPlus | PuncMinMin+ | PuncAmpersand | PuncAsterisk+ | PuncPlus | PuncMin+ | PuncTilde+ | PuncExclamation+ | PuncFSlash+ | PuncPercent+ | PuncShiftL | PuncShiftR+ | PuncLT | PuncGT+ | PuncLE | PuncGE+ | PuncEq+ | PuncNEq+ | PuncCaret+ | PuncBar+ | PuncDoubleAmpersand+ | PuncDoubleBar+ | PuncQuestion+ | PuncColon+ | PuncSemicolon+ | PuncDots+ | PuncAssign+ | PuncAssignTimes+ | PuncAssignDiv+ | PuncAssignMod+ | PuncAssignPlus+ | PuncAssignMin+ | PuncAssignShiftL+ | PuncAssignShiftR+ | PuncAssignAnd+ | PuncAssignXOr+ | PuncAssignOr+ | PuncComma+ | PuncHash+ | PuncDoubleHash+ | PuncDiSquareL | PuncDiSquareR+ | PuncDiBraceL | PuncDiBraceR+ | PuncDiHash+ | PuncDiDoubleHash+++{- HEADER NAMES -}+{- 6.4.7 -}+data HeaderName = HeaderGlobal HCharSeq+ | HeaderLocal QCharSeq++data HCharSeq = HCharBase HChar+ | HCharCons HCharSeq HChar++data HChar = HChar Char++data QCharSeq = QCharBase QChar+ | QCharCons QCharSeq QChar++data QChar = QChar Char+++{- PREPROCESSING NUMBERS -}+{- 6.4.8 -}+data PPNumber = PPDigit Digit+ | PPDec Digit+ | PPNum PPNumber Digit+ | PPIdent PPNumber IdentNonDigit+ | PPe PPNumber Sign+ | PPE PPNumber Sign+ | PPp PPNumber Sign+ | PPP PPNumber Sign+ | PPDot PPNumber+++{- EXPRESSIONS -}+{- 6.5.1 -}+data PrimExpr = PrimIdent Ident+ | PrimConst Const+ | PrimString StringLit+ | PrimExpr Expr++{- 6.5.2 -}+data PostfixExpr = PostfixPrim PrimExpr+ | PostfixIndex PostfixExpr Expr+ | PostfixFunction PostfixExpr (Maybe ArgExprList)+ | PostfixDot PostfixExpr Ident+ | PostfixArrow PostfixExpr Ident+ | PostfixInc PostfixExpr+ | PostfixDec PostfixExpr+ | PostfixInits TypeName InitList++data ArgExprList = ArgExprListBase AssignExpr+ | ArgExprListCons ArgExprList AssignExpr++{- 6.5.3 -}+data UnaryExpr = UnaryPostfix PostfixExpr+ | UnaryInc UnaryExpr+ | UnaryDec UnaryExpr+ | UnaryOp UnaryOp CastExpr+ | UnarySizeExpr UnaryExpr+ | UnarySizeType TypeName++data UnaryOp = UORef+ | UODeref+ | UOPlus+ | UOMin+ | UOBNot+ | UONot++{- 6.5.4 -}+data CastExpr = CastUnary UnaryExpr+ | Cast TypeName CastExpr++{- 6.5.5 -}+data MultExpr = MultCast CastExpr+ | MultMult MultExpr CastExpr+ | MultDiv MultExpr CastExpr+ | MultMod MultExpr CastExpr++{- 6.5.6 -}+data AddExpr = AddMult MultExpr+ | AddPlus AddExpr MultExpr+ | AddMin AddExpr MultExpr++{- 6.5.7 -}+data ShiftExpr = ShiftAdd AddExpr+ | ShiftLeft ShiftExpr AddExpr+ | ShiftRight ShiftExpr AddExpr++{- 6.5.8 -}+data RelExpr = RelShift ShiftExpr+ | RelLT RelExpr ShiftExpr+ | RelGT RelExpr ShiftExpr+ | RelLE RelExpr ShiftExpr+ | RelGE RelExpr ShiftExpr++{- 6.5.9 -}+data EqExpr = EqRel RelExpr+ | EqEq EqExpr RelExpr+ | EqNEq EqExpr RelExpr++{- 6.5.10 -}+data AndExpr = AndEq EqExpr+ | And AndExpr EqExpr++{- 6.5.11 -}+data XOrExpr = XOrAnd AndExpr+ | XOr XOrExpr AndExpr++{- 6.5.12 -}+data OrExpr = OrXOr XOrExpr+ | Or OrExpr XOrExpr++{- 6.5.13 -}+data LAndExpr = LAndOr OrExpr+ | LAnd LAndExpr OrExpr++{- 6.5.14 -}+data LOrExpr = LOrAnd LAndExpr+ | LOr LOrExpr LAndExpr++{- 6.5.15 -}+data CondExpr = CondLOr LOrExpr+ | Cond LOrExpr Expr CondExpr++{- 6.5.16 -}+data AssignExpr = AssignCond CondExpr+ | Assign UnaryExpr AssignOp AssignExpr++data AssignOp = AEq+ | ATimes+ | ADiv+ | AMod+ | AAdd+ | ASub+ | AShiftL+ | AShiftR+ | AAnd+ | AXOr+ | AOr++{- 6.5.17 -}+data Expr = ExprAssign AssignExpr+ | Expr Expr AssignExpr++{- 6.6 -}+data ConstExpr = Const CondExpr+++{- DECLARATIONS -}+{- 6.7 -}+data Decln = Decln DeclnSpecs (Maybe InitDeclrList)++data DeclnSpecs = DeclnSpecsStorage StorageClassSpec (Maybe DeclnSpecs)+ | DeclnSpecsType TypeSpec (Maybe DeclnSpecs)+ | DeclnSpecsQual TypeQual (Maybe DeclnSpecs)+ | DeclnSpecsFun FunSpec (Maybe DeclnSpecs)++data InitDeclrList = InitDeclrBase InitDeclr+ | InitDeclrCons InitDeclrList InitDeclr++data InitDeclr = InitDeclr Declr+ | InitDeclrInitr Declr Init++{- 6.7.1 -}+data StorageClassSpec = STypedef+ | SExtern+ | SStatic+ | SAuto+ | SRegister++{- 6.7.2 -}+data TypeSpec = TVoid+ | TChar+ | TShort+ | TInt+ | TLong+ | TFloat+ | TDouble+ | TSigned+ | TUnsigned+ | TBool+ | TComplex+ | TStructOrUnion StructOrUnionSpec+ | TEnum EnumSpec+ | TTypedef TypedefName++{- 6.7.2.1 -}+data StructOrUnionSpec+ = StructOrUnionDecln StructOrUnion (Maybe Ident) StructDeclnList+ | StructOrUnionForwDecln StructOrUnion Ident++data StructOrUnion = Struct+ | Union++data StructDeclnList = StructDeclnBase StructDecln+ | StructDeclnCons StructDeclnList StructDecln++data StructDecln = StructDecln SpecQualList StructDeclrList++data SpecQualList = SpecQualType TypeSpec (Maybe SpecQualList)+ | SpecQualQual TypeQual (Maybe SpecQualList)++data StructDeclrList = StructDeclrBase StructDeclr+ | StructDeclrCons StructDeclrList StructDeclr++data StructDeclr = StructDeclr Declr+ | StructDeclrBit (Maybe Declr) ConstExpr++{- 6.7.2.2 -}+data EnumSpec = EnumSpec (Maybe Ident) EnumrList+ | EnumSpecForw Ident++data EnumrList = EnumrBase Enumr+ | EnumrCons EnumrList Enumr++data Enumr = Enumr EnumConst+ | EnumrInit EnumConst ConstExpr++{- 6.7.3 -}+data TypeQual = QConst+ | QRestrict+ | QVolatile++{- 6.7.4 -}+data FunSpec = SpecInline++{- 6.7.5 -}+data Declr = Declr (Maybe Ptr) DirectDeclr++data DirectDeclr+ = DirectDeclrIdent Ident+ | DirectDeclrDeclr Declr+ | DirectDeclrArray1 DirectDeclr (Maybe TypeQualList) (Maybe AssignExpr)+ | DirectDeclrArray2 DirectDeclr (Maybe TypeQualList) AssignExpr+ | DirectDeclrArray3 DirectDeclr TypeQualList AssignExpr+ | DirectDeclrArray4 DirectDeclr (Maybe TypeQualList)+ | DirectDeclrFun1 DirectDeclr ParamTypeList+ | DirectDeclrFun2 DirectDeclr (Maybe IdentList)++data Ptr = PtrBase (Maybe TypeQualList)+ | PtrCons (Maybe TypeQualList) Ptr++data TypeQualList = TypeQualBase TypeQual+ | TypeQualCons TypeQualList TypeQual++data ParamTypeList = ParamTypeList ParamList+ | ParamTypeListVar ParamList++data ParamList = ParamBase ParamDecln+ | ParamCons ParamList ParamDecln++data ParamDecln = ParamDecln DeclnSpecs Declr+ | ParamDeclnAbstract DeclnSpecs (Maybe DirectAbstractDeclr)++data IdentList = IdentListBase Ident+ | IdentListCons IdentList Ident++{- 6.7.6 -}+data TypeName = TypeName SpecQualList (Maybe AbstractDeclr)++data AbstractDeclr = AbstractDeclr Ptr+ | AbstractDeclrDirect (Maybe Ptr) DirectAbstractDeclr++data DirectAbstractDeclr+ = DirectAbstractDeclr AbstractDeclr+ | DirectAbstractDeclrArray1+ (Maybe DirectAbstractDeclr) (Maybe TypeQualList) (Maybe AssignExpr)+ | DirectAbstractDeclrArray2+ (Maybe DirectAbstractDeclr) (Maybe TypeQualList) AssignExpr+ | DirectAbstractDeclrArray3 (Maybe DirectAbstractDeclr) TypeQualList AssignExpr+ | DirectAbstractDeclrArray4 (Maybe DirectAbstractDeclr)+ | DirectAbstractDeclrFun (Maybe DirectAbstractDeclr) (Maybe ParamTypeList)++{- 6.7.7 -}+data TypedefName = TypedefName Ident++{- 6.7.8 -}+data Init = InitExpr AssignExpr+ | InitArray InitList+ -- We omit the specific case of InitArray ending with ,++data InitList = InitBase (Maybe Design) Init+ | InitCons InitList (Maybe Design) Init++data Design = Design DesigrList++data DesigrList = DesigrBase Desigr+ | DesigrCons DesigrList Desigr++data Desigr = DesigrConst ConstExpr+ | DesigrIdent Ident+++{- STATEMENTS -}+{- 6.8 -}+data Stmt = StmtLabeled LabeledStmt+ | StmtCompound CompoundStmt+ | StmtExpr ExprStmt+ | StmtSelect SelectStmt+ | StmtIter IterStmt+ | StmtJump JumpStmt++{- 6.8.1 -}+data LabeledStmt = LabeledIdent Ident Stmt+ | LabeledCase ConstExpr Stmt+ | LabeledDefault Stmt++{- 6.8.2 -}+data CompoundStmt = Compound (Maybe BlockItemList)++data BlockItemList = BlockItemBase BlockItem+ | BlockItemCons BlockItemList BlockItem++data BlockItem = BlockItemDecln Decln+ | BlockItemStmt Stmt++{- 6.8.3 -}+data ExprStmt = ExprStmt (Maybe Expr)++{- 6.8.4 -}+data SelectStmt = SelectIf Expr Stmt+ | SelectIfElse Expr Stmt Stmt+ | SelectSwitch Expr Stmt++{- 6.8.5 -}+data IterStmt = IterWhile Expr Stmt+ | IterDo Stmt Expr+ | IterForUpdate (Maybe Expr) (Maybe Expr) (Maybe Expr) Stmt+ | IterFor Decln (Maybe Expr) (Maybe Expr) Stmt++{- 6.8.6 -}+data JumpStmt = JumpGoto Ident+ | JumpContinue+ | JumpBreak+ | JumpReturn (Maybe Expr)++{- EXTERNAL DEFINITIONS -}+{- 6.9 -}+data TransUnit = TransUnitBase ExtDecln+ | TransUnitCons TransUnit ExtDecln++data ExtDecln = ExtFun FunDef+ | ExtDecln Decln++{- 6.9.1 -}+data FunDef = FunDef DeclnSpecs Declr (Maybe DeclnList) CompoundStmt++data DeclnList = DeclnBase Decln+ | DeclnCons DeclnList Decln+++{- PREPROCESSING DIRECTIVES -}+{- 6.10 -}+data PreprocFile = PreprocFile (Maybe Group)++data Group = GroupBase GroupPart+ | GroupCons Group GroupPart++data GroupPart = GroupIf IfSection+ | GroupControl ControlLine+ | GroupText TextLine+ | GroupNonDirective NonDirective++data IfSection+ = IfSection IfGroup (Maybe ElifGroups) (Maybe ElseGroup) EndIfLine++data IfGroup = If ConstExpr NewLine (Maybe Group)+ | IfDef Ident NewLine (Maybe Group)+ | IfNDef Ident NewLine (Maybe Group)++data ElifGroups = ElifBase ElifGroup+ | ElifCons ElifGroups ElifGroup++data ElifGroup = Elif ConstExpr NewLine (Maybe Group)++data ElseGroup = Else NewLine (Maybe Group)++data EndIfLine = EndIf NewLine++data ControlLine = Include PPTokens NewLine+ | Define1 Ident ReplaceList NewLine+ | Define2 Ident LParen (Maybe IdentList) ReplaceList NewLine+ | Define3 Ident LParen ReplaceList NewLine+ | Define4 Ident LParen IdentList ReplaceList NewLine+ | Undef Ident NewLine+ | Line PPTokens NewLine+ | Error (Maybe PPTokens) NewLine+ | Pragma (Maybe PPTokens) NewLine+ | Hash NewLine++data TextLine = TextLine (Maybe PPTokens) NewLine++data NonDirective = NonDirective PPTokens NewLine++data LParen = LParen++data ReplaceList = ReplaceList (Maybe PPTokens)++data PPTokens = PPTokensBase PreprocToken+ | PPTokensCons PPTokens PreprocToken++data NewLine = NewLine
+ src/Language/C99/Pretty.hs view
@@ -0,0 +1,640 @@+module Language.C99.Pretty where++import Language.C99.AST++import Text.PrettyPrint+import Prelude hiding ((<>))+++-- Binary operator+bin :: (Pretty a, Pretty b) => a -> String -> b -> Doc+bin x op y = pretty x <+> text op <+> pretty y++class Pretty a where+ pretty :: a -> Doc++instance Pretty a => Pretty (Maybe a) where+ pretty (Just x) = pretty x+ pretty Nothing = empty++{- IDENTIFIERS -}+{- 6.4.2.1 -}+instance Pretty Ident where+ pretty (IdentBase idn) = pretty idn+ pretty (IdentConsNonDigit i idn) = pretty i <> pretty idn+ pretty (IdentCons i d ) = pretty i <> pretty d++instance Pretty IdentNonDigit where+ pretty (IdentNonDigit nd ) = pretty nd+ pretty (IdentNonDigitUniv ucn) = pretty ucn++instance Pretty NonDigit where+ pretty c = case c of+ NDUnderscore -> char '_'+ NDa -> char 'a' ; NDA -> char 'A'+ NDb -> char 'b' ; NDB -> char 'B'+ NDc -> char 'c' ; NDC -> char 'C'+ NDd -> char 'd' ; NDD -> char 'D'+ NDe -> char 'e' ; NDE -> char 'E'+ NDf -> char 'f' ; NDF -> char 'F'+ NDg -> char 'g' ; NDG -> char 'G'+ NDh -> char 'h' ; NDH -> char 'H'+ NDi -> char 'i' ; NDI -> char 'J'+ NDj -> char 'j' ; NDJ -> char 'I'+ NDk -> char 'k' ; NDK -> char 'K'+ NDl -> char 'l' ; NDL -> char 'L'+ NDm -> char 'm' ; NDM -> char 'M'+ NDn -> char 'n' ; NDN -> char 'N'+ NDo -> char 'o' ; NDO -> char 'O'+ NDp -> char 'p' ; NDP -> char 'P'+ NDq -> char 'q' ; NDQ -> char 'Q'+ NDr -> char 'r' ; NDR -> char 'R'+ NDs -> char 's' ; NDS -> char 'S'+ NDt -> char 't' ; NDT -> char 'T'+ NDu -> char 'u' ; NDU -> char 'U'+ NDv -> char 'v' ; NDV -> char 'V'+ NDw -> char 'w' ; NDW -> char 'W'+ NDx -> char 'x' ; NDX -> char 'X'+ NDy -> char 'y' ; NDY -> char 'Y'+ NDz -> char 'z' ; NDZ -> char 'Z'++instance Pretty Digit where+ pretty c = case c of+ DZero -> int 0+ DOne -> int 1+ DTwo -> int 2+ DThree -> int 3+ DFour -> int 4+ DFive -> int 5+ DSix -> int 6+ DSeven -> int 7+ DEight -> int 8+ DNine -> int 9+++{- UNIVERSAL CHARACTER NAMES -}+{- 6.4.3 -}+instance Pretty UnivCharName where+ pretty (UnivCharName1 hq ) = text "\\u" <> pretty hq+ pretty (UnivCharName2 hq1 hq2) = text "\\U" <> pretty hq1 <> pretty hq2++instance Pretty HexQuad where+ pretty (HexQuad hd1 hd2 hd3 hd4) = pretty hd1 <> pretty hd2+ <> pretty hd3 <> pretty hd4+++{- CONSTANTS -}+{- 6.4.4 -}+instance Pretty Const where+ pretty (ConstInt ic) = pretty ic+ pretty (ConstFloat fc) = pretty fc+ pretty (ConstEnum ec) = pretty ec+ pretty (ConstChar cc) = pretty cc++{- 6.4.4.1 -}+instance Pretty IntConst where+ pretty (IntDec dc mis) = pretty dc <> pretty mis+ pretty (IntOc oc mis) = pretty oc <> pretty mis+ pretty (IntHex hc mis) = pretty hc <> pretty mis++instance Pretty DecConst where+ pretty (DecBase nzd) = pretty nzd+ pretty (DecCons dc d ) = pretty dc <> pretty d++instance Pretty OcConst where+ pretty Oc0 = int 0+ pretty (OcCons oc od) = pretty oc <> pretty od++instance Pretty HexConst where++instance Pretty HexPrefix where++instance Pretty NonZeroDigit where+ pretty d = case d of+ NZOne -> int 1+ NZTwo -> int 2+ NZThree -> int 3+ NZFour -> int 4+ NZFive -> int 5+ NZSix -> int 6+ NZSeven -> int 7+ NZEight -> int 8+ NZNine -> int 9++instance Pretty OcDigit where++instance Pretty HexDigit where++instance Pretty IntSuffix where+ pretty (IntSuffixUnsignedLong u ml) = pretty u <> pretty ml+ pretty (IntSuffixUnsignedLongLong u ll) = pretty u <> pretty ll+ pretty (IntSuffixLong l mu) = pretty l <> pretty mu+ pretty (IntSuffixLongLong ll mu) = pretty ll <> pretty mu++instance Pretty UnsignedSuffix where+ pretty U = char 'U'++instance Pretty LongSuffix where+ pretty L = char 'L'++instance Pretty LongLongSuffix where+ pretty rL = text "LL"++{- 6.4.4.2 -}+instance Pretty FloatConst where+ pretty (FloatDec dfc) = pretty dfc+ pretty (FloatHex hfc) = pretty hfc++instance Pretty DecFloatConst where+ pretty (DecFloatFrac fc me mfs) = pretty fc <> pretty me <> pretty mfs+ pretty (DecFloatDigits ds ep mfs) = pretty ds <> pretty ep <> pretty mfs++instance Pretty HexFloatConst where+ pretty (HexFloatFrac hp hfc bep mfs) =+ pretty hp <> pretty hfc <> pretty bep <> pretty mfs+ pretty (HexFloatDigits hp hds bep mfs) =+ pretty hp <> pretty hds <> pretty bep <> pretty mfs++instance Pretty FracConst where+ pretty (FracZero mds ds) = pretty mds <> char '.' <> pretty ds+ pretty (Frac ds) = pretty ds <> char '.'++instance Pretty ExpPart where+ pretty (E ms ds) = char 'e' <> pretty ms <> pretty ds++instance Pretty Sign where+ pretty SPlus = char '+'+ pretty SMinus = char '-'++instance Pretty DigitSeq where+ pretty (DigitBase d) = pretty d+ pretty (DigitCons ds d) = pretty ds <> pretty d++instance Pretty HexFracConst where+ pretty (HexFracZero mhds hds) = pretty mhds <> char '.' <> pretty hds+ pretty (HexFrac hds) = pretty hds <> char '.'++instance Pretty BinExpPart where+ pretty (P ms ds) = char 'p' <> pretty ms <> pretty ds++instance Pretty HexDigitSeq where+ pretty (HexDigitBase hd) = pretty hd+ pretty (HexDigitCons hds hd) = pretty hds <> pretty hd++instance Pretty FloatSuffix where+ pretty FF = char 'f'+ pretty FL = char 'l'++{- 6.4.4.3 -}+instance Pretty EnumConst where+ pretty (Enum i) = pretty i++{- 6.4.4.4 -}+instance Pretty CharConst where++instance Pretty CCharSeq where++instance Pretty CChar where++instance Pretty EscSeq where+ pretty (EscSimple se) = pretty se++instance Pretty SimpleEscSeq where+ pretty esc = case esc of+ SEQuote -> text "\\\'"+ SEDQuote -> text "\\\""+ SEQuestion -> text "\\?"+ SEBackSlash -> text "\\\\"+ SEa -> text "\\a"+ SEb -> text "\\b"+ SEf -> text "\\f"+ SEn -> text "\\n"+ SEr -> text "\\r"+ SEt -> text "\\t"+ SEv -> text "\\v"++instance Pretty OcEscSeq where++instance Pretty HexEscSeq where+++{- STRING LITERALS -}+{- 6.4.5 -}+instance Pretty StringLit where+ pretty (StringLit mcs) = doubleQuotes (pretty mcs)+ pretty (StringLitL mcs) = char 'L' <> doubleQuotes (pretty mcs)++instance Pretty SCharSeq where+ pretty (SCharBase sc ) = pretty sc+ pretty (SCharCons scs sc) = pretty scs <> pretty sc++instance Pretty SChar where+ pretty (SChar c ) = char c+ pretty (SCharEsc es) = pretty es+++{- EXPRESSIONS -}+{- 6.5.1 -}+instance Pretty PrimExpr where+ pretty (PrimIdent i ) = pretty i+ pretty (PrimConst c ) = pretty c+ pretty (PrimString sl) = pretty sl+ pretty (PrimExpr e ) = parens (pretty e)++{- 6.5.2 -}+instance Pretty PostfixExpr where+ pretty (PostfixPrim pe ) = pretty pe+ pretty (PostfixIndex pe e ) = pretty pe <> brackets (pretty e)+ pretty (PostfixFunction pe mael) = pretty pe <> parens (pretty mael)+ pretty (PostfixDot pe i ) = pretty pe <> char '.' <> pretty i+ pretty (PostfixArrow pe i ) = pretty pe <> text "->" <> pretty i+ pretty (PostfixInc pe ) = pretty pe <> text "++"+ pretty (PostfixDec pe ) = pretty pe <> text "--"+ pretty (PostfixInits tn il ) = parens (pretty tn) <> braces (pretty il)++instance Pretty ArgExprList where+ pretty (ArgExprListBase ae) = pretty ae+ pretty (ArgExprListCons ael ae) = pretty ael <> comma <+> pretty ae++{- 6.5.3 -}+instance Pretty UnaryExpr where+ pretty (UnaryPostfix pe ) = pretty pe+ pretty (UnaryInc ue ) = text "++" <> pretty ue+ pretty (UnaryDec ue ) = text "--" <> pretty ue+ pretty (UnaryOp op ce) = pretty op <> pretty ce+ pretty (UnarySizeExpr ue ) = text "sizeof" <+> pretty ue+ pretty (UnarySizeType tn ) = text "sizeof" <> parens (pretty tn)++instance Pretty UnaryOp where+ pretty op = case op of+ UORef -> char '&'+ UODeref -> char '*'+ UOPlus -> char '+'+ UOMin -> char '-'+ UOBNot -> char '~'+ UONot -> char '!'++{- 6.5.4 -}+instance Pretty CastExpr where+ pretty (CastUnary ue) = pretty ue+ pretty (Cast tn ce) = parens (pretty tn) <> pretty ce++{- 6.5.5 -}+instance Pretty MultExpr where+ pretty (MultCast ce) = pretty ce+ pretty (MultMult me ce) = bin me "*" ce+ pretty (MultDiv me ce) = bin me "/" ce+ pretty (MultMod me ce) = bin me "%" ce++{- 6.5.6 -}+instance Pretty AddExpr where+ pretty (AddMult me) = pretty me+ pretty (AddPlus ae me) = bin ae "+" me+ pretty (AddMin ae me) = bin ae "-" me++{- 6.5.7 -}+instance Pretty ShiftExpr where+ pretty (ShiftAdd add) = pretty add+ pretty (ShiftLeft shift add) = bin shift "<<" add+ pretty (ShiftRight shift add) = bin shift ">>" add++{- 6.5.8 -}+instance Pretty RelExpr where+ pretty (RelShift shift) = pretty shift+ pretty (RelLT rel shift) = bin rel "<" shift+ pretty (RelGT rel shift) = bin rel ">" shift+ pretty (RelLE rel shift) = bin rel "<=" shift+ pretty (RelGE rel shift) = bin rel ">=" shift++{- 6.5.9 -}+instance Pretty EqExpr where+ pretty (EqRel rel) = pretty rel+ pretty (EqEq eq rel) = bin eq "==" rel+ pretty (EqNEq eq rel) = bin eq "!=" rel++{- 6.5.10 -}+instance Pretty AndExpr where+ pretty (AndEq eq) = pretty eq+ pretty (And and eq) = bin and "&" eq++{- 6.5.11 -}+instance Pretty XOrExpr where+ pretty (XOrAnd and) = pretty and+ pretty (XOr xor and) = bin xor "^" and++{- 6.5.12 -}+instance Pretty OrExpr where+ pretty (OrXOr xor) = pretty xor+ pretty (Or or xor) = bin or "|" xor++{- 6.5.13 -}+instance Pretty LAndExpr where+ pretty (LAndOr or) = pretty or+ pretty (LAnd and or) = bin and "&&" or++{- 6.5.14 -}+instance Pretty LOrExpr where+ pretty (LOrAnd and) = pretty and+ pretty (LOr or and) = bin or "||" and++{- 6.5.15 -}+instance Pretty CondExpr where+ pretty (CondLOr le ) = pretty le+ pretty (Cond le e ce) = pretty le <+> char '?' <+> pretty e <+> colon <+> pretty ce++{- 6.5.16 -}+instance Pretty AssignExpr where+ pretty (AssignCond ce) = pretty ce+ pretty (Assign ue op ae) = pretty ue <+> pretty op <+> pretty ae++instance Pretty AssignOp where+ pretty op = case op of+ AEq -> text "="+ ATimes -> text "*="+ ADiv -> text "/="+ AMod -> text "%="+ AAdd -> text "+="+ ASub -> text "-="+ AShiftL -> text "<<="+ AShiftR -> text ">>="+ AAnd -> text "&="+ AXOr -> text "^="+ AOr -> text "|="++{- 6.5.17 -}+instance Pretty Expr where+ pretty (ExprAssign ae) = pretty ae+ pretty (Expr e ae) = pretty e <> comma <+> pretty ae++{- 6.6 -}+instance Pretty ConstExpr where+ pretty (Const ce) = pretty ce+++{- DECLARATIONS -}+{- 6.7 -}+instance Pretty Decln where+ pretty (Decln ds midl) = pretty ds <+> pretty midl++instance Pretty DeclnSpecs where+ pretty (DeclnSpecsStorage scs mds) = pretty scs <+> pretty mds+ pretty (DeclnSpecsType ts mds) = pretty ts <+> pretty mds+ pretty (DeclnSpecsQual tq mds) = pretty tq <+> pretty mds+ pretty (DeclnSpecsFun fs mds) = pretty fs <+> pretty mds++instance Pretty InitDeclrList where+ pretty (InitDeclrBase id) = pretty id+ pretty (InitDeclrCons idl id) = pretty idl <> comma <+> pretty id++instance Pretty InitDeclr where+ pretty (InitDeclr d ) = pretty d+ pretty (InitDeclrInitr d i) = pretty d <+> equals <+> pretty i++{- 6.7.1 -}+instance Pretty StorageClassSpec where+ pretty c = case c of+ STypedef -> text "typedef"+ SExtern -> text "extern"+ SStatic -> text "static"+ SAuto -> text "auto"+ SRegister -> text "register"++{- 6.7.2 -}+instance Pretty TypeSpec where+ pretty ty = case ty of+ TVoid -> text "void"+ TChar -> text "char"+ TShort -> text "short"+ TInt -> text "int"+ TLong -> text "long"+ TFloat -> text "float"+ TDouble -> text "double"+ TSigned -> text "signed"+ TUnsigned -> text "unsigned"+ TBool -> text "_Bool"+ TComplex -> text "_Complex"+ TStructOrUnion sous -> pretty sous+ TEnum es -> pretty es+ TTypedef tn -> pretty tn++{- 6.7.2.1 -}+instance Pretty StructOrUnionSpec where+ pretty (StructOrUnionDecln sou mi sdl) =+ vcat [pretty sou <+> pretty mi, lbrace, nest 2 $ pretty sdl, rbrace]+ pretty (StructOrUnionForwDecln sou i ) =+ pretty sou <+> pretty i++instance Pretty StructOrUnion where+ pretty Struct = text "struct"+ pretty Union = text "union"++instance Pretty StructDeclnList where+ pretty (StructDeclnBase sd ) = pretty sd+ pretty (StructDeclnCons sdl sd) = pretty sdl $+$ pretty sd++instance Pretty StructDecln where+ pretty (StructDecln sql sdl) = pretty sql <+> pretty sdl <> char ';'++instance Pretty SpecQualList where+ pretty (SpecQualType ts msql) = pretty ts <+> pretty msql+ pretty (SpecQualQual tq msql) = pretty tq <+> pretty msql++instance Pretty StructDeclrList where+ pretty (StructDeclrBase sd) = pretty sd+ pretty (StructDeclrCons sdl sd) = pretty sdl <+> char ',' <+> pretty sd++instance Pretty StructDeclr where+ pretty (StructDeclr d ) = pretty d+ pretty (StructDeclrBit md ce) = pretty md <+> char ':' <+> pretty ce++{- 6.7.2.2 -}+instance Pretty EnumSpec where++instance Pretty EnumrList where++instance Pretty Enumr where++{- 6.7.3 -}+instance Pretty TypeQual where+ pretty q = case q of+ QConst -> text "const"+ QRestrict -> text "restrict"+ QVolatile -> text "volatile"++{- 6.7.4 -}+instance Pretty FunSpec where+ pretty SpecInline = text "inline"++{- 6.7.5 -}+instance Pretty Declr where+ pretty (Declr mptr dd) = pretty mptr <+> pretty dd++instance Pretty DirectDeclr where+ pretty (DirectDeclrIdent i ) = pretty i+ pretty (DirectDeclrDeclr d ) = parens $ pretty d+ pretty (DirectDeclrArray1 d mtl mae) = pretty d <> brackets (pretty mtl <+> pretty mae)+ pretty (DirectDeclrArray2 d mtl ae ) = pretty d <> brackets (text "static" <+> pretty mtl <+> pretty ae)+ pretty (DirectDeclrArray3 d tl ae ) = pretty d <> brackets (pretty tl <+> text "static" <+> pretty ae)+ pretty (DirectDeclrArray4 d mtl ) = pretty d <> brackets (pretty mtl <+> char '*')+ pretty (DirectDeclrFun1 d ptl ) = pretty d <> parens (pretty ptl)+ pretty (DirectDeclrFun2 d mil ) = pretty d <> parens (pretty mil)++instance Pretty Ptr where+ pretty (PtrBase mtql ) = char '*' <> pretty mtql+ pretty (PtrCons mtql p) = char '*' <> pretty mtql <> pretty p++instance Pretty TypeQualList where+ pretty (TypeQualBase tq) = pretty tq+ pretty (TypeQualCons tql tq) = pretty tql <+> pretty tq++instance Pretty ParamTypeList where+ pretty (ParamTypeList tq) = pretty tq+ pretty (ParamTypeListVar tq) = pretty tq <> comma <+> text "..."++instance Pretty ParamList where+ pretty (ParamBase pd) = pretty pd+ pretty (ParamCons pl pd) = pretty pl <> comma <+> pretty pd++instance Pretty ParamDecln where+ pretty (ParamDecln ds d ) = pretty ds <+> pretty d+ pretty (ParamDeclnAbstract ds mdad) = pretty ds <+> pretty mdad++instance Pretty IdentList where++{- 6.7.6 -}+instance Pretty TypeName where+ pretty (TypeName sql mdar) = pretty sql <+> pretty mdar++instance Pretty AbstractDeclr where+ pretty (AbstractDeclr ptr ) = pretty ptr+ pretty (AbstractDeclrDirect mptr ad) = pretty mptr <> pretty ad++instance Pretty DirectAbstractDeclr where+ pretty (DirectAbstractDeclr dad) = parens $ pretty dad+ pretty (DirectAbstractDeclrArray1 mdad mtql mae)+ = pretty mdad <> brackets (pretty mtql <> pretty mae)+ pretty (DirectAbstractDeclrArray2 mdad mtql ae)+ = pretty mdad <> brackets (text "static" <+> pretty mtql <> pretty ae)+ pretty (DirectAbstractDeclrArray3 mdad tql ae)+ = pretty mdad <> brackets (pretty tql <+> text "static" <+> pretty ae)+ pretty (DirectAbstractDeclrArray4 mdad) = pretty mdad <> brackets (char '*')+ pretty (DirectAbstractDeclrFun mdad mptl) = pretty mdad <> parens (pretty mptl)++{- 6.7.7 -}+instance Pretty TypedefName where+ pretty (TypedefName i) = pretty i++{- 6.7.8 -}+instance Pretty Init where+ pretty (InitExpr ae) = pretty ae+ pretty (InitArray il) = braces (pretty il)++instance Pretty InitList where+ pretty (InitBase md i) = pretty md <+> pretty i+ pretty (InitCons il md i) = pretty il <> comma <+> pretty md <+> pretty i++instance Pretty Design where+ pretty (Design dl) = pretty dl <+> char '='++instance Pretty DesigrList where+ pretty (DesigrBase d) = pretty d+ pretty (DesigrCons dl d) = pretty dl <+> pretty d++instance Pretty Desigr where+ pretty (DesigrConst ce) = brackets (pretty ce)+ pretty (DesigrIdent i ) = char '.' <> pretty i++{- STATEMENTS -}+{- 6.8 -}+instance Pretty Stmt where+ pretty (StmtLabeled ls) = pretty ls+ pretty (StmtCompound cs) = vcat [ lbrace, nest 2 $ pretty cs, rbrace ]++ pretty (StmtExpr es) = pretty es+ pretty (StmtSelect ss) = pretty ss+ pretty (StmtIter is) = pretty is+ pretty (StmtJump js) = pretty js++{- 6.8.1 -}+instance Pretty LabeledStmt where+ pretty (LabeledIdent i s) = pretty i <> colon <+> pretty s+ pretty (LabeledCase ce s) = text "case" <+> pretty ce <> colon <+> pretty s+ pretty (LabeledDefault s) = text "default" <> colon <+> pretty s++{- 6.8.2 -}+instance Pretty CompoundStmt where+ pretty (Compound Nothing) = empty+ pretty (Compound mbil ) = pretty mbil++instance Pretty BlockItemList where+ pretty (BlockItemBase bi) = pretty bi+ pretty (BlockItemCons bil bi) = pretty bil $$ pretty bi++instance Pretty BlockItem where+ pretty (BlockItemDecln d) = pretty d <> semi+ pretty (BlockItemStmt s) = pretty s <> semi++{- 6.8.3 -}+instance Pretty ExprStmt where+ pretty (ExprStmt Nothing) = empty+ pretty (ExprStmt me) = pretty me++{- 6.8.4 -}+instance Pretty SelectStmt where+ pretty (SelectIf c s) = text "if" <+> parens (pretty c) <+> pretty s+ pretty (SelectIfElse c s1 s2) =+ text "if" <+> parens (pretty c) <+> pretty s1 <+> text "else" <+> pretty s2+ pretty (SelectSwitch c s) = text "switch" <+> parens (pretty c) <+> pretty s++{- 6.8.5 -}+instance Pretty IterStmt where+ pretty (IterWhile c s) = text "while" <+> parens (pretty c) <+> pretty s+ pretty (IterDo s c) =+ text "do" <+> pretty s <+> text "while" <+> parens (pretty c) <> semi+ pretty (IterForUpdate me1 me2 me3 s) =+ vcat [ text "for" <+> parens ( pretty me1 <> semi <+>+ pretty me2 <> semi <+>+ pretty me3 ) <+> lbrace+ , nest 2 $ pretty s+ , rbrace+ ]+ pretty (IterFor d me1 me2 s) =+ text "for" <+> parens ( pretty d <+> pretty me1 <> semi+ <+> pretty me2 ) <+> pretty s++{- 6.8.6 -}+instance Pretty JumpStmt where+ pretty (JumpGoto i) = text "goto" <+> pretty i+ pretty JumpContinue = text "continue"+ pretty JumpBreak = text "break"+ pretty (JumpReturn me) = text "return" <+> pretty me+++{- EXTERNAL DEFINITIONS -}+{- 6.9 -}+instance Pretty TransUnit where+ pretty (TransUnitBase ed) = pretty ed+ pretty (TransUnitCons tu ed) = case ed of+ ExtFun _ -> vcat [pretty tu, text "", pretty ed]+ _ -> vcat [pretty tu, pretty ed]++instance Pretty ExtDecln where+ pretty (ExtFun fd) = pretty fd+ pretty (ExtDecln d) = pretty d <> semi++{- 6.9.1 -}+instance Pretty FunDef where+ pretty (FunDef ds d mdl (Compound Nothing)) = fheader ds d mdl <> semi+ pretty (FunDef ds d mdl cs) =+ vcat [ fheader ds d mdl <+> lbrace+ , nest 2 $ pretty cs+ , rbrace+ ]++instance Pretty DeclnList where+ pretty (DeclnBase d) = pretty d+ pretty (DeclnCons dl d) = pretty dl <> comma <+> pretty d+++fheader :: DeclnSpecs -> Declr -> Maybe DeclnList -> Doc+fheader ds d mdl = pretty ds <+> pretty d <+> pretty mdl