This file is indexed.

/usr/share/doc/libghc-megaparsec-doc/html/src/Text-Megaparsec-Expr.html is in libghc-megaparsec-doc 5.0.1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>Text/Megaparsec/Expr.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-- |</span>
<a name="line-2"></a><span class='hs-comment'>-- Module      :  Text.Megaparsec.Expr</span>
<a name="line-3"></a><span class='hs-comment'>-- Copyright   :  © 2015–2016 Megaparsec contributors</span>
<a name="line-4"></a><span class='hs-comment'>--                © 2007 Paolo Martini</span>
<a name="line-5"></a><span class='hs-comment'>--                © 1999–2001 Daan Leijen</span>
<a name="line-6"></a><span class='hs-comment'>-- License     :  FreeBSD</span>
<a name="line-7"></a><span class='hs-comment'>--</span>
<a name="line-8"></a><span class='hs-comment'>-- Maintainer  :  Mark Karpov &lt;markkarpov@opmbx.org&gt;</span>
<a name="line-9"></a><span class='hs-comment'>-- Stability   :  experimental</span>
<a name="line-10"></a><span class='hs-comment'>-- Portability :  non-portable</span>
<a name="line-11"></a><span class='hs-comment'>--</span>
<a name="line-12"></a><span class='hs-comment'>-- A helper module to parse expressions. It can build a parser given a table</span>
<a name="line-13"></a><span class='hs-comment'>-- of operators.</span>
<a name="line-14"></a>
<a name="line-15"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Megaparsec</span><span class='hs-varop'>.</span><span class='hs-conid'>Expr</span>
<a name="line-16"></a>  <span class='hs-layout'>(</span> <span class='hs-conid'>Operator</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-17"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>makeExprParser</span> <span class='hs-layout'>)</span>
<a name="line-18"></a><span class='hs-keyword'>where</span>
<a name="line-19"></a>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>&lt;|&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-21"></a>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Megaparsec</span><span class='hs-varop'>.</span><span class='hs-conid'>Combinator</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Megaparsec</span><span class='hs-varop'>.</span><span class='hs-conid'>Prim</span>
<a name="line-24"></a>
<a name="line-25"></a><span class='hs-comment'>-- | This data type specifies operators that work on values of type @a@.</span>
<a name="line-26"></a><span class='hs-comment'>-- An operator is either binary infix or unary prefix or postfix. A binary</span>
<a name="line-27"></a><span class='hs-comment'>-- operator has also an associated associativity.</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="Operator"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Operator</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-30"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InfixN</span>  <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ Non-associative infix</span>
<a name="line-31"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>InfixL</span>  <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ Left-associative infix</span>
<a name="line-32"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>InfixR</span>  <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ Right-associative infix</span>
<a name="line-33"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Prefix</span>  <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>      <span class='hs-comment'>-- ^ Prefix</span>
<a name="line-34"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Postfix</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>      <span class='hs-comment'>-- ^ Postfix</span>
<a name="line-35"></a>
<a name="line-36"></a><span class='hs-comment'>-- | @makeExprParser term table@ builds an expression parser for terms</span>
<a name="line-37"></a><span class='hs-comment'>-- @term@ with operators from @table@, taking the associativity and</span>
<a name="line-38"></a><span class='hs-comment'>-- precedence specified in @table@ into account.</span>
<a name="line-39"></a><span class='hs-comment'>--</span>
<a name="line-40"></a><span class='hs-comment'>-- @table@ is a list of @[Operator m a]@ lists. The list is ordered in</span>
<a name="line-41"></a><span class='hs-comment'>-- descending precedence. All operators in one list have the same precedence</span>
<a name="line-42"></a><span class='hs-comment'>-- (but may have different associativity).</span>
<a name="line-43"></a><span class='hs-comment'>--</span>
<a name="line-44"></a><span class='hs-comment'>-- Prefix and postfix operators of the same precedence associate to the left</span>
<a name="line-45"></a><span class='hs-comment'>-- (i.e. if @++@ is postfix increment, than @-2++@ equals @-1@, not @-3@).</span>
<a name="line-46"></a><span class='hs-comment'>--</span>
<a name="line-47"></a><span class='hs-comment'>-- Unary operators of the same precedence can only occur once (i.e. @--2@ is</span>
<a name="line-48"></a><span class='hs-comment'>-- not allowed if @-@ is prefix negate). If you need to parse several prefix</span>
<a name="line-49"></a><span class='hs-comment'>-- or postfix operators in a row, (like C pointers — @**i@) you can use this</span>
<a name="line-50"></a><span class='hs-comment'>-- approach:</span>
<a name="line-51"></a><span class='hs-comment'>--</span>
<a name="line-52"></a><span class='hs-comment'>-- &gt; manyUnaryOp = foldr1 (.) &lt;$&gt; some singleUnaryOp</span>
<a name="line-53"></a><span class='hs-comment'>--</span>
<a name="line-54"></a><span class='hs-comment'>-- This is not done by default because in some cases you don't want to allow</span>
<a name="line-55"></a><span class='hs-comment'>-- repeating prefix or postfix operators.</span>
<a name="line-56"></a><span class='hs-comment'>--</span>
<a name="line-57"></a><span class='hs-comment'>-- @makeExprParser@ takes care of all the complexity involved in building an</span>
<a name="line-58"></a><span class='hs-comment'>-- expression parser. Here is an example of an expression parser that</span>
<a name="line-59"></a><span class='hs-comment'>-- handles prefix signs, postfix increment and basic arithmetic:</span>
<a name="line-60"></a><span class='hs-comment'>--</span>
<a name="line-61"></a><span class='hs-comment'>-- &gt; expr = makeExprParser term table &lt;?&gt; "expression"</span>
<a name="line-62"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-63"></a><span class='hs-comment'>-- &gt; term = parens expr &lt;|&gt; integer &lt;?&gt; "term"</span>
<a name="line-64"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-65"></a><span class='hs-comment'>-- &gt; table = [ [ prefix  "-"  negate</span>
<a name="line-66"></a><span class='hs-comment'>-- &gt;           , prefix  "+"  id ]</span>
<a name="line-67"></a><span class='hs-comment'>-- &gt;         , [ postfix "++" (+1) ]</span>
<a name="line-68"></a><span class='hs-comment'>-- &gt;         , [ binary  "*"  (*)</span>
<a name="line-69"></a><span class='hs-comment'>-- &gt;           , binary  "/"  div  ]</span>
<a name="line-70"></a><span class='hs-comment'>-- &gt;         , [ binary  "+"  (+)</span>
<a name="line-71"></a><span class='hs-comment'>-- &gt;           , binary  "-"  (-)  ] ]</span>
<a name="line-72"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-73"></a><span class='hs-comment'>-- &gt; binary  name f = InfixL  (f &lt;$ symbol name)</span>
<a name="line-74"></a><span class='hs-comment'>-- &gt; prefix  name f = Prefix  (f &lt;$ symbol name)</span>
<a name="line-75"></a><span class='hs-comment'>-- &gt; postfix name f = Postfix (f &lt;$ symbol name)</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="makeExprParser"></a><span class='hs-definition'>makeExprParser</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadParsec</span> <span class='hs-varid'>e</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span>
<a name="line-78"></a>  <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>               <span class='hs-comment'>-- ^ Term parser</span>
<a name="line-79"></a>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Operator</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>  <span class='hs-comment'>-- ^ Operator table, see 'Operator'</span>
<a name="line-80"></a>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>               <span class='hs-comment'>-- ^ Resulting expression parser</span>
<a name="line-81"></a><span class='hs-definition'>makeExprParser</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl</span> <span class='hs-varid'>addPrecLevel</span>
<a name="line-82"></a>
<a name="line-83"></a><span class='hs-comment'>-- | @addPrecLevel p ops@ adds ability to parse operators in table @ops@ to</span>
<a name="line-84"></a><span class='hs-comment'>-- parser @p@.</span>
<a name="line-85"></a>
<a name="line-86"></a><a name="addPrecLevel"></a><span class='hs-definition'>addPrecLevel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadParsec</span> <span class='hs-varid'>e</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Operator</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-87"></a><span class='hs-definition'>addPrecLevel</span> <span class='hs-varid'>term</span> <span class='hs-varid'>ops</span> <span class='hs-keyglyph'>=</span>
<a name="line-88"></a>  <span class='hs-varid'>term'</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>choice</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ras'</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>las'</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>nas'</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>&lt;?&gt;</span> <span class='hs-str'>"operator"</span>
<a name="line-89"></a>  <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>ras</span><span class='hs-layout'>,</span> <span class='hs-varid'>las</span><span class='hs-layout'>,</span> <span class='hs-varid'>nas</span><span class='hs-layout'>,</span> <span class='hs-varid'>prefix</span><span class='hs-layout'>,</span> <span class='hs-varid'>postfix</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>splitOp</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-varid'>ops</span>
<a name="line-90"></a>        <span class='hs-varid'>term'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pTerm</span> <span class='hs-layout'>(</span><span class='hs-varid'>choice</span> <span class='hs-varid'>prefix</span><span class='hs-layout'>)</span> <span class='hs-varid'>term</span> <span class='hs-layout'>(</span><span class='hs-varid'>choice</span> <span class='hs-varid'>postfix</span><span class='hs-layout'>)</span>
<a name="line-91"></a>        <span class='hs-varid'>ras'</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pInfixR</span> <span class='hs-layout'>(</span><span class='hs-varid'>choice</span> <span class='hs-varid'>ras</span><span class='hs-layout'>)</span> <span class='hs-varid'>term'</span>
<a name="line-92"></a>        <span class='hs-varid'>las'</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pInfixL</span> <span class='hs-layout'>(</span><span class='hs-varid'>choice</span> <span class='hs-varid'>las</span><span class='hs-layout'>)</span> <span class='hs-varid'>term'</span>
<a name="line-93"></a>        <span class='hs-varid'>nas'</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pInfixN</span> <span class='hs-layout'>(</span><span class='hs-varid'>choice</span> <span class='hs-varid'>nas</span><span class='hs-layout'>)</span> <span class='hs-varid'>term'</span>
<a name="line-94"></a>
<a name="line-95"></a><span class='hs-comment'>-- | @pTerm prefix term postfix@ parses term with @term@ surrounded by</span>
<a name="line-96"></a><span class='hs-comment'>-- optional prefix and postfix unary operators. Parsers @prefix@ and</span>
<a name="line-97"></a><span class='hs-comment'>-- @postfix@ are allowed to fail, in this case 'id' is used.</span>
<a name="line-98"></a>
<a name="line-99"></a><a name="pTerm"></a><span class='hs-definition'>pTerm</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadParsec</span> <span class='hs-varid'>e</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-100"></a><span class='hs-definition'>pTerm</span> <span class='hs-varid'>prefix</span> <span class='hs-varid'>term</span> <span class='hs-varid'>postfix</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-101"></a>  <span class='hs-varid'>pre</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>option</span> <span class='hs-varid'>id</span> <span class='hs-layout'>(</span><span class='hs-varid'>hidden</span> <span class='hs-varid'>prefix</span><span class='hs-layout'>)</span>
<a name="line-102"></a>  <span class='hs-varid'>x</span>    <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>term</span>
<a name="line-103"></a>  <span class='hs-varid'>post</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>option</span> <span class='hs-varid'>id</span> <span class='hs-layout'>(</span><span class='hs-varid'>hidden</span> <span class='hs-varid'>postfix</span><span class='hs-layout'>)</span>
<a name="line-104"></a>  <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-varid'>post</span> <span class='hs-varop'>.</span> <span class='hs-varid'>pre</span> <span class='hs-varop'>$</span> <span class='hs-varid'>x</span>
<a name="line-105"></a>
<a name="line-106"></a><span class='hs-comment'>-- | @pInfixN op p x@ parses non-associative infix operator @op@, then term</span>
<a name="line-107"></a><span class='hs-comment'>-- with parser @p@, then returns result of the operator application on @x@</span>
<a name="line-108"></a><span class='hs-comment'>-- and the term.</span>
<a name="line-109"></a>
<a name="line-110"></a><a name="pInfixN"></a><span class='hs-definition'>pInfixN</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadParsec</span> <span class='hs-varid'>e</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-111"></a><span class='hs-definition'>pInfixN</span> <span class='hs-varid'>op</span> <span class='hs-varid'>p</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-112"></a>  <span class='hs-varid'>f</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>op</span>
<a name="line-113"></a>  <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span>
<a name="line-114"></a>  <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-115"></a>
<a name="line-116"></a><span class='hs-comment'>-- | @pInfixL op p x@ parses left-associative infix operator @op@, then term</span>
<a name="line-117"></a><span class='hs-comment'>-- with parser @p@, then returns result of the operator application on @x@</span>
<a name="line-118"></a><span class='hs-comment'>-- and the term.</span>
<a name="line-119"></a>
<a name="line-120"></a><a name="pInfixL"></a><span class='hs-definition'>pInfixL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadParsec</span> <span class='hs-varid'>e</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-121"></a><span class='hs-definition'>pInfixL</span> <span class='hs-varid'>op</span> <span class='hs-varid'>p</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-122"></a>  <span class='hs-varid'>f</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>op</span>
<a name="line-123"></a>  <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span>
<a name="line-124"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-125"></a>  <span class='hs-varid'>pInfixL</span> <span class='hs-varid'>op</span> <span class='hs-varid'>p</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&lt;|&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>r</span>
<a name="line-126"></a>
<a name="line-127"></a><span class='hs-comment'>-- | @pInfixR op p x@ parses right-associative infix operator @op@, then</span>
<a name="line-128"></a><span class='hs-comment'>-- term with parser @p@, then returns result of the operator application on</span>
<a name="line-129"></a><span class='hs-comment'>-- @x@ and the term.</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="pInfixR"></a><span class='hs-definition'>pInfixR</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadParsec</span> <span class='hs-varid'>e</span> <span class='hs-varid'>s</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-132"></a><span class='hs-definition'>pInfixR</span> <span class='hs-varid'>op</span> <span class='hs-varid'>p</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-133"></a>  <span class='hs-varid'>f</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>op</span>
<a name="line-134"></a>  <span class='hs-varid'>y</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>p</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pInfixR</span> <span class='hs-varid'>op</span> <span class='hs-varid'>p</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&lt;|&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>r</span>
<a name="line-135"></a>  <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span>
<a name="line-136"></a>
<a name="line-137"></a><a name="Batch"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Batch</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span>
<a name="line-138"></a>  <span class='hs-layout'>(</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-139"></a>  <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-140"></a>  <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-141"></a>  <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-142"></a>  <span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>)</span>
<a name="line-143"></a>
<a name="line-144"></a><span class='hs-comment'>-- | A helper to separate various operators (binary, unary, and according to</span>
<a name="line-145"></a><span class='hs-comment'>-- associativity) and return them in a tuple.</span>
<a name="line-146"></a>
<a name="line-147"></a><a name="splitOp"></a><span class='hs-definition'>splitOp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Operator</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Batch</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Batch</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-148"></a><span class='hs-definition'>splitOp</span> <span class='hs-layout'>(</span><span class='hs-conid'>InfixR</span>  <span class='hs-varid'>op</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>post</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>op</span><span class='hs-conop'>:</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>post</span><span class='hs-layout'>)</span>
<a name="line-149"></a><span class='hs-definition'>splitOp</span> <span class='hs-layout'>(</span><span class='hs-conid'>InfixL</span>  <span class='hs-varid'>op</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>post</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>op</span><span class='hs-conop'>:</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>post</span><span class='hs-layout'>)</span>
<a name="line-150"></a><span class='hs-definition'>splitOp</span> <span class='hs-layout'>(</span><span class='hs-conid'>InfixN</span>  <span class='hs-varid'>op</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>post</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>op</span><span class='hs-conop'>:</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>post</span><span class='hs-layout'>)</span>
<a name="line-151"></a><span class='hs-definition'>splitOp</span> <span class='hs-layout'>(</span><span class='hs-conid'>Prefix</span>  <span class='hs-varid'>op</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>post</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>op</span><span class='hs-conop'>:</span><span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>post</span><span class='hs-layout'>)</span>
<a name="line-152"></a><span class='hs-definition'>splitOp</span> <span class='hs-layout'>(</span><span class='hs-conid'>Postfix</span> <span class='hs-varid'>op</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>post</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-layout'>,</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>pre</span><span class='hs-layout'>,</span> <span class='hs-varid'>op</span><span class='hs-conop'>:</span><span class='hs-varid'>post</span><span class='hs-layout'>)</span>
</pre></body>
</html>