packages feed

ruler-0.4.0.0: demo/RulerDemoMain.cag

%%[0
%include lhs2TeX.fmt
%include afp.fmt
%%]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Haskell interface to AG generated code for compiler
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%[3 hs import(System.IO,Data.List,UU.Pretty,UU.Parsing,UU.Scanner,UU.Scanner.Position( initPos, Pos ),RulerDemoUtils)
%%]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Import of generated part (type rule implementation)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%[3 import(demo)
WRAPPER AGItf
%%]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Main
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%[3 hs
-- main
main :: IO ()
main
  = do { txt <- hGetContents stdin
       ; let tokens = scan ["let", "in"] ["->", "=", "\\"]
                           "()" "\\->=" (initPos "") txt
       ; pres <- parseIOMessage show pAGItf tokens
       ; let res = wrap_AGItf pres Inh_AGItf
       ; putStrLn (disp (pp_Syn_AGItf res) 200 "")
       }

-- Parser
pAGItf :: (IsParser p Token) => p T_AGItf
pAGItf
  = pAGItf
  where pAGItf    =   sem_AGItf_AGItf <$> pExpr
        pExprBase =   pParens pExpr
                  <|> sem_Expr_Var          <$> pVarid
                  <|> (sem_Expr_Int . read) <$> pInteger
        pExprApp  =   foldl1 sem_Expr_App   <$> pList1 pExprBase
        pExprPre  =   sem_Expr_Let
                      <$ pKey "let" <*> pVarid
                      <* pKey "="   <*> pExpr <* pKey "in"
                  <|> sem_Expr_Lam
                      <$ pKey "\\"  <*> pVarid
                      <* pKey "->"
        pExpr     =   pExprPre <*> pExpr
                  <|> pExprApp
%%]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% AST
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%[3
-- AST
DATA AGItf
  | AGItf  e  : Expr
%%]

%%[33.AST.Expr.App
DATA Expr
  | App  f    : Expr
         a    : Expr
%%]
%%[33.AST.Expr.IntVar
  | Int  int  : {Int}
  | Var  i    : {String}
%%]
%%[33.AST.Expr.Rest
  | Lam  i    : {String}
         b    : Expr
  | Let  i    : {String}
         e    : Expr
         b    : Expr
%%]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Initialisation
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%[3
-- Initialisation
SEM AGItf
  | AGItf  e  .   g  =   []
              .   c  =   []
%%]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Pretty printing
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%[3
-- Pretty printing
ATTR AGItf Expr [ | | pp: PP_Doc ]

SEM Expr
  | App  lhs  .   pp   =   @f.pp >#< pp_parens @a.pp
                           >-< mkErr @mtErrs
  | Int  lhs  .   pp   =   pp @int
  | Var  lhs  .   pp   =   pp @i >-< mkErr @nmErrs
  | Lam  lhs  .   pp   =   "\\" >|< pp @i >#< "->" >#< @b.pp
  | Let  lhs  .   pp   =   "let"     >#< pp @i
                           >#< "::"  >#< show @pty_e_
                           >#< "="   >#< @e.pp
                           >-< "in " >#< @b.pp
%%]
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Uniq
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%[3
-- Uniq
%%]

%%[3.uniq
ATTR Expr [ | uniq: UID | ]

SEM AGItf
  | AGItf  e  .   uniq  =   uidStart
%%]