/fparsec/main/Doc/html/reference/operatorprecedenceparser.html

http://github.com/sandersn/fing · HTML · 782 lines · 754 code · 22 blank · 6 comment · 0 complexity · 459a17f202da8ddb7f480b72c2e6fbd7 MD5 · raw file

Large files are truncated click here to view the full file

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5. <title>FParsec.OperatorPrecedenceParser</title>
  6. <link rel="stylesheet" type="text/css" media="all" href="../css/style.css" />
  7. <link rel="stylesheet" type="text/css" media="screen" href="../css/screen-sidebar.css" title="Sidebar" />
  8. <link rel="alternate stylesheet" type="text/css" media="screen" href="../css/screen-no-sidebar.css" title="No sidebar" />
  9. <!--[if IE]>
  10. <link rel="stylesheet" type="text/css" media="all" href="../css/style-ie.css" />
  11. <![endif]-->
  12. <!--[if IE 6]>
  13. <link rel="stylesheet" type="text/css" media="all" href="../css/style-ie6.css" />
  14. <![endif]-->
  15. <link rel="stylesheet" type="text/css" media="print" href="../css/print.css" />
  16. </head>
  17. <body>
  18. <div id="fixed-layer">
  19. <div id="fixed-wrapper">
  20. <div id="sidebar">
  21. <div id="breadcrumbs-dummy"><span class="breadcrumbs">&nbsp;</span></div>
  22. <div id="nav-tree">
  23. <table class="nav n1">
  24. <tbody class="nav-open n1">
  25. <tr class="nav-entry n1 _1">
  26. <td class="nav-number n1"></td>
  27. <td class="nav-title n1"><a href="../index.html">FParsec Documentation</a></td>
  28. </tr>
  29. <tr class="nav-sub-entries n1 _1">
  30. <td class="nav-sub-entries-number n1"></td>
  31. <td class="nav-sub-entries n1">
  32. <table class="nav n2">
  33. <tbody class="nav-before-open n2">
  34. <tr class="nav-entry n2 _1">
  35. <td class="nav-number n2"><a href="../tutorial.html"><span class="section-number">1</span><span class="nav-space"></span></a></td>
  36. <td class="nav-title n2"><a href="../tutorial.html">Tutorial</a></td>
  37. </tr>
  38. </tbody>
  39. <tbody class="nav-open n2">
  40. <tr class="nav-entry n2 _2">
  41. <td class="nav-number n2"><a href="index.html"><span class="section-number">2</span><span class="nav-space"></span></a></td>
  42. <td class="nav-title n2"><a href="index.html">Reference</a></td>
  43. </tr>
  44. <tr class="nav-sub-entries n2 _2">
  45. <td class="nav-sub-entries-number n2"></td>
  46. <td class="nav-sub-entries n2">
  47. <table class="nav n3">
  48. <tbody class="nav-before-open n3">
  49. <tr class="nav-entry n3 _1">
  50. <td class="nav-number n3"><a href="parser-overview.html"><span class="section-number">1</span><span class="nav-space"></span></a></td>
  51. <td class="nav-title n3"><a href="parser-overview.html">Parser overview</a></td>
  52. </tr>
  53. <tr class="nav-entry n3 _2">
  54. <td class="nav-number n3"><a href="primitives.html"><span class="section-number">2</span><span class="nav-space"></span></a></td>
  55. <td class="nav-title n3"><a href="primitives.html">FParsec.Primitives</a></td>
  56. </tr>
  57. <tr class="nav-entry n3 _3">
  58. <td class="nav-number n3"><a href="charparsers.html"><span class="section-number">3</span><span class="nav-space"></span></a></td>
  59. <td class="nav-title n3"><a href="charparsers.html">FParsec.CharParsers</a></td>
  60. </tr>
  61. </tbody>
  62. <tbody class="nav-open selected n3">
  63. <tr class="nav-entry selected n3 _4">
  64. <td class="nav-number selected n3"><a href="#"><span class="section-number">4</span><span class="nav-space"></span></a></td>
  65. <td class="nav-title selected n3"><a href="#">FParsec.OperatorPrecedenceParser</a></td>
  66. </tr>
  67. <tr class="nav-sub-entries selected n3 _4">
  68. <td class="nav-sub-entries-number selected n3"></td>
  69. <td class="nav-sub-entries selected n3">
  70. <table class="nav n4">
  71. <tbody class="nav-before-open n4">
  72. <tr class="nav-entry n4 _1">
  73. <td class="nav-number n4"><a href="#interface"><span class="section-number">1</span><span class="nav-space"></span></a></td>
  74. <td class="nav-title n4"><a href="#interface">Interface</a></td>
  75. </tr>
  76. <tr class="nav-entry n4 _2">
  77. <td class="nav-number n4"><a href="#members"><span class="section-number">2</span><span class="nav-space"></span></a></td>
  78. <td class="nav-title n4"><a href="#members">Members</a></td>
  79. </tr>
  80. </tbody>
  81. </table>
  82. </td>
  83. </tr>
  84. </tbody>
  85. <tbody class="nav-after-open n3">
  86. <tr class="nav-entry n3 _5">
  87. <td class="nav-number n3"><a href="error.html"><span class="section-number">5</span><span class="nav-space"></span></a></td>
  88. <td class="nav-title n3"><a href="error.html">FParsec.Error</a></td>
  89. </tr>
  90. <tr class="nav-entry n3 _6">
  91. <td class="nav-number n3"><a href="state.html"><span class="section-number">6</span><span class="nav-space"></span></a></td>
  92. <td class="nav-title n3"><a href="state.html">FParsec.State</a></td>
  93. </tr>
  94. <tr class="nav-entry n3 _7">
  95. <td class="nav-number n3"><a href="position.html"><span class="section-number">7</span><span class="nav-space"></span></a></td>
  96. <td class="nav-title n3"><a href="position.html">FParsec.Position</a></td>
  97. </tr>
  98. <tr class="nav-entry n3 _8">
  99. <td class="nav-number n3"><a href="charstream.html"><span class="section-number">8</span><span class="nav-space"></span></a></td>
  100. <td class="nav-title n3"><a href="charstream.html">FParsec.CharStream</a></td>
  101. </tr>
  102. </tbody>
  103. </table>
  104. </td>
  105. </tr>
  106. </tbody>
  107. </table>
  108. </td>
  109. </tr>
  110. </tbody>
  111. </table>
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. <div id="wrapper">
  117. <div id="main">
  118. <div id="main-content">
  119. <div id="breadcrumbs">
  120. <span class="breadcrumbs">
  121. <span id="breadcrumbs-parents"><a href="../index.html">FParsec Documentation</a><span class="breadcrumbs-sep"> > </span><a href="index.html">Reference</a></span><span class="breadcrumbs-sep"> > </span>FParsec.OperatorPrecedenceParser
  122. </span>
  123. </div>
  124. <div class="section s2">
  125. <h1 class="title h2"><span class="section-number">2.4</span> FParsec.OperatorPrecedenceParser</h1>
  126. <div class="intro i2">
  127. <p class="para _1">
  128. This module defines the <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
  129. class="ci">OperatorPrecedenceParser</span></a></code> class.
  130. </p>
  131. </div>
  132. <div id="interface" class="section s3">
  133. <h2 class="title h3"><span class="section-number">2.4.1</span> Interface</h2>
  134. <div class="intro i3">
  135. <div class="para _1">
  136. <pre class="code fsharp"><span class="ck">module</span> <span class="ci">FParsec</span><span class="cm">.</span><span class="ci">OperatorPrecedenceParser</span>
  137. <span class="ck">open</span> <a href="primitives.html"><span class="ci">FParsec</span><span class="cm">.</span><span class="ci">Primitives</span></a>
  138. <span class="ck">type</span> <a id="interface.Assoc:B:" href="#members.Assoc"><span class="interface-member-marker"><span class="ci">Assoc</span></span></a> <span class="cp">=</span> <span class="ci">None</span> <span class="cp">=</span> <span class="cn">0</span>
  139. <span class="cp">|</span> <span class="ci">Left</span> <span class="cp">=</span> <span class="cn">1</span>
  140. <span class="cp">|</span> <span class="ci">Right</span> <span class="cp">=</span> <span class="cn">2</span>
  141. <span class="cp">[&lt;</span><span class="ci">ReferenceEquality</span><span class="cp">&gt;]</span>
  142. <span class="ck">type</span> <a id="interface.PrecedenceParserOp:B:" href="#members.PrecedenceParserOp"><span class="interface-member-marker"><span class="ci">PrecedenceParserOp</span></span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">=</span>
  143. <span class="clc"><span class="left-delimiter">//</span> Op(opString, whitespaceParser, precedence, associativity, f)</span>
  144. <span class="cp">|</span> <a id="interface.PrefixOp:B:" href="#members.PrefixOp"><span class="interface-member-marker"><span class="ci">PrefixOp</span></span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  145. <span class="cp">|</span> <a id="interface.PostfixOp:B:" href="#members.PostfixOp"><span class="interface-member-marker"><span class="ci">PostfixOp</span></span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  146. <span class="cp">|</span> <a id="interface.InfixOp:B:" href="#members.InfixOp"><span class="interface-member-marker"><span class="ci">InfixOp</span></span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  147. <span class="cp">|</span> <a id="interface.TernaryOp:B:" href="#members.TernaryOp"><span class="interface-member-marker"><span class="ci">TernaryOp</span></span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  148. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  149. <span class="cp">|</span> <a id="interface.PrefixOp:39::B:" href="#members.PrefixOp:39:"><span class="interface-member-marker"><span class="ci">PrefixOp'</span></span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  150. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  151. <span class="cp">|</span> <a id="interface.PostfixOp:39::B:" href="#members.PostfixOp:39:"><span class="interface-member-marker"><span class="ci">PostfixOp'</span></span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  152. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  153. <span class="cp">|</span> <a id="interface.InfixOp:39::B:" href="#members.InfixOp:39:"><span class="interface-member-marker"><span class="ci">InfixOp'</span></span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  154. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a> <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  155. <span class="cp">|</span> <a id="interface.TernaryOp:39::B:" href="#members.TernaryOp:39:"><span class="interface-member-marker"><span class="ci">TernaryOp'</span></span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  156. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a>
  157. <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  158. <span class="ck">with</span>
  159. <span class="ck">override</span> <span class="ci">ToString</span><span class="cp">:</span> <span class="ci">unit</span> <span class="cr">-&gt;</span> <span class="ci">string</span>
  160. <span class="ck">type</span> <a id="interface.OperatorPrecedenceParser:B:" href="#members.OperatorPrecedenceParser"><span class="interface-member-marker"><span class="ci">OperatorPrecedenceParser</span></span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="co">=</span>
  161. <a id="interface.new:B:" href="#members.new"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="cp">?</span><span class="ci">ops</span><span class="cp">:</span><span class="ci">seq</span><span class="cp">&lt;</span><a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ci">OperatorPrecedenceParser</span><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  162. <span class="ck">member</span> <a id="interface.ExpressionParser:B:" href="#members.ExpressionParser"><span class="interface-member-marker"><span class="ci">ExpressionParser</span></span></a><span class="cp">:</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  163. <span class="ck">member</span> <a id="interface.TermParser:B:" href="#members.TermParser"><span class="interface-member-marker"><span class="ci">TermParser</span></span></a><span class="cp">:</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span> <span class="ctv">'u</span><span class="cp">&gt;</span> <span class="ck">with</span> <span class="ci">get</span><span class="cp">,</span> <span class="ci">set</span>
  164. <span class="ck">member</span> <a id="interface.OperatorConflictHandler:B:" href="#members.OperatorConflictHandler"><span class="interface-member-marker"><span class="ci">OperatorConflictHandler</span></span></a><span class="cp">:</span> <span class="cp">(</span> <a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  165. <span class="cr">-&gt;</span> <a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  166. <span class="cr">-&gt;</span> <span class="ci">string</span><span class="cp">)</span> <span class="ck">with</span> <span class="ci">get</span><span class="cp">,</span> <span class="ci">set</span>
  167. <span class="ck">member</span> <a id="interface.AddOperator:B:" href="#members.AddOperator"><span class="interface-member-marker"><span class="ci">AddOperator</span></span></a><span class="cp">:</span> <a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ci">unit</span>
  168. <span class="ck">member</span> <a id="interface.AddOperators:B:" href="#members.AddOperators"><span class="interface-member-marker"><span class="ci">AddOperators</span></span></a><span class="cp">:</span> <span class="ci">seq</span><span class="cp">&lt;</span><a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ci">unit</span>
  169. <span class="ck">member</span> <a id="interface.RemoveOperator:B:" href="#members.RemoveOperator"><span class="interface-member-marker"><span class="ci">RemoveOperator</span></span></a><span class="cp">:</span> <a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ci">bool</span>
  170. <span class="ck">member</span> <a id="interface.RemoveInfixOp:B:" href="#members.RemoveInfixOp"><span class="interface-member-marker"><span class="ci">RemoveInfixOp</span></span></a><span class="cp">:</span> <span class="ci">string</span> <span class="cr">-&gt;</span> <span class="ci">bool</span>
  171. <span class="ck">member</span> <a id="interface.RemovePrefixOp:B:" href="#members.RemovePrefixOp"><span class="interface-member-marker"><span class="ci">RemovePrefixOp</span></span></a><span class="cp">:</span> <span class="ci">string</span> <span class="cr">-&gt;</span> <span class="ci">bool</span>
  172. <span class="ck">member</span> <a id="interface.RemovePostfixOp:B:" href="#members.RemovePostfixOp"><span class="interface-member-marker"><span class="ci">RemovePostfixOp</span></span></a><span class="cp">:</span> <span class="ci">string</span> <span class="cr">-&gt;</span> <span class="ci">bool</span>
  173. <span class="ck">member</span> <a id="interface.RemoveTernaryOp:B:" href="#members.RemoveTernaryOp"><span class="interface-member-marker"><span class="ci">RemoveTernaryOp</span></span></a><span class="cp">:</span> <span class="ci">string</span> <span class="cp">*</span> <span class="ci">string</span> <span class="cr">-&gt;</span> <span class="ci">bool</span>
  174. <span class="ck">member</span> <a id="interface.Operators:B:" href="#members.Operators"><span class="interface-member-marker"><span class="ci">Operators</span></span></a><span class="cp">:</span> <span class="ci">seq</span><span class="cp">&lt;</span><a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span><span class="cp">&gt;</span>
  175. </pre>
  176. </div>
  177. </div>
  178. </div>
  179. <div id="members" class="section s3">
  180. <h2 class="title h3"><span class="section-number">2.4.2</span> Members</h2>
  181. <div class="intro i3">
  182. <div class="para _1">
  183. <div class="interface-members">
  184. <div class="interface-member _1" id="members.Assoc">
  185. <div class="interface-member-code">
  186. <a class="interface-member-backlink" href="#interface.Assoc:B:"></a>
  187. <pre class="code fsharp"><span class="ck">type</span> <span class="interface-member-marker"><span class="ci">Assoc</span></span></pre>
  188. </div>
  189. <div class="interface-member-description">
  190. <p class="para _1">Represents the associativity of infix operators.</p>
  191. <div class="para _2">
  192. <pre class="code fsharp"><span class="ck">type</span> <span class="ci">Assoc</span> <span class="cp">=</span> <span class="ci">None</span> <span class="cp">=</span> <span class="cn">0</span>
  193. <span class="cp">|</span> <span class="ci">Left</span> <span class="cp">=</span> <span class="cn">1</span>
  194. <span class="cp">|</span> <span class="ci">Right</span> <span class="cp">=</span> <span class="cn">2</span>
  195. </pre>
  196. </div>
  197. </div>
  198. </div>
  199. <div class="interface-member _2" id="members.PrecedenceParserOp">
  200. <div class="interface-member-code">
  201. <a class="interface-member-backlink" href="#interface.PrecedenceParserOp:B:"></a>
  202. <pre class="code fsharp"><span class="ck">type</span> <span class="interface-member-marker"><span class="ci">PrecedenceParserOp</span></span><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span></pre>
  203. </div>
  204. <div class="interface-member-description">
  205. <p class="para _1">
  206. This union type represents an operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
  207. class="ci">OperatorPrecedenceParser</span></a></code> (OPP).
  208. </p>
  209. <div class="para _2">
  210. <pre class="code fsharp"><span class="cp">[&lt;</span><span class="ci">ReferenceEquality</span><span class="cp">&gt;]</span>
  211. <span class="ck">type</span> <span class="ci">PrecenceParserOp</span><span class="cp">&lt;</span><span class="ctv">'a</span><span class="cp">,</span> <span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">=</span>
  212. <span class="clc"><span class="left-delimiter">//</span> Op(opString, whitespaceParser, precedence, associativity, f)</span>
  213. <span class="cp">|</span> <a href="#members.PrefixOp"><span class="ci">PrefixOp</span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  214. <span class="cp">|</span> <a href="#members.PostfixOp"><span class="ci">PostfixOp</span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  215. <span class="cp">|</span> <a href="#members.InfixOp"><span class="ci">InfixOp</span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  216. <span class="cp">|</span> <a href="#members.TernaryOp"><span class="ci">TernaryOp</span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  217. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  218. <span class="cp">|</span> <a href="#members.PrefixOp:39:"><span class="ci">PrefixOp'</span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span>
  219. <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  220. <span class="cp">|</span> <a href="#members.PostfixOp:39:"><span class="ci">PostfixOp'</span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span>
  221. <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  222. <span class="cp">|</span> <a href="#members.InfixOp:39:"><span class="ci">InfixOp'</span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a>
  223. <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  224. <span class="cp">|</span> <a href="#members.TernaryOp:39:"><span class="ci">TernaryOp'</span></a> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  225. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a>
  226. <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  227. <span class="ck">with</span>
  228. <span class="ck">override</span> <span class="ci">ToString</span><span class="cp">:</span> <span class="ci">unit</span> <span class="cr">-&gt;</span> <span class="ci">string</span>
  229. </pre>
  230. </div>
  231. <p class="para _3">
  232. Four types of operators are supported: binary infix (e.g. &#x201C;1 + 1&#x201D;), unary prefix (e.g. &#x201C;1&#x201D;), unary postfix (e.g.
  233. &#x201C;1++&#x201D;) and Cstyle ternary operators (e.g. &#x201C;x &gt; 0 ? 1 : 2&#x201D;).
  234. </p>
  235. <p class="para _4">
  236. Each operator is defined by an operator string, a trailing whitespace parser, a precedence level, an associativity value and a function that
  237. is applied after the expression is parsed. Ternary operators require a string and associated whitespace parser for each of the two operator
  238. parts.
  239. </p>
  240. <p class="para _5">
  241. While infix operators can be left, right and nonassociative (see the <code class="fsharp"><a href="#members.Assoc"><span
  242. class="ci">Assoc</span></a></code> type), prefix and postfix operators can only be associative (<code class="fsharp"><span
  243. class="cb">true</span></code>) or nonassociative (<code class="fsharp"><span class="cb">false</span></code>). See below for details on <a
  244. href="#members.precedence-associativity">how precedence and associativity influence the operator precedence parser</a>.
  245. </p>
  246. <p class="para _6">
  247. After an OPP instance parsed a subexpression it will call the function given as the last operator argument to map the term(s) belonging to
  248. the operator to a new term. Often this function will be used to construct AST nodes or to directly transform terminal values.
  249. </p>
  250. <p class="para _7">
  251. The only difference between the constructors with and without the trailing ' is the signature of their function arguments. The functions of
  252. the '‐constructors are called with an additional parameter: the parser state as captured immediately before the operator string was parsed.
  253. This is for example useful if you want to annotate your AST nodes with the position of the operators in the input.
  254. </p>
  255. <p class="para _8">
  256. The string and the whitespace parser determine the textual representation of an operator. If the OPP encounters the operator string in the
  257. input, it will apply the whitespace parser directly after the operator string. If the whitespace parser succeeds, the operator will be
  258. accepted. If the whitespace parser fails after consuming input, the OPP will itself fail with this error. If the whitespace parser fails
  259. without consuming input, the OPP will backtrack to before the operator string and will not try to parse any other operator at this location.
  260. This behaviour can be exploited to conditionally accept an operator depending on the input following the operator string. For example, the
  261. whitespace parser definition in <code class="fsharp"><a href="#members.PrefixOp"><span class="ci">PrefixOp</span></a><span
  262. class="cp">(</span><span class="cs"><span class="left-delimiter">"</span>not<span class="right-delimiter">"</span></span><span
  263. class="cp">,</span> <a href="primitives.html#members.notFollowedBy"><span class="ci">notFollowedBy</span></a> <a
  264. href="charparsers.html#members.letter"><span class="ci">letter</span></a> <a href="primitives.html#members.:62::62::.:"><span
  265. class="co">&gt;&gt;.</span></a> <a href="charparsers.html#members.spaces"><span class="ci">spaces</span></a><span class="cp">,</span> <span
  266. class="cn">1</span><span class="cp">,</span> <span class="cb">true</span><span class="cp">,</span> <span class="ck">fun</span> <span
  267. class="ci">x</span> <span class="cr">-&gt;</span> <span class="ci">not</span> <span class="ci">x</span><span class="cp">)</span></code> will
  268. ensure that the <code class="fsharp"><span class="cs"><span class="left-delimiter">"</span>not<span
  269. class="right-delimiter">"</span></span></code> in <code class="fsharp"><span class="cs"><span
  270. class="left-delimiter">"</span>notAnOperator<span class="right-delimiter">"</span></span></code> can not be parsed as an operator.
  271. </p>
  272. <p class="para _9">
  273. You can configure an OPP instance to support a prefix operator with the same string as the (first) string of an infix, postfix or ternary
  274. operator. However, no two prefix operators and no two infix, postfix or ternary operators can have the same (first) string. The second string
  275. of a ternary operator can not be used for any other operator at the same time.
  276. </p>
  277. <p class="para _0">
  278. Note that the OPP will parse operators greedily. For example, if you define an operator with the string <code class="fsharp"><span
  279. class="cs"><span class="left-delimiter">"</span>-<span class="right-delimiter">"</span></span></code> and one with the string <code
  280. class="fsharp"><span class="cs"><span class="left-delimiter">"</span>--<span class="right-delimiter">"</span></span></code> then <code
  281. class="fsharp"><span class="co">--</span></code> in the input will always be parsed as a <code class="fsharp"><span
  282. class="co">--</span></code> operator never as two successive <code class="fsharp"><span class="co">-</span></code> operators, irrespective of
  283. the types of the involved operators.
  284. </p>
  285. <div class="para _1">
  286. <p>
  287. <code class="fsharp"><span class="ci">PrecenceParserOp</span><span class="cp">&lt;</span><span class="ctv">'a</span><span
  288. class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span></code> has the following union cases:
  289. </p>
  290. <div class="interface-members">
  291. <div class="interface-member _1" id="members.PrefixOp">
  292. <div class="interface-member-code">
  293. <a class="interface-member-backlink" href="#interface.PrefixOp:B:"></a>
  294. <pre class="code fsharp"><span class="cp">|</span> <span class="interface-member-marker"><span class="ci">PrefixOp</span></span> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  295. </pre>
  296. </div>
  297. <div class="interface-member-description">
  298. <p class="para _1">
  299. <code class="fsharp"><span class="ci">PrefixOp</span><span class="cp">(</span><span class="ci">opStr</span><span
  300. class="cp">,</span> <span class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span
  301. class="cp">,</span> <span class="ci">isAssoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>
  302. represents a prefix operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
  303. class="ci">OperatorPrecedenceParser</span></a></code>.
  304. </p>
  305. </div>
  306. </div>
  307. <div class="interface-member _2" id="members.PostfixOp">
  308. <div class="interface-member-code">
  309. <a class="interface-member-backlink" href="#interface.PostfixOp:B:"></a>
  310. <pre class="code fsharp"><span class="cp">|</span> <span class="interface-member-marker"><span class="ci">PostfixOp</span></span> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  311. </pre>
  312. </div>
  313. <div class="interface-member-description">
  314. <p class="para _1">
  315. <code class="fsharp"><span class="ci">PostfixOp</span><span class="cp">(</span><span class="ci">opStr</span><span
  316. class="cp">,</span> <span class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span
  317. class="cp">,</span> <span class="ci">isAssoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>
  318. represents a postfix operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
  319. class="ci">OperatorPrecedenceParser</span></a></code>.
  320. </p>
  321. </div>
  322. </div>
  323. <div class="interface-member _3" id="members.InfixOp">
  324. <div class="interface-member-code">
  325. <a class="interface-member-backlink" href="#interface.InfixOp:B:"></a>
  326. <pre class="code fsharp"><span class="cp">|</span> <span class="interface-member-marker"><span class="ci">InfixOp</span></span> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  327. </pre>
  328. </div>
  329. <div class="interface-member-description">
  330. <p class="para _1">
  331. <code class="fsharp"><span class="ci">InfixOp</span><span class="cp">(</span><span class="ci">opStr</span><span class="cp">,</span> <span
  332. class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span class="cp">,</span> <span
  333. class="ci">assoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code> represents an infix operator
  334. definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
  335. class="ci">OperatorPrecedenceParser</span></a></code>.
  336. </p>
  337. </div>
  338. </div>
  339. <div class="interface-member _4" id="members.TernaryOp">
  340. <div class="interface-member-code">
  341. <a class="interface-member-backlink" href="#interface.TernaryOp:B:"></a>
  342. <pre class="code fsharp"><span class="cp">|</span> <span class="interface-member-marker"><span class="ci">TernaryOp</span></span> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cp">*</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  343. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <a href="#members.Assoc"><span class="ci">Assoc</span></a> <span class="cp">*</span> <span class="cp">(</span><span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  344. </pre>
  345. </div>
  346. <div class="interface-member-description">
  347. <p class="para _1">
  348. <code class="fsharp"><span class="ci">TernaryOp</span><span class="cp">(</span><span class="ci">op1Str</span><span
  349. class="cp">,</span> <span class="ci">wsAfterOp1Parser</span><span class="cp">,</span> <span class="ci">op2Str</span><span
  350. class="cp">,</span> <span class="ci">wsAfterOp2Parser</span><span class="cp">,</span> <span class="ci">prec</span><span
  351. class="cp">,</span> <span class="ci">assoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>
  352. represents a ternary operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
  353. class="ci">OperatorPrecedenceParser</span></a></code>.
  354. </p>
  355. </div>
  356. </div>
  357. <div class="interface-member _5" id="members.PrefixOp:39:">
  358. <div class="interface-member-code">
  359. <a class="interface-member-backlink" href="#interface.PrefixOp:39::B:"></a>
  360. <pre class="code fsharp"><span class="cp">|</span> <span class="interface-member-marker"><span class="ci">PrefixOp'</span></span> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  361. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  362. </pre>
  363. </div>
  364. <div class="interface-member-description">
  365. <p class="para _1">
  366. <code class="fsharp"><span class="ci">PrefixOp'</span><span class="cp">(</span><span class="ci">opStr</span><span
  367. class="cp">,</span> <span class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span
  368. class="cp">,</span> <span class="ci">isAssoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>
  369. represents a prefix operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
  370. class="ci">OperatorPrecedenceParser</span></a></code>. The state passed as an argument to the function is captured immediately before the
  371. operator string is parsed and contains the position of the operator.
  372. </p>
  373. </div>
  374. </div>
  375. <div class="interface-member _6" id="members.PostfixOp:39:">
  376. <div class="interface-member-code">
  377. <a class="interface-member-backlink" href="#interface.PostfixOp:39::B:"></a>
  378. <pre class="code fsharp"><span class="cp">|</span> <span class="interface-member-marker"><span class="ci">PostfixOp'</span></span> <span class="ck">of</span> <span class="ci">string</span> <span class="cp">*</span> <a href="primitives.html#members.Parser"><span class="ci">Parser</span></a><span class="cp">&lt;</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">&gt;</span>
  379. <span class="cp">*</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">bool</span> <span class="cp">*</span> <span class="cp">(</span><a href="state.html"><span class="ci">State</span></a><span class="cp">&lt;</span><span class="ctv">'u</span><span class="cp">&gt;</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span> <span class="cr">-&gt;</span> <span class="ctv">'a</span><span class="cp">)</span>
  380. </pre>
  381. </div>
  382. <div class="interface-member-description">
  383. <p class="para _1">
  384. <code class="fsharp"><span class="ci">PostfixOp'</span><span class="cp">(</span><span class="ci">opStr</span><span
  385. class="cp">,</span> <span class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span
  386. class="cp">,</span> <span class="ci">isAssoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>