packages feed

glualint-1.26.0: src/GLua/AG/PrettyPrint.hs

{-# LANGUAGE DeriveGeneric #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}

-- UUAGC 0.9.55 (src/GLua/AG/PrettyPrint.ag)
module GLua.AG.PrettyPrint where

{-# LINE 10 "src/GLua/AG/AST.ag" #-}

import Data.Aeson
import GHC.Generics
import GLua.AG.Token
import GLua.TokenTypes ()
{-# LINE 15 "src/GLua/AG/PrettyPrint.hs" #-}

{-# LINE 4 "src/GLua/AG/PrettyPrint.ag" #-}

import Data.List (foldl', isInfixOf)
import Data.Maybe
import Debug.Trace
import GLua.AG.AST
import GLua.TokenTypes
import Text.Parsec
import Text.Parsec.Error
import Text.ParserCombinators.UU.BasicInstances hiding (pos)
import Text.PrettyPrint hiding (braces, brackets, parens)
import Prelude hiding ((<>))
{-# LINE 29 "src/GLua/AG/PrettyPrint.hs" #-}
{-# LINE 19 "src/GLua/AG/PrettyPrint.ag" #-}

tok :: MToken -> Doc
tok (MToken _ t) = zeroWidthText . show $ t

printList :: (a -> Doc) -> String -> [a] -> Doc
printList _ _ [] = empty
printList f sep' (e : es) = (f e) <> g es
  where
    g [] = empty
    g (e' : es') = zeroWidthText sep' <> (f e') <> g es'

data IsEmpty = IsEmpty | NonEmpty

fromEmpty :: IsEmpty -> Bool
fromEmpty IsEmpty = True
fromEmpty NonEmpty = False

toEmpty :: Bool -> IsEmpty
toEmpty b = if b then IsEmpty else NonEmpty

data PrettyPrintConfig = PPConfig
  { spaceAfterParens :: Bool
  , spaceAfterBrackets :: Bool
  , spaceAfterBraces :: Bool
  , spaceEmptyParens :: Bool
  , spaceEmptyBraces :: Bool
  , spaceAfterLabel :: Bool
  , spaceBeforeComma :: Bool
  , spaceAfterComma :: Bool
  , semicolons :: Bool
  , cStyle :: Bool
  , removeRedundantParens :: Bool
  , minimizeParens :: Bool
  , assumeOperatorAssociativity :: Bool
  , indentation :: String
  }

defaultPPConfig :: PrettyPrintConfig
defaultPPConfig =
  PPConfig
    { spaceAfterParens = False
    , spaceAfterBrackets = False
    , spaceAfterBraces = False
    , spaceEmptyParens = False
    , spaceEmptyBraces = False
    , spaceAfterLabel = False
    , spaceBeforeComma = False
    , spaceAfterComma = True
    , semicolons = False
    , cStyle = False
    , removeRedundantParens = True
    , assumeOperatorAssociativity = True
    , minimizeParens = False
    , indentation = "    "
    }

metaDoc :: Maybe MToken -> Doc
metaDoc (Just m) = zchr ':' <> tok m
metaDoc Nothing = empty

printVarList :: [(PrefixExp, Maybe MExpr)] -> Doc
printVarList vars =
  printList pp_prefixexp ", " (map fst vars)
    <-> zchr '='
    <-> printList pp_mexpr ", " (catMaybes . map snd $ vars)

printStats :: [MStat] -> Int -> Doc
printStats [] _ = empty
printStats (x : xs) i = nest (i * 4) (pp_mstat x i) $+$ printStats xs i

printElIfs :: [(MExpr, Block)] -> Int -> Doc
printElIfs [] _ = empty
printElIfs ((e, b) : es) i =
  zeroWidthText "elseif"
    <-> pp_mexpr e
    <-> zeroWidthText "then"
    $+$ pp_block b i
    $+$ printElIfs es i

printEls :: Maybe Block -> Int -> Doc
printEls Nothing _ = empty
printEls (Just b) i = zeroWidthText "else" $+$ pp_block b i

renderPos :: LineColPos -> String
renderPos (LineColPos l c _) = "line " ++ show (succ l) ++ ", column " ++ show (succ c)

renderRegion :: Region -> String
renderRegion (Region l r) = renderPos l ++ " - " ++ renderPos r

renderSourcePos :: SourcePos -> String
renderSourcePos sp =
  "line "
    ++ (show . succ . sourceLine $ sp)
    ++ ", column "
    ++ (show . succ . sourceColumn $ sp)

getMStatPos :: MStat -> String
getMStatPos (MStat p _) = renderRegion p

getAReturnPos :: AReturn -> String
getAReturnPos (AReturn p _) = renderRegion p
getAReturnPos NoReturn = "<unknown>"

getMExprPos :: MExpr -> String
getMExprPos (MExpr p _) = renderRegion p

renderError :: Error LineColPos -> String
renderError (Inserted str pos strs) =
  renderPos pos
    ++ ": Inserted '"
    ++ str
    ++ "'."
    ++ render_expecting strs
renderError (Deleted str pos strs) =
  renderPos pos
    ++ ": Removed '"
    ++ str
    ++ "'. "
    ++ render_expecting strs
renderError (Replaced str1 str2 pos strs) =
  renderPos pos
    ++ ": Replaced '"
    ++ str1
    ++ "' with '"
    ++ str2
    ++ "' at "
    ++ renderPos pos
    ++ render_expecting strs
renderError (DeletedAtEnd str) =
  "Deleted '"
    ++ str
    ++ "' at the end of the Lua file because the parser doesn't know what to do with it."

render_expecting :: [String] -> String
render_expecting [a] = "Parser expected a " ++ a
render_expecting (a : as) = "Parser expected one of [" ++ a ++ concat (map (", " ++) as) ++ "]"
render_expecting [] = "Parser expected nothing"

renderPSError :: ParseError -> String
renderPSError ps =
  map replNL
    . showErrorMessages
      "or"
      "unknown parse error"
      "expecting"
      "unexpected"
      "end of input"
    . errorMessages
    $ ps
  where
    replNL '\n' = ' '
    replNL c = c

-- | Render comments on multiple lines
renderMLComments :: PrettyPrintConfig -> Int -> [MToken] -> Doc
renderMLComments conf ind toks =
  foldl' ($+$) empty . map (indent conf ind . tok . convertComment conf) $ toks

-- | Render comments, and prefer having them on a single line. It may not print comments on the same
-- line if that would cause a syntax error (e.g. a multiline comment after a single line comment)
renderSLComments :: PrettyPrintConfig -> Int -> [MToken] -> Doc
renderSLComments conf ind toks = foldl' combine empty . map (convertComment conf) $ toks
  where
    combine :: Doc -> MToken -> Doc
    combine acc mt@(MToken _pos t) =
      case t of
        -- Block comments after single line comments cannot be printed on the same line, as that
        -- would cause a syntax error, e.g. in this case:

        -- foo = { -- single line comment
        -- --[[multiline
        -- comment
        -- ]]
        -- }
        -- Make sure in these cases the comment is printed on a new line, rather than on the
        -- same line
        DashBlockComment _depth comment
          | '\n' `elem` comment ->
              acc $+$ (indent conf ind $ tok mt)
        SlashBlockComment comment
          | '\n' `elem` comment ->
              acc $+$ (indent conf ind $ tok mt)
        _ -> acc <-> tok mt

convertComment :: PrettyPrintConfig -> MToken -> MToken
convertComment conf (MToken p t) = MToken p $ convert' t
  where
    convert' :: Token -> Token
    convert' = if cStyle conf then cComment else luaComment

    luaComment :: Token -> Token
    luaComment (SlashComment s) = DashComment s
    luaComment (SlashBlockComment s) = DashBlockComment (lastBracket s) s
    luaComment t' = t'

    -- converting /*]*/ would end up in --[[]]] when plainly converted
    -- Deepen the block comment by 1 if that's the case
    lastBracket :: String -> Int
    lastBracket [] = 0
    lastBracket s = if last s == ']' then 1 else 0

    cComment :: Token -> Token
    cComment (DashComment s) = SlashComment s
    cComment (DashBlockComment _ s) = SlashBlockComment s
    cComment t' = t'

indent :: PrettyPrintConfig -> Int -> Doc -> Doc
indent conf n = (<>) $ zeroWidthText (concat . replicate n $ indentation conf)

parens :: PrettyPrintConfig -> IsEmpty -> Doc -> Doc
parens conf ie doc = zchr '(' `sep'` doc `sep'` zchr ')'
  where
    sep' :: Doc -> Doc -> Doc
    sep' =
      if spaceAfterParens conf && (not (fromEmpty ie) || spaceEmptyParens conf)
        then (<->)
        else (<>)

brackets :: PrettyPrintConfig -> Doc -> Doc
brackets conf doc = zchr '[' `sep'` doc `sep'` zchr ']'
  where
    sep' :: Doc -> Doc -> Doc
    sep' = if spaceAfterBrackets conf then (<->) else (<>)

braces :: PrettyPrintConfig -> IsEmpty -> Doc -> Doc
braces conf ie doc = zchr '{' `sep'` doc `sep'` zchr '}'
  where
    sep' :: Doc -> Doc -> Doc
    sep' =
      if spaceAfterBraces conf && (not (fromEmpty ie) || spaceEmptyBraces conf)
        then (<->)
        else (<>)

-- Zero width char
zchr :: Char -> Doc
zchr c = zeroWidthText [c]

-- Zero width <+>
infixl 6 <->
(<->) :: Doc -> Doc -> Doc
a <-> b
  | a == empty = b
  | b == empty = a
  | otherwise = a <> zchr ' ' <> b

-- Operator levels, where level 1 is the lowest level, and level 8 is the highest one
-- See http://www.lua.org/manual/5.2/manual.html#3.4.7
data OperatorLevel
  = -- At the top level, there is no assigned operator level yet. This serves as a bottom value.
    TopLevelExpression
  | OperatorLevel1
  | OperatorLevel2
  | OperatorLevel3
  | OperatorLevel4
  | OperatorLevel5
  | OperatorLevel6
  | OperatorLevel7
  | OperatorLevel8
  deriving (Eq, Ord)

-- | Returns true when any of the comments contain the string "format: multiline"
commentsForceMultiline :: [MToken] -> Bool
commentsForceMultiline commentTokens = any containsFormatMultiline commentTokens
  where
    containsFormatMultiline :: MToken -> Bool
    containsFormatMultiline (MToken _pos t) = case t of
      DashComment comment -> stringForcesFormat comment
      DashBlockComment _ comment -> stringForcesFormat comment
      SlashComment comment -> stringForcesFormat comment
      SlashBlockComment comment -> stringForcesFormat comment
      _ -> False

    stringForcesFormat :: String -> Bool
    stringForcesFormat s = "format: multiline" `isInfixOf` s

{-# LINE 304 "src/GLua/AG/PrettyPrint.hs" #-}

{-# LINE 1235 "src/GLua/AG/PrettyPrint.ag" #-}

pp_block :: Block -> Int -> Doc
pp_block p i = pretty_Syn_Block (wrap_Block (sem_Block p) (emptyInh_Block{indent_Inh_Block = i}))

pp_mstat :: MStat -> Int -> Doc
pp_mstat p i = pretty_Syn_MStat (wrap_MStat (sem_MStat p) emptyInh_MStat{indent_Inh_MStat = i})

pp_prefixexp :: PrefixExp -> Doc
pp_prefixexp p = pretty_Syn_PrefixExp (wrap_PrefixExp (sem_PrefixExp p) emptyInh_PrefixExp)

pp_pfexprsuffix :: PFExprSuffix -> Doc
pp_pfexprsuffix p =
  pretty_Syn_PFExprSuffix (wrap_PFExprSuffix (sem_PFExprSuffix p) emptyInh_PFExprSuffix)

pp_field :: Field -> Doc
pp_field p = pretty_Syn_Field (wrap_Field (sem_Field p) emptyInh_Field)

pp_mexpr :: MExpr -> Doc
pp_mexpr p = pretty_Syn_MExpr (wrap_MExpr (sem_MExpr p) emptyInh_MExpr)

prettyprint :: AST -> String
prettyprint p = render $ pretty_Syn_AST (wrap_AST (sem_AST p) emptyInh_AST)

prettyprintConf :: PrettyPrintConfig -> AST -> String
prettyprintConf conf p =
  render $ pretty_Syn_AST (wrap_AST (sem_AST p) emptyInh_AST{ppconf_Inh_AST = conf})

renderBlock :: Block -> String
renderBlock p = render $ pretty_Syn_Block (wrap_Block (sem_Block p) emptyInh_Block)

renderStat :: Stat -> String
renderStat p = render $ pretty_Syn_Stat (wrap_Stat (sem_Stat p) emptyInh_Stat)

renderMStat :: MStat -> String
renderMStat p = render $ pretty_Syn_MStat (wrap_MStat (sem_MStat p) emptyInh_MStat)

renderAReturn :: AReturn -> String
renderAReturn p = render $ pretty_Syn_AReturn (wrap_AReturn (sem_AReturn p) emptyInh_AReturn)

renderFuncName :: FuncName -> String
renderFuncName p = render $ pretty_Syn_FuncName (wrap_FuncName (sem_FuncName p) emptyInh_FuncName)

renderPrefixExp :: PrefixExp -> String
renderPrefixExp p =
  render $ pretty_Syn_PrefixExp (wrap_PrefixExp (sem_PrefixExp p) emptyInh_PrefixExp)

renderExpr :: Expr -> String
renderExpr p = render $ pretty_Syn_Expr (wrap_Expr (sem_Expr p) emptyInh_Expr)

renderMExpr :: MExpr -> String
renderMExpr p = render $ pretty_Syn_MExpr (wrap_MExpr (sem_MExpr p) emptyInh_MExpr)

renderArgs :: Args -> String
renderArgs p = render $ pretty_Syn_Args (wrap_Args (sem_Args p) emptyInh_Args)

renderField :: Field -> String
renderField p = render $ pretty_Syn_Field (wrap_Field (sem_Field p) emptyInh_Field)

emptyInh_Field :: Inh_Field
emptyInh_Field =
  Inh_Field
    { comments_Inh_Field = []
    , forceMultiline_Inh_Field = False
    , indent_Inh_Field = 0
    , ppconf_Inh_Field = defaultPPConfig
    }

emptyInh_Args :: Inh_Args
emptyInh_Args =
  Inh_Args
    { comments_Inh_Args = []
    , forceMultiline_Inh_Args = False
    , indent_Inh_Args = 0
    , ppconf_Inh_Args = defaultPPConfig
    }

emptyInh_MExpr :: Inh_MExpr
emptyInh_MExpr =
  Inh_MExpr
    { comments_Inh_MExpr = []
    , forceMultiline_Inh_MExpr = False
    , indent_Inh_MExpr = 0
    , parentOperatorAssociative_Inh_MExpr = True
    , parentOperatorPrecedence_Inh_MExpr = TopLevelExpression
    , ppconf_Inh_MExpr = defaultPPConfig
    }

emptyInh_Expr :: Inh_Expr
emptyInh_Expr =
  Inh_Expr
    { comments_Inh_Expr = []
    , forceMultiline_Inh_Expr = False
    , indent_Inh_Expr = 0
    , parentOperatorAssociative_Inh_Expr = True
    , parentOperatorPrecedence_Inh_Expr = TopLevelExpression
    , ppconf_Inh_Expr = defaultPPConfig
    , statRegion_Inh_Expr = emptyRg
    }

emptyInh_PrefixExp :: Inh_PrefixExp
emptyInh_PrefixExp =
  Inh_PrefixExp
    { comments_Inh_PrefixExp = []
    , forceMultiline_Inh_PrefixExp = False
    , indent_Inh_PrefixExp = 0
    , parentOperatorAssociative_Inh_PrefixExp = True
    , parentOperatorPrecedence_Inh_PrefixExp = TopLevelExpression
    , ppconf_Inh_PrefixExp = defaultPPConfig
    }

emptyInh_FuncName :: Inh_FuncName
emptyInh_FuncName =
  Inh_FuncName
    { comments_Inh_FuncName = []
    , indent_Inh_FuncName = 0
    , ppconf_Inh_FuncName = defaultPPConfig
    }

emptyInh_AReturn :: Inh_AReturn
emptyInh_AReturn =
  Inh_AReturn
    { comments_Inh_AReturn = []
    , forceMultiline_Inh_AReturn = False
    , indent_Inh_AReturn = 0
    , ppconf_Inh_AReturn = defaultPPConfig
    }

emptyInh_MStat :: Inh_MStat
emptyInh_MStat =
  Inh_MStat
    { comments_Inh_MStat = []
    , forceMultiline_Inh_MStat = False
    , indent_Inh_MStat = 0
    , isLastStatement_Inh_MStat = False
    , ppconf_Inh_MStat = defaultPPConfig
    , wouldBeAmbiguousWithoutSemicolon_Inh_MStat = False
    }

emptyInh_Stat :: Inh_Stat
emptyInh_Stat =
  Inh_Stat
    { comments_Inh_Stat = []
    , forceMultiline_Inh_Stat = False
    , indent_Inh_Stat = 0
    , isLastStatement_Inh_Stat = False
    , ppconf_Inh_Stat = defaultPPConfig
    , statRegion_Inh_Stat = emptyRg
    , wouldBeAmbiguousWithoutSemicolon_Inh_Stat = False
    }

emptyInh_Block :: Inh_Block
emptyInh_Block =
  Inh_Block
    { comments_Inh_Block = []
    , forceMultiline_Inh_Block = False
    , indent_Inh_Block = 0
    , ppconf_Inh_Block = defaultPPConfig
    , statRegion_Inh_Block = emptyRg
    }

emptyInh_AST :: Inh_AST
emptyInh_AST =
  Inh_AST
    { indent_Inh_AST = 0
    , ppconf_Inh_AST = defaultPPConfig
    }

emptyInh_PFExprSuffix :: Inh_PFExprSuffix
emptyInh_PFExprSuffix =
  Inh_PFExprSuffix
    { comments_Inh_PFExprSuffix = []
    , forceMultiline_Inh_PFExprSuffix = False
    , indent_Inh_PFExprSuffix = 0
    , ppconf_Inh_PFExprSuffix = defaultPPConfig
    }

{-# LINE 484 "src/GLua/AG/PrettyPrint.hs" #-}
-- AReturn -----------------------------------------------------
-- cata
sem_AReturn
  :: AReturn
  -> T_AReturn
sem_AReturn (AReturn _pos _values) =
  (sem_AReturn_AReturn _pos (sem_MExprList _values))
sem_AReturn (NoReturn) =
  (sem_AReturn_NoReturn)

-- semantic domain
type T_AReturn =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), AReturn, Bool, Doc, Int)
data Inh_AReturn = Inh_AReturn {comments_Inh_AReturn :: ([MToken]), forceMultiline_Inh_AReturn :: Bool, indent_Inh_AReturn :: Int, ppconf_Inh_AReturn :: PrettyPrintConfig}
data Syn_AReturn = Syn_AReturn {comments_Syn_AReturn :: ([MToken]), copy_Syn_AReturn :: AReturn, isMultiline_Syn_AReturn :: Bool, pretty_Syn_AReturn :: Doc, statementCount_Syn_AReturn :: Int}
wrap_AReturn
  :: T_AReturn
  -> Inh_AReturn
  -> Syn_AReturn
wrap_AReturn sem (Inh_AReturn _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty, _lhsOstatementCount) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_AReturn _lhsOcomments _lhsOcopy _lhsOisMultiline _lhsOpretty _lhsOstatementCount)
  )
sem_AReturn_AReturn
  :: Region
  -> T_MExprList
  -> T_AReturn
sem_AReturn_AReturn pos_ values_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _valuesOcomments :: ([MToken])
            _lhsOcomments :: ([MToken])
            _valuesOforceMultiline :: Bool
            _valuesOsomeElementsInListAreMultiline :: Bool
            _lhsOstatementCount :: Int
            _lhsOcopy :: AReturn
            _valuesOindent :: Int
            _valuesOppconf :: PrettyPrintConfig
            _valuesIcomments :: ([MToken])
            _valuesIcopy :: MExprList
            _valuesIisAssociative :: Bool
            _valuesIisLast :: Bool
            _valuesIisMultiline :: Bool
            _valuesIpos :: Region
            _valuesIprecedence :: OperatorLevel
            _valuesIpretty :: Doc
            _lhsOpretty =
              ( renderMLComments _lhsIppconf _lhsIindent (fst _commentsBefore)
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "return")
                    <-> _valuesIpretty
                    <> _semicolon
                      <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfter)
              )
            _lhsOisMultiline =
              ( _valuesIisMultiline
                  || not (null $ fst _commentsBefore)
                  || not (null $ fst _commentsAfter)
              )
            _semicolon =
              ( if semicolons _lhsIppconf then zchr ';' else empty
              )
            _commentsBefore =
              ( span (\(MToken pos _) -> pos `before` pos_) _lhsIcomments
              )
            _valuesOcomments =
              ( snd _commentsBefore
              )
            _commentsAfter =
              ( span (\(MToken pos _) -> pos `beforeOrOnLine` (rgOr _valuesIpos pos_)) _valuesIcomments
              )
            _lhsOcomments =
              ( snd _commentsAfter
              )
            _valuesOforceMultiline =
              ( False
              )
            _valuesOsomeElementsInListAreMultiline =
              ( False
              )
            _lhsOstatementCount =
              ( 1
              )
            _copy =
              ( AReturn pos_ _valuesIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _valuesOindent =
              ( _lhsIindent
              )
            _valuesOppconf =
              ( _lhsIppconf
              )
            (_valuesIcomments, _valuesIcopy, _valuesIisAssociative, _valuesIisLast, _valuesIisMultiline, _valuesIpos, _valuesIprecedence, _valuesIpretty) =
              values_ _valuesOcomments _valuesOforceMultiline _valuesOindent _valuesOppconf _valuesOsomeElementsInListAreMultiline
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty, _lhsOstatementCount)
        )
  )
sem_AReturn_NoReturn :: T_AReturn
sem_AReturn_NoReturn =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstatementCount :: Int
            _lhsOisMultiline :: Bool
            _lhsOcopy :: AReturn
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( empty
              )
            _lhsOstatementCount =
              ( 0
              )
            _lhsOisMultiline =
              ( False
              )
            _copy =
              ( NoReturn
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty, _lhsOstatementCount)
        )
  )

-- AST ---------------------------------------------------------
-- cata
sem_AST
  :: AST
  -> T_AST
sem_AST (AST _comments _chunk) =
  (sem_AST_AST _comments (sem_Block _chunk))

-- semantic domain
type T_AST =
  Int
  -> PrettyPrintConfig
  -> (AST, Bool, Doc)
data Inh_AST = Inh_AST {indent_Inh_AST :: Int, ppconf_Inh_AST :: PrettyPrintConfig}
data Syn_AST = Syn_AST {copy_Syn_AST :: AST, isMultiline_Syn_AST :: Bool, pretty_Syn_AST :: Doc}
wrap_AST
  :: T_AST
  -> Inh_AST
  -> Syn_AST
wrap_AST sem (Inh_AST _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcopy, _lhsOisMultiline, _lhsOpretty) = sem _lhsIindent _lhsIppconf
    in
      (Syn_AST _lhsOcopy _lhsOisMultiline _lhsOpretty)
  )
sem_AST_AST
  :: ([MToken])
  -> T_Block
  -> T_AST
sem_AST_AST comments_ chunk_ =
  ( \_lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _chunkOcomments :: ([MToken])
            _chunkOstatRegion :: Region
            _chunkOforceMultiline :: Bool
            _lhsOcopy :: AST
            _chunkOindent :: Int
            _chunkOppconf :: PrettyPrintConfig
            _chunkIcomments :: ([MToken])
            _chunkIcopy :: Block
            _chunkIisMultiline :: Bool
            _chunkIpretty :: Doc
            _chunkIstatementCount :: Int
            _lhsOpretty =
              ( _chunkIpretty $+$ _prettyComments
              )
            _lhsOisMultiline =
              ( _chunkIisMultiline
              )
            _prettyComments =
              ( renderMLComments _lhsIppconf _lhsIindent _chunkIcomments
              )
            _chunkOcomments =
              ( comments_
              )
            _chunkOstatRegion =
              ( emptyRg
              )
            _chunkOforceMultiline =
              ( False
              )
            _copy =
              ( AST comments_ _chunkIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _chunkOindent =
              ( _lhsIindent
              )
            _chunkOppconf =
              ( _lhsIppconf
              )
            (_chunkIcomments, _chunkIcopy, _chunkIisMultiline, _chunkIpretty, _chunkIstatementCount) =
              chunk_ _chunkOcomments _chunkOforceMultiline _chunkOindent _chunkOppconf _chunkOstatRegion
          in
            (_lhsOcopy, _lhsOisMultiline, _lhsOpretty)
        )
  )

-- Args --------------------------------------------------------
-- cata
sem_Args
  :: Args
  -> T_Args
sem_Args (ListArgs _args) =
  (sem_Args_ListArgs (sem_MExprList _args))
sem_Args (TableArg _arg) =
  (sem_Args_TableArg (sem_FieldList _arg))
sem_Args (StringArg _arg) =
  (sem_Args_StringArg _arg)

-- semantic domain
type T_Args =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), Args, Bool, Doc)
data Inh_Args = Inh_Args {comments_Inh_Args :: ([MToken]), forceMultiline_Inh_Args :: Bool, indent_Inh_Args :: Int, ppconf_Inh_Args :: PrettyPrintConfig}
data Syn_Args = Syn_Args {comments_Syn_Args :: ([MToken]), copy_Syn_Args :: Args, isMultiline_Syn_Args :: Bool, pretty_Syn_Args :: Doc}
wrap_Args
  :: T_Args
  -> Inh_Args
  -> Syn_Args
wrap_Args sem (Inh_Args _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_Args _lhsOcomments _lhsOcopy _lhsOisMultiline _lhsOpretty)
  )
sem_Args_ListArgs
  :: T_MExprList
  -> T_Args
sem_Args_ListArgs args_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _argsOindent :: Int
            _argsOsomeElementsInListAreMultiline :: Bool
            _lhsOcopy :: Args
            _lhsOcomments :: ([MToken])
            _argsOcomments :: ([MToken])
            _argsOforceMultiline :: Bool
            _argsOppconf :: PrettyPrintConfig
            _argsIcomments :: ([MToken])
            _argsIcopy :: MExprList
            _argsIisAssociative :: Bool
            _argsIisLast :: Bool
            _argsIisMultiline :: Bool
            _argsIpos :: Region
            _argsIprecedence :: OperatorLevel
            _argsIpretty :: Doc
            _lhsOpretty =
              ( if _argsIisMultiline
                  then
                    zchr '('
                      $+$ _argsIpretty
                      $+$ indent _lhsIppconf _lhsIindent (zchr ')')
                  else parens _lhsIppconf _emptyParams _argsIpretty
              )
            _lhsOisMultiline =
              ( _argsIisMultiline
              )
            _emptyParams =
              ( toEmpty $ null _argsIcopy
              )
            _argsOindent =
              ( if _argsIisMultiline then _lhsIindent + 1 else 0
              )
            _argsOsomeElementsInListAreMultiline =
              ( False
              )
            _copy =
              ( ListArgs _argsIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _argsIcomments
              )
            _argsOcomments =
              ( _lhsIcomments
              )
            _argsOforceMultiline =
              ( _lhsIforceMultiline
              )
            _argsOppconf =
              ( _lhsIppconf
              )
            (_argsIcomments, _argsIcopy, _argsIisAssociative, _argsIisLast, _argsIisMultiline, _argsIpos, _argsIprecedence, _argsIpretty) =
              args_ _argsOcomments _argsOforceMultiline _argsOindent _argsOppconf _argsOsomeElementsInListAreMultiline
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty)
        )
  )
sem_Args_TableArg
  :: T_FieldList
  -> T_Args
sem_Args_TableArg arg_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _argOindent :: Int
            _argOsomeElementsInListAreMultiline :: Bool
            _lhsOcopy :: Args
            _lhsOcomments :: ([MToken])
            _argOcomments :: ([MToken])
            _argOforceMultiline :: Bool
            _argOppconf :: PrettyPrintConfig
            _argIcomments :: ([MToken])
            _argIcopy :: FieldList
            _argIisMultiline :: Bool
            _argIisNil :: Bool
            _argIpretty :: Doc
            _lhsOpretty =
              ( if _argIisMultiline then _prettyMulti else _prettySingle
              )
            _lhsOisMultiline =
              ( _argIisMultiline
              )
            _prettyMulti =
              ( zchr '{' $+$ _argIpretty $+$ indent _lhsIppconf _lhsIindent (zchr '}')
              )
            _prettySingle =
              ( braces _lhsIppconf _emptyContents _argIpretty
              )
            _emptyContents =
              ( toEmpty $ null _argIcopy
              )
            _argOindent =
              ( _lhsIindent + (if _argIisMultiline then 1 else 0)
              )
            _argOsomeElementsInListAreMultiline =
              ( False
              )
            _copy =
              ( TableArg _argIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _argIcomments
              )
            _argOcomments =
              ( _lhsIcomments
              )
            _argOforceMultiline =
              ( _lhsIforceMultiline
              )
            _argOppconf =
              ( _lhsIppconf
              )
            (_argIcomments, _argIcopy, _argIisMultiline, _argIisNil, _argIpretty) =
              arg_ _argOcomments _argOforceMultiline _argOindent _argOppconf _argOsomeElementsInListAreMultiline
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty)
        )
  )
sem_Args_StringArg
  :: MToken
  -> T_Args
sem_Args_StringArg arg_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOcopy :: Args
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( tok arg_
              )
            _lhsOisMultiline =
              ( False
              )
            _copy =
              ( StringArg arg_
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty)
        )
  )

-- BinOp -------------------------------------------------------
-- cata
sem_BinOp
  :: BinOp
  -> T_BinOp
sem_BinOp (AOr) =
  (sem_BinOp_AOr)
sem_BinOp (AAnd) =
  (sem_BinOp_AAnd)
sem_BinOp (ALT) =
  (sem_BinOp_ALT)
sem_BinOp (AGT) =
  (sem_BinOp_AGT)
sem_BinOp (ALEQ) =
  (sem_BinOp_ALEQ)
sem_BinOp (AGEQ) =
  (sem_BinOp_AGEQ)
sem_BinOp (ANEq) =
  (sem_BinOp_ANEq)
sem_BinOp (AEq) =
  (sem_BinOp_AEq)
sem_BinOp (AConcatenate) =
  (sem_BinOp_AConcatenate)
sem_BinOp (APlus) =
  (sem_BinOp_APlus)
sem_BinOp (BinMinus) =
  (sem_BinOp_BinMinus)
sem_BinOp (AMultiply) =
  (sem_BinOp_AMultiply)
sem_BinOp (ADivide) =
  (sem_BinOp_ADivide)
sem_BinOp (AModulus) =
  (sem_BinOp_AModulus)
sem_BinOp (APower) =
  (sem_BinOp_APower)

-- semantic domain
type T_BinOp =
  ([MToken])
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), BinOp, Bool, Bool, OperatorLevel, Doc)
data Inh_BinOp = Inh_BinOp {comments_Inh_BinOp :: ([MToken]), indent_Inh_BinOp :: Int, ppconf_Inh_BinOp :: PrettyPrintConfig}
data Syn_BinOp = Syn_BinOp {comments_Syn_BinOp :: ([MToken]), copy_Syn_BinOp :: BinOp, isAssociative_Syn_BinOp :: Bool, isMultiline_Syn_BinOp :: Bool, precedence_Syn_BinOp :: OperatorLevel, pretty_Syn_BinOp :: Doc}
wrap_BinOp
  :: T_BinOp
  -> Inh_BinOp
  -> Syn_BinOp
wrap_BinOp sem (Inh_BinOp _lhsIcomments _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty) = sem _lhsIcomments _lhsIindent _lhsIppconf
    in
      (Syn_BinOp _lhsOcomments _lhsOcopy _lhsOisAssociative _lhsOisMultiline _lhsOprecedence _lhsOpretty)
  )
sem_BinOp_AOr :: T_BinOp
sem_BinOp_AOr =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText (if cStyle _lhsIppconf then "||" else "or")
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel1
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( AOr
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_AAnd :: T_BinOp
sem_BinOp_AAnd =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText (if cStyle _lhsIppconf then "&&" else "and")
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel2
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( AAnd
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_ALT :: T_BinOp
sem_BinOp_ALT =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "<"
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel3
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( ALT
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_AGT :: T_BinOp
sem_BinOp_AGT =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText ">"
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel3
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( AGT
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_ALEQ :: T_BinOp
sem_BinOp_ALEQ =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "<="
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel3
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( ALEQ
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_AGEQ :: T_BinOp
sem_BinOp_AGEQ =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText ">="
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel3
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( AGEQ
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_ANEq :: T_BinOp
sem_BinOp_ANEq =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText (if cStyle _lhsIppconf then "!=" else "~=")
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel3
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( ANEq
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_AEq :: T_BinOp
sem_BinOp_AEq =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "=="
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel3
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( AEq
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_AConcatenate :: T_BinOp
sem_BinOp_AConcatenate =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText ".."
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel4
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( AConcatenate
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_APlus :: T_BinOp
sem_BinOp_APlus =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "+"
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel5
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( APlus
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_BinMinus :: T_BinOp
sem_BinOp_BinMinus =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "-"
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel5
              )
            _lhsOisAssociative =
              ( False
              )
            _copy =
              ( BinMinus
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_AMultiply :: T_BinOp
sem_BinOp_AMultiply =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "*"
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel6
              )
            _lhsOisAssociative =
              ( True
              )
            _copy =
              ( AMultiply
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_ADivide :: T_BinOp
sem_BinOp_ADivide =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "/"
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel6
              )
            _lhsOisAssociative =
              ( False
              )
            _copy =
              ( ADivide
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_AModulus :: T_BinOp
sem_BinOp_AModulus =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "%"
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel6
              )
            _lhsOisAssociative =
              ( False
              )
            _copy =
              ( AModulus
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_BinOp_APower :: T_BinOp
sem_BinOp_APower =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOcopy :: BinOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "^"
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _lhsOisAssociative =
              ( False
              )
            _copy =
              ( APower
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )

-- Block -------------------------------------------------------
-- cata
sem_Block
  :: Block
  -> T_Block
sem_Block (Block _stats _ret) =
  (sem_Block_Block (sem_MStatList _stats) (sem_AReturn _ret))

-- semantic domain
type T_Block =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> Region
  -> (([MToken]), Block, Bool, Doc, Int)
data Inh_Block = Inh_Block {comments_Inh_Block :: ([MToken]), forceMultiline_Inh_Block :: Bool, indent_Inh_Block :: Int, ppconf_Inh_Block :: PrettyPrintConfig, statRegion_Inh_Block :: Region}
data Syn_Block = Syn_Block {comments_Syn_Block :: ([MToken]), copy_Syn_Block :: Block, isMultiline_Syn_Block :: Bool, pretty_Syn_Block :: Doc, statementCount_Syn_Block :: Int}
wrap_Block
  :: T_Block
  -> Inh_Block
  -> Syn_Block
wrap_Block sem (Inh_Block _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIstatRegion) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty, _lhsOstatementCount) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIstatRegion
    in
      (Syn_Block _lhsOcomments _lhsOcopy _lhsOisMultiline _lhsOpretty _lhsOstatementCount)
  )
sem_Block_Block
  :: T_MStatList
  -> T_AReturn
  -> T_Block
sem_Block_Block stats_ ret_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstatementCount :: Int
            _lhsOcopy :: Block
            _lhsOcomments :: ([MToken])
            _lhsOisMultiline :: Bool
            _statsOcomments :: ([MToken])
            _statsOforceMultiline :: Bool
            _statsOindent :: Int
            _statsOppconf :: PrettyPrintConfig
            _statsOstatRegion :: Region
            _retOcomments :: ([MToken])
            _retOforceMultiline :: Bool
            _retOindent :: Int
            _retOppconf :: PrettyPrintConfig
            _statsIcomments :: ([MToken])
            _statsIcopy :: MStatList
            _statsIisLast :: Bool
            _statsIisMultiline :: Bool
            _statsIpretty :: Doc
            _statsIstartsWithExprPrefixExpression :: Bool
            _statsIstatementCount :: Int
            _retIcomments :: ([MToken])
            _retIcopy :: AReturn
            _retIisMultiline :: Bool
            _retIpretty :: Doc
            _retIstatementCount :: Int
            _lhsOpretty =
              ( if _isMultiline
                  then _statsIpretty $+$ _retIpretty
                  else _statsIpretty <-> _retIpretty
              )
            _statementCount =
              ( _statsIstatementCount + _retIstatementCount
              )
            _isMultiline =
              ( _statsIisMultiline || _retIisMultiline || _statementCount > 1
              )
            _lhsOstatementCount =
              ( _statementCount
              )
            _copy =
              ( Block _statsIcopy _retIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _retIcomments
              )
            _lhsOisMultiline =
              ( _isMultiline
              )
            _statsOcomments =
              ( _lhsIcomments
              )
            _statsOforceMultiline =
              ( _lhsIforceMultiline
              )
            _statsOindent =
              ( _lhsIindent
              )
            _statsOppconf =
              ( _lhsIppconf
              )
            _statsOstatRegion =
              ( _lhsIstatRegion
              )
            _retOcomments =
              ( _statsIcomments
              )
            _retOforceMultiline =
              ( _lhsIforceMultiline
              )
            _retOindent =
              ( _lhsIindent
              )
            _retOppconf =
              ( _lhsIppconf
              )
            (_statsIcomments, _statsIcopy, _statsIisLast, _statsIisMultiline, _statsIpretty, _statsIstartsWithExprPrefixExpression, _statsIstatementCount) =
              stats_ _statsOcomments _statsOforceMultiline _statsOindent _statsOppconf _statsOstatRegion
            (_retIcomments, _retIcopy, _retIisMultiline, _retIpretty, _retIstatementCount) =
              ret_ _retOcomments _retOforceMultiline _retOindent _retOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty, _lhsOstatementCount)
        )
  )

-- Declaration -------------------------------------------------
-- cata
sem_Declaration
  :: Declaration
  -> T_Declaration
sem_Declaration (x1, x2) =
  (sem_Declaration_Tuple (sem_PrefixExp x1) (sem_MaybeMExpr x2))

-- semantic domain
type T_Declaration =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), Declaration, Bool, Doc, Bool, Bool, Doc, Bool, Doc)
data Inh_Declaration = Inh_Declaration {comments_Inh_Declaration :: ([MToken]), forceMultiline_Inh_Declaration :: Bool, indent_Inh_Declaration :: Int, ppconf_Inh_Declaration :: PrettyPrintConfig}
data Syn_Declaration = Syn_Declaration {comments_Syn_Declaration :: ([MToken]), copy_Syn_Declaration :: Declaration, endsWithPrefixExpression_Syn_Declaration :: Bool, exprPretty_Syn_Declaration :: Doc, isDefined_Syn_Declaration :: Bool, isMultiline_Syn_Declaration :: Bool, pretty_Syn_Declaration :: Doc, startsWithExprPrefixExpression_Syn_Declaration :: Bool, varPretty_Syn_Declaration :: Doc}
wrap_Declaration
  :: T_Declaration
  -> Inh_Declaration
  -> Syn_Declaration
wrap_Declaration sem (Inh_Declaration _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOexprPretty, _lhsOisDefined, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOvarPretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_Declaration _lhsOcomments _lhsOcopy _lhsOendsWithPrefixExpression _lhsOexprPretty _lhsOisDefined _lhsOisMultiline _lhsOpretty _lhsOstartsWithExprPrefixExpression _lhsOvarPretty)
  )
sem_Declaration_Tuple
  :: T_PrefixExp
  -> T_MaybeMExpr
  -> T_Declaration
sem_Declaration_Tuple x1_ x2_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOvarPretty :: Doc
            _lhsOexprPretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _x1OparentOperatorPrecedence :: OperatorLevel
            _x1OparentOperatorAssociative :: Bool
            _lhsOisDefined :: Bool
            _lhsOcopy :: Declaration
            _lhsOcomments :: ([MToken])
            _lhsOpretty :: Doc
            _x1Ocomments :: ([MToken])
            _x1OforceMultiline :: Bool
            _x1Oindent :: Int
            _x1Oppconf :: PrettyPrintConfig
            _x2Ocomments :: ([MToken])
            _x2OforceMultiline :: Bool
            _x2Oindent :: Int
            _x2Oppconf :: PrettyPrintConfig
            _x1Icomments :: ([MToken])
            _x1Icopy :: PrefixExp
            _x1IisAssociative :: Bool
            _x1IisLiteral :: Bool
            _x1IisMultiline :: Bool
            _x1Iprecedence :: OperatorLevel
            _x1Ipretty :: Doc
            _x1IstartsWithExprPrefixExpression :: Bool
            _x2Icomments :: ([MToken])
            _x2Icopy :: MaybeMExpr
            _x2IendsWithPrefixExpression :: Bool
            _x2IisAssociative :: Bool
            _x2IisDefined :: Bool
            _x2IisMultiline :: Bool
            _x2Iprecedence :: OperatorLevel
            _x2Ipretty :: Doc
            _lhsOvarPretty =
              ( _x1Ipretty
              )
            _lhsOexprPretty =
              ( _x2Ipretty
              )
            _lhsOstartsWithExprPrefixExpression =
              ( _x1IstartsWithExprPrefixExpression
              )
            _lhsOendsWithPrefixExpression =
              ( _x2IendsWithPrefixExpression
              )
            _lhsOisMultiline =
              ( _x1IisMultiline || _x2IisMultiline
              )
            _x1OparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _x1OparentOperatorAssociative =
              ( True
              )
            _lhsOisDefined =
              ( _x2IisDefined
              )
            _copy =
              ( (_x1Icopy, _x2Icopy)
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _x2Icomments
              )
            _lhsOpretty =
              ( _x2Ipretty
              )
            _x1Ocomments =
              ( _lhsIcomments
              )
            _x1OforceMultiline =
              ( _lhsIforceMultiline
              )
            _x1Oindent =
              ( _lhsIindent
              )
            _x1Oppconf =
              ( _lhsIppconf
              )
            _x2Ocomments =
              ( _x1Icomments
              )
            _x2OforceMultiline =
              ( _lhsIforceMultiline
              )
            _x2Oindent =
              ( _lhsIindent
              )
            _x2Oppconf =
              ( _lhsIppconf
              )
            (_x1Icomments, _x1Icopy, _x1IisAssociative, _x1IisLiteral, _x1IisMultiline, _x1Iprecedence, _x1Ipretty, _x1IstartsWithExprPrefixExpression) =
              x1_ _x1Ocomments _x1OforceMultiline _x1Oindent _x1OparentOperatorAssociative _x1OparentOperatorPrecedence _x1Oppconf
            (_x2Icomments, _x2Icopy, _x2IendsWithPrefixExpression, _x2IisAssociative, _x2IisDefined, _x2IisMultiline, _x2Iprecedence, _x2Ipretty) =
              x2_ _x2Ocomments _x2OforceMultiline _x2Oindent _x2Oppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOexprPretty, _lhsOisDefined, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOvarPretty)
        )
  )

-- Else --------------------------------------------------------
-- cata
sem_Else
  :: Else
  -> T_Else
sem_Else (Prelude.Just x) =
  (sem_Else_Just (sem_MElse x))
sem_Else Prelude.Nothing =
  sem_Else_Nothing

-- semantic domain
type T_Else =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> Region
  -> (([MToken]), Else, Bool, Bool, Region, Doc)
data Inh_Else = Inh_Else {comments_Inh_Else :: ([MToken]), forceMultiline_Inh_Else :: Bool, indent_Inh_Else :: Int, ppconf_Inh_Else :: PrettyPrintConfig, statRegion_Inh_Else :: Region}
data Syn_Else = Syn_Else {comments_Syn_Else :: ([MToken]), copy_Syn_Else :: Else, elsesExist_Syn_Else :: Bool, isMultiline_Syn_Else :: Bool, pos_Syn_Else :: Region, pretty_Syn_Else :: Doc}
wrap_Else
  :: T_Else
  -> Inh_Else
  -> Syn_Else
wrap_Else sem (Inh_Else _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIstatRegion) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOelsesExist, _lhsOisMultiline, _lhsOpos, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIstatRegion
    in
      (Syn_Else _lhsOcomments _lhsOcopy _lhsOelsesExist _lhsOisMultiline _lhsOpos _lhsOpretty)
  )
sem_Else_Just
  :: T_MElse
  -> T_Else
sem_Else_Just just_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOelsesExist :: Bool
            _lhsOisMultiline :: Bool
            _lhsOcopy :: Else
            _lhsOcomments :: ([MToken])
            _lhsOpos :: Region
            _lhsOpretty :: Doc
            _justOcomments :: ([MToken])
            _justOforceMultiline :: Bool
            _justOindent :: Int
            _justOppconf :: PrettyPrintConfig
            _justOstatRegion :: Region
            _justIcomments :: ([MToken])
            _justIcopy :: MElse
            _justIelsesExist :: Bool
            _justIisMultiline :: Bool
            _justIpos :: Region
            _justIpretty :: Doc
            _lhsOelsesExist =
              ( True
              )
            _lhsOisMultiline =
              ( _justIisMultiline
              )
            _copy =
              ( Just _justIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _justIcomments
              )
            _lhsOpos =
              ( _justIpos
              )
            _lhsOpretty =
              ( _justIpretty
              )
            _justOcomments =
              ( _lhsIcomments
              )
            _justOforceMultiline =
              ( _lhsIforceMultiline
              )
            _justOindent =
              ( _lhsIindent
              )
            _justOppconf =
              ( _lhsIppconf
              )
            _justOstatRegion =
              ( _lhsIstatRegion
              )
            (_justIcomments, _justIcopy, _justIelsesExist, _justIisMultiline, _justIpos, _justIpretty) =
              just_ _justOcomments _justOforceMultiline _justOindent _justOppconf _justOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOelsesExist, _lhsOisMultiline, _lhsOpos, _lhsOpretty)
        )
  )
sem_Else_Nothing :: T_Else
sem_Else_Nothing =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOpos :: Region
            _lhsOisMultiline :: Bool
            _lhsOelsesExist :: Bool
            _lhsOcopy :: Else
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( empty
              )
            _lhsOpos =
              ( emptyRg
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOelsesExist =
              ( False
              )
            _copy =
              ( Nothing
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOelsesExist, _lhsOisMultiline, _lhsOpos, _lhsOpretty)
        )
  )

-- ElseIf ------------------------------------------------------
-- cata
sem_ElseIf
  :: ElseIf
  -> T_ElseIf
sem_ElseIf (x1, x2) =
  (sem_ElseIf_Tuple (sem_MExpr x1) (sem_Block x2))

-- semantic domain
type T_ElseIf =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), ElseIf, Bool, Doc)
data Inh_ElseIf = Inh_ElseIf {comments_Inh_ElseIf :: ([MToken]), forceMultiline_Inh_ElseIf :: Bool, indent_Inh_ElseIf :: Int, ppconf_Inh_ElseIf :: PrettyPrintConfig}
data Syn_ElseIf = Syn_ElseIf {comments_Syn_ElseIf :: ([MToken]), copy_Syn_ElseIf :: ElseIf, isMultiline_Syn_ElseIf :: Bool, pretty_Syn_ElseIf :: Doc}
wrap_ElseIf
  :: T_ElseIf
  -> Inh_ElseIf
  -> Syn_ElseIf
wrap_ElseIf sem (Inh_ElseIf _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_ElseIf _lhsOcomments _lhsOcopy _lhsOisMultiline _lhsOpretty)
  )
sem_ElseIf_Tuple
  :: T_MExpr
  -> T_Block
  -> T_ElseIf
sem_ElseIf_Tuple x1_ x2_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _x2Oindent :: Int
            _x2OstatRegion :: Region
            _x1OparentOperatorPrecedence :: OperatorLevel
            _x1OparentOperatorAssociative :: Bool
            _lhsOcopy :: ElseIf
            _lhsOcomments :: ([MToken])
            _x1Ocomments :: ([MToken])
            _x1OforceMultiline :: Bool
            _x1Oindent :: Int
            _x1Oppconf :: PrettyPrintConfig
            _x2Ocomments :: ([MToken])
            _x2OforceMultiline :: Bool
            _x2Oppconf :: PrettyPrintConfig
            _x1Icomments :: ([MToken])
            _x1Icopy :: MExpr
            _x1IendsWithPrefixExpression :: Bool
            _x1IisAssociative :: Bool
            _x1IisLiteral :: Bool
            _x1IisMultiline :: Bool
            _x1Ipos :: Region
            _x1Iprecedence :: OperatorLevel
            _x1Ipretty :: Doc
            _x2Icomments :: ([MToken])
            _x2Icopy :: Block
            _x2IisMultiline :: Bool
            _x2Ipretty :: Doc
            _x2IstatementCount :: Int
            _lhsOpretty =
              ( zeroWidthText "elseif" <-> _x1Ipretty <-> zeroWidthText "then" $+$ _x2Ipretty
              )
            _lhsOisMultiline =
              ( _x1IisMultiline || _x2IisMultiline
              )
            _x2Oindent =
              ( _lhsIindent + 1
              )
            _x2OstatRegion =
              ( emptyRg
              )
            _x1OparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _x1OparentOperatorAssociative =
              ( True
              )
            _copy =
              ( (_x1Icopy, _x2Icopy)
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _x2Icomments
              )
            _x1Ocomments =
              ( _lhsIcomments
              )
            _x1OforceMultiline =
              ( _lhsIforceMultiline
              )
            _x1Oindent =
              ( _lhsIindent
              )
            _x1Oppconf =
              ( _lhsIppconf
              )
            _x2Ocomments =
              ( _x1Icomments
              )
            _x2OforceMultiline =
              ( _lhsIforceMultiline
              )
            _x2Oppconf =
              ( _lhsIppconf
              )
            (_x1Icomments, _x1Icopy, _x1IendsWithPrefixExpression, _x1IisAssociative, _x1IisLiteral, _x1IisMultiline, _x1Ipos, _x1Iprecedence, _x1Ipretty) =
              x1_ _x1Ocomments _x1OforceMultiline _x1Oindent _x1OparentOperatorAssociative _x1OparentOperatorPrecedence _x1Oppconf
            (_x2Icomments, _x2Icopy, _x2IisMultiline, _x2Ipretty, _x2IstatementCount) =
              x2_ _x2Ocomments _x2OforceMultiline _x2Oindent _x2Oppconf _x2OstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty)
        )
  )

-- ElseIfList --------------------------------------------------
-- cata
sem_ElseIfList
  :: ElseIfList
  -> T_ElseIfList
sem_ElseIfList list =
  (Prelude.foldr sem_ElseIfList_Cons sem_ElseIfList_Nil (Prelude.map sem_MElseIf list))

-- semantic domain
type T_ElseIfList =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), ElseIfList, Bool, Bool, Region, Doc)
data Inh_ElseIfList = Inh_ElseIfList {comments_Inh_ElseIfList :: ([MToken]), forceMultiline_Inh_ElseIfList :: Bool, indent_Inh_ElseIfList :: Int, ppconf_Inh_ElseIfList :: PrettyPrintConfig}
data Syn_ElseIfList = Syn_ElseIfList {comments_Syn_ElseIfList :: ([MToken]), copy_Syn_ElseIfList :: ElseIfList, elsesExist_Syn_ElseIfList :: Bool, isMultiline_Syn_ElseIfList :: Bool, pos_Syn_ElseIfList :: Region, pretty_Syn_ElseIfList :: Doc}
wrap_ElseIfList
  :: T_ElseIfList
  -> Inh_ElseIfList
  -> Syn_ElseIfList
wrap_ElseIfList sem (Inh_ElseIfList _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOelsesExist, _lhsOisMultiline, _lhsOpos, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_ElseIfList _lhsOcomments _lhsOcopy _lhsOelsesExist _lhsOisMultiline _lhsOpos _lhsOpretty)
  )
sem_ElseIfList_Cons
  :: T_MElseIf
  -> T_ElseIfList
  -> T_ElseIfList
sem_ElseIfList_Cons hd_ tl_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOelsesExist :: Bool
            _lhsOpos :: Region
            _lhsOisMultiline :: Bool
            _lhsOcopy :: ElseIfList
            _lhsOcomments :: ([MToken])
            _hdOcomments :: ([MToken])
            _hdOforceMultiline :: Bool
            _hdOindent :: Int
            _hdOppconf :: PrettyPrintConfig
            _tlOcomments :: ([MToken])
            _tlOforceMultiline :: Bool
            _tlOindent :: Int
            _tlOppconf :: PrettyPrintConfig
            _hdIcomments :: ([MToken])
            _hdIcopy :: MElseIf
            _hdIisMultiline :: Bool
            _hdIpos :: Region
            _hdIpretty :: Doc
            _tlIcomments :: ([MToken])
            _tlIcopy :: ElseIfList
            _tlIelsesExist :: Bool
            _tlIisMultiline :: Bool
            _tlIpos :: Region
            _tlIpretty :: Doc
            _lhsOpretty =
              ( indent _lhsIppconf _lhsIindent _hdIpretty $+$ _tlIpretty
              )
            _lhsOelsesExist =
              ( True
              )
            _lhsOpos =
              ( _hdIpos
              )
            _lhsOisMultiline =
              ( _hdIisMultiline || _tlIisMultiline
              )
            _copy =
              ( (:) _hdIcopy _tlIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _tlIcomments
              )
            _hdOcomments =
              ( _lhsIcomments
              )
            _hdOforceMultiline =
              ( _lhsIforceMultiline
              )
            _hdOindent =
              ( _lhsIindent
              )
            _hdOppconf =
              ( _lhsIppconf
              )
            _tlOcomments =
              ( _hdIcomments
              )
            _tlOforceMultiline =
              ( _lhsIforceMultiline
              )
            _tlOindent =
              ( _lhsIindent
              )
            _tlOppconf =
              ( _lhsIppconf
              )
            (_hdIcomments, _hdIcopy, _hdIisMultiline, _hdIpos, _hdIpretty) =
              hd_ _hdOcomments _hdOforceMultiline _hdOindent _hdOppconf
            (_tlIcomments, _tlIcopy, _tlIelsesExist, _tlIisMultiline, _tlIpos, _tlIpretty) =
              tl_ _tlOcomments _tlOforceMultiline _tlOindent _tlOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOelsesExist, _lhsOisMultiline, _lhsOpos, _lhsOpretty)
        )
  )
sem_ElseIfList_Nil :: T_ElseIfList
sem_ElseIfList_Nil =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOpos :: Region
            _lhsOisMultiline :: Bool
            _lhsOelsesExist :: Bool
            _lhsOcopy :: ElseIfList
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( empty
              )
            _lhsOpos =
              ( emptyRg
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOelsesExist =
              ( False
              )
            _copy =
              ( []
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOelsesExist, _lhsOisMultiline, _lhsOpos, _lhsOpretty)
        )
  )

-- Expr --------------------------------------------------------
-- cata
sem_Expr
  :: Expr
  -> T_Expr
sem_Expr (ANil) =
  (sem_Expr_ANil)
sem_Expr (AFalse) =
  (sem_Expr_AFalse)
sem_Expr (ATrue) =
  (sem_Expr_ATrue)
sem_Expr (ANumber _num) =
  (sem_Expr_ANumber _num)
sem_Expr (AString _str) =
  (sem_Expr_AString _str)
sem_Expr (AVarArg) =
  (sem_Expr_AVarArg)
sem_Expr (AnonymousFunc _pars _body) =
  (sem_Expr_AnonymousFunc _pars (sem_Block _body))
sem_Expr (APrefixExpr _pexpr) =
  (sem_Expr_APrefixExpr (sem_PrefixExp _pexpr))
sem_Expr (ATableConstructor _fields) =
  (sem_Expr_ATableConstructor (sem_FieldList _fields))
sem_Expr (BinOpExpr _op _left _right) =
  (sem_Expr_BinOpExpr (sem_BinOp _op) (sem_MExpr _left) (sem_MExpr _right))
sem_Expr (UnOpExpr _op _right) =
  (sem_Expr_UnOpExpr (sem_UnOp _op) (sem_MExpr _right))

-- semantic domain
type T_Expr =
  ([MToken])
  -> Bool
  -> Int
  -> Bool
  -> OperatorLevel
  -> PrettyPrintConfig
  -> Region
  -> (([MToken]), Expr, Bool, Bool, Bool, Bool, OperatorLevel, Doc)
data Inh_Expr = Inh_Expr {comments_Inh_Expr :: ([MToken]), forceMultiline_Inh_Expr :: Bool, indent_Inh_Expr :: Int, parentOperatorAssociative_Inh_Expr :: Bool, parentOperatorPrecedence_Inh_Expr :: OperatorLevel, ppconf_Inh_Expr :: PrettyPrintConfig, statRegion_Inh_Expr :: Region}
data Syn_Expr = Syn_Expr {comments_Syn_Expr :: ([MToken]), copy_Syn_Expr :: Expr, endsWithPrefixExpression_Syn_Expr :: Bool, isAssociative_Syn_Expr :: Bool, isLiteral_Syn_Expr :: Bool, isMultiline_Syn_Expr :: Bool, precedence_Syn_Expr :: OperatorLevel, pretty_Syn_Expr :: Doc}
wrap_Expr
  :: T_Expr
  -> Inh_Expr
  -> Syn_Expr
wrap_Expr sem (Inh_Expr _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIparentOperatorAssociative _lhsIparentOperatorPrecedence _lhsIppconf _lhsIstatRegion) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIparentOperatorAssociative _lhsIparentOperatorPrecedence _lhsIppconf _lhsIstatRegion
    in
      (Syn_Expr _lhsOcomments _lhsOcopy _lhsOendsWithPrefixExpression _lhsOisAssociative _lhsOisLiteral _lhsOisMultiline _lhsOprecedence _lhsOpretty)
  )
sem_Expr_ANil :: T_Expr
sem_Expr_ANil =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisLiteral :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "nil"
              )
            _lhsOisLiteral =
              ( True
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( ANil
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_AFalse :: T_Expr
sem_Expr_AFalse =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisLiteral :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "false"
              )
            _lhsOisLiteral =
              ( True
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( AFalse
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_ATrue :: T_Expr
sem_Expr_ATrue =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisLiteral :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "true"
              )
            _lhsOisLiteral =
              ( True
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( ATrue
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_ANumber
  :: String
  -> T_Expr
sem_Expr_ANumber num_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisLiteral :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText num_
              )
            _lhsOisLiteral =
              ( True
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( ANumber num_
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_AString
  :: MToken
  -> T_Expr
sem_Expr_AString str_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisLiteral :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( tok str_
              )
            _lhsOisLiteral =
              ( True
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( AString str_
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_AVarArg :: T_Expr
sem_Expr_AVarArg =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisLiteral :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "..."
              )
            _lhsOisLiteral =
              ( True
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( AVarArg
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_AnonymousFunc
  :: ([MToken])
  -> T_Block
  -> T_Expr
sem_Expr_AnonymousFunc pars_ body_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOendsWithPrefixExpression :: Bool
            _bodyOindent :: Int
            _lhsOpretty :: Doc
            _lhsOisAssociative :: Bool
            _lhsOisLiteral :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _lhsOisMultiline :: Bool
            _bodyOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _bodyOstatRegion :: Region
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _isMultiline =
              ( _lhsIforceMultiline || _bodyIisMultiline
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _singleLinePretty =
              ( zeroWidthText "function"
                  <> parens _lhsIppconf _emptyParams (printList tok (render _comma) pars_)
                    <-> _bodyIpretty
                    <-> zeroWidthText "end"
              )
            _multilinePretty =
              ( zeroWidthText "function"
                  <> parens _lhsIppconf _emptyParams (printList tok (render _comma) pars_)
                  $+$ _bodyIpretty
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "end")
              )
            _comma =
              ( (if spaceBeforeComma _lhsIppconf then zchr ' ' else empty)
                  <> zchr ','
                  <> (if spaceAfterComma _lhsIppconf then zchr ' ' else empty)
              )
            _emptyParams =
              ( toEmpty $ null pars_
              )
            _bodyOindent =
              ( if _isMultiline then _lhsIindent + 1 else 0
              )
            _lhsOpretty =
              ( if _isMultiline then _multilinePretty else _singleLinePretty
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOisLiteral =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( AnonymousFunc pars_ _bodyIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _bodyIcomments
              )
            _lhsOisMultiline =
              ( _isMultiline
              )
            _bodyOcomments =
              ( _lhsIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion
              )
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_APrefixExpr
  :: T_PrefixExp
  -> T_Expr
sem_Expr_APrefixExpr pexpr_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOisLiteral :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _pexprOcomments :: ([MToken])
            _pexprOforceMultiline :: Bool
            _pexprOindent :: Int
            _pexprOparentOperatorAssociative :: Bool
            _pexprOparentOperatorPrecedence :: OperatorLevel
            _pexprOppconf :: PrettyPrintConfig
            _pexprIcomments :: ([MToken])
            _pexprIcopy :: PrefixExp
            _pexprIisAssociative :: Bool
            _pexprIisLiteral :: Bool
            _pexprIisMultiline :: Bool
            _pexprIprecedence :: OperatorLevel
            _pexprIpretty :: Doc
            _pexprIstartsWithExprPrefixExpression :: Bool
            _lhsOpretty =
              ( _pexprIpretty
              )
            _lhsOendsWithPrefixExpression =
              ( True
              )
            _lhsOisMultiline =
              ( _pexprIisMultiline
              )
            _lhsOisAssociative =
              ( _pexprIisAssociative
              )
            _lhsOisLiteral =
              ( _pexprIisLiteral
              )
            _lhsOprecedence =
              ( _pexprIprecedence
              )
            _copy =
              ( APrefixExpr _pexprIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _pexprIcomments
              )
            _pexprOcomments =
              ( _lhsIcomments
              )
            _pexprOforceMultiline =
              ( _lhsIforceMultiline
              )
            _pexprOindent =
              ( _lhsIindent
              )
            _pexprOparentOperatorAssociative =
              ( _lhsIparentOperatorAssociative
              )
            _pexprOparentOperatorPrecedence =
              ( _lhsIparentOperatorPrecedence
              )
            _pexprOppconf =
              ( _lhsIppconf
              )
            (_pexprIcomments, _pexprIcopy, _pexprIisAssociative, _pexprIisLiteral, _pexprIisMultiline, _pexprIprecedence, _pexprIpretty, _pexprIstartsWithExprPrefixExpression) =
              pexpr_ _pexprOcomments _pexprOforceMultiline _pexprOindent _pexprOparentOperatorAssociative _pexprOparentOperatorPrecedence _pexprOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_ATableConstructor
  :: T_FieldList
  -> T_Expr
sem_Expr_ATableConstructor fields_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisLiteral :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _fieldsOindent :: Int
            _fieldsOsomeElementsInListAreMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _lhsOisMultiline :: Bool
            _fieldsOcomments :: ([MToken])
            _fieldsOforceMultiline :: Bool
            _fieldsOppconf :: PrettyPrintConfig
            _fieldsIcomments :: ([MToken])
            _fieldsIcopy :: FieldList
            _fieldsIisMultiline :: Bool
            _fieldsIisNil :: Bool
            _fieldsIpretty :: Doc
            _lhsOpretty =
              ( if _isMultiline then _prettyMulti else _prettySingle
              )
            _isMultiline =
              ( _lhsIforceMultiline || _fieldsIisMultiline
              )
            _lhsOisLiteral =
              ( True
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _prettyMulti =
              ( zchr '{' $+$ _fieldsIpretty $+$ indent _lhsIppconf _lhsIindent (zchr '}')
              )
            _prettySingle =
              ( braces _lhsIppconf _emptyContents _fieldsIpretty
              )
            _emptyContents =
              ( toEmpty $ null _fieldsIcopy
              )
            _fieldsOindent =
              ( _lhsIindent + (if _fieldsIisMultiline then 1 else 0)
              )
            _fieldsOsomeElementsInListAreMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( ATableConstructor _fieldsIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _fieldsIcomments
              )
            _lhsOisMultiline =
              ( _isMultiline
              )
            _fieldsOcomments =
              ( _lhsIcomments
              )
            _fieldsOforceMultiline =
              ( _lhsIforceMultiline
              )
            _fieldsOppconf =
              ( _lhsIppconf
              )
            (_fieldsIcomments, _fieldsIcopy, _fieldsIisMultiline, _fieldsIisNil, _fieldsIpretty) =
              fields_ _fieldsOcomments _fieldsOforceMultiline _fieldsOindent _fieldsOppconf _fieldsOsomeElementsInListAreMultiline
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_BinOpExpr
  :: T_BinOp
  -> T_MExpr
  -> T_MExpr
  -> T_Expr
sem_Expr_BinOpExpr op_ left_ right_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOisMultiline :: Bool
            _leftOparentOperatorPrecedence :: OperatorLevel
            _rightOparentOperatorPrecedence :: OperatorLevel
            _leftOparentOperatorAssociative :: Bool
            _rightOparentOperatorAssociative :: Bool
            _lhsOisAssociative :: Bool
            _lhsOisLiteral :: Bool
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _opOcomments :: ([MToken])
            _opOindent :: Int
            _opOppconf :: PrettyPrintConfig
            _leftOcomments :: ([MToken])
            _leftOforceMultiline :: Bool
            _leftOindent :: Int
            _leftOppconf :: PrettyPrintConfig
            _rightOcomments :: ([MToken])
            _rightOforceMultiline :: Bool
            _rightOindent :: Int
            _rightOppconf :: PrettyPrintConfig
            _opIcomments :: ([MToken])
            _opIcopy :: BinOp
            _opIisAssociative :: Bool
            _opIisMultiline :: Bool
            _opIprecedence :: OperatorLevel
            _opIpretty :: Doc
            _leftIcomments :: ([MToken])
            _leftIcopy :: MExpr
            _leftIendsWithPrefixExpression :: Bool
            _leftIisAssociative :: Bool
            _leftIisLiteral :: Bool
            _leftIisMultiline :: Bool
            _leftIpos :: Region
            _leftIprecedence :: OperatorLevel
            _leftIpretty :: Doc
            _rightIcomments :: ([MToken])
            _rightIcopy :: MExpr
            _rightIendsWithPrefixExpression :: Bool
            _rightIisAssociative :: Bool
            _rightIisLiteral :: Bool
            _rightIisMultiline :: Bool
            _rightIpos :: Region
            _rightIprecedence :: OperatorLevel
            _rightIpretty :: Doc
            _lhsOpretty =
              ( _leftIpretty <-> _opIpretty <-> _rightIpretty
              )
            _lhsOendsWithPrefixExpression =
              ( _rightIendsWithPrefixExpression
              )
            _lhsOprecedence =
              ( min _opIprecedence $ min _leftIprecedence _rightIprecedence
              )
            _lhsOisMultiline =
              ( _leftIisMultiline || _rightIisMultiline
              )
            _leftOparentOperatorPrecedence =
              ( _opIprecedence
              )
            _rightOparentOperatorPrecedence =
              ( _opIprecedence
              )
            _leftOparentOperatorAssociative =
              ( _opIisAssociative
              )
            _rightOparentOperatorAssociative =
              ( _opIisAssociative
              )
            _lhsOisAssociative =
              ( _opIisAssociative && _leftIisAssociative && _rightIisAssociative
              )
            _lhsOisLiteral =
              ( ((\_ _ -> False) _leftIisLiteral _rightIisLiteral)
              )
            _copy =
              ( BinOpExpr _opIcopy _leftIcopy _rightIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _rightIcomments
              )
            _opOcomments =
              ( _lhsIcomments
              )
            _opOindent =
              ( _lhsIindent
              )
            _opOppconf =
              ( _lhsIppconf
              )
            _leftOcomments =
              ( _opIcomments
              )
            _leftOforceMultiline =
              ( _lhsIforceMultiline
              )
            _leftOindent =
              ( _lhsIindent
              )
            _leftOppconf =
              ( _lhsIppconf
              )
            _rightOcomments =
              ( _leftIcomments
              )
            _rightOforceMultiline =
              ( _lhsIforceMultiline
              )
            _rightOindent =
              ( _lhsIindent
              )
            _rightOppconf =
              ( _lhsIppconf
              )
            (_opIcomments, _opIcopy, _opIisAssociative, _opIisMultiline, _opIprecedence, _opIpretty) =
              op_ _opOcomments _opOindent _opOppconf
            (_leftIcomments, _leftIcopy, _leftIendsWithPrefixExpression, _leftIisAssociative, _leftIisLiteral, _leftIisMultiline, _leftIpos, _leftIprecedence, _leftIpretty) =
              left_ _leftOcomments _leftOforceMultiline _leftOindent _leftOparentOperatorAssociative _leftOparentOperatorPrecedence _leftOppconf
            (_rightIcomments, _rightIcopy, _rightIendsWithPrefixExpression, _rightIisAssociative, _rightIisLiteral, _rightIisMultiline, _rightIpos, _rightIprecedence, _rightIpretty) =
              right_ _rightOcomments _rightOforceMultiline _rightOindent _rightOparentOperatorAssociative _rightOparentOperatorPrecedence _rightOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_Expr_UnOpExpr
  :: T_UnOp
  -> T_MExpr
  -> T_Expr
sem_Expr_UnOpExpr op_ right_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOprecedence :: OperatorLevel
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _rightOparentOperatorPrecedence :: OperatorLevel
            _lhsOisAssociative :: Bool
            _lhsOisLiteral :: Bool
            _lhsOcopy :: Expr
            _lhsOcomments :: ([MToken])
            _opOcomments :: ([MToken])
            _opOindent :: Int
            _opOppconf :: PrettyPrintConfig
            _rightOcomments :: ([MToken])
            _rightOforceMultiline :: Bool
            _rightOindent :: Int
            _rightOparentOperatorAssociative :: Bool
            _rightOppconf :: PrettyPrintConfig
            _opIcomments :: ([MToken])
            _opIcopy :: UnOp
            _opIisMultiline :: Bool
            _opIpretty :: Doc
            _rightIcomments :: ([MToken])
            _rightIcopy :: MExpr
            _rightIendsWithPrefixExpression :: Bool
            _rightIisAssociative :: Bool
            _rightIisLiteral :: Bool
            _rightIisMultiline :: Bool
            _rightIpos :: Region
            _rightIprecedence :: OperatorLevel
            _rightIpretty :: Doc
            _lhsOpretty =
              ( _opIpretty <> _rightIpretty
              )
            _lhsOprecedence =
              ( min _rightIprecedence OperatorLevel7
              )
            _lhsOendsWithPrefixExpression =
              ( _rightIendsWithPrefixExpression
              )
            _lhsOisMultiline =
              ( _opIisMultiline || _rightIisMultiline
              )
            _rightOparentOperatorPrecedence =
              ( OperatorLevel7
              )
            _lhsOisAssociative =
              ( _rightIisAssociative
              )
            _lhsOisLiteral =
              ( _rightIisLiteral
              )
            _copy =
              ( UnOpExpr _opIcopy _rightIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _rightIcomments
              )
            _opOcomments =
              ( _lhsIcomments
              )
            _opOindent =
              ( _lhsIindent
              )
            _opOppconf =
              ( _lhsIppconf
              )
            _rightOcomments =
              ( _opIcomments
              )
            _rightOforceMultiline =
              ( _lhsIforceMultiline
              )
            _rightOindent =
              ( _lhsIindent
              )
            _rightOparentOperatorAssociative =
              ( _lhsIparentOperatorAssociative
              )
            _rightOppconf =
              ( _lhsIppconf
              )
            (_opIcomments, _opIcopy, _opIisMultiline, _opIpretty) =
              op_ _opOcomments _opOindent _opOppconf
            (_rightIcomments, _rightIcopy, _rightIendsWithPrefixExpression, _rightIisAssociative, _rightIisLiteral, _rightIisMultiline, _rightIpos, _rightIprecedence, _rightIpretty) =
              right_ _rightOcomments _rightOforceMultiline _rightOindent _rightOparentOperatorAssociative _rightOparentOperatorPrecedence _rightOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )

-- ExprSuffixList ----------------------------------------------
-- cata
sem_ExprSuffixList
  :: ExprSuffixList
  -> T_ExprSuffixList
sem_ExprSuffixList list =
  (Prelude.foldr sem_ExprSuffixList_Cons sem_ExprSuffixList_Nil (Prelude.map sem_PFExprSuffix list))

-- semantic domain
type T_ExprSuffixList =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), ExprSuffixList, Bool, Bool, OperatorLevel, Doc)
data Inh_ExprSuffixList = Inh_ExprSuffixList {comments_Inh_ExprSuffixList :: ([MToken]), forceMultiline_Inh_ExprSuffixList :: Bool, indent_Inh_ExprSuffixList :: Int, ppconf_Inh_ExprSuffixList :: PrettyPrintConfig}
data Syn_ExprSuffixList = Syn_ExprSuffixList {comments_Syn_ExprSuffixList :: ([MToken]), copy_Syn_ExprSuffixList :: ExprSuffixList, isAssociative_Syn_ExprSuffixList :: Bool, isMultiline_Syn_ExprSuffixList :: Bool, precedence_Syn_ExprSuffixList :: OperatorLevel, pretty_Syn_ExprSuffixList :: Doc}
wrap_ExprSuffixList
  :: T_ExprSuffixList
  -> Inh_ExprSuffixList
  -> Syn_ExprSuffixList
wrap_ExprSuffixList sem (Inh_ExprSuffixList _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_ExprSuffixList _lhsOcomments _lhsOcopy _lhsOisAssociative _lhsOisMultiline _lhsOprecedence _lhsOpretty)
  )
sem_ExprSuffixList_Cons
  :: T_PFExprSuffix
  -> T_ExprSuffixList
  -> T_ExprSuffixList
sem_ExprSuffixList_Cons hd_ tl_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: ExprSuffixList
            _lhsOcomments :: ([MToken])
            _hdOcomments :: ([MToken])
            _hdOforceMultiline :: Bool
            _hdOindent :: Int
            _hdOppconf :: PrettyPrintConfig
            _tlOcomments :: ([MToken])
            _tlOforceMultiline :: Bool
            _tlOindent :: Int
            _tlOppconf :: PrettyPrintConfig
            _hdIcomments :: ([MToken])
            _hdIcopy :: PFExprSuffix
            _hdIisAssociative :: Bool
            _hdIisMultiline :: Bool
            _hdIprecedence :: OperatorLevel
            _hdIpretty :: Doc
            _tlIcomments :: ([MToken])
            _tlIcopy :: ExprSuffixList
            _tlIisAssociative :: Bool
            _tlIisMultiline :: Bool
            _tlIprecedence :: OperatorLevel
            _tlIpretty :: Doc
            _lhsOpretty =
              ( _hdIpretty <> _tlIpretty
              )
            _lhsOisMultiline =
              ( _hdIisMultiline || _tlIisMultiline
              )
            _lhsOisAssociative =
              ( _hdIisAssociative && _tlIisAssociative
              )
            _lhsOprecedence =
              ( (min _hdIprecedence _tlIprecedence)
              )
            _copy =
              ( (:) _hdIcopy _tlIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _tlIcomments
              )
            _hdOcomments =
              ( _lhsIcomments
              )
            _hdOforceMultiline =
              ( _lhsIforceMultiline
              )
            _hdOindent =
              ( _lhsIindent
              )
            _hdOppconf =
              ( _lhsIppconf
              )
            _tlOcomments =
              ( _hdIcomments
              )
            _tlOforceMultiline =
              ( _lhsIforceMultiline
              )
            _tlOindent =
              ( _lhsIindent
              )
            _tlOppconf =
              ( _lhsIppconf
              )
            (_hdIcomments, _hdIcopy, _hdIisAssociative, _hdIisMultiline, _hdIprecedence, _hdIpretty) =
              hd_ _hdOcomments _hdOforceMultiline _hdOindent _hdOppconf
            (_tlIcomments, _tlIcopy, _tlIisAssociative, _tlIisMultiline, _tlIprecedence, _tlIpretty) =
              tl_ _tlOcomments _tlOforceMultiline _tlOindent _tlOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_ExprSuffixList_Nil :: T_ExprSuffixList
sem_ExprSuffixList_Nil =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: ExprSuffixList
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( empty
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( []
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )

-- Field -------------------------------------------------------
-- cata
sem_Field
  :: Field
  -> T_Field
sem_Field (ExprField _key _value _sep) =
  (sem_Field_ExprField (sem_MExpr _key) (sem_MExpr _value) (sem_FieldSep _sep))
sem_Field (NamedField _key _value _sep) =
  (sem_Field_NamedField _key (sem_MExpr _value) (sem_FieldSep _sep))
sem_Field (UnnamedField _value _sep) =
  (sem_Field_UnnamedField (sem_MExpr _value) (sem_FieldSep _sep))

-- semantic domain
type T_Field =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), Field, Bool, Bool, Region, Doc)
data Inh_Field = Inh_Field {comments_Inh_Field :: ([MToken]), forceMultiline_Inh_Field :: Bool, indent_Inh_Field :: Int, ppconf_Inh_Field :: PrettyPrintConfig}
data Syn_Field = Syn_Field {comments_Syn_Field :: ([MToken]), copy_Syn_Field :: Field, isMultiline_Syn_Field :: Bool, isSemiColon_Syn_Field :: Bool, pos_Syn_Field :: Region, pretty_Syn_Field :: Doc}
wrap_Field
  :: T_Field
  -> Inh_Field
  -> Syn_Field
wrap_Field sem (Inh_Field _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOisSemiColon, _lhsOpos, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_Field _lhsOcomments _lhsOcopy _lhsOisMultiline _lhsOisSemiColon _lhsOpos _lhsOpretty)
  )
sem_Field_ExprField
  :: T_MExpr
  -> T_MExpr
  -> T_FieldSep
  -> T_Field
sem_Field_ExprField key_ value_ sep_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _keyOparentOperatorPrecedence :: OperatorLevel
            _keyOparentOperatorAssociative :: Bool
            _valueOparentOperatorPrecedence :: OperatorLevel
            _valueOparentOperatorAssociative :: Bool
            _lhsOisSemiColon :: Bool
            _lhsOcopy :: Field
            _lhsOcomments :: ([MToken])
            _lhsOpos :: Region
            _keyOcomments :: ([MToken])
            _keyOforceMultiline :: Bool
            _keyOindent :: Int
            _keyOppconf :: PrettyPrintConfig
            _valueOcomments :: ([MToken])
            _valueOforceMultiline :: Bool
            _valueOindent :: Int
            _valueOppconf :: PrettyPrintConfig
            _sepOindent :: Int
            _sepOppconf :: PrettyPrintConfig
            _keyIcomments :: ([MToken])
            _keyIcopy :: MExpr
            _keyIendsWithPrefixExpression :: Bool
            _keyIisAssociative :: Bool
            _keyIisLiteral :: Bool
            _keyIisMultiline :: Bool
            _keyIpos :: Region
            _keyIprecedence :: OperatorLevel
            _keyIpretty :: Doc
            _valueIcomments :: ([MToken])
            _valueIcopy :: MExpr
            _valueIendsWithPrefixExpression :: Bool
            _valueIisAssociative :: Bool
            _valueIisLiteral :: Bool
            _valueIisMultiline :: Bool
            _valueIpos :: Region
            _valueIprecedence :: OperatorLevel
            _valueIpretty :: Doc
            _sepIcopy :: FieldSep
            _sepIisMultiline :: Bool
            _sepIisSemiColon :: Bool
            _sepIpretty :: Doc
            _lhsOpretty =
              ( brackets _lhsIppconf _keyIpretty <-> zchr '=' <-> _valueIpretty <> _sepIpretty
              )
            _lhsOisMultiline =
              ( True
              )
            _keyOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _keyOparentOperatorAssociative =
              ( True
              )
            _valueOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _valueOparentOperatorAssociative =
              ( True
              )
            _lhsOisSemiColon =
              ( _sepIisSemiColon
              )
            _copy =
              ( ExprField _keyIcopy _valueIcopy _sepIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _valueIcomments
              )
            _lhsOpos =
              ( _valueIpos
              )
            _keyOcomments =
              ( _lhsIcomments
              )
            _keyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _keyOindent =
              ( _lhsIindent
              )
            _keyOppconf =
              ( _lhsIppconf
              )
            _valueOcomments =
              ( _keyIcomments
              )
            _valueOforceMultiline =
              ( _lhsIforceMultiline
              )
            _valueOindent =
              ( _lhsIindent
              )
            _valueOppconf =
              ( _lhsIppconf
              )
            _sepOindent =
              ( _lhsIindent
              )
            _sepOppconf =
              ( _lhsIppconf
              )
            (_keyIcomments, _keyIcopy, _keyIendsWithPrefixExpression, _keyIisAssociative, _keyIisLiteral, _keyIisMultiline, _keyIpos, _keyIprecedence, _keyIpretty) =
              key_ _keyOcomments _keyOforceMultiline _keyOindent _keyOparentOperatorAssociative _keyOparentOperatorPrecedence _keyOppconf
            (_valueIcomments, _valueIcopy, _valueIendsWithPrefixExpression, _valueIisAssociative, _valueIisLiteral, _valueIisMultiline, _valueIpos, _valueIprecedence, _valueIpretty) =
              value_ _valueOcomments _valueOforceMultiline _valueOindent _valueOparentOperatorAssociative _valueOparentOperatorPrecedence _valueOppconf
            (_sepIcopy, _sepIisMultiline, _sepIisSemiColon, _sepIpretty) =
              sep_ _sepOindent _sepOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOisSemiColon, _lhsOpos, _lhsOpretty)
        )
  )
sem_Field_NamedField
  :: MToken
  -> T_MExpr
  -> T_FieldSep
  -> T_Field
sem_Field_NamedField key_ value_ sep_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _valueOparentOperatorPrecedence :: OperatorLevel
            _valueOparentOperatorAssociative :: Bool
            _lhsOisSemiColon :: Bool
            _lhsOcopy :: Field
            _lhsOcomments :: ([MToken])
            _lhsOpos :: Region
            _valueOcomments :: ([MToken])
            _valueOforceMultiline :: Bool
            _valueOindent :: Int
            _valueOppconf :: PrettyPrintConfig
            _sepOindent :: Int
            _sepOppconf :: PrettyPrintConfig
            _valueIcomments :: ([MToken])
            _valueIcopy :: MExpr
            _valueIendsWithPrefixExpression :: Bool
            _valueIisAssociative :: Bool
            _valueIisLiteral :: Bool
            _valueIisMultiline :: Bool
            _valueIpos :: Region
            _valueIprecedence :: OperatorLevel
            _valueIpretty :: Doc
            _sepIcopy :: FieldSep
            _sepIisMultiline :: Bool
            _sepIisSemiColon :: Bool
            _sepIpretty :: Doc
            _lhsOpretty =
              ( tok key_ <-> zchr '=' <-> _valueIpretty <> _sepIpretty
              )
            _lhsOisMultiline =
              ( True
              )
            _valueOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _valueOparentOperatorAssociative =
              ( True
              )
            _lhsOisSemiColon =
              ( _sepIisSemiColon
              )
            _copy =
              ( NamedField key_ _valueIcopy _sepIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _valueIcomments
              )
            _lhsOpos =
              ( _valueIpos
              )
            _valueOcomments =
              ( _lhsIcomments
              )
            _valueOforceMultiline =
              ( _lhsIforceMultiline
              )
            _valueOindent =
              ( _lhsIindent
              )
            _valueOppconf =
              ( _lhsIppconf
              )
            _sepOindent =
              ( _lhsIindent
              )
            _sepOppconf =
              ( _lhsIppconf
              )
            (_valueIcomments, _valueIcopy, _valueIendsWithPrefixExpression, _valueIisAssociative, _valueIisLiteral, _valueIisMultiline, _valueIpos, _valueIprecedence, _valueIpretty) =
              value_ _valueOcomments _valueOforceMultiline _valueOindent _valueOparentOperatorAssociative _valueOparentOperatorPrecedence _valueOppconf
            (_sepIcopy, _sepIisMultiline, _sepIisSemiColon, _sepIpretty) =
              sep_ _sepOindent _sepOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOisSemiColon, _lhsOpos, _lhsOpretty)
        )
  )
sem_Field_UnnamedField
  :: T_MExpr
  -> T_FieldSep
  -> T_Field
sem_Field_UnnamedField value_ sep_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _valueOparentOperatorPrecedence :: OperatorLevel
            _valueOparentOperatorAssociative :: Bool
            _lhsOisSemiColon :: Bool
            _lhsOcopy :: Field
            _lhsOcomments :: ([MToken])
            _lhsOpos :: Region
            _valueOcomments :: ([MToken])
            _valueOforceMultiline :: Bool
            _valueOindent :: Int
            _valueOppconf :: PrettyPrintConfig
            _sepOindent :: Int
            _sepOppconf :: PrettyPrintConfig
            _valueIcomments :: ([MToken])
            _valueIcopy :: MExpr
            _valueIendsWithPrefixExpression :: Bool
            _valueIisAssociative :: Bool
            _valueIisLiteral :: Bool
            _valueIisMultiline :: Bool
            _valueIpos :: Region
            _valueIprecedence :: OperatorLevel
            _valueIpretty :: Doc
            _sepIcopy :: FieldSep
            _sepIisMultiline :: Bool
            _sepIisSemiColon :: Bool
            _sepIpretty :: Doc
            _lhsOpretty =
              ( _valueIpretty <> _sepIpretty
              )
            _lhsOisMultiline =
              ( _valueIisMultiline || _sepIisMultiline
              )
            _valueOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _valueOparentOperatorAssociative =
              ( True
              )
            _lhsOisSemiColon =
              ( _sepIisSemiColon
              )
            _copy =
              ( UnnamedField _valueIcopy _sepIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _valueIcomments
              )
            _lhsOpos =
              ( _valueIpos
              )
            _valueOcomments =
              ( _lhsIcomments
              )
            _valueOforceMultiline =
              ( _lhsIforceMultiline
              )
            _valueOindent =
              ( _lhsIindent
              )
            _valueOppconf =
              ( _lhsIppconf
              )
            _sepOindent =
              ( _lhsIindent
              )
            _sepOppconf =
              ( _lhsIppconf
              )
            (_valueIcomments, _valueIcopy, _valueIendsWithPrefixExpression, _valueIisAssociative, _valueIisLiteral, _valueIisMultiline, _valueIpos, _valueIprecedence, _valueIpretty) =
              value_ _valueOcomments _valueOforceMultiline _valueOindent _valueOparentOperatorAssociative _valueOparentOperatorPrecedence _valueOppconf
            (_sepIcopy, _sepIisMultiline, _sepIisSemiColon, _sepIpretty) =
              sep_ _sepOindent _sepOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOisSemiColon, _lhsOpos, _lhsOpretty)
        )
  )

-- FieldList ---------------------------------------------------
-- cata
sem_FieldList
  :: FieldList
  -> T_FieldList
sem_FieldList list =
  (Prelude.foldr sem_FieldList_Cons sem_FieldList_Nil (Prelude.map sem_Field list))

-- semantic domain
type T_FieldList =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> Bool
  -> (([MToken]), FieldList, Bool, Bool, Doc)
data Inh_FieldList = Inh_FieldList {comments_Inh_FieldList :: ([MToken]), forceMultiline_Inh_FieldList :: Bool, indent_Inh_FieldList :: Int, ppconf_Inh_FieldList :: PrettyPrintConfig, someElementsInListAreMultiline_Inh_FieldList :: Bool}
data Syn_FieldList = Syn_FieldList {comments_Syn_FieldList :: ([MToken]), copy_Syn_FieldList :: FieldList, isMultiline_Syn_FieldList :: Bool, isNil_Syn_FieldList :: Bool, pretty_Syn_FieldList :: Doc}
wrap_FieldList
  :: T_FieldList
  -> Inh_FieldList
  -> Syn_FieldList
wrap_FieldList sem (Inh_FieldList _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIsomeElementsInListAreMultiline) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOisNil, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIsomeElementsInListAreMultiline
    in
      (Syn_FieldList _lhsOcomments _lhsOcopy _lhsOisMultiline _lhsOisNil _lhsOpretty)
  )
sem_FieldList_Cons
  :: T_Field
  -> T_FieldList
  -> T_FieldList
sem_FieldList_Cons hd_ tl_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIsomeElementsInListAreMultiline ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisNil :: Bool
            _tlOsomeElementsInListAreMultiline :: Bool
            _hdOcomments :: ([MToken])
            _tlOcomments :: ([MToken])
            _lhsOcomments :: ([MToken])
            _lhsOcopy :: FieldList
            _lhsOisMultiline :: Bool
            _hdOforceMultiline :: Bool
            _hdOindent :: Int
            _hdOppconf :: PrettyPrintConfig
            _tlOforceMultiline :: Bool
            _tlOindent :: Int
            _tlOppconf :: PrettyPrintConfig
            _hdIcomments :: ([MToken])
            _hdIcopy :: Field
            _hdIisMultiline :: Bool
            _hdIisSemiColon :: Bool
            _hdIpos :: Region
            _hdIpretty :: Doc
            _tlIcomments :: ([MToken])
            _tlIcopy :: FieldList
            _tlIisMultiline :: Bool
            _tlIisNil :: Bool
            _tlIpretty :: Doc
            _lhsOpretty =
              ( if _isMultiline
                  then
                    renderMLComments _lhsIppconf _lhsIindent (fst _commentsBefore)
                      $+$ indent _lhsIppconf _lhsIindent _hdIpretty
                        <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfter)
                      $+$ _tlIpretty
                  else
                    _hdIpretty
                      `_optionalSpaceAfterSep` _tlIpretty
              )
            _lhsOisNil =
              ( False
              )
            _optionalSpaceAfterSep =
              ( if spaceAfterComma _lhsIppconf then (<->) else (<>)
              )
            _isMultiline =
              ( _lhsIforceMultiline
                  || _hdIisMultiline
                  || _tlIisMultiline
                  || _lhsIsomeElementsInListAreMultiline
                  || not (null $ fst _commentsBefore)
                  || not (null $ fst _commentsAfter)
              )
            _tlOsomeElementsInListAreMultiline =
              ( _lhsIsomeElementsInListAreMultiline
                  || _hdIisMultiline
                  || not (null $ fst _commentsBefore)
                  || not (null $ fst _commentsAfter)
              )
            _commentsBefore =
              ( span (\(MToken pos _) -> pos `before` _hdIpos) _lhsIcomments
              )
            _hdOcomments =
              ( snd _commentsBefore
              )
            _commentsAfter =
              ( span (\(MToken pos _) -> pos `beforeOrOnLine` _hdIpos) _hdIcomments
              )
            _tlOcomments =
              ( snd _commentsAfter
              )
            _lhsOcomments =
              ( _tlIcomments
              )
            _copy =
              ( (:) _hdIcopy _tlIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOisMultiline =
              ( _isMultiline
              )
            _hdOforceMultiline =
              ( _lhsIforceMultiline
              )
            _hdOindent =
              ( _lhsIindent
              )
            _hdOppconf =
              ( _lhsIppconf
              )
            _tlOforceMultiline =
              ( _lhsIforceMultiline
              )
            _tlOindent =
              ( _lhsIindent
              )
            _tlOppconf =
              ( _lhsIppconf
              )
            (_hdIcomments, _hdIcopy, _hdIisMultiline, _hdIisSemiColon, _hdIpos, _hdIpretty) =
              hd_ _hdOcomments _hdOforceMultiline _hdOindent _hdOppconf
            (_tlIcomments, _tlIcopy, _tlIisMultiline, _tlIisNil, _tlIpretty) =
              tl_ _tlOcomments _tlOforceMultiline _tlOindent _tlOppconf _tlOsomeElementsInListAreMultiline
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOisNil, _lhsOpretty)
        )
  )
sem_FieldList_Nil :: T_FieldList
sem_FieldList_Nil =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIsomeElementsInListAreMultiline ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisNil :: Bool
            _lhsOisMultiline :: Bool
            _lhsOcopy :: FieldList
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( empty
              )
            _lhsOisNil =
              ( True
              )
            _lhsOisMultiline =
              ( False
              )
            _copy =
              ( []
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOisNil, _lhsOpretty)
        )
  )

-- FieldSep ----------------------------------------------------
-- cata
sem_FieldSep
  :: FieldSep
  -> T_FieldSep
sem_FieldSep (CommaSep) =
  (sem_FieldSep_CommaSep)
sem_FieldSep (SemicolonSep) =
  (sem_FieldSep_SemicolonSep)
sem_FieldSep (NoSep) =
  (sem_FieldSep_NoSep)

-- semantic domain
type T_FieldSep =
  Int
  -> PrettyPrintConfig
  -> (FieldSep, Bool, Bool, Doc)
data Inh_FieldSep = Inh_FieldSep {indent_Inh_FieldSep :: Int, ppconf_Inh_FieldSep :: PrettyPrintConfig}
data Syn_FieldSep = Syn_FieldSep {copy_Syn_FieldSep :: FieldSep, isMultiline_Syn_FieldSep :: Bool, isSemiColon_Syn_FieldSep :: Bool, pretty_Syn_FieldSep :: Doc}
wrap_FieldSep
  :: T_FieldSep
  -> Inh_FieldSep
  -> Syn_FieldSep
wrap_FieldSep sem (Inh_FieldSep _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcopy, _lhsOisMultiline, _lhsOisSemiColon, _lhsOpretty) = sem _lhsIindent _lhsIppconf
    in
      (Syn_FieldSep _lhsOcopy _lhsOisMultiline _lhsOisSemiColon _lhsOpretty)
  )
sem_FieldSep_CommaSep :: T_FieldSep
sem_FieldSep_CommaSep =
  ( \_lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOisSemiColon :: Bool
            _lhsOcopy :: FieldSep
            _lhsOpretty =
              ( (if spaceBeforeComma _lhsIppconf then zchr ' ' else empty) <> zchr ','
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisSemiColon =
              ( False
              )
            _copy =
              ( CommaSep
              )
            _lhsOcopy =
              ( _copy
              )
          in
            (_lhsOcopy, _lhsOisMultiline, _lhsOisSemiColon, _lhsOpretty)
        )
  )
sem_FieldSep_SemicolonSep :: T_FieldSep
sem_FieldSep_SemicolonSep =
  ( \_lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisSemiColon :: Bool
            _lhsOisMultiline :: Bool
            _lhsOcopy :: FieldSep
            _lhsOpretty =
              ( (if spaceBeforeComma _lhsIppconf then zchr ' ' else empty) <> zchr ';'
              )
            _lhsOisSemiColon =
              ( True
              )
            _lhsOisMultiline =
              ( True
              )
            _copy =
              ( SemicolonSep
              )
            _lhsOcopy =
              ( _copy
              )
          in
            (_lhsOcopy, _lhsOisMultiline, _lhsOisSemiColon, _lhsOpretty)
        )
  )
sem_FieldSep_NoSep :: T_FieldSep
sem_FieldSep_NoSep =
  ( \_lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOisSemiColon :: Bool
            _lhsOcopy :: FieldSep
            _lhsOpretty =
              ( empty
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisSemiColon =
              ( False
              )
            _copy =
              ( NoSep
              )
            _lhsOcopy =
              ( _copy
              )
          in
            (_lhsOcopy, _lhsOisMultiline, _lhsOisSemiColon, _lhsOpretty)
        )
  )

-- FuncName ----------------------------------------------------
-- cata
sem_FuncName
  :: FuncName
  -> T_FuncName
sem_FuncName (FuncName _names _meta) =
  (sem_FuncName_FuncName _names _meta)

-- semantic domain
type T_FuncName =
  ([MToken])
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), FuncName, Bool, Region, Doc)
data Inh_FuncName = Inh_FuncName {comments_Inh_FuncName :: ([MToken]), indent_Inh_FuncName :: Int, ppconf_Inh_FuncName :: PrettyPrintConfig}
data Syn_FuncName = Syn_FuncName {comments_Syn_FuncName :: ([MToken]), copy_Syn_FuncName :: FuncName, isMultiline_Syn_FuncName :: Bool, pos_Syn_FuncName :: Region, pretty_Syn_FuncName :: Doc}
wrap_FuncName
  :: T_FuncName
  -> Inh_FuncName
  -> Syn_FuncName
wrap_FuncName sem (Inh_FuncName _lhsIcomments _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpos, _lhsOpretty) = sem _lhsIcomments _lhsIindent _lhsIppconf
    in
      (Syn_FuncName _lhsOcomments _lhsOcopy _lhsOisMultiline _lhsOpos _lhsOpretty)
  )
sem_FuncName_FuncName
  :: ([MToken])
  -> (Maybe MToken)
  -> T_FuncName
sem_FuncName_FuncName names_ meta_ =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOpos :: Region
            _lhsOcopy :: FuncName
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( printList tok "." names_ <> metaDoc meta_
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOpos =
              ( case meta_ of
                  Nothing -> _namesPos
                  Just name -> rgOr _namesPos (mpos name)
              )
            _namesPos =
              ( foldl1 rgOr $ map mpos names_
              )
            _copy =
              ( FuncName names_ meta_
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpos, _lhsOpretty)
        )
  )

-- MElse -------------------------------------------------------
-- cata
sem_MElse
  :: MElse
  -> T_MElse
sem_MElse (MElse _pos _body) =
  (sem_MElse_MElse _pos (sem_Block _body))

-- semantic domain
type T_MElse =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> Region
  -> (([MToken]), MElse, Bool, Bool, Region, Doc)
data Inh_MElse = Inh_MElse {comments_Inh_MElse :: ([MToken]), forceMultiline_Inh_MElse :: Bool, indent_Inh_MElse :: Int, ppconf_Inh_MElse :: PrettyPrintConfig, statRegion_Inh_MElse :: Region}
data Syn_MElse = Syn_MElse {comments_Syn_MElse :: ([MToken]), copy_Syn_MElse :: MElse, elsesExist_Syn_MElse :: Bool, isMultiline_Syn_MElse :: Bool, pos_Syn_MElse :: Region, pretty_Syn_MElse :: Doc}
wrap_MElse
  :: T_MElse
  -> Inh_MElse
  -> Syn_MElse
wrap_MElse sem (Inh_MElse _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIstatRegion) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOelsesExist, _lhsOisMultiline, _lhsOpos, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIstatRegion
    in
      (Syn_MElse _lhsOcomments _lhsOcopy _lhsOelsesExist _lhsOisMultiline _lhsOpos _lhsOpretty)
  )
sem_MElse_MElse
  :: Region
  -> T_Block
  -> T_MElse
sem_MElse_MElse pos_ body_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _bodyOindent :: Int
            _lhsOpos :: Region
            _bodyOcomments :: ([MToken])
            _lhsOelsesExist :: Bool
            _lhsOcopy :: MElse
            _lhsOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _bodyOstatRegion :: Region
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _lhsOpretty =
              ( indent _lhsIppconf _lhsIindent (zeroWidthText "else")
                  <-> _prettyCommentsAfter
                  $+$ _bodyIpretty
              )
            _lhsOisMultiline =
              ( _bodyIisMultiline
              )
            _bodyOindent =
              ( _lhsIindent + 1
              )
            _prettyCommentsAfter =
              ( renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfter)
              )
            _commentsAfter =
              ( span (\(MToken pos _) -> pos `beforeOrOnLine` pos_) _lhsIcomments
              )
            _lhsOpos =
              ( pos_
              )
            _bodyOcomments =
              ( snd _commentsAfter
              )
            _lhsOelsesExist =
              ( False
              )
            _copy =
              ( MElse pos_ _bodyIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _bodyIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion
              )
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOelsesExist, _lhsOisMultiline, _lhsOpos, _lhsOpretty)
        )
  )

-- MElseIf -----------------------------------------------------
-- cata
sem_MElseIf
  :: MElseIf
  -> T_MElseIf
sem_MElseIf (MElseIf _pos _elif) =
  (sem_MElseIf_MElseIf _pos (sem_ElseIf _elif))

-- semantic domain
type T_MElseIf =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), MElseIf, Bool, Region, Doc)
data Inh_MElseIf = Inh_MElseIf {comments_Inh_MElseIf :: ([MToken]), forceMultiline_Inh_MElseIf :: Bool, indent_Inh_MElseIf :: Int, ppconf_Inh_MElseIf :: PrettyPrintConfig}
data Syn_MElseIf = Syn_MElseIf {comments_Syn_MElseIf :: ([MToken]), copy_Syn_MElseIf :: MElseIf, isMultiline_Syn_MElseIf :: Bool, pos_Syn_MElseIf :: Region, pretty_Syn_MElseIf :: Doc}
wrap_MElseIf
  :: T_MElseIf
  -> Inh_MElseIf
  -> Syn_MElseIf
wrap_MElseIf sem (Inh_MElseIf _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpos, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_MElseIf _lhsOcomments _lhsOcopy _lhsOisMultiline _lhsOpos _lhsOpretty)
  )
sem_MElseIf_MElseIf
  :: Region
  -> T_ElseIf
  -> T_MElseIf
sem_MElseIf_MElseIf pos_ elif_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpos :: Region
            _lhsOisMultiline :: Bool
            _lhsOcopy :: MElseIf
            _lhsOcomments :: ([MToken])
            _lhsOpretty :: Doc
            _elifOcomments :: ([MToken])
            _elifOforceMultiline :: Bool
            _elifOindent :: Int
            _elifOppconf :: PrettyPrintConfig
            _elifIcomments :: ([MToken])
            _elifIcopy :: ElseIf
            _elifIisMultiline :: Bool
            _elifIpretty :: Doc
            _lhsOpos =
              ( pos_
              )
            _lhsOisMultiline =
              ( _elifIisMultiline
              )
            _copy =
              ( MElseIf pos_ _elifIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _elifIcomments
              )
            _lhsOpretty =
              ( _elifIpretty
              )
            _elifOcomments =
              ( _lhsIcomments
              )
            _elifOforceMultiline =
              ( _lhsIforceMultiline
              )
            _elifOindent =
              ( _lhsIindent
              )
            _elifOppconf =
              ( _lhsIppconf
              )
            (_elifIcomments, _elifIcopy, _elifIisMultiline, _elifIpretty) =
              elif_ _elifOcomments _elifOforceMultiline _elifOindent _elifOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpos, _lhsOpretty)
        )
  )

-- MExpr -------------------------------------------------------
-- cata
sem_MExpr
  :: MExpr
  -> T_MExpr
sem_MExpr (MExpr _pos _expr) =
  (sem_MExpr_MExpr _pos (sem_Expr _expr))

-- semantic domain
type T_MExpr =
  ([MToken])
  -> Bool
  -> Int
  -> Bool
  -> OperatorLevel
  -> PrettyPrintConfig
  -> (([MToken]), MExpr, Bool, Bool, Bool, Bool, Region, OperatorLevel, Doc)
data Inh_MExpr = Inh_MExpr {comments_Inh_MExpr :: ([MToken]), forceMultiline_Inh_MExpr :: Bool, indent_Inh_MExpr :: Int, parentOperatorAssociative_Inh_MExpr :: Bool, parentOperatorPrecedence_Inh_MExpr :: OperatorLevel, ppconf_Inh_MExpr :: PrettyPrintConfig}
data Syn_MExpr = Syn_MExpr {comments_Syn_MExpr :: ([MToken]), copy_Syn_MExpr :: MExpr, endsWithPrefixExpression_Syn_MExpr :: Bool, isAssociative_Syn_MExpr :: Bool, isLiteral_Syn_MExpr :: Bool, isMultiline_Syn_MExpr :: Bool, pos_Syn_MExpr :: Region, precedence_Syn_MExpr :: OperatorLevel, pretty_Syn_MExpr :: Doc}
wrap_MExpr
  :: T_MExpr
  -> Inh_MExpr
  -> Syn_MExpr
wrap_MExpr sem (Inh_MExpr _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIparentOperatorAssociative _lhsIparentOperatorPrecedence _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOpos, _lhsOprecedence, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIparentOperatorAssociative _lhsIparentOperatorPrecedence _lhsIppconf
    in
      (Syn_MExpr _lhsOcomments _lhsOcopy _lhsOendsWithPrefixExpression _lhsOisAssociative _lhsOisLiteral _lhsOisMultiline _lhsOpos _lhsOprecedence _lhsOpretty)
  )
sem_MExpr_MExpr
  :: Region
  -> T_Expr
  -> T_MExpr
sem_MExpr_MExpr pos_ expr_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf ->
        ( let
            _lhsOpos :: Region
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _exprOstatRegion :: Region
            _lhsOisAssociative :: Bool
            _lhsOisLiteral :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: MExpr
            _lhsOcomments :: ([MToken])
            _lhsOpretty :: Doc
            _exprOcomments :: ([MToken])
            _exprOforceMultiline :: Bool
            _exprOindent :: Int
            _exprOparentOperatorAssociative :: Bool
            _exprOparentOperatorPrecedence :: OperatorLevel
            _exprOppconf :: PrettyPrintConfig
            _exprIcomments :: ([MToken])
            _exprIcopy :: Expr
            _exprIendsWithPrefixExpression :: Bool
            _exprIisAssociative :: Bool
            _exprIisLiteral :: Bool
            _exprIisMultiline :: Bool
            _exprIprecedence :: OperatorLevel
            _exprIpretty :: Doc
            _lhsOpos =
              ( pos_
              )
            _lhsOendsWithPrefixExpression =
              ( _exprIendsWithPrefixExpression
              )
            _lhsOisMultiline =
              ( _exprIisMultiline
              )
            _exprOstatRegion =
              ( pos_
              )
            _lhsOisAssociative =
              ( _exprIisAssociative
              )
            _lhsOisLiteral =
              ( _exprIisLiteral
              )
            _lhsOprecedence =
              ( _exprIprecedence
              )
            _copy =
              ( MExpr pos_ _exprIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _exprIcomments
              )
            _lhsOpretty =
              ( _exprIpretty
              )
            _exprOcomments =
              ( _lhsIcomments
              )
            _exprOforceMultiline =
              ( _lhsIforceMultiline
              )
            _exprOindent =
              ( _lhsIindent
              )
            _exprOparentOperatorAssociative =
              ( _lhsIparentOperatorAssociative
              )
            _exprOparentOperatorPrecedence =
              ( _lhsIparentOperatorPrecedence
              )
            _exprOppconf =
              ( _lhsIppconf
              )
            (_exprIcomments, _exprIcopy, _exprIendsWithPrefixExpression, _exprIisAssociative, _exprIisLiteral, _exprIisMultiline, _exprIprecedence, _exprIpretty) =
              expr_ _exprOcomments _exprOforceMultiline _exprOindent _exprOparentOperatorAssociative _exprOparentOperatorPrecedence _exprOppconf _exprOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOpos, _lhsOprecedence, _lhsOpretty)
        )
  )

-- MExprList ---------------------------------------------------
-- cata
sem_MExprList
  :: MExprList
  -> T_MExprList
sem_MExprList list =
  (Prelude.foldr sem_MExprList_Cons sem_MExprList_Nil (Prelude.map sem_MExpr list))

-- semantic domain
type T_MExprList =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> Bool
  -> (([MToken]), MExprList, Bool, Bool, Bool, Region, OperatorLevel, Doc)
data Inh_MExprList = Inh_MExprList {comments_Inh_MExprList :: ([MToken]), forceMultiline_Inh_MExprList :: Bool, indent_Inh_MExprList :: Int, ppconf_Inh_MExprList :: PrettyPrintConfig, someElementsInListAreMultiline_Inh_MExprList :: Bool}
data Syn_MExprList = Syn_MExprList {comments_Syn_MExprList :: ([MToken]), copy_Syn_MExprList :: MExprList, isAssociative_Syn_MExprList :: Bool, isLast_Syn_MExprList :: Bool, isMultiline_Syn_MExprList :: Bool, pos_Syn_MExprList :: Region, precedence_Syn_MExprList :: OperatorLevel, pretty_Syn_MExprList :: Doc}
wrap_MExprList
  :: T_MExprList
  -> Inh_MExprList
  -> Syn_MExprList
wrap_MExprList sem (Inh_MExprList _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIsomeElementsInListAreMultiline) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisLast, _lhsOisMultiline, _lhsOpos, _lhsOprecedence, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIsomeElementsInListAreMultiline
    in
      (Syn_MExprList _lhsOcomments _lhsOcopy _lhsOisAssociative _lhsOisLast _lhsOisMultiline _lhsOpos _lhsOprecedence _lhsOpretty)
  )
sem_MExprList_Cons
  :: T_MExpr
  -> T_MExprList
  -> T_MExprList
sem_MExprList_Cons hd_ tl_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIsomeElementsInListAreMultiline ->
        ( let
            _lhsOpretty :: Doc
            _hdOcomments :: ([MToken])
            _tlOcomments :: ([MToken])
            _lhsOcomments :: ([MToken])
            _lhsOpos :: Region
            _lhsOisLast :: Bool
            _hdOparentOperatorPrecedence :: OperatorLevel
            _hdOparentOperatorAssociative :: Bool
            _tlOsomeElementsInListAreMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: MExprList
            _lhsOisMultiline :: Bool
            _hdOforceMultiline :: Bool
            _hdOindent :: Int
            _hdOppconf :: PrettyPrintConfig
            _tlOforceMultiline :: Bool
            _tlOindent :: Int
            _tlOppconf :: PrettyPrintConfig
            _hdIcomments :: ([MToken])
            _hdIcopy :: MExpr
            _hdIendsWithPrefixExpression :: Bool
            _hdIisAssociative :: Bool
            _hdIisLiteral :: Bool
            _hdIisMultiline :: Bool
            _hdIpos :: Region
            _hdIprecedence :: OperatorLevel
            _hdIpretty :: Doc
            _tlIcomments :: ([MToken])
            _tlIcopy :: MExprList
            _tlIisAssociative :: Bool
            _tlIisLast :: Bool
            _tlIisMultiline :: Bool
            _tlIpos :: Region
            _tlIprecedence :: OperatorLevel
            _tlIpretty :: Doc
            _lhsOpretty =
              ( if _isMultiline then _prettyMultiLine else _prettySingleLine
              )
            _prettySingleLine =
              ( _hdIpretty
                  <> _comma
                  <> _tlIpretty
              )
            _prettyMultiLine =
              ( renderMLComments _lhsIppconf _lhsIindent (fst _commentsBeforeLine)
                  $+$ indent _lhsIppconf _lhsIindent _hdIpretty
                    <> _comma
                      <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfter)
                  $+$ _tlIpretty
              )
            _comma =
              ( if _tlIisLast
                  then empty
                  else
                    (if spaceBeforeComma _lhsIppconf then zchr ' ' else empty)
                      <> zchr ','
                      <> (if not _isMultiline && spaceAfterComma _lhsIppconf then zchr ' ' else empty)
              )
            _commentsBeforeLine =
              ( span (\(MToken pos' _) -> pos' `before` _hdIpos) _lhsIcomments
              )
            _hdOcomments =
              ( snd _commentsBeforeLine
              )
            _commentsAfter =
              ( span (\(MToken pos' _) -> pos' `before` _tlIpos) _hdIcomments
              )
            _tlOcomments =
              ( snd _commentsAfter
              )
            _lhsOcomments =
              ( _tlIcomments
              )
            _lhsOpos =
              ( _hdIpos
              )
            _lhsOisLast =
              ( False
              )
            _hdOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _hdOparentOperatorAssociative =
              ( True
              )
            _isMultiline =
              ( _lhsIforceMultiline
                  || not (null $ fst _commentsBeforeLine)
                  || not (null $ fst _commentsAfter)
                  || _lhsIsomeElementsInListAreMultiline
                  || _hdIisMultiline
                  || _tlIisMultiline
              )
            _tlOsomeElementsInListAreMultiline =
              ( _lhsIsomeElementsInListAreMultiline
                  || _hdIisMultiline
                  || not (null $ fst _commentsBeforeLine)
                  || not (null $ fst _commentsAfter)
              )
            _lhsOisAssociative =
              ( _hdIisAssociative && _tlIisAssociative
              )
            _lhsOprecedence =
              ( (min _hdIprecedence _tlIprecedence)
              )
            _copy =
              ( (:) _hdIcopy _tlIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOisMultiline =
              ( _isMultiline
              )
            _hdOforceMultiline =
              ( _lhsIforceMultiline
              )
            _hdOindent =
              ( _lhsIindent
              )
            _hdOppconf =
              ( _lhsIppconf
              )
            _tlOforceMultiline =
              ( _lhsIforceMultiline
              )
            _tlOindent =
              ( _lhsIindent
              )
            _tlOppconf =
              ( _lhsIppconf
              )
            (_hdIcomments, _hdIcopy, _hdIendsWithPrefixExpression, _hdIisAssociative, _hdIisLiteral, _hdIisMultiline, _hdIpos, _hdIprecedence, _hdIpretty) =
              hd_ _hdOcomments _hdOforceMultiline _hdOindent _hdOparentOperatorAssociative _hdOparentOperatorPrecedence _hdOppconf
            (_tlIcomments, _tlIcopy, _tlIisAssociative, _tlIisLast, _tlIisMultiline, _tlIpos, _tlIprecedence, _tlIpretty) =
              tl_ _tlOcomments _tlOforceMultiline _tlOindent _tlOppconf _tlOsomeElementsInListAreMultiline
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisLast, _lhsOisMultiline, _lhsOpos, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_MExprList_Nil :: T_MExprList
sem_MExprList_Nil =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIsomeElementsInListAreMultiline ->
        ( let
            _lhsOpretty :: Doc
            _lhsOpos :: Region
            _lhsOisMultiline :: Bool
            _lhsOisLast :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: MExprList
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( empty
              )
            _lhsOpos =
              ( emptyRg
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisLast =
              ( True
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( []
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisLast, _lhsOisMultiline, _lhsOpos, _lhsOprecedence, _lhsOpretty)
        )
  )

-- MStat -------------------------------------------------------
-- cata
sem_MStat
  :: MStat
  -> T_MStat
sem_MStat (MStat _pos _stat) =
  (sem_MStat_MStat _pos (sem_Stat _stat))

-- semantic domain
type T_MStat =
  ([MToken])
  -> Bool
  -> Int
  -> Bool
  -> PrettyPrintConfig
  -> Bool
  -> (([MToken]), MStat, Bool, Bool, Region, Doc, Bool, Int)
data Inh_MStat = Inh_MStat {comments_Inh_MStat :: ([MToken]), forceMultiline_Inh_MStat :: Bool, indent_Inh_MStat :: Int, isLastStatement_Inh_MStat :: Bool, ppconf_Inh_MStat :: PrettyPrintConfig, wouldBeAmbiguousWithoutSemicolon_Inh_MStat :: Bool}
data Syn_MStat = Syn_MStat {comments_Syn_MStat :: ([MToken]), copy_Syn_MStat :: MStat, endsWithPrefixExpression_Syn_MStat :: Bool, isMultiline_Syn_MStat :: Bool, pos_Syn_MStat :: Region, pretty_Syn_MStat :: Doc, startsWithExprPrefixExpression_Syn_MStat :: Bool, statementCount_Syn_MStat :: Int}
wrap_MStat
  :: T_MStat
  -> Inh_MStat
  -> Syn_MStat
wrap_MStat sem (Inh_MStat _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIisLastStatement _lhsIppconf _lhsIwouldBeAmbiguousWithoutSemicolon) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpos, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOstatementCount) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIisLastStatement _lhsIppconf _lhsIwouldBeAmbiguousWithoutSemicolon
    in
      (Syn_MStat _lhsOcomments _lhsOcopy _lhsOendsWithPrefixExpression _lhsOisMultiline _lhsOpos _lhsOpretty _lhsOstartsWithExprPrefixExpression _lhsOstatementCount)
  )
sem_MStat_MStat
  :: Region
  -> T_Stat
  -> T_MStat
sem_MStat_MStat pos_ stat_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOpos :: Region
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _statOstatRegion :: Region
            _statOwouldBeAmbiguousWithoutSemicolon :: Bool
            _lhsOstatementCount :: Int
            _lhsOcopy :: MStat
            _lhsOcomments :: ([MToken])
            _lhsOpretty :: Doc
            _statOcomments :: ([MToken])
            _statOforceMultiline :: Bool
            _statOindent :: Int
            _statOisLastStatement :: Bool
            _statOppconf :: PrettyPrintConfig
            _statIcomments :: ([MToken])
            _statIcopy :: Stat
            _statIendsWithPrefixExpression :: Bool
            _statIisMultiline :: Bool
            _statIpretty :: Doc
            _statIstartsWithExprPrefixExpression :: Bool
            _lhsOpos =
              ( pos_
              )
            _lhsOstartsWithExprPrefixExpression =
              ( _statIstartsWithExprPrefixExpression
              )
            _lhsOendsWithPrefixExpression =
              ( _statIendsWithPrefixExpression
              )
            _lhsOisMultiline =
              ( _statIisMultiline
              )
            _statOstatRegion =
              ( pos_
              )
            _statOwouldBeAmbiguousWithoutSemicolon =
              ( _lhsIwouldBeAmbiguousWithoutSemicolon
              )
            _lhsOstatementCount =
              ( 1
              )
            _copy =
              ( MStat pos_ _statIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _statIcomments
              )
            _lhsOpretty =
              ( _statIpretty
              )
            _statOcomments =
              ( _lhsIcomments
              )
            _statOforceMultiline =
              ( _lhsIforceMultiline
              )
            _statOindent =
              ( _lhsIindent
              )
            _statOisLastStatement =
              ( _lhsIisLastStatement
              )
            _statOppconf =
              ( _lhsIppconf
              )
            (_statIcomments, _statIcopy, _statIendsWithPrefixExpression, _statIisMultiline, _statIpretty, _statIstartsWithExprPrefixExpression) =
              stat_ _statOcomments _statOforceMultiline _statOindent _statOisLastStatement _statOppconf _statOstatRegion _statOwouldBeAmbiguousWithoutSemicolon
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpos, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOstatementCount)
        )
  )

-- MStatList ---------------------------------------------------
-- cata
sem_MStatList
  :: MStatList
  -> T_MStatList
sem_MStatList list =
  (Prelude.foldr sem_MStatList_Cons sem_MStatList_Nil (Prelude.map sem_MStat list))

-- semantic domain
type T_MStatList =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> Region
  -> (([MToken]), MStatList, Bool, Bool, Doc, Bool, Int)
data Inh_MStatList = Inh_MStatList {comments_Inh_MStatList :: ([MToken]), forceMultiline_Inh_MStatList :: Bool, indent_Inh_MStatList :: Int, ppconf_Inh_MStatList :: PrettyPrintConfig, statRegion_Inh_MStatList :: Region}
data Syn_MStatList = Syn_MStatList {comments_Syn_MStatList :: ([MToken]), copy_Syn_MStatList :: MStatList, isLast_Syn_MStatList :: Bool, isMultiline_Syn_MStatList :: Bool, pretty_Syn_MStatList :: Doc, startsWithExprPrefixExpression_Syn_MStatList :: Bool, statementCount_Syn_MStatList :: Int}
wrap_MStatList
  :: T_MStatList
  -> Inh_MStatList
  -> Syn_MStatList
wrap_MStatList sem (Inh_MStatList _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIstatRegion) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisLast, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOstatementCount) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf _lhsIstatRegion
    in
      (Syn_MStatList _lhsOcomments _lhsOcopy _lhsOisLast _lhsOisMultiline _lhsOpretty _lhsOstartsWithExprPrefixExpression _lhsOstatementCount)
  )
sem_MStatList_Cons
  :: T_MStat
  -> T_MStatList
  -> T_MStatList
sem_MStatList_Cons hd_ tl_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOisLast :: Bool
            _hdOcomments :: ([MToken])
            _tlOcomments :: ([MToken])
            _lhsOcomments :: ([MToken])
            _hdOisLastStatement :: Bool
            _hdOwouldBeAmbiguousWithoutSemicolon :: Bool
            _hdOforceMultiline :: Bool
            _lhsOstatementCount :: Int
            _lhsOcopy :: MStatList
            _lhsOisMultiline :: Bool
            _hdOindent :: Int
            _hdOppconf :: PrettyPrintConfig
            _tlOforceMultiline :: Bool
            _tlOindent :: Int
            _tlOppconf :: PrettyPrintConfig
            _tlOstatRegion :: Region
            _hdIcomments :: ([MToken])
            _hdIcopy :: MStat
            _hdIendsWithPrefixExpression :: Bool
            _hdIisMultiline :: Bool
            _hdIpos :: Region
            _hdIpretty :: Doc
            _hdIstartsWithExprPrefixExpression :: Bool
            _hdIstatementCount :: Int
            _tlIcomments :: ([MToken])
            _tlIcopy :: MStatList
            _tlIisLast :: Bool
            _tlIisMultiline :: Bool
            _tlIpretty :: Doc
            _tlIstartsWithExprPrefixExpression :: Bool
            _tlIstatementCount :: Int
            _lhsOpretty =
              ( renderMLComments _lhsIppconf _lhsIindent (fst _commentsBeforeLine)
                  $+$ indent _lhsIppconf _lhsIindent _hdIpretty
                    <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfter)
                    <> _addNewline
                  $+$ _tlIpretty
              )
            _lhsOstartsWithExprPrefixExpression =
              ( _hdIstartsWithExprPrefixExpression
              )
            _lhsOisLast =
              ( False
              )
            _isMultiline =
              ( _hdIisMultiline
                  || _tlIisMultiline
                  || not (null $ fst _commentsBeforeLine)
                  || not (null $ fst _commentsAfter)
              )
            _addNewline =
              ( if not _tlIisLast && _hdIisMultiline then zchr '\n' else empty
              )
            _commentsBeforeLine =
              ( span (\(MToken pos' _) -> pos' `before` _hdIpos) _lhsIcomments
              )
            _hdOcomments =
              ( snd _commentsBeforeLine
              )
            _commentsAfter =
              ( span (\(MToken pos' _) -> pos' `beforeOrOnLine` _hdIpos) _hdIcomments
              )
            _tlOcomments =
              ( snd _commentsAfter
              )
            _lhsOcomments =
              ( _tlIcomments
              )
            _hdOisLastStatement =
              ( _tlIisLast
              )
            _hdOwouldBeAmbiguousWithoutSemicolon =
              ( _hdIendsWithPrefixExpression && _tlIstartsWithExprPrefixExpression
              )
            _hdOforceMultiline =
              ( commentsForceMultiline $ fst _commentsBeforeLine
              )
            _lhsOstatementCount =
              ( _hdIstatementCount + _tlIstatementCount
              )
            _copy =
              ( (:) _hdIcopy _tlIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOisMultiline =
              ( _isMultiline
              )
            _hdOindent =
              ( _lhsIindent
              )
            _hdOppconf =
              ( _lhsIppconf
              )
            _tlOforceMultiline =
              ( _lhsIforceMultiline
              )
            _tlOindent =
              ( _lhsIindent
              )
            _tlOppconf =
              ( _lhsIppconf
              )
            _tlOstatRegion =
              ( _lhsIstatRegion
              )
            (_hdIcomments, _hdIcopy, _hdIendsWithPrefixExpression, _hdIisMultiline, _hdIpos, _hdIpretty, _hdIstartsWithExprPrefixExpression, _hdIstatementCount) =
              hd_ _hdOcomments _hdOforceMultiline _hdOindent _hdOisLastStatement _hdOppconf _hdOwouldBeAmbiguousWithoutSemicolon
            (_tlIcomments, _tlIcopy, _tlIisLast, _tlIisMultiline, _tlIpretty, _tlIstartsWithExprPrefixExpression, _tlIstatementCount) =
              tl_ _tlOcomments _tlOforceMultiline _tlOindent _tlOppconf _tlOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisLast, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOstatementCount)
        )
  )
sem_MStatList_Nil :: T_MStatList
sem_MStatList_Nil =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf
     _lhsIstatRegion ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstatementCount :: Int
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisLast :: Bool
            _lhsOcopy :: MStatList
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( empty
              )
            _lhsOstatementCount =
              ( 0
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisLast =
              ( True
              )
            _copy =
              ( []
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisLast, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOstatementCount)
        )
  )

-- MaybeMExpr --------------------------------------------------
-- cata
sem_MaybeMExpr
  :: MaybeMExpr
  -> T_MaybeMExpr
sem_MaybeMExpr (Prelude.Just x) =
  (sem_MaybeMExpr_Just (sem_MExpr x))
sem_MaybeMExpr Prelude.Nothing =
  sem_MaybeMExpr_Nothing

-- semantic domain
type T_MaybeMExpr =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), MaybeMExpr, Bool, Bool, Bool, Bool, OperatorLevel, Doc)
data Inh_MaybeMExpr = Inh_MaybeMExpr {comments_Inh_MaybeMExpr :: ([MToken]), forceMultiline_Inh_MaybeMExpr :: Bool, indent_Inh_MaybeMExpr :: Int, ppconf_Inh_MaybeMExpr :: PrettyPrintConfig}
data Syn_MaybeMExpr = Syn_MaybeMExpr {comments_Syn_MaybeMExpr :: ([MToken]), copy_Syn_MaybeMExpr :: MaybeMExpr, endsWithPrefixExpression_Syn_MaybeMExpr :: Bool, isAssociative_Syn_MaybeMExpr :: Bool, isDefined_Syn_MaybeMExpr :: Bool, isMultiline_Syn_MaybeMExpr :: Bool, precedence_Syn_MaybeMExpr :: OperatorLevel, pretty_Syn_MaybeMExpr :: Doc}
wrap_MaybeMExpr
  :: T_MaybeMExpr
  -> Inh_MaybeMExpr
  -> Syn_MaybeMExpr
wrap_MaybeMExpr sem (Inh_MaybeMExpr _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisDefined, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_MaybeMExpr _lhsOcomments _lhsOcopy _lhsOendsWithPrefixExpression _lhsOisAssociative _lhsOisDefined _lhsOisMultiline _lhsOprecedence _lhsOpretty)
  )
sem_MaybeMExpr_Just
  :: T_MExpr
  -> T_MaybeMExpr
sem_MaybeMExpr_Just just_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisDefined :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _justOparentOperatorPrecedence :: OperatorLevel
            _justOparentOperatorAssociative :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: MaybeMExpr
            _lhsOcomments :: ([MToken])
            _justOcomments :: ([MToken])
            _justOforceMultiline :: Bool
            _justOindent :: Int
            _justOppconf :: PrettyPrintConfig
            _justIcomments :: ([MToken])
            _justIcopy :: MExpr
            _justIendsWithPrefixExpression :: Bool
            _justIisAssociative :: Bool
            _justIisLiteral :: Bool
            _justIisMultiline :: Bool
            _justIpos :: Region
            _justIprecedence :: OperatorLevel
            _justIpretty :: Doc
            _lhsOpretty =
              ( _justIpretty
              )
            _lhsOisDefined =
              ( True
              )
            _lhsOendsWithPrefixExpression =
              ( _justIendsWithPrefixExpression
              )
            _lhsOisMultiline =
              ( _justIisMultiline
              )
            _justOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _justOparentOperatorAssociative =
              ( True
              )
            _lhsOisAssociative =
              ( _justIisAssociative
              )
            _lhsOprecedence =
              ( _justIprecedence
              )
            _copy =
              ( Just _justIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _justIcomments
              )
            _justOcomments =
              ( _lhsIcomments
              )
            _justOforceMultiline =
              ( _lhsIforceMultiline
              )
            _justOindent =
              ( _lhsIindent
              )
            _justOppconf =
              ( _lhsIppconf
              )
            (_justIcomments, _justIcopy, _justIendsWithPrefixExpression, _justIisAssociative, _justIisLiteral, _justIisMultiline, _justIpos, _justIprecedence, _justIpretty) =
              just_ _justOcomments _justOforceMultiline _justOindent _justOparentOperatorAssociative _justOparentOperatorPrecedence _justOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisDefined, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_MaybeMExpr_Nothing :: T_MaybeMExpr
sem_MaybeMExpr_Nothing =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisDefined :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: MaybeMExpr
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( empty
              )
            _lhsOisDefined =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( Nothing
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisAssociative, _lhsOisDefined, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )

-- PFExprSuffix ------------------------------------------------
-- cata
sem_PFExprSuffix
  :: PFExprSuffix
  -> T_PFExprSuffix
sem_PFExprSuffix (Call _args) =
  (sem_PFExprSuffix_Call (sem_Args _args))
sem_PFExprSuffix (MetaCall _fn _args) =
  (sem_PFExprSuffix_MetaCall _fn (sem_Args _args))
sem_PFExprSuffix (ExprIndex _index) =
  (sem_PFExprSuffix_ExprIndex (sem_MExpr _index))
sem_PFExprSuffix (DotIndex _index) =
  (sem_PFExprSuffix_DotIndex _index)

-- semantic domain
type T_PFExprSuffix =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), PFExprSuffix, Bool, Bool, OperatorLevel, Doc)
data Inh_PFExprSuffix = Inh_PFExprSuffix {comments_Inh_PFExprSuffix :: ([MToken]), forceMultiline_Inh_PFExprSuffix :: Bool, indent_Inh_PFExprSuffix :: Int, ppconf_Inh_PFExprSuffix :: PrettyPrintConfig}
data Syn_PFExprSuffix = Syn_PFExprSuffix {comments_Syn_PFExprSuffix :: ([MToken]), copy_Syn_PFExprSuffix :: PFExprSuffix, isAssociative_Syn_PFExprSuffix :: Bool, isMultiline_Syn_PFExprSuffix :: Bool, precedence_Syn_PFExprSuffix :: OperatorLevel, pretty_Syn_PFExprSuffix :: Doc}
wrap_PFExprSuffix
  :: T_PFExprSuffix
  -> Inh_PFExprSuffix
  -> Syn_PFExprSuffix
wrap_PFExprSuffix sem (Inh_PFExprSuffix _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_PFExprSuffix _lhsOcomments _lhsOcopy _lhsOisAssociative _lhsOisMultiline _lhsOprecedence _lhsOpretty)
  )
sem_PFExprSuffix_Call
  :: T_Args
  -> T_PFExprSuffix
sem_PFExprSuffix_Call args_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: PFExprSuffix
            _lhsOcomments :: ([MToken])
            _argsOcomments :: ([MToken])
            _argsOforceMultiline :: Bool
            _argsOindent :: Int
            _argsOppconf :: PrettyPrintConfig
            _argsIcomments :: ([MToken])
            _argsIcopy :: Args
            _argsIisMultiline :: Bool
            _argsIpretty :: Doc
            _lhsOpretty =
              ( _argsIpretty
              )
            _lhsOisMultiline =
              ( _argsIisMultiline
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( Call _argsIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _argsIcomments
              )
            _argsOcomments =
              ( _lhsIcomments
              )
            _argsOforceMultiline =
              ( _lhsIforceMultiline
              )
            _argsOindent =
              ( _lhsIindent
              )
            _argsOppconf =
              ( _lhsIppconf
              )
            (_argsIcomments, _argsIcopy, _argsIisMultiline, _argsIpretty) =
              args_ _argsOcomments _argsOforceMultiline _argsOindent _argsOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_PFExprSuffix_MetaCall
  :: MToken
  -> T_Args
  -> T_PFExprSuffix
sem_PFExprSuffix_MetaCall fn_ args_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: PFExprSuffix
            _lhsOcomments :: ([MToken])
            _argsOcomments :: ([MToken])
            _argsOforceMultiline :: Bool
            _argsOindent :: Int
            _argsOppconf :: PrettyPrintConfig
            _argsIcomments :: ([MToken])
            _argsIcopy :: Args
            _argsIisMultiline :: Bool
            _argsIpretty :: Doc
            _lhsOpretty =
              ( zchr ':' <> tok fn_ <> _argsIpretty
              )
            _lhsOisMultiline =
              ( _argsIisMultiline
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( MetaCall fn_ _argsIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _argsIcomments
              )
            _argsOcomments =
              ( _lhsIcomments
              )
            _argsOforceMultiline =
              ( _lhsIforceMultiline
              )
            _argsOindent =
              ( _lhsIindent
              )
            _argsOppconf =
              ( _lhsIppconf
              )
            (_argsIcomments, _argsIcopy, _argsIisMultiline, _argsIpretty) =
              args_ _argsOcomments _argsOforceMultiline _argsOindent _argsOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_PFExprSuffix_ExprIndex
  :: T_MExpr
  -> T_PFExprSuffix
sem_PFExprSuffix_ExprIndex index_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _indexOparentOperatorPrecedence :: OperatorLevel
            _indexOparentOperatorAssociative :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: PFExprSuffix
            _lhsOcomments :: ([MToken])
            _indexOcomments :: ([MToken])
            _indexOforceMultiline :: Bool
            _indexOindent :: Int
            _indexOppconf :: PrettyPrintConfig
            _indexIcomments :: ([MToken])
            _indexIcopy :: MExpr
            _indexIendsWithPrefixExpression :: Bool
            _indexIisAssociative :: Bool
            _indexIisLiteral :: Bool
            _indexIisMultiline :: Bool
            _indexIpos :: Region
            _indexIprecedence :: OperatorLevel
            _indexIpretty :: Doc
            _lhsOpretty =
              ( brackets _lhsIppconf _indexIpretty
              )
            _lhsOisMultiline =
              ( _indexIisMultiline
              )
            _indexOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _indexOparentOperatorAssociative =
              ( True
              )
            _lhsOisAssociative =
              ( _indexIisAssociative
              )
            _lhsOprecedence =
              ( _indexIprecedence
              )
            _copy =
              ( ExprIndex _indexIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _indexIcomments
              )
            _indexOcomments =
              ( _lhsIcomments
              )
            _indexOforceMultiline =
              ( _lhsIforceMultiline
              )
            _indexOindent =
              ( _lhsIindent
              )
            _indexOppconf =
              ( _lhsIppconf
              )
            (_indexIcomments, _indexIcopy, _indexIendsWithPrefixExpression, _indexIisAssociative, _indexIisLiteral, _indexIisMultiline, _indexIpos, _indexIprecedence, _indexIpretty) =
              index_ _indexOcomments _indexOforceMultiline _indexOindent _indexOparentOperatorAssociative _indexOparentOperatorPrecedence _indexOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )
sem_PFExprSuffix_DotIndex
  :: MToken
  -> T_PFExprSuffix
sem_PFExprSuffix_DotIndex index_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: PFExprSuffix
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zchr '.' <> tok index_
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisAssociative =
              ( False
              )
            _lhsOprecedence =
              ( OperatorLevel8
              )
            _copy =
              ( DotIndex index_
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty)
        )
  )

-- PrefixExp ---------------------------------------------------
-- cata
sem_PrefixExp
  :: PrefixExp
  -> T_PrefixExp
sem_PrefixExp (PFVar _name _suffixes) =
  (sem_PrefixExp_PFVar _name (sem_ExprSuffixList _suffixes))
sem_PrefixExp (ExprVar _expr _suffixes) =
  (sem_PrefixExp_ExprVar (sem_MExpr _expr) (sem_ExprSuffixList _suffixes))

-- semantic domain
type T_PrefixExp =
  ([MToken])
  -> Bool
  -> Int
  -> Bool
  -> OperatorLevel
  -> PrettyPrintConfig
  -> (([MToken]), PrefixExp, Bool, Bool, Bool, OperatorLevel, Doc, Bool)
data Inh_PrefixExp = Inh_PrefixExp {comments_Inh_PrefixExp :: ([MToken]), forceMultiline_Inh_PrefixExp :: Bool, indent_Inh_PrefixExp :: Int, parentOperatorAssociative_Inh_PrefixExp :: Bool, parentOperatorPrecedence_Inh_PrefixExp :: OperatorLevel, ppconf_Inh_PrefixExp :: PrettyPrintConfig}
data Syn_PrefixExp = Syn_PrefixExp {comments_Syn_PrefixExp :: ([MToken]), copy_Syn_PrefixExp :: PrefixExp, isAssociative_Syn_PrefixExp :: Bool, isLiteral_Syn_PrefixExp :: Bool, isMultiline_Syn_PrefixExp :: Bool, precedence_Syn_PrefixExp :: OperatorLevel, pretty_Syn_PrefixExp :: Doc, startsWithExprPrefixExpression_Syn_PrefixExp :: Bool}
wrap_PrefixExp
  :: T_PrefixExp
  -> Inh_PrefixExp
  -> Syn_PrefixExp
wrap_PrefixExp sem (Inh_PrefixExp _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIparentOperatorAssociative _lhsIparentOperatorPrecedence _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty, _lhsOstartsWithExprPrefixExpression) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIparentOperatorAssociative _lhsIparentOperatorPrecedence _lhsIppconf
    in
      (Syn_PrefixExp _lhsOcomments _lhsOcopy _lhsOisAssociative _lhsOisLiteral _lhsOisMultiline _lhsOprecedence _lhsOpretty _lhsOstartsWithExprPrefixExpression)
  )
sem_PrefixExp_PFVar
  :: MToken
  -> T_ExprSuffixList
  -> T_PrefixExp
sem_PrefixExp_PFVar name_ suffixes_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisLiteral :: Bool
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOprecedence :: OperatorLevel
            _lhsOcopy :: PrefixExp
            _lhsOcomments :: ([MToken])
            _suffixesOcomments :: ([MToken])
            _suffixesOforceMultiline :: Bool
            _suffixesOindent :: Int
            _suffixesOppconf :: PrettyPrintConfig
            _suffixesIcomments :: ([MToken])
            _suffixesIcopy :: ExprSuffixList
            _suffixesIisAssociative :: Bool
            _suffixesIisMultiline :: Bool
            _suffixesIprecedence :: OperatorLevel
            _suffixesIpretty :: Doc
            _lhsOpretty =
              ( tok name_ <> _suffixesIpretty
              )
            _lhsOisLiteral =
              ( False
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( _suffixesIisMultiline
              )
            _lhsOisAssociative =
              ( _suffixesIisAssociative
              )
            _lhsOprecedence =
              ( _suffixesIprecedence
              )
            _copy =
              ( PFVar name_ _suffixesIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _suffixesIcomments
              )
            _suffixesOcomments =
              ( _lhsIcomments
              )
            _suffixesOforceMultiline =
              ( _lhsIforceMultiline
              )
            _suffixesOindent =
              ( _lhsIindent
              )
            _suffixesOppconf =
              ( _lhsIppconf
              )
            (_suffixesIcomments, _suffixesIcopy, _suffixesIisAssociative, _suffixesIisMultiline, _suffixesIprecedence, _suffixesIpretty) =
              suffixes_ _suffixesOcomments _suffixesOforceMultiline _suffixesOindent _suffixesOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_PrefixExp_ExprVar
  :: T_MExpr
  -> T_ExprSuffixList
  -> T_PrefixExp
sem_PrefixExp_ExprVar expr_ suffixes_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIparentOperatorAssociative
     _lhsIparentOperatorPrecedence
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOprecedence :: OperatorLevel
            _lhsOisLiteral :: Bool
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisAssociative :: Bool
            _lhsOcopy :: PrefixExp
            _lhsOcomments :: ([MToken])
            _exprOcomments :: ([MToken])
            _exprOforceMultiline :: Bool
            _exprOindent :: Int
            _exprOparentOperatorAssociative :: Bool
            _exprOparentOperatorPrecedence :: OperatorLevel
            _exprOppconf :: PrettyPrintConfig
            _suffixesOcomments :: ([MToken])
            _suffixesOforceMultiline :: Bool
            _suffixesOindent :: Int
            _suffixesOppconf :: PrettyPrintConfig
            _exprIcomments :: ([MToken])
            _exprIcopy :: MExpr
            _exprIendsWithPrefixExpression :: Bool
            _exprIisAssociative :: Bool
            _exprIisLiteral :: Bool
            _exprIisMultiline :: Bool
            _exprIpos :: Region
            _exprIprecedence :: OperatorLevel
            _exprIpretty :: Doc
            _suffixesIcomments :: ([MToken])
            _suffixesIcopy :: ExprSuffixList
            _suffixesIisAssociative :: Bool
            _suffixesIisMultiline :: Bool
            _suffixesIprecedence :: OperatorLevel
            _suffixesIpretty :: Doc
            _lhsOpretty =
              ( (if _noparens then _exprIpretty else parens _lhsIppconf NonEmpty _exprIpretty)
                  <> _suffixesIpretty
              )
            _lhsOprecedence =
              ( if _noparens then _exprIprecedence else OperatorLevel8
              )
            _lhsOisLiteral =
              ( False
              )
            _lhsOstartsWithExprPrefixExpression =
              ( True
              )
            _lhsOisMultiline =
              ( _exprIisMultiline || _suffixesIisMultiline
              )
            _containsParenthesizedExpr =
              ( case _exprIcopy of
                  MExpr _ (APrefixExpr (ExprVar (MExpr _ AVarArg) _)) -> False
                  MExpr _ (APrefixExpr _) -> True
                  _ -> False
              )
            _noparens =
              ( (removeRedundantParens _lhsIppconf || minimizeParens _lhsIppconf)
                  && ( _containsParenthesizedExpr
                        || (_lhsIparentOperatorPrecedence == TopLevelExpression || _exprIisLiteral)
                          && length _suffixesIcopy == 0
                     )
                  || ( minimizeParens _lhsIppconf
                        && length _suffixesIcopy == 0
                        && ( _lhsIparentOperatorPrecedence < _exprIprecedence
                              || assumeOperatorAssociativity _lhsIppconf
                                && _lhsIparentOperatorPrecedence == _exprIprecedence
                                && _lhsIparentOperatorAssociative
                           )
                     )
              )
            _lhsOisAssociative =
              ( _exprIisAssociative && _suffixesIisAssociative
              )
            _copy =
              ( ExprVar _exprIcopy _suffixesIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _suffixesIcomments
              )
            _exprOcomments =
              ( _lhsIcomments
              )
            _exprOforceMultiline =
              ( _lhsIforceMultiline
              )
            _exprOindent =
              ( _lhsIindent
              )
            _exprOparentOperatorAssociative =
              ( _lhsIparentOperatorAssociative
              )
            _exprOparentOperatorPrecedence =
              ( _lhsIparentOperatorPrecedence
              )
            _exprOppconf =
              ( _lhsIppconf
              )
            _suffixesOcomments =
              ( _exprIcomments
              )
            _suffixesOforceMultiline =
              ( _lhsIforceMultiline
              )
            _suffixesOindent =
              ( _lhsIindent
              )
            _suffixesOppconf =
              ( _lhsIppconf
              )
            (_exprIcomments, _exprIcopy, _exprIendsWithPrefixExpression, _exprIisAssociative, _exprIisLiteral, _exprIisMultiline, _exprIpos, _exprIprecedence, _exprIpretty) =
              expr_ _exprOcomments _exprOforceMultiline _exprOindent _exprOparentOperatorAssociative _exprOparentOperatorPrecedence _exprOppconf
            (_suffixesIcomments, _suffixesIcopy, _suffixesIisAssociative, _suffixesIisMultiline, _suffixesIprecedence, _suffixesIpretty) =
              suffixes_ _suffixesOcomments _suffixesOforceMultiline _suffixesOindent _suffixesOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisAssociative, _lhsOisLiteral, _lhsOisMultiline, _lhsOprecedence, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )

-- Stat --------------------------------------------------------
-- cata
sem_Stat
  :: Stat
  -> T_Stat
sem_Stat (Def _vars) =
  (sem_Stat_Def (sem_VarsList _vars))
sem_Stat (LocDef _vars) =
  (sem_Stat_LocDef (sem_VarsList _vars))
sem_Stat (AFuncCall _fn) =
  (sem_Stat_AFuncCall (sem_PrefixExp _fn))
sem_Stat (ALabel _lbl) =
  (sem_Stat_ALabel _lbl)
sem_Stat (ABreak) =
  (sem_Stat_ABreak)
sem_Stat (AContinue) =
  (sem_Stat_AContinue)
sem_Stat (AGoto _lbl) =
  (sem_Stat_AGoto _lbl)
sem_Stat (ADo _body) =
  (sem_Stat_ADo (sem_Block _body))
sem_Stat (AWhile _cond _body) =
  (sem_Stat_AWhile (sem_MExpr _cond) (sem_Block _body))
sem_Stat (ARepeat _body _cond) =
  (sem_Stat_ARepeat (sem_Block _body) (sem_MExpr _cond))
sem_Stat (AIf _cond _body _elifs _els) =
  (sem_Stat_AIf (sem_MExpr _cond) (sem_Block _body) (sem_ElseIfList _elifs) (sem_Else _els))
sem_Stat (ANFor _var _val _to _step _body) =
  (sem_Stat_ANFor _var (sem_MExpr _val) (sem_MExpr _to) (sem_MExpr _step) (sem_Block _body))
sem_Stat (AGFor _vars _vals _body) =
  (sem_Stat_AGFor _vars (sem_MExprList _vals) (sem_Block _body))
sem_Stat (AFunc _name _args _body) =
  (sem_Stat_AFunc (sem_FuncName _name) _args (sem_Block _body))
sem_Stat (ALocFunc _name _args _body) =
  (sem_Stat_ALocFunc (sem_FuncName _name) _args (sem_Block _body))

-- semantic domain
type T_Stat =
  ([MToken])
  -> Bool
  -> Int
  -> Bool
  -> PrettyPrintConfig
  -> Region
  -> Bool
  -> (([MToken]), Stat, Bool, Bool, Doc, Bool)
data Inh_Stat = Inh_Stat {comments_Inh_Stat :: ([MToken]), forceMultiline_Inh_Stat :: Bool, indent_Inh_Stat :: Int, isLastStatement_Inh_Stat :: Bool, ppconf_Inh_Stat :: PrettyPrintConfig, statRegion_Inh_Stat :: Region, wouldBeAmbiguousWithoutSemicolon_Inh_Stat :: Bool}
data Syn_Stat = Syn_Stat {comments_Syn_Stat :: ([MToken]), copy_Syn_Stat :: Stat, endsWithPrefixExpression_Syn_Stat :: Bool, isMultiline_Syn_Stat :: Bool, pretty_Syn_Stat :: Doc, startsWithExprPrefixExpression_Syn_Stat :: Bool}
wrap_Stat
  :: T_Stat
  -> Inh_Stat
  -> Syn_Stat
wrap_Stat sem (Inh_Stat _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIisLastStatement _lhsIppconf _lhsIstatRegion _lhsIwouldBeAmbiguousWithoutSemicolon) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIisLastStatement _lhsIppconf _lhsIstatRegion _lhsIwouldBeAmbiguousWithoutSemicolon
    in
      (Syn_Stat _lhsOcomments _lhsOcopy _lhsOendsWithPrefixExpression _lhsOisMultiline _lhsOpretty _lhsOstartsWithExprPrefixExpression)
  )
sem_Stat_Def
  :: T_VarsList
  -> T_Stat
sem_Stat_Def vars_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _varsOcomments :: ([MToken])
            _varsOforceMultiline :: Bool
            _varsOindent :: Int
            _varsOppconf :: PrettyPrintConfig
            _varsIcomments :: ([MToken])
            _varsIcopy :: VarsList
            _varsIendsWithPrefixExpression :: Bool
            _varsIexprPretty :: Doc
            _varsIisDefined :: Bool
            _varsIisLast :: Bool
            _varsIisMultiline :: Bool
            _varsIpretty :: Doc
            _varsIstartsWithExprPrefixExpression :: Bool
            _varsIvarPretty :: Doc
            _lhsOpretty =
              ( _varsIpretty <> _semicolon
              )
            _lhsOstartsWithExprPrefixExpression =
              ( _varsIstartsWithExprPrefixExpression
              )
            _lhsOendsWithPrefixExpression =
              ( _varsIendsWithPrefixExpression
              )
            _lhsOisMultiline =
              ( _varsIisMultiline
              )
            _semicolon =
              ( if semicolons _lhsIppconf || _lhsIwouldBeAmbiguousWithoutSemicolon
                  then zchr ';'
                  else empty
              )
            _copy =
              ( Def _varsIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _varsIcomments
              )
            _varsOcomments =
              ( _lhsIcomments
              )
            _varsOforceMultiline =
              ( _lhsIforceMultiline
              )
            _varsOindent =
              ( _lhsIindent
              )
            _varsOppconf =
              ( _lhsIppconf
              )
            (_varsIcomments, _varsIcopy, _varsIendsWithPrefixExpression, _varsIexprPretty, _varsIisDefined, _varsIisLast, _varsIisMultiline, _varsIpretty, _varsIstartsWithExprPrefixExpression, _varsIvarPretty) =
              vars_ _varsOcomments _varsOforceMultiline _varsOindent _varsOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_LocDef
  :: T_VarsList
  -> T_Stat
sem_Stat_LocDef vars_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _varsOcomments :: ([MToken])
            _varsOforceMultiline :: Bool
            _varsOindent :: Int
            _varsOppconf :: PrettyPrintConfig
            _varsIcomments :: ([MToken])
            _varsIcopy :: VarsList
            _varsIendsWithPrefixExpression :: Bool
            _varsIexprPretty :: Doc
            _varsIisDefined :: Bool
            _varsIisLast :: Bool
            _varsIisMultiline :: Bool
            _varsIpretty :: Doc
            _varsIstartsWithExprPrefixExpression :: Bool
            _varsIvarPretty :: Doc
            _lhsOpretty =
              ( zeroWidthText "local" <-> _varsIpretty <> _semicolon
              )
            _lhsOstartsWithExprPrefixExpression =
              ( _varsIstartsWithExprPrefixExpression
              )
            _lhsOendsWithPrefixExpression =
              ( _varsIendsWithPrefixExpression
              )
            _lhsOisMultiline =
              ( _varsIisMultiline
              )
            _semicolon =
              ( if semicolons _lhsIppconf || _lhsIwouldBeAmbiguousWithoutSemicolon
                  then zchr ';'
                  else empty
              )
            _copy =
              ( LocDef _varsIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _varsIcomments
              )
            _varsOcomments =
              ( _lhsIcomments
              )
            _varsOforceMultiline =
              ( _lhsIforceMultiline
              )
            _varsOindent =
              ( _lhsIindent
              )
            _varsOppconf =
              ( _lhsIppconf
              )
            (_varsIcomments, _varsIcopy, _varsIendsWithPrefixExpression, _varsIexprPretty, _varsIisDefined, _varsIisLast, _varsIisMultiline, _varsIpretty, _varsIstartsWithExprPrefixExpression, _varsIvarPretty) =
              vars_ _varsOcomments _varsOforceMultiline _varsOindent _varsOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_AFuncCall
  :: T_PrefixExp
  -> T_Stat
sem_Stat_AFuncCall fn_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _fnOparentOperatorPrecedence :: OperatorLevel
            _fnOparentOperatorAssociative :: Bool
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _fnOcomments :: ([MToken])
            _fnOforceMultiline :: Bool
            _fnOindent :: Int
            _fnOppconf :: PrettyPrintConfig
            _fnIcomments :: ([MToken])
            _fnIcopy :: PrefixExp
            _fnIisAssociative :: Bool
            _fnIisLiteral :: Bool
            _fnIisMultiline :: Bool
            _fnIprecedence :: OperatorLevel
            _fnIpretty :: Doc
            _fnIstartsWithExprPrefixExpression :: Bool
            _lhsOpretty =
              ( _fnIpretty <> _semicolon
              )
            _lhsOisMultiline =
              ( _fnIisMultiline
              )
            _semicolon =
              ( if semicolons _lhsIppconf then zchr ';' else empty
              )
            _lhsOstartsWithExprPrefixExpression =
              ( _fnIstartsWithExprPrefixExpression
              )
            _lhsOendsWithPrefixExpression =
              ( True
              )
            _fnOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _fnOparentOperatorAssociative =
              ( True
              )
            _copy =
              ( AFuncCall _fnIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _fnIcomments
              )
            _fnOcomments =
              ( _lhsIcomments
              )
            _fnOforceMultiline =
              ( _lhsIforceMultiline
              )
            _fnOindent =
              ( _lhsIindent
              )
            _fnOppconf =
              ( _lhsIppconf
              )
            (_fnIcomments, _fnIcopy, _fnIisAssociative, _fnIisLiteral, _fnIisMultiline, _fnIprecedence, _fnIpretty, _fnIstartsWithExprPrefixExpression) =
              fn_ _fnOcomments _fnOforceMultiline _fnOindent _fnOparentOperatorAssociative _fnOparentOperatorPrecedence _fnOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_ALabel
  :: MToken
  -> T_Stat
sem_Stat_ALabel lbl_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "::"
                  <> _whitespace
                  <> tok lbl_
                  <> _whitespace
                  <> zeroWidthText "::"
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _whitespace =
              ( if spaceAfterLabel _lhsIppconf then zeroWidthText " " else empty
              )
            _copy =
              ( ALabel lbl_
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_ABreak :: T_Stat
sem_Stat_ABreak =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "break" <> _semicolon
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _semicolon =
              ( if semicolons _lhsIppconf then zchr ';' else empty
              )
            _copy =
              ( ABreak
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_AContinue :: T_Stat
sem_Stat_AContinue =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "continue" <> _semicolon
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _semicolon =
              ( if semicolons _lhsIppconf then zchr ';' else empty
              )
            _copy =
              ( AContinue
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_AGoto
  :: MToken
  -> T_Stat
sem_Stat_AGoto lbl_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "goto" <-> tok lbl_ <> _semicolon
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _semicolon =
              ( if semicolons _lhsIppconf then zchr ';' else empty
              )
            _copy =
              ( AGoto lbl_
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_ADo
  :: T_Block
  -> T_Stat
sem_Stat_ADo body_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOisMultiline :: Bool
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _bodyOindent :: Int
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _bodyOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _bodyOstatRegion :: Region
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _lhsOisMultiline =
              ( True
              )
            _lhsOpretty =
              ( zeroWidthText "do"
                  $+$ _bodyIpretty
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "end")
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _bodyOindent =
              ( _lhsIindent + 1
              )
            _copy =
              ( ADo _bodyIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _bodyIcomments
              )
            _bodyOcomments =
              ( _lhsIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion
              )
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_AWhile
  :: T_MExpr
  -> T_Block
  -> T_Stat
sem_Stat_AWhile cond_ body_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOisMultiline :: Bool
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _condOparentOperatorPrecedence :: OperatorLevel
            _condOparentOperatorAssociative :: Bool
            _lhsOpretty :: Doc
            _bodyOindent :: Int
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _condOcomments :: ([MToken])
            _condOforceMultiline :: Bool
            _condOindent :: Int
            _condOppconf :: PrettyPrintConfig
            _bodyOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _bodyOstatRegion :: Region
            _condIcomments :: ([MToken])
            _condIcopy :: MExpr
            _condIendsWithPrefixExpression :: Bool
            _condIisAssociative :: Bool
            _condIisLiteral :: Bool
            _condIisMultiline :: Bool
            _condIpos :: Region
            _condIprecedence :: OperatorLevel
            _condIpretty :: Doc
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _lhsOisMultiline =
              ( True
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _condOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _condOparentOperatorAssociative =
              ( True
              )
            _lhsOpretty =
              ( zeroWidthText "while"
                  <-> _condIpretty
                  <-> zeroWidthText "do"
                  $+$ _bodyIpretty
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "end")
              )
            _bodyOindent =
              ( _lhsIindent + 1
              )
            _copy =
              ( AWhile _condIcopy _bodyIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _bodyIcomments
              )
            _condOcomments =
              ( _lhsIcomments
              )
            _condOforceMultiline =
              ( _lhsIforceMultiline
              )
            _condOindent =
              ( _lhsIindent
              )
            _condOppconf =
              ( _lhsIppconf
              )
            _bodyOcomments =
              ( _condIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion
              )
            (_condIcomments, _condIcopy, _condIendsWithPrefixExpression, _condIisAssociative, _condIisLiteral, _condIisMultiline, _condIpos, _condIprecedence, _condIpretty) =
              cond_ _condOcomments _condOforceMultiline _condOindent _condOparentOperatorAssociative _condOparentOperatorPrecedence _condOppconf
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_ARepeat
  :: T_Block
  -> T_MExpr
  -> T_Stat
sem_Stat_ARepeat body_ cond_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _bodyOindent :: Int
            _condOparentOperatorPrecedence :: OperatorLevel
            _condOparentOperatorAssociative :: Bool
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _bodyOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _bodyOstatRegion :: Region
            _condOcomments :: ([MToken])
            _condOforceMultiline :: Bool
            _condOindent :: Int
            _condOppconf :: PrettyPrintConfig
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _condIcomments :: ([MToken])
            _condIcopy :: MExpr
            _condIendsWithPrefixExpression :: Bool
            _condIisAssociative :: Bool
            _condIisLiteral :: Bool
            _condIisMultiline :: Bool
            _condIpos :: Region
            _condIprecedence :: OperatorLevel
            _condIpretty :: Doc
            _lhsOpretty =
              ( zeroWidthText "repeat"
                  $+$ _bodyIpretty
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "until" <-> _condIpretty)
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( True
              )
            _bodyOindent =
              ( _lhsIindent + 1
              )
            _condOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _condOparentOperatorAssociative =
              ( True
              )
            _copy =
              ( ARepeat _bodyIcopy _condIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _condIcomments
              )
            _bodyOcomments =
              ( _lhsIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion
              )
            _condOcomments =
              ( _bodyIcomments
              )
            _condOforceMultiline =
              ( _lhsIforceMultiline
              )
            _condOindent =
              ( _lhsIindent
              )
            _condOppconf =
              ( _lhsIppconf
              )
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
            (_condIcomments, _condIcopy, _condIendsWithPrefixExpression, _condIisAssociative, _condIisLiteral, _condIisMultiline, _condIpos, _condIprecedence, _condIpretty) =
              cond_ _condOcomments _condOforceMultiline _condOindent _condOparentOperatorAssociative _condOparentOperatorPrecedence _condOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_AIf
  :: T_MExpr
  -> T_Block
  -> T_ElseIfList
  -> T_Else
  -> T_Stat
sem_Stat_AIf cond_ body_ elifs_ els_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _condOcomments :: ([MToken])
            _condOparentOperatorPrecedence :: OperatorLevel
            _condOparentOperatorAssociative :: Bool
            _bodyOindent :: Int
            _bodyOstatRegion :: Region
            _lhsOpretty :: Doc
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _lhsOisMultiline :: Bool
            _condOforceMultiline :: Bool
            _condOindent :: Int
            _condOppconf :: PrettyPrintConfig
            _bodyOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _elifsOcomments :: ([MToken])
            _elifsOforceMultiline :: Bool
            _elifsOindent :: Int
            _elifsOppconf :: PrettyPrintConfig
            _elsOcomments :: ([MToken])
            _elsOforceMultiline :: Bool
            _elsOindent :: Int
            _elsOppconf :: PrettyPrintConfig
            _elsOstatRegion :: Region
            _condIcomments :: ([MToken])
            _condIcopy :: MExpr
            _condIendsWithPrefixExpression :: Bool
            _condIisAssociative :: Bool
            _condIisLiteral :: Bool
            _condIisMultiline :: Bool
            _condIpos :: Region
            _condIprecedence :: OperatorLevel
            _condIpretty :: Doc
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _elifsIcomments :: ([MToken])
            _elifsIcopy :: ElseIfList
            _elifsIelsesExist :: Bool
            _elifsIisMultiline :: Bool
            _elifsIpos :: Region
            _elifsIpretty :: Doc
            _elsIcomments :: ([MToken])
            _elsIcopy :: Else
            _elsIelsesExist :: Bool
            _elsIisMultiline :: Bool
            _elsIpos :: Region
            _elsIpretty :: Doc
            _isMultiline =
              ( _lhsIforceMultiline
                  || _condIisMultiline
                  || _bodyIisMultiline
                  || _elifsIelsesExist
                  || _elsIelsesExist
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _singleLinePretty =
              ( zeroWidthText "if"
                  <-> _condIpretty
                  <-> zeroWidthText "then"
                  <-> _bodyIpretty
                  <-> zeroWidthText "end"
                  <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfterThen)
              )
            _multilinePretty =
              ( zeroWidthText "if"
                  <-> _condIpretty
                  <-> zeroWidthText "then"
                  <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfterThen)
                  $+$ _bodyIpretty
                  $+$ _elifsIpretty
                  $+$ _elsIpretty
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "end")
              )
            _commentsAfterThen =
              ( span (\(MToken pos _) -> pos `beforeOrOnLine` _condIpos) _lhsIcomments
              )
            _condOcomments =
              ( snd _commentsAfterThen
              )
            _condOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _condOparentOperatorAssociative =
              ( True
              )
            _bodyOindent =
              ( if _isMultiline then _lhsIindent + 1 else 0
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion `upto` _elifsIpos `upto` _elsIpos
              )
            _lhsOpretty =
              ( if _isMultiline then _multilinePretty else _singleLinePretty
              )
            _copy =
              ( AIf _condIcopy _bodyIcopy _elifsIcopy _elsIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _elsIcomments
              )
            _lhsOisMultiline =
              ( _isMultiline
              )
            _condOforceMultiline =
              ( _lhsIforceMultiline
              )
            _condOindent =
              ( _lhsIindent
              )
            _condOppconf =
              ( _lhsIppconf
              )
            _bodyOcomments =
              ( _condIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _elifsOcomments =
              ( _bodyIcomments
              )
            _elifsOforceMultiline =
              ( _lhsIforceMultiline
              )
            _elifsOindent =
              ( _lhsIindent
              )
            _elifsOppconf =
              ( _lhsIppconf
              )
            _elsOcomments =
              ( _elifsIcomments
              )
            _elsOforceMultiline =
              ( _lhsIforceMultiline
              )
            _elsOindent =
              ( _lhsIindent
              )
            _elsOppconf =
              ( _lhsIppconf
              )
            _elsOstatRegion =
              ( _lhsIstatRegion
              )
            (_condIcomments, _condIcopy, _condIendsWithPrefixExpression, _condIisAssociative, _condIisLiteral, _condIisMultiline, _condIpos, _condIprecedence, _condIpretty) =
              cond_ _condOcomments _condOforceMultiline _condOindent _condOparentOperatorAssociative _condOparentOperatorPrecedence _condOppconf
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
            (_elifsIcomments, _elifsIcopy, _elifsIelsesExist, _elifsIisMultiline, _elifsIpos, _elifsIpretty) =
              elifs_ _elifsOcomments _elifsOforceMultiline _elifsOindent _elifsOppconf
            (_elsIcomments, _elsIcopy, _elsIelsesExist, _elsIisMultiline, _elsIpos, _elsIpretty) =
              els_ _elsOcomments _elsOforceMultiline _elsOindent _elsOppconf _elsOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_ANFor
  :: MToken
  -> T_MExpr
  -> T_MExpr
  -> T_MExpr
  -> T_Block
  -> T_Stat
sem_Stat_ANFor var_ val_ to_ step_ body_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOisMultiline :: Bool
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOpretty :: Doc
            _valOcomments :: ([MToken])
            _valOparentOperatorPrecedence :: OperatorLevel
            _valOparentOperatorAssociative :: Bool
            _toOparentOperatorPrecedence :: OperatorLevel
            _toOparentOperatorAssociative :: Bool
            _stepOparentOperatorPrecedence :: OperatorLevel
            _stepOparentOperatorAssociative :: Bool
            _bodyOindent :: Int
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _valOforceMultiline :: Bool
            _valOindent :: Int
            _valOppconf :: PrettyPrintConfig
            _toOcomments :: ([MToken])
            _toOforceMultiline :: Bool
            _toOindent :: Int
            _toOppconf :: PrettyPrintConfig
            _stepOcomments :: ([MToken])
            _stepOforceMultiline :: Bool
            _stepOindent :: Int
            _stepOppconf :: PrettyPrintConfig
            _bodyOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _bodyOstatRegion :: Region
            _valIcomments :: ([MToken])
            _valIcopy :: MExpr
            _valIendsWithPrefixExpression :: Bool
            _valIisAssociative :: Bool
            _valIisLiteral :: Bool
            _valIisMultiline :: Bool
            _valIpos :: Region
            _valIprecedence :: OperatorLevel
            _valIpretty :: Doc
            _toIcomments :: ([MToken])
            _toIcopy :: MExpr
            _toIendsWithPrefixExpression :: Bool
            _toIisAssociative :: Bool
            _toIisLiteral :: Bool
            _toIisMultiline :: Bool
            _toIpos :: Region
            _toIprecedence :: OperatorLevel
            _toIpretty :: Doc
            _stepIcomments :: ([MToken])
            _stepIcopy :: MExpr
            _stepIendsWithPrefixExpression :: Bool
            _stepIisAssociative :: Bool
            _stepIisLiteral :: Bool
            _stepIisMultiline :: Bool
            _stepIpos :: Region
            _stepIprecedence :: OperatorLevel
            _stepIpretty :: Doc
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _lhsOisMultiline =
              ( True
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _step =
              ( case _stepIcopy of
                  MExpr _ (ANumber "1") -> empty
                  _ -> _comma <> _stepIpretty
              )
            _lhsOpretty =
              ( zeroWidthText "for"
                  <-> tok var_
                  <-> zchr '='
                  <-> _valIpretty
                  <> _comma
                  <> _toIpretty
                  <> _step
                    <-> zeroWidthText "do"
                    <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfterFor)
                  $+$ _bodyIpretty
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "end")
              )
            _comma =
              ( (if spaceBeforeComma _lhsIppconf then zchr ' ' else empty)
                  <> zchr ','
                  <> (if spaceAfterComma _lhsIppconf then zchr ' ' else empty)
              )
            _commentsAfterFor =
              ( span (\(MToken pos _) -> pos `beforeOrOnLine` mpos var_) _lhsIcomments
              )
            _valOcomments =
              ( snd _commentsAfterFor
              )
            _valOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _valOparentOperatorAssociative =
              ( True
              )
            _toOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _toOparentOperatorAssociative =
              ( True
              )
            _stepOparentOperatorPrecedence =
              ( TopLevelExpression
              )
            _stepOparentOperatorAssociative =
              ( True
              )
            _bodyOindent =
              ( _lhsIindent + 1
              )
            _copy =
              ( ANFor var_ _valIcopy _toIcopy _stepIcopy _bodyIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _bodyIcomments
              )
            _valOforceMultiline =
              ( _lhsIforceMultiline
              )
            _valOindent =
              ( _lhsIindent
              )
            _valOppconf =
              ( _lhsIppconf
              )
            _toOcomments =
              ( _valIcomments
              )
            _toOforceMultiline =
              ( _lhsIforceMultiline
              )
            _toOindent =
              ( _lhsIindent
              )
            _toOppconf =
              ( _lhsIppconf
              )
            _stepOcomments =
              ( _toIcomments
              )
            _stepOforceMultiline =
              ( _lhsIforceMultiline
              )
            _stepOindent =
              ( _lhsIindent
              )
            _stepOppconf =
              ( _lhsIppconf
              )
            _bodyOcomments =
              ( _stepIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion
              )
            (_valIcomments, _valIcopy, _valIendsWithPrefixExpression, _valIisAssociative, _valIisLiteral, _valIisMultiline, _valIpos, _valIprecedence, _valIpretty) =
              val_ _valOcomments _valOforceMultiline _valOindent _valOparentOperatorAssociative _valOparentOperatorPrecedence _valOppconf
            (_toIcomments, _toIcopy, _toIendsWithPrefixExpression, _toIisAssociative, _toIisLiteral, _toIisMultiline, _toIpos, _toIprecedence, _toIpretty) =
              to_ _toOcomments _toOforceMultiline _toOindent _toOparentOperatorAssociative _toOparentOperatorPrecedence _toOppconf
            (_stepIcomments, _stepIcopy, _stepIendsWithPrefixExpression, _stepIisAssociative, _stepIisLiteral, _stepIisMultiline, _stepIpos, _stepIprecedence, _stepIpretty) =
              step_ _stepOcomments _stepOforceMultiline _stepOindent _stepOparentOperatorAssociative _stepOparentOperatorPrecedence _stepOppconf
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_AGFor
  :: ([MToken])
  -> T_MExprList
  -> T_Block
  -> T_Stat
sem_Stat_AGFor vars_ vals_ body_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOisMultiline :: Bool
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOpretty :: Doc
            _bodyOindent :: Int
            _valsOcomments :: ([MToken])
            _valsOforceMultiline :: Bool
            _valsOsomeElementsInListAreMultiline :: Bool
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _valsOindent :: Int
            _valsOppconf :: PrettyPrintConfig
            _bodyOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _bodyOstatRegion :: Region
            _valsIcomments :: ([MToken])
            _valsIcopy :: MExprList
            _valsIisAssociative :: Bool
            _valsIisLast :: Bool
            _valsIisMultiline :: Bool
            _valsIpos :: Region
            _valsIprecedence :: OperatorLevel
            _valsIpretty :: Doc
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _lhsOisMultiline =
              ( True
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOpretty =
              ( zeroWidthText "for"
                  <-> printList tok (render _comma) vars_
                  <-> zeroWidthText "in"
                  <-> _valsIpretty
                  <-> zeroWidthText "do"
                  <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfterFor)
                  $+$ _bodyIpretty
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "end")
              )
            _bodyOindent =
              ( _lhsIindent + 1
              )
            _comma =
              ( (if spaceBeforeComma _lhsIppconf then zchr ' ' else empty)
                  <> zchr ','
                  <> (if spaceAfterComma _lhsIppconf then zchr ' ' else empty)
              )
            _commentsAfterFor =
              ( span (\(MToken pos _) -> pos `beforeOrOnLine` mpos (head vars_)) _lhsIcomments
              )
            _valsOcomments =
              ( snd _commentsAfterFor
              )
            _valsOforceMultiline =
              ( False
              )
            _valsOsomeElementsInListAreMultiline =
              ( False
              )
            _copy =
              ( AGFor vars_ _valsIcopy _bodyIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _bodyIcomments
              )
            _valsOindent =
              ( _lhsIindent
              )
            _valsOppconf =
              ( _lhsIppconf
              )
            _bodyOcomments =
              ( _valsIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion
              )
            (_valsIcomments, _valsIcopy, _valsIisAssociative, _valsIisLast, _valsIisMultiline, _valsIpos, _valsIprecedence, _valsIpretty) =
              vals_ _valsOcomments _valsOforceMultiline _valsOindent _valsOppconf _valsOsomeElementsInListAreMultiline
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_AFunc
  :: T_FuncName
  -> ([MToken])
  -> T_Block
  -> T_Stat
sem_Stat_AFunc name_ args_ body_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOisMultiline :: Bool
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOpretty :: Doc
            _nameOcomments :: ([MToken])
            _bodyOindent :: Int
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _nameOindent :: Int
            _nameOppconf :: PrettyPrintConfig
            _bodyOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _bodyOstatRegion :: Region
            _nameIcomments :: ([MToken])
            _nameIcopy :: FuncName
            _nameIisMultiline :: Bool
            _nameIpos :: Region
            _nameIpretty :: Doc
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _lhsOisMultiline =
              ( True
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOpretty =
              ( zeroWidthText "function"
                  <-> _nameIpretty
                  <> parens _lhsIppconf _emptyParams (printList tok (render _comma) args_)
                    <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfterFunc)
                  $+$ _bodyIpretty
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "end")
              )
            _commentsAfterFunc =
              ( span (\(MToken pos _) -> pos `beforeOrOnLine` _nameIpos) _lhsIcomments
              )
            _nameOcomments =
              ( snd _commentsAfterFunc
              )
            _emptyParams =
              ( toEmpty $ null args_
              )
            _comma =
              ( (if spaceBeforeComma _lhsIppconf then zchr ' ' else empty)
                  <> zchr ','
                  <> (if spaceAfterComma _lhsIppconf then zchr ' ' else empty)
              )
            _bodyOindent =
              ( _lhsIindent + 1
              )
            _copy =
              ( AFunc _nameIcopy args_ _bodyIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _bodyIcomments
              )
            _nameOindent =
              ( _lhsIindent
              )
            _nameOppconf =
              ( _lhsIppconf
              )
            _bodyOcomments =
              ( _nameIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion
              )
            (_nameIcomments, _nameIcopy, _nameIisMultiline, _nameIpos, _nameIpretty) =
              name_ _nameOcomments _nameOindent _nameOppconf
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )
sem_Stat_ALocFunc
  :: T_FuncName
  -> ([MToken])
  -> T_Block
  -> T_Stat
sem_Stat_ALocFunc name_ args_ body_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIisLastStatement
     _lhsIppconf
     _lhsIstatRegion
     _lhsIwouldBeAmbiguousWithoutSemicolon ->
        ( let
            _lhsOisMultiline :: Bool
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _nameOcomments :: ([MToken])
            _bodyOindent :: Int
            _lhsOcopy :: Stat
            _lhsOcomments :: ([MToken])
            _nameOindent :: Int
            _nameOppconf :: PrettyPrintConfig
            _bodyOcomments :: ([MToken])
            _bodyOforceMultiline :: Bool
            _bodyOppconf :: PrettyPrintConfig
            _bodyOstatRegion :: Region
            _nameIcomments :: ([MToken])
            _nameIcopy :: FuncName
            _nameIisMultiline :: Bool
            _nameIpos :: Region
            _nameIpretty :: Doc
            _bodyIcomments :: ([MToken])
            _bodyIcopy :: Block
            _bodyIisMultiline :: Bool
            _bodyIpretty :: Doc
            _bodyIstatementCount :: Int
            _lhsOisMultiline =
              ( True
              )
            _lhsOpretty =
              ( zeroWidthText "local function"
                  <-> _nameIpretty
                  <> parens _lhsIppconf _emptyParams (printList tok (render _comma) args_)
                    <-> renderSLComments _lhsIppconf _lhsIindent (fst _commentsAfterFunc)
                  $+$ _bodyIpretty
                  $+$ indent _lhsIppconf _lhsIindent (zeroWidthText "end")
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _commentsAfterFunc =
              ( span (\(MToken pos _) -> pos `beforeOrOnLine` _nameIpos) _lhsIcomments
              )
            _nameOcomments =
              ( snd _commentsAfterFunc
              )
            _emptyParams =
              ( toEmpty $ null args_
              )
            _comma =
              ( (if spaceBeforeComma _lhsIppconf then zchr ' ' else empty)
                  <> zchr ','
                  <> (if spaceAfterComma _lhsIppconf then zchr ' ' else empty)
              )
            _bodyOindent =
              ( _lhsIindent + 1
              )
            _copy =
              ( ALocFunc _nameIcopy args_ _bodyIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _bodyIcomments
              )
            _nameOindent =
              ( _lhsIindent
              )
            _nameOppconf =
              ( _lhsIppconf
              )
            _bodyOcomments =
              ( _nameIcomments
              )
            _bodyOforceMultiline =
              ( _lhsIforceMultiline
              )
            _bodyOppconf =
              ( _lhsIppconf
              )
            _bodyOstatRegion =
              ( _lhsIstatRegion
              )
            (_nameIcomments, _nameIcopy, _nameIisMultiline, _nameIpos, _nameIpretty) =
              name_ _nameOcomments _nameOindent _nameOppconf
            (_bodyIcomments, _bodyIcopy, _bodyIisMultiline, _bodyIpretty, _bodyIstatementCount) =
              body_ _bodyOcomments _bodyOforceMultiline _bodyOindent _bodyOppconf _bodyOstatRegion
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression)
        )
  )

-- UnOp --------------------------------------------------------
-- cata
sem_UnOp
  :: UnOp
  -> T_UnOp
sem_UnOp (UnMinus) =
  (sem_UnOp_UnMinus)
sem_UnOp (ANot) =
  (sem_UnOp_ANot)
sem_UnOp (AHash) =
  (sem_UnOp_AHash)

-- semantic domain
type T_UnOp =
  ([MToken])
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), UnOp, Bool, Doc)
data Inh_UnOp = Inh_UnOp {comments_Inh_UnOp :: ([MToken]), indent_Inh_UnOp :: Int, ppconf_Inh_UnOp :: PrettyPrintConfig}
data Syn_UnOp = Syn_UnOp {comments_Syn_UnOp :: ([MToken]), copy_Syn_UnOp :: UnOp, isMultiline_Syn_UnOp :: Bool, pretty_Syn_UnOp :: Doc}
wrap_UnOp
  :: T_UnOp
  -> Inh_UnOp
  -> Syn_UnOp
wrap_UnOp sem (Inh_UnOp _lhsIcomments _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty) = sem _lhsIcomments _lhsIindent _lhsIppconf
    in
      (Syn_UnOp _lhsOcomments _lhsOcopy _lhsOisMultiline _lhsOpretty)
  )
sem_UnOp_UnMinus :: T_UnOp
sem_UnOp_UnMinus =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOcopy :: UnOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "-"
              )
            _lhsOisMultiline =
              ( False
              )
            _copy =
              ( UnMinus
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty)
        )
  )
sem_UnOp_ANot :: T_UnOp
sem_UnOp_ANot =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOcopy :: UnOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText (if cStyle _lhsIppconf then "!" else "not ")
              )
            _lhsOisMultiline =
              ( False
              )
            _copy =
              ( ANot
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty)
        )
  )
sem_UnOp_AHash :: T_UnOp
sem_UnOp_AHash =
  ( \_lhsIcomments
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOisMultiline :: Bool
            _lhsOcopy :: UnOp
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( zeroWidthText "#"
              )
            _lhsOisMultiline =
              ( False
              )
            _copy =
              ( AHash
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOisMultiline, _lhsOpretty)
        )
  )

-- VarsList ----------------------------------------------------
-- cata
sem_VarsList
  :: VarsList
  -> T_VarsList
sem_VarsList list =
  (Prelude.foldr sem_VarsList_Cons sem_VarsList_Nil (Prelude.map sem_Declaration list))

-- semantic domain
type T_VarsList =
  ([MToken])
  -> Bool
  -> Int
  -> PrettyPrintConfig
  -> (([MToken]), VarsList, Bool, Doc, Bool, Bool, Bool, Doc, Bool, Doc)
data Inh_VarsList = Inh_VarsList {comments_Inh_VarsList :: ([MToken]), forceMultiline_Inh_VarsList :: Bool, indent_Inh_VarsList :: Int, ppconf_Inh_VarsList :: PrettyPrintConfig}
data Syn_VarsList = Syn_VarsList {comments_Syn_VarsList :: ([MToken]), copy_Syn_VarsList :: VarsList, endsWithPrefixExpression_Syn_VarsList :: Bool, exprPretty_Syn_VarsList :: Doc, isDefined_Syn_VarsList :: Bool, isLast_Syn_VarsList :: Bool, isMultiline_Syn_VarsList :: Bool, pretty_Syn_VarsList :: Doc, startsWithExprPrefixExpression_Syn_VarsList :: Bool, varPretty_Syn_VarsList :: Doc}
wrap_VarsList
  :: T_VarsList
  -> Inh_VarsList
  -> Syn_VarsList
wrap_VarsList sem (Inh_VarsList _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf) =
  ( let
      (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOexprPretty, _lhsOisDefined, _lhsOisLast, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOvarPretty) = sem _lhsIcomments _lhsIforceMultiline _lhsIindent _lhsIppconf
    in
      (Syn_VarsList _lhsOcomments _lhsOcopy _lhsOendsWithPrefixExpression _lhsOexprPretty _lhsOisDefined _lhsOisLast _lhsOisMultiline _lhsOpretty _lhsOstartsWithExprPrefixExpression _lhsOvarPretty)
  )
sem_VarsList_Cons
  :: T_Declaration
  -> T_VarsList
  -> T_VarsList
sem_VarsList_Cons hd_ tl_ =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisLast :: Bool
            _lhsOexprPretty :: Doc
            _lhsOisDefined :: Bool
            _lhsOvarPretty :: Doc
            _lhsOcopy :: VarsList
            _lhsOcomments :: ([MToken])
            _hdOcomments :: ([MToken])
            _hdOforceMultiline :: Bool
            _hdOindent :: Int
            _hdOppconf :: PrettyPrintConfig
            _tlOcomments :: ([MToken])
            _tlOforceMultiline :: Bool
            _tlOindent :: Int
            _tlOppconf :: PrettyPrintConfig
            _hdIcomments :: ([MToken])
            _hdIcopy :: Declaration
            _hdIendsWithPrefixExpression :: Bool
            _hdIexprPretty :: Doc
            _hdIisDefined :: Bool
            _hdIisMultiline :: Bool
            _hdIpretty :: Doc
            _hdIstartsWithExprPrefixExpression :: Bool
            _hdIvarPretty :: Doc
            _tlIcomments :: ([MToken])
            _tlIcopy :: VarsList
            _tlIendsWithPrefixExpression :: Bool
            _tlIexprPretty :: Doc
            _tlIisDefined :: Bool
            _tlIisLast :: Bool
            _tlIisMultiline :: Bool
            _tlIpretty :: Doc
            _tlIstartsWithExprPrefixExpression :: Bool
            _tlIvarPretty :: Doc
            _lhsOpretty =
              ( _varPretty
                  <-> if _isDefined then zchr '=' <-> _exprPretty else empty
              )
            _lhsOstartsWithExprPrefixExpression =
              ( _hdIstartsWithExprPrefixExpression
              )
            _lhsOendsWithPrefixExpression =
              ( if _tlIisDefined then _tlIendsWithPrefixExpression else _hdIendsWithPrefixExpression
              )
            _lhsOisMultiline =
              ( _hdIisMultiline || _tlIisMultiline
              )
            _isDefined =
              ( _hdIisDefined || _tlIisDefined
              )
            _varPretty =
              ( _hdIvarPretty
                  <> (if _tlIisLast then empty else _comma)
                  <> _tlIvarPretty
              )
            _exprPretty =
              ( _hdIexprPretty
                  <> (if not _tlIisLast && _tlIisDefined then _comma else empty)
                  <> _tlIexprPretty
              )
            _comma =
              ( (if spaceBeforeComma _lhsIppconf then zchr ' ' else empty)
                  <> zchr ','
                  <> (if spaceAfterComma _lhsIppconf then zchr ' ' else empty)
              )
            _lhsOisLast =
              ( False
              )
            _lhsOexprPretty =
              ( _exprPretty
              )
            _lhsOisDefined =
              ( _isDefined
              )
            _lhsOvarPretty =
              ( _varPretty
              )
            _copy =
              ( (:) _hdIcopy _tlIcopy
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _tlIcomments
              )
            _hdOcomments =
              ( _lhsIcomments
              )
            _hdOforceMultiline =
              ( _lhsIforceMultiline
              )
            _hdOindent =
              ( _lhsIindent
              )
            _hdOppconf =
              ( _lhsIppconf
              )
            _tlOcomments =
              ( _hdIcomments
              )
            _tlOforceMultiline =
              ( _lhsIforceMultiline
              )
            _tlOindent =
              ( _lhsIindent
              )
            _tlOppconf =
              ( _lhsIppconf
              )
            (_hdIcomments, _hdIcopy, _hdIendsWithPrefixExpression, _hdIexprPretty, _hdIisDefined, _hdIisMultiline, _hdIpretty, _hdIstartsWithExprPrefixExpression, _hdIvarPretty) =
              hd_ _hdOcomments _hdOforceMultiline _hdOindent _hdOppconf
            (_tlIcomments, _tlIcopy, _tlIendsWithPrefixExpression, _tlIexprPretty, _tlIisDefined, _tlIisLast, _tlIisMultiline, _tlIpretty, _tlIstartsWithExprPrefixExpression, _tlIvarPretty) =
              tl_ _tlOcomments _tlOforceMultiline _tlOindent _tlOppconf
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOexprPretty, _lhsOisDefined, _lhsOisLast, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOvarPretty)
        )
  )
sem_VarsList_Nil :: T_VarsList
sem_VarsList_Nil =
  ( \_lhsIcomments
     _lhsIforceMultiline
     _lhsIindent
     _lhsIppconf ->
        ( let
            _lhsOpretty :: Doc
            _lhsOstartsWithExprPrefixExpression :: Bool
            _lhsOendsWithPrefixExpression :: Bool
            _lhsOisMultiline :: Bool
            _lhsOisLast :: Bool
            _lhsOexprPretty :: Doc
            _lhsOisDefined :: Bool
            _lhsOvarPretty :: Doc
            _lhsOcopy :: VarsList
            _lhsOcomments :: ([MToken])
            _lhsOpretty =
              ( empty
              )
            _lhsOstartsWithExprPrefixExpression =
              ( False
              )
            _lhsOendsWithPrefixExpression =
              ( False
              )
            _lhsOisMultiline =
              ( False
              )
            _lhsOisLast =
              ( True
              )
            _lhsOexprPretty =
              ( empty
              )
            _lhsOisDefined =
              ( False
              )
            _lhsOvarPretty =
              ( empty
              )
            _copy =
              ( []
              )
            _lhsOcopy =
              ( _copy
              )
            _lhsOcomments =
              ( _lhsIcomments
              )
          in
            (_lhsOcomments, _lhsOcopy, _lhsOendsWithPrefixExpression, _lhsOexprPretty, _lhsOisDefined, _lhsOisLast, _lhsOisMultiline, _lhsOpretty, _lhsOstartsWithExprPrefixExpression, _lhsOvarPretty)
        )
  )