packages feed

ruler-0.4.0.0: src/Expr/PrettyPrintAG.cag

%%[1 ag

-------------------------------------------------------------------------
-- PP for Expr
-------------------------------------------------------------------------

ATTR AllExpr AGExprItf [ | | pp USE {>-<} {empty} : PP_Doc ]

SEM Expr
  | App             lhs     .   pp          =   exprNeedPar ParCtxtAppL nmUnk @lExpr.self @lExpr.pp
                                                >#< exprNeedPar ParCtxtAppR nmUnk @rExpr.self @rExpr.pp
  | Op              lhs     .   pp          =   let op = if @nm == nmSp1 then empty else @nmExpr.pp
                                                in  ppExprMbEmpty @lExpr.self (>|< " ")
                                                        (exprNeedPar ParCtxtOpL @nm @lExpr.self @lExpr.pp)
                                                    >|< op
                                                    >|< ppExprMbEmpty @rExpr.self (" " >|<)
                                                            (exprNeedPar ParCtxtOpR @nm @rExpr.self @rExpr.pp)
  | LF              lhs     .   pp          =   exprNeedPar ParCtxtAppR nmUnk @lExpr.self @lExpr.pp
                                                >-< exprNeedPar ParCtxtAppR nmUnk @rExpr.self @rExpr.pp
  | SP              lhs     .   pp          =   @lExpr.pp >|< @rExpr.pp
  | Int             lhs     .   pp          =   pp @int
  | StrText StrAsIs lhs     .   pp          =   pp @str
  | Named           lhs     .   pp          =   @expr.pp
  | Cnstr           lhs     .   pp          =   ppCurlys (@expr.pp >|< "|" >|< @cnstr.pp)
  | Uniq            lhs     .   pp          =   pp "?uniq?"
  | Undefined       lhs     .   pp          =   pp "_"
SEM Expr
  | Sel             lhs     .   pp          =   exprNeedPar ParCtxtOther nmUnk @expr.self @expr.pp >|< cfgStrSel >|< @selMbExpr.pp
  | Var             lhs     .   pp          =   pp @nm
  | Paren           lhs     .   pp          =   {-ppParens-} @expr.pp
  | AppTop          lhs     .   pp          =   @expr.pp
{-
-}
{-
SEM Expr
  | Sel             lhs     .   pp          =   ppBrackets ("SEL" >#< exprNeedPar ParCtxtOther nmUnk @expr.self @expr.pp) >|< cfgStrSel >|< @selMbExpr.pp
  | Var             lhs     .   pp          =   ppBrackets ("VAR" >#< pp @nm)
  | AVar            lhs     .   pp          =   ppBrackets ("AVR" >#< @anm.pp)
  | Paren           lhs     .   pp          =   ppBrackets ("PAR" >#< @expr.pp)
  | AppTop          lhs     .   pp          =   ppBrackets ("TOP" >#< @expr.pp)
-}

SEM ECnstr
  | Ty              lhs     .   pp          =   ppCommas' @nms
  | Var             lhs     .   pp          =   pp @nm

SEM ANm
  | Wild            loc     .   nm          =   nmWild
                    lhs     .   pp          =   ppDest "W" @lhs.isDest @lhs.mbDstWd @lhs.mbPrevNdStr ""     ""     @nm
  | Loc             lhs     .   pp          =   ppDest "L" @lhs.isDest @lhs.mbDstWd @lhs.mbPrevNdStr @ndStr ""     @nm
  | Lhs             lhs     .   pp          =   ppDest "P" @lhs.isDest @lhs.mbDstWd @lhs.mbPrevNdStr @ndStr @ndStr @nm
  | Fld             lhs     .   pp          =   ppDest "F" @lhs.isDest @lhs.mbDstWd @lhs.mbPrevNdStr "??"   @ndStr @nm
  | Node            lhs     .   pp          =   ppDest "N" @lhs.isDest @lhs.mbDstWd @lhs.mbPrevNdStr @ndStr @ndStr @nm

-------------------------------------------------------------------------
-- Context of ANm
-------------------------------------------------------------------------

ATTR ANm [ isDest: Bool | | ]

SEM Expr
  | AVar            anm     .   isDest      =   False

-------------------------------------------------------------------------
-- ARule max column width info, for tabular like PP
-------------------------------------------------------------------------

ATTR ANm [ mbDstWd: {Maybe (Int,Int)} | | mxDstNdWd, mxDstAtWd USE {`max`} {0}: Int ]

SEM ANm
  | Loc Lhs         lhs     .   mxDstNdWd   =   3
  | Wild            lhs     .   mxDstNdWd   =   0
  | Node            lhs     .   mxDstNdWd   =   length @ndStr
  | *               lhs     .   mxDstAtWd   =   length . show $ @nm

SEM Expr
  | AVar            loc     .   mbDstWd     =   Nothing

-------------------------------------------------------------------------
-- Node name of AEqnDest in an AEqn, for emitting only first of a series of same node names
-------------------------------------------------------------------------

ATTR ANm [ | | ndStr: String ]
ATTR ANm [ mbPrevNdStr: {Maybe String} | | ]

SEM ANm
  | Loc             loc     .   ndStr       =   strLoc
  | Lhs             loc     .   ndStr       =   if AtRetain `elem` @props then strLoc else strLhs
  | Node            loc     .   ndStr       =   show @ndNm
  | Fld Wild        loc     .   ndStr       =   ""

SEM Expr
  | AVar            loc     .   mbPrevNdStr =   Nothing

%%]