Update link to paper about demand analyser in user guide
[ghc.git] / docs / stg-spec / StgSyn.ott
1 %%
2 %% CoreSyn.ott
3 %%
4 %% defines formal version of core syntax
5 %%
6 %% See accompanying README file
7
8 embed {{ tex-preamble
9   \newcommand{\coderef}[2]{\ghcfile{#1}:\texttt{#2}%
10 }
11   \newcommand{\keyword}[1]{\textbf{#1} }
12   \newcommand{\labeledjudge}[1]{\vdash_{\!\!\mathsf{#1} } }
13 }}
14
15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
16 %%  Metavariables  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18
19 metavar f, x, y, z ::=   {{ com Variable names }}
20 metavar K ::=   {{ com Data constructor names }}
21
22 indexvar i, j, k, n ::= {{ com Indices to be used in lists }}
23
24 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
25 %%  Syntax  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27
28 grammar
29
30 lit {{ tex \textsf{lit} }} :: 'Literal_' ::=
31   {{ com Literals, \coderef{basicTypes/Literal.lhs}{Literal} }}
32
33 op {{ tex \textsf{op} }} :: 'StgOp_' ::=
34   {{ com Primitive operation or foreign call, \coderef{stgSyn/StgSyn.lhs}{StgOp} }}
35
36 cc {{ tex \textsf{cc} }} :: 'CostCentre_' ::=
37   {{ com Cost-centre, \coderef{profiling/CostCentre.lhs}{CostCentre} }}
38
39 ccs {{ tex \textsf{ccs} }} :: 'CostCentreStack_' ::=
40   | CCCS :: :: CurrentCCS {{ com Current cost-centre stack }}
41     {{ tex \bullet }}
42   | _    :: :: DontCareCCS {{ com Don't care cost-centre stack }}
43   | ccs ^ ccs' :: :: EnterFunCCS {{ com Function entry, \coderef{rts/Profiling.c}{enterFunCCS} }}
44   | ccs # cc   :: :: PushCC {{ com Push a cost-centre, \coderef{rts/Profiling.c}{pushCostCentre} }}
45   {{ com Cost-centre stack, \coderef{profiling/CostCentre.lhs}{CostCentreStack} }}
46
47 a, b, c :: 'StgArg_' ::= {{ com Arguments, \coderef{stgSyn/StgSyn.lhs}{StgArg} }}
48   | x   ::   :: StgVarArg {{ com Variable }}
49   | lit ::   :: StgLitArg {{ com Literal }}
50
51 args :: 'StgArgs_' ::= {{ com List of arguments }}
52   | </ ai // , // i /> :: :: List
53   | args args' :: :: Append
54   | xs :: :: CastVariables
55   | nil :: :: EmptyList
56
57 xs :: 'Ids_' ::= {{ com List of variables }}
58   | </ xi // , // i /> :: :: List
59   | nil :: :: EmptyList
60   | xs xs' :: :: Append
61
62 e :: 'StgExpr_' ::= {{ com Expressions, \coderef{stgSyn/StgSyn.lhs}{StgExpr} }}
63   | lit                                  ::   :: StgLit {{ com Literal }}
64   | x args                               ::   :: StgApp {{ com Function application (or variable) }}
65   | K args                               ::   :: StgConApp {{ com Saturated constructor application }}
66   | op args                              ::   :: StgOpApp {{ com Saturated primitive application }}
67   | case e as x of </ alti // | // i />  ::   :: StgCase {{ com Pattern match }}
68   | let binding in e                     ::   :: StgLet  {{ com Let binding }}
69   | lne binding in e                     ::   :: StgLetNoEscape  {{ com Let-no-escape binding }}
70   | scc cc e                             ::   :: StgSCC {{ com Set cost-centre }}
71   | ( e )                                :: M :: Parens {{ com Parenthesized expression }}
72   | e' subst                             :: M :: Tsub
73
74 subst :: 'Subst_' ::= {{ com List of substitutions }}
75   | [ a / x ]         ::   :: Mapping
76   | </ substi // i /> ::   :: List
77
78 binding :: 'StgBind_' ::= {{ com Let-bindings, \coderef{stgSyn/StgSyn.lhs}{StgBind} }}
79   | x = rhs                         ::   :: StgNonRec  {{ com Non-recursive binding }}
80   | rec </ xi = rhsi // and // i /> ::   :: StgRec     {{ com Recursive binding }}
81
82 upd :: 'UpdateFlag_' ::= {{ com Update flag, \coderef{stgSyn/StgSyn.lhs}{UpdateFlag} }}
83   | r :: :: ReEntrant {{ com Function (re-entrant closure) }}
84   | u :: :: Updatable {{ com Thunk (updatable closure) }}
85
86 cl :: 'StgRhsClosure_' ::= {{ com StgRhsClosure }}
87   | \ upd ccs xs . e  :: :: StgRhsClosure
88
89 rhs :: 'StgRhs_' ::= {{ com Right-hand sides, \coderef{stgSyn/StgSyn.lhs}{StgRhs} }}
90   | cl                :: :: StgRhsClosure {{ com Closure }}
91   | K ccs args        :: :: StgRhsCon {{ com Constructor }}
92   | x                 :: :: StgRhsIndirection {{ com Indirection (runtime only) }}
93
94 alt :: 'StgAlt_' ::= {{ com Case alternative, \coderef{stgSyn/StgSyn.lhs}{StgAlt} }}
95   | K </ xi // i /> -> e    ::   :: StgAlt  {{ com Constructor applied to fresh names }}
96
97 terminals :: 'terminals_' ::=
98   | \                   ::   :: lambda     {{ tex \lambda }}
99   | ->                  ::   :: arrow      {{ tex \rightarrow }}
100   | |->                 ::   :: mapsto     {{ tex \mapsto }}
101   | <>                  ::   :: union      {{ tex \mathbin{\mathaccent\cdot\cup} }}
102   | nil                 ::   :: empty      {{ tex \cdot }}
103   | /=                  ::   :: neq        {{ tex \neq }}
104   | ^                   ::   :: enterFun   {{ tex \bowtie }}
105   | #                   ::   :: push       {{ tex \triangleright }}