/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 <markkarpov@opmbx.org></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'><|></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'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-- > manyUnaryOp = foldr1 (.) <$> 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'>-- > expr = makeExprParser term table <?> "expression"</span>
<a name="line-62"></a><span class='hs-comment'>-- ></span>
<a name="line-63"></a><span class='hs-comment'>-- > term = parens expr <|> integer <?> "term"</span>
<a name="line-64"></a><span class='hs-comment'>-- ></span>
<a name="line-65"></a><span class='hs-comment'>-- > table = [ [ prefix "-" negate</span>
<a name="line-66"></a><span class='hs-comment'>-- > , prefix "+" id ]</span>
<a name="line-67"></a><span class='hs-comment'>-- > , [ postfix "++" (+1) ]</span>
<a name="line-68"></a><span class='hs-comment'>-- > , [ binary "*" (*)</span>
<a name="line-69"></a><span class='hs-comment'>-- > , binary "/" div ]</span>
<a name="line-70"></a><span class='hs-comment'>-- > , [ binary "+" (+)</span>
<a name="line-71"></a><span class='hs-comment'>-- > , binary "-" (-) ] ]</span>
<a name="line-72"></a><span class='hs-comment'>-- ></span>
<a name="line-73"></a><span class='hs-comment'>-- > binary name f = InfixL (f <$ symbol name)</span>
<a name="line-74"></a><span class='hs-comment'>-- > prefix name f = Prefix (f <$ symbol name)</span>
<a name="line-75"></a><span class='hs-comment'>-- > postfix name f = Postfix (f <$ 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'>=></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'>-></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'>-></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'>=></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-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-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'>>>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></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'><?></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'>=></span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</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'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></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'><-</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'><-</span> <span class='hs-varid'>term</span>
<a name="line-103"></a> <span class='hs-varid'>post</span> <span class='hs-keyglyph'><-</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'>=></span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'><-</span> <span class='hs-varid'>op</span>
<a name="line-113"></a> <span class='hs-varid'>y</span> <span class='hs-keyglyph'><-</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'>=></span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'><-</span> <span class='hs-varid'>op</span>
<a name="line-123"></a> <span class='hs-varid'>y</span> <span class='hs-keyglyph'><-</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'><|></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'>=></span> <span class='hs-varid'>m</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'><-</span> <span class='hs-varid'>op</span>
<a name="line-134"></a> <span class='hs-varid'>y</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>p</span> <span class='hs-varop'>>>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></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'><|></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'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></span> <span class='hs-conid'>Batch</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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>
|