%%[1 ag ------------------------------------------------------------------------- -- ARule's PP ------------------------------------------------------------------------- ATTR AllARule AGARuleItf [ | | pp USE {>-<} {empty} : PP_Doc ] SEM ARule | Rule lhs . pp = "SEM" >#< pp (head @ndNmL) -- >#< "--" >#< ppCommas' @info >-< indent atLhs2texDist ("|" >#< @rlNm >|< indent atLhs2texDist @eqns.pp) SEM AEqn | Eqn lhs . pp = let (w1,w2) = fromJust @lhs.mbDstWd w = w1 + w2 + atDstFillLen cmb l r = if @dest.isComposite then if @dest.dstWd > w - atLhs2texDist then l >-< strWhite w >|< r else l >|< strWhite (w - @dest.dstWd) >|< r else l >|< r in cmb @dest.pp ("=" >|< strWhite atLhs2texDist >|< @val.pp) | Err lhs . pp = "ERR" >#< @expr.pp SEM AEqnDest | Many lhs . pp = ppParensCommas @dests.ppL SEM AExpr | Expr lhs . pp = exprNeedPar ParCtxtOther nmUnk @expr.self @expr.pp SEM AEqnDests [ | | ppL: {[PP_Doc]} ] | Cons lhs . ppL = @hd.pp : @tl.ppL | Nil lhs . ppL = [] ------------------------------------------------------------------------- -- Context of ANm ------------------------------------------------------------------------- SEM AEqnDest | One anm . isDest = True ------------------------------------------------------------------------- -- ARule max column width info, for tabular like PP ------------------------------------------------------------------------- ATTR AllARuleButARule [ mbDstWd: {Maybe (Int,Int)} | | mxDstNdWd, mxDstAtWd USE {`max`} {0}: Int ] SEM ARule | Rule loc . mbDstWd = Just (@eqns.mxDstNdWd,@eqns.mxDstAtWd) SEM AEqnDest | Many dests . mbDstWd = Nothing ------------------------------------------------------------------------- -- ARule dest width info, for lining up multidestination AEqn ------------------------------------------------------------------------- ATTR AEqnDest [ | | dstWd: Int ] ATTR AEqnDests [ | | dstWdL: {[Int]} ] SEM AEqnDest | Many lhs . dstWd = sum @dests.dstWdL + length @dests.dstWdL + 1 | One lhs . dstWd = @anm.mxDstNdWd + @anm.mxDstAtWd + (if @anm.mxDstNdWd > 0 then 1 else 0) SEM AEqnDests | Cons lhs . dstWdL = @hd.dstWd : @tl.dstWdL | Nil lhs . dstWdL = [] ------------------------------------------------------------------------- -- Node name of AEqnDest in an AEqn, for emitting only first of a series of same node names ------------------------------------------------------------------------- ATTR AEqnDest AEqn [ | | ndStr: String ] ATTR AEqnDest AEqn AEqns [ mbPrevNdStr: {Maybe String} | | ] SEM AEqnDest | Many lhs . ndStr = "??" SEM AEqn | Err lhs . ndStr = "??" SEM AEqns | Cons tl . mbPrevNdStr = fmap (const @hd.ndStr) @lhs.mbDstWd SEM ARule | Rule loc . mbPrevNdStr = Nothing SEM AEqnDests | Cons loc . mbPrevNdStr = Nothing SEM AEqnDest | Many loc . mbPrevNdStr = Nothing ------------------------------------------------------------------------- -- Kind of lhs of eqn, composite? ------------------------------------------------------------------------- ATTR AEqnDest [ | | isComposite: Bool ] SEM AEqnDest | Many lhs . isComposite = True | One lhs . isComposite = False %%]