/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
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <title>FParsec.OperatorPrecedenceParser</title>
- <link rel="stylesheet" type="text/css" media="all" href="../css/style.css" />
- <link rel="stylesheet" type="text/css" media="screen" href="../css/screen-sidebar.css" title="Sidebar" />
- <link rel="alternate stylesheet" type="text/css" media="screen" href="../css/screen-no-sidebar.css" title="No sidebar" />
- <!--[if IE]>
- <link rel="stylesheet" type="text/css" media="all" href="../css/style-ie.css" />
- <![endif]-->
- <!--[if IE 6]>
- <link rel="stylesheet" type="text/css" media="all" href="../css/style-ie6.css" />
- <![endif]-->
- <link rel="stylesheet" type="text/css" media="print" href="../css/print.css" />
- </head>
- <body>
- <div id="fixed-layer">
- <div id="fixed-wrapper">
- <div id="sidebar">
- <div id="breadcrumbs-dummy"><span class="breadcrumbs"> </span></div>
- <div id="nav-tree">
- <table class="nav n1">
- <tbody class="nav-open n1">
- <tr class="nav-entry n1 _1">
- <td class="nav-number n1"></td>
- <td class="nav-title n1"><a href="../index.html">FParsec Documentation</a></td>
- </tr>
- <tr class="nav-sub-entries n1 _1">
- <td class="nav-sub-entries-number n1"></td>
- <td class="nav-sub-entries n1">
- <table class="nav n2">
- <tbody class="nav-before-open n2">
- <tr class="nav-entry n2 _1">
- <td class="nav-number n2"><a href="../tutorial.html"><span class="section-number">1</span><span class="nav-space"></span></a></td>
- <td class="nav-title n2"><a href="../tutorial.html">Tutorial</a></td>
- </tr>
- </tbody>
- <tbody class="nav-open n2">
- <tr class="nav-entry n2 _2">
- <td class="nav-number n2"><a href="index.html"><span class="section-number">2</span><span class="nav-space"></span></a></td>
- <td class="nav-title n2"><a href="index.html">Reference</a></td>
- </tr>
- <tr class="nav-sub-entries n2 _2">
- <td class="nav-sub-entries-number n2"></td>
- <td class="nav-sub-entries n2">
- <table class="nav n3">
- <tbody class="nav-before-open n3">
- <tr class="nav-entry n3 _1">
- <td class="nav-number n3"><a href="parser-overview.html"><span class="section-number">1</span><span class="nav-space"></span></a></td>
- <td class="nav-title n3"><a href="parser-overview.html">Parser overview</a></td>
- </tr>
- <tr class="nav-entry n3 _2">
- <td class="nav-number n3"><a href="primitives.html"><span class="section-number">2</span><span class="nav-space"></span></a></td>
- <td class="nav-title n3"><a href="primitives.html">FParsec.Primitives</a></td>
- </tr>
- <tr class="nav-entry n3 _3">
- <td class="nav-number n3"><a href="charparsers.html"><span class="section-number">3</span><span class="nav-space"></span></a></td>
- <td class="nav-title n3"><a href="charparsers.html">FParsec.CharParsers</a></td>
- </tr>
- </tbody>
- <tbody class="nav-open selected n3">
- <tr class="nav-entry selected n3 _4">
- <td class="nav-number selected n3"><a href="#"><span class="section-number">4</span><span class="nav-space"></span></a></td>
- <td class="nav-title selected n3"><a href="#">FParsec.OperatorPrecedenceParser</a></td>
- </tr>
- <tr class="nav-sub-entries selected n3 _4">
- <td class="nav-sub-entries-number selected n3"></td>
- <td class="nav-sub-entries selected n3">
- <table class="nav n4">
- <tbody class="nav-before-open n4">
- <tr class="nav-entry n4 _1">
- <td class="nav-number n4"><a href="#interface"><span class="section-number">1</span><span class="nav-space"></span></a></td>
- <td class="nav-title n4"><a href="#interface">Interface</a></td>
- </tr>
- <tr class="nav-entry n4 _2">
- <td class="nav-number n4"><a href="#members"><span class="section-number">2</span><span class="nav-space"></span></a></td>
- <td class="nav-title n4"><a href="#members">Members</a></td>
- </tr>
- </tbody>
- </table>
- </td>
- </tr>
- </tbody>
- <tbody class="nav-after-open n3">
- <tr class="nav-entry n3 _5">
- <td class="nav-number n3"><a href="error.html"><span class="section-number">5</span><span class="nav-space"></span></a></td>
- <td class="nav-title n3"><a href="error.html">FParsec.Error</a></td>
- </tr>
- <tr class="nav-entry n3 _6">
- <td class="nav-number n3"><a href="state.html"><span class="section-number">6</span><span class="nav-space"></span></a></td>
- <td class="nav-title n3"><a href="state.html">FParsec.State</a></td>
- </tr>
- <tr class="nav-entry n3 _7">
- <td class="nav-number n3"><a href="position.html"><span class="section-number">7</span><span class="nav-space"></span></a></td>
- <td class="nav-title n3"><a href="position.html">FParsec.Position</a></td>
- </tr>
- <tr class="nav-entry n3 _8">
- <td class="nav-number n3"><a href="charstream.html"><span class="section-number">8</span><span class="nav-space"></span></a></td>
- <td class="nav-title n3"><a href="charstream.html">FParsec.CharStream</a></td>
- </tr>
- </tbody>
- </table>
- </td>
- </tr>
- </tbody>
- </table>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- <div id="wrapper">
- <div id="main">
- <div id="main-content">
- <div id="breadcrumbs">
- <span class="breadcrumbs">
- <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
- </span>
- </div>
- <div class="section s2">
- <h1 class="title h2"><span class="section-number">2.4</span> FParsec.OperatorPrecedenceParser</h1>
- <div class="intro i2">
- <p class="para _1">
- This module defines the <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
- class="ci">OperatorPrecedenceParser</span></a></code> class.
- </p>
- </div>
- <div id="interface" class="section s3">
- <h2 class="title h3"><span class="section-number">2.4.1</span> Interface</h2>
- <div class="intro i3">
- <div class="para _1">
- <pre class="code fsharp"><span class="ck">module</span> <span class="ci">FParsec</span><span class="cm">.</span><span class="ci">OperatorPrecedenceParser</span>
- <span class="ck">open</span> <a href="primitives.html"><span class="ci">FParsec</span><span class="cm">.</span><span class="ci">Primitives</span></a>
- <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>
- <span class="cp">|</span> <span class="ci">Left</span> <span class="cp">=</span> <span class="cn">1</span>
- <span class="cp">|</span> <span class="ci">Right</span> <span class="cp">=</span> <span class="cn">2</span>
- <span class="cp">[<</span><span class="ci">ReferenceEquality</span><span class="cp">>]</span>
- <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"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span> <span class="cp">=</span>
- <span class="clc"><span class="left-delimiter">//</span> Op(opString, whitespaceParser, precedence, associativity, f)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <span class="ck">with</span>
- <span class="ck">override</span> <span class="ci">ToString</span><span class="cp">:</span> <span class="ci">unit</span> <span class="cr">-></span> <span class="ci">string</span>
- <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"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span> <span class="co">=</span>
- <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"><</span><a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span><span class="cp">></span> <span class="cr">-></span> <span class="ci">OperatorPrecedenceParser</span><span class="cp"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span>
- <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"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span>
- <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"><</span><span class="ctv">'a</span><span class="cp">,</span> <span class="ctv">'u</span><span class="cp">></span> <span class="ck">with</span> <span class="ci">get</span><span class="cp">,</span> <span class="ci">set</span>
- <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"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span>
- <span class="cr">-></span> <a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span>
- <span class="cr">-></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>
- <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"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ci">unit</span>
- <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"><</span><a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span><span class="cp">></span> <span class="cr">-></span> <span class="ci">unit</span>
- <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"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ci">bool</span>
- <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">-></span> <span class="ci">bool</span>
- <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">-></span> <span class="ci">bool</span>
- <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">-></span> <span class="ci">bool</span>
- <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">-></span> <span class="ci">bool</span>
- <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"><</span><a href="#members.PrecedenceParserOp"><span class="ci">PrecedenceParserOp</span></a><span class="cp"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span><span class="cp">></span>
- </pre>
- </div>
- </div>
- </div>
- <div id="members" class="section s3">
- <h2 class="title h3"><span class="section-number">2.4.2</span> Members</h2>
- <div class="intro i3">
- <div class="para _1">
- <div class="interface-members">
- <div class="interface-member _1" id="members.Assoc">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.Assoc:B:">⇧</a>
- <pre class="code fsharp"><span class="ck">type</span> <span class="interface-member-marker"><span class="ci">Assoc</span></span></pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">Represents the associativity of infix operators.</p>
- <div class="para _2">
- <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>
- <span class="cp">|</span> <span class="ci">Left</span> <span class="cp">=</span> <span class="cn">1</span>
- <span class="cp">|</span> <span class="ci">Right</span> <span class="cp">=</span> <span class="cn">2</span>
- </pre>
- </div>
- </div>
- </div>
- <div class="interface-member _2" id="members.PrecedenceParserOp">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.PrecedenceParserOp:B:">⇧</a>
- <pre class="code fsharp"><span class="ck">type</span> <span class="interface-member-marker"><span class="ci">PrecedenceParserOp</span></span><span class="cp"><</span><span class="ctv">'a</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></span></pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- This union type represents an operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
- class="ci">OperatorPrecedenceParser</span></a></code> (OPP).
- </p>
- <div class="para _2">
- <pre class="code fsharp"><span class="cp">[<</span><span class="ci">ReferenceEquality</span><span class="cp">>]</span>
- <span class="ck">type</span> <span class="ci">PrecenceParserOp</span><span class="cp"><</span><span class="ctv">'a</span><span class="cp">,</span> <span class="ctv">'u</span><span class="cp">></span> <span class="cp">=</span>
- <span class="clc"><span class="left-delimiter">//</span> Op(opString, whitespaceParser, precedence, associativity, f)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- <span class="ck">with</span>
- <span class="ck">override</span> <span class="ci">ToString</span><span class="cp">:</span> <span class="ci">unit</span> <span class="cr">-></span> <span class="ci">string</span>
- </pre>
- </div>
- <p class="para _3">
- Four types of operators are supported: binary infix (e.g. “1 + 1”), unary prefix (e.g. “‒1”), unary postfix (e.g.
- “1++”) and C‐style ternary operators (e.g. “x > 0 ? 1 : 2”).
- </p>
- <p class="para _4">
- Each operator is defined by an operator string, a trailing whitespace parser, a precedence level, an associativity value and a function that
- is applied after the expression is parsed. Ternary operators require a string and associated whitespace parser for each of the two operator
- parts.
- </p>
- <p class="para _5">
- While infix operators can be left‐, right‐ and non‐associative (see the <code class="fsharp"><a href="#members.Assoc"><span
- class="ci">Assoc</span></a></code> type), prefix and postfix operators can only be associative (<code class="fsharp"><span
- class="cb">true</span></code>) or non‐associative (<code class="fsharp"><span class="cb">false</span></code>). See below for details on <a
- href="#members.precedence-associativity">how precedence and associativity influence the operator precedence parser</a>.
- </p>
- <p class="para _6">
- After an OPP instance parsed a sub‐expression it will call the function given as the last operator argument to map the term(s) belonging to
- the operator to a new term. Often this function will be used to construct AST nodes or to directly transform terminal values.
- </p>
- <p class="para _7">
- The only difference between the constructors with and without the trailing ' is the signature of their function arguments. The functions of
- the '‐constructors are called with an additional parameter: the parser state as captured immediately before the operator string was parsed.
- This is for example useful if you want to annotate your AST nodes with the position of the operators in the input.
- </p>
- <p class="para _8">
- The string and the whitespace parser determine the textual representation of an operator. If the OPP encounters the operator string in the
- input, it will apply the whitespace parser directly after the operator string. If the whitespace parser succeeds, the operator will be
- accepted. If the whitespace parser fails after consuming input, the OPP will itself fail with this error. If the whitespace parser fails
- without consuming input, the OPP will backtrack to before the operator string and will not try to parse any other operator at this location.
- This behaviour can be exploited to conditionally accept an operator depending on the input following the operator string. For example, the
- whitespace parser definition in <code class="fsharp"><a href="#members.PrefixOp"><span class="ci">PrefixOp</span></a><span
- class="cp">(</span><span class="cs"><span class="left-delimiter">"</span>not<span class="right-delimiter">"</span></span><span
- class="cp">,</span> <a href="primitives.html#members.notFollowedBy"><span class="ci">notFollowedBy</span></a> <a
- href="charparsers.html#members.letter"><span class="ci">letter</span></a> <a href="primitives.html#members.:62::62::.:"><span
- class="co">>>.</span></a> <a href="charparsers.html#members.spaces"><span class="ci">spaces</span></a><span class="cp">,</span> <span
- class="cn">1</span><span class="cp">,</span> <span class="cb">true</span><span class="cp">,</span> <span class="ck">fun</span> <span
- class="ci">x</span> <span class="cr">-></span> <span class="ci">not</span> <span class="ci">x</span><span class="cp">)</span></code> will
- ensure that the <code class="fsharp"><span class="cs"><span class="left-delimiter">"</span>not<span
- class="right-delimiter">"</span></span></code> in <code class="fsharp"><span class="cs"><span
- class="left-delimiter">"</span>notAnOperator<span class="right-delimiter">"</span></span></code> can not be parsed as an operator.
- </p>
- <p class="para _9">
- 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
- operator. However, no two prefix operators and no two infix, postfix or ternary operators can have the same (first) string. The second string
- of a ternary operator can not be used for any other operator at the same time.
- </p>
- <p class="para _0">
- Note that the OPP will parse operators greedily. For example, if you define an operator with the string <code class="fsharp"><span
- class="cs"><span class="left-delimiter">"</span>-<span class="right-delimiter">"</span></span></code> and one with the string <code
- class="fsharp"><span class="cs"><span class="left-delimiter">"</span>--<span class="right-delimiter">"</span></span></code> then <code
- class="fsharp"><span class="co">--</span></code> in the input will always be parsed as a <code class="fsharp"><span
- class="co">--</span></code> operator never as two successive <code class="fsharp"><span class="co">-</span></code> operators, irrespective of
- the types of the involved operators.
- </p>
- <div class="para _1">
- <p>
- <code class="fsharp"><span class="ci">PrecenceParserOp</span><span class="cp"><</span><span class="ctv">'a</span><span
- class="cp">,</span><span class="ctv">'u</span><span class="cp">></span></code> has the following union cases:
- </p>
- <div class="interface-members">
- <div class="interface-member _1" id="members.PrefixOp">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.PrefixOp:B:">⇧</a>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- <code class="fsharp"><span class="ci">PrefixOp</span><span class="cp">(</span><span class="ci">opStr</span><span
- class="cp">,</span> <span class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span
- class="cp">,</span> <span class="ci">isAssoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>
- represents a prefix operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
- class="ci">OperatorPrecedenceParser</span></a></code>.
- </p>
- </div>
- </div>
- <div class="interface-member _2" id="members.PostfixOp">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.PostfixOp:B:">⇧</a>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- <code class="fsharp"><span class="ci">PostfixOp</span><span class="cp">(</span><span class="ci">opStr</span><span
- class="cp">,</span> <span class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span
- class="cp">,</span> <span class="ci">isAssoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>
- represents a postfix operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
- class="ci">OperatorPrecedenceParser</span></a></code>.
- </p>
- </div>
- </div>
- <div class="interface-member _3" id="members.InfixOp">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.InfixOp:B:">⇧</a>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- <code class="fsharp"><span class="ci">InfixOp</span><span class="cp">(</span><span class="ci">opStr</span><span class="cp">,</span> <span
- class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span class="cp">,</span> <span
- class="ci">assoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code> represents an infix operator
- definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
- class="ci">OperatorPrecedenceParser</span></a></code>.
- </p>
- </div>
- </div>
- <div class="interface-member _4" id="members.TernaryOp">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.TernaryOp:B:">⇧</a>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- <code class="fsharp"><span class="ci">TernaryOp</span><span class="cp">(</span><span class="ci">op1Str</span><span
- class="cp">,</span> <span class="ci">wsAfterOp1Parser</span><span class="cp">,</span> <span class="ci">op2Str</span><span
- class="cp">,</span> <span class="ci">wsAfterOp2Parser</span><span class="cp">,</span> <span class="ci">prec</span><span
- class="cp">,</span> <span class="ci">assoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>
- represents a ternary operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
- class="ci">OperatorPrecedenceParser</span></a></code>.
- </p>
- </div>
- </div>
- <div class="interface-member _5" id="members.PrefixOp:39:">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.PrefixOp:39::B:">⇧</a>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- <code class="fsharp"><span class="ci">PrefixOp'</span><span class="cp">(</span><span class="ci">opStr</span><span
- class="cp">,</span> <span class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span
- class="cp">,</span> <span class="ci">isAssoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>
- represents a prefix operator definition for an <code class="fsharp"><a href="#members.OperatorPrecedenceParser"><span
- class="ci">OperatorPrecedenceParser</span></a></code>. The state passed as an argument to the function is captured immediately before the
- operator string is parsed and contains the position of the operator.
- </p>
- </div>
- </div>
- <div class="interface-member _6" id="members.PostfixOp:39:">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.PostfixOp:39::B:">⇧</a>
- <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"><</span><span class="ci">unit</span><span class="cp">,</span><span class="ctv">'u</span><span class="cp">></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><a href="state.html"><span class="ci">State</span></a><span class="cp"><</span><span class="ctv">'u</span><span class="cp">></span> <span class="cr">-></span> <span class="ctv">'a</span> <span class="cr">-></span> <span class="ctv">'a</span><span class="cp">)</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- <code class="fsharp"><span class="ci">PostfixOp'</span><span class="cp">(</span><span class="ci">opStr</span><span
- class="cp">,</span> <span class="ci">wsAfterOpParser</span><span class="cp">,</span> <span class="ci">prec</span><span
- class="cp">,</span> <span class="ci">isAssoc</span><span class="cp">,</span> <span class="ci">f</span><span class="cp">)</span></code>…