symparsec
Safe HaskellNone
LanguageGHC2021

Symparsec.Example.Expr

Description

An example Symparsec parser for a basic expression tree.

Synopsis

Documentation

data Expr a Source #

A basic expression tree, polymorphic over a single literal type.

Constructors

EBOp BOp (Expr a) (Expr a) 
ELit a 

Instances

Instances details
type App PExpr (s :: PState) Source # 
Instance details

Defined in Symparsec.Example.Expr

type App PExpr (s :: PState) = PExprNext s ('[] :: [ExprTok]) ('[] :: [Expr Natural]) (UnconsState s)

data BOp Source #

A binary operator.

Constructors

Add 
Sub 
Mul 
Div 

type family Eval (expr :: Expr Natural) :: Natural where ... Source #

Evaluate an Expr of Naturals on the type level.

Naive, doesn't attempt to tail-call recurse.

Equations

Eval ('EBOp bop l r) = EvalBOp bop (Eval l) (Eval r) 
Eval ('ELit n) = n 

type family EvalBOp (bop :: BOp) (l :: Natural) (r :: Natural) :: Natural where ... Source #

Equations

EvalBOp 'Add l r = l + r 
EvalBOp 'Sub l r = l - r 
EvalBOp 'Mul l r = l * r 
EvalBOp 'Div l r = Div l r 

data PExpr (s :: FunKind PState (PReply (Expr Natural))) Source #

Instances

Instances details
type App PExpr (s :: PState) Source # 
Instance details

Defined in Symparsec.Example.Expr

type App PExpr (s :: PState) = PExprNext s ('[] :: [ExprTok]) ('[] :: [Expr Natural]) (UnconsState s)

type family PExprNext (sPrev :: PState) (ops :: [ExprTok]) (exprs :: [Expr Natural]) (s :: (Maybe Char, PState)) :: PReply (Expr Natural) where ... Source #

Equations

PExprNext sPrev ops exprs '('Just ch, s) = PExprCh sPrev s ops exprs ch 
PExprNext sPrev ops exprs '('Nothing :: Maybe Char, s) = PExprEnd sPrev s ops exprs 

type family PExprEnd (sPrev :: State Symbol n) (s :: State Symbol n) (ops :: [ExprTok]) (exprs :: [Expr a]) :: Reply Symbol n (Expr a) where ... Source #

Equations

PExprEnd (sPrev :: State Symbol n) (s :: State Symbol n) ('TokBOp op ': ops) (exprs :: [Expr a]) = PExprEndPopOp sPrev s ops exprs op 
PExprEnd (sPrev :: State Symbol n) (s :: State Symbol n) ('[] :: [ExprTok]) ('[expr] :: [Expr a]) = 'Reply ('OK expr :: Result Symbol n (Expr a)) s 
PExprEnd (sPrev :: State Symbol n) (s :: State Symbol n) ('[] :: [ExprTok]) (_1 :: [Expr a]) = 'Reply ('Err (Error1 "badly formed expression") :: Result Symbol n (Expr a)) sPrev 

type family PExprEndPopOp (sPrev :: State Symbol n) (s :: State Symbol n) (ops :: [ExprTok]) (exprs :: [Expr a]) (op :: BOp) :: Reply Symbol n (Expr a) where ... Source #

Equations

PExprEndPopOp (sPrev :: State Symbol n) (s :: State Symbol n) ops (r ': (l ': exprs) :: [Expr a]) bop = PExprEnd sPrev s ops ('EBOp bop l r ': exprs) 
PExprEndPopOp (sPrev :: State Symbol n) (s :: State Symbol n) ops (exprs :: [Expr a]) bop = 'Reply ('Err (Error1 "badly formed expression") :: Result Symbol n (Expr a)) sPrev 

type family PExprCh (sPrev :: PState) (s :: PState) (ops :: [ExprTok]) (exprs :: [Expr Natural]) (ch :: Char) :: PReply (Expr Natural) where ... Source #

Equations

PExprCh sPrev s ops exprs ' ' = PExprNext s ops exprs (UnconsState s) 
PExprCh sPrev s ops exprs ch = PExprELit sPrev s ops exprs ch (ParseDigitDecSym @@ ch) 

type family PExprELit (sPrev :: PState) (s :: PState) (ops :: [ExprTok]) (exprs :: [Expr Natural]) (ch :: Char) (mDigit :: Maybe Natural) :: PReply (Expr Natural) where ... Source #

Equations

PExprELit sPrev s ops exprs _ch ('Just digit) = PExprELitEnd ops exprs (While IsDecDigitSym (NatBase1 10 ParseDigitDecSym digit) @@ s) 
PExprELit sPrev s ops exprs ch ('Nothing :: Maybe Natural) = PExprEBOp sPrev s ops exprs ch (PExprEBOpOpCh ch) 

type family PExprELitEnd (ops :: [ExprTok]) (exprs :: [Expr Natural]) (res :: PReply Natural) :: PReply (Expr Natural) where ... Source #

Equations

PExprELitEnd ops exprs ('Reply ('OK n :: Result Symbol Natural Natural) s) = PExprNext s ops ('ELit n ': exprs) (UnconsState s) 
PExprELitEnd ops exprs ('Reply ('Err e :: Result Symbol Natural Natural) s) = Impossible :: PReply (Expr Natural) 

type family PExprEBOp (sPrev :: PState) (s :: PState) (ops :: [ExprTok]) (exprs :: [Expr Natural]) (ch :: Char) (mbop :: Maybe ExprTok) :: PReply (Expr Natural) where ... Source #

Equations

PExprEBOp sPrev s ops exprs ch ('Just ('TokBOp bop)) = PExprEBOp' sPrev s bop (BOpPrec bop) exprs ops 
PExprEBOp sPrev s ops exprs ch ('Just 'TokParenL) = PExprNext sPrev ('TokParenL ': ops) exprs (UnconsState s) 
PExprEBOp sPrev s ops exprs ch ('Just 'TokParenR) = PExprParenRStart sPrev s exprs ops 
PExprEBOp sPrev s ops exprs ch ('Nothing :: Maybe ExprTok) = 'Reply ('Err (Error1 "bad expression, expected digit or operator") :: Result Symbol Natural (Expr Natural)) sPrev 

type family PExprParenRStart (sPrev :: PState) (s :: PState) (exprs :: [Expr Natural]) (ops :: [ExprTok]) :: PReply (Expr Natural) where ... Source #

Equations

PExprParenRStart sPrev s exprs ('TokParenL ': ops) = 'Reply ('Err (Error1 "invalid bracket syntax (empty brackets, or otherwise bad)") :: Result Symbol Natural (Expr Natural)) sPrev 
PExprParenRStart sPrev s exprs ops = PExprParenR sPrev s exprs ops 

type family PExprParenR (sPrev :: PState) (s :: PState) (exprs :: [Expr Natural]) (ops :: [ExprTok]) :: PReply (Expr Natural) where ... Source #

Equations

PExprParenR sPrev s exprs ('TokBOp bop ': ops) = PExprParenRPopBOp sPrev s bop ops exprs 
PExprParenR sPrev s exprs ('TokParenL ': ops) = PExprNext sPrev ops exprs (UnconsState s) 
PExprParenR sPrev s exprs ops = 'Reply ('Err (Error1 "badly formed expression") :: Result Symbol Natural (Expr Natural)) sPrev 

type family PExprParenRPopBOp (sPrev :: PState) (s :: PState) (bop :: BOp) (ops :: [ExprTok]) (exprs :: [Expr Natural]) :: PReply (Expr Natural) where ... Source #

Equations

PExprParenRPopBOp sPrev s bop ops (r ': (l ': exprs)) = PExprParenR sPrev s ('EBOp bop l r ': exprs) ops 
PExprParenRPopBOp sPrev s bop ops exprs = 'Reply ('Err (Error1 "badly formed expression") :: Result Symbol Natural (Expr Natural)) sPrev 

type family PExprEBOp' (sPrev :: PState) (s :: PState) (op :: BOp) (prec :: Natural) (exprs :: [Expr Natural]) (ops :: [ExprTok]) :: PReply (Expr Natural) where ... Source #

Equations

PExprEBOp' sPrev s op prec exprs ('TokBOp opPrev ': ops) = IfNatLte prec (BOpPrec opPrev) (PExprEBOpPop sPrev s op prec opPrev ops exprs) (PExprNext sPrev ('TokBOp op ': ('TokBOp opPrev ': ops)) exprs (UnconsState s)) 
PExprEBOp' sPrev s op prec exprs ('[] :: [ExprTok]) = PExprNext s '['TokBOp op] exprs (UnconsState s) 
PExprEBOp' sPrev s op prec exprs ('TokParenL ': ops) = PExprNext sPrev ('TokBOp op ': ('TokParenL ': ops)) exprs (UnconsState s) 
PExprEBOp' sPrev s op prec exprs ('TokParenR ': ops) = PExprNext sPrev ('TokBOp op ': ('TokParenR ': ops)) exprs (UnconsState s) 

type family PExprEBOpPop (sPrev :: PState) (s :: PState) (op :: BOp) (prec :: Natural) (opPrev :: BOp) (ops :: [ExprTok]) (exprs :: [Expr Natural]) :: PReply (Expr Natural) where ... Source #

Equations

PExprEBOpPop sPrev s op prec opPrev ops (r ': (l ': exprs)) = PExprEBOp' sPrev s op prec ('EBOp opPrev l r ': exprs) ops 
PExprEBOpPop sPrev s op prec opPrev ops exprs = 'Reply ('Err (Error1 "badly formed expression") :: Result Symbol Natural (Expr Natural)) sPrev 

type family BOpPrec (bop :: BOp) :: Natural where ... Source #

Equations

BOpPrec 'Add = 2 
BOpPrec 'Sub = 2 
BOpPrec 'Mul = 3 
BOpPrec 'Div = 3