ocaml-containers/2.3/containers/CCParse/index.html
2018-08-06 11:54:50 -05:00

51 lines
No EOL
30 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>CCParse (containers.CCParse)</title><link rel="stylesheet" href="../../odoc.css"/><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1.0"/><meta name="generator" content="doc-ock-html v1.0.0-1-g1fc9bf0"/></head><body><nav id="top"><a href="../index.html">Up</a> &mdash; <span class="package">package <a href="../index.html">containers</a></span></nav><header><h1><span class="keyword">Module</span> <span class="module-path">CCParse</span></h1></header><h2>Very Simple Parser Combinators</h2><pre><code class="code"> open CCParse;;
type tree = L of int | N of tree * tree;;
let mk_leaf x = L x
let mk_node x y = N(x,y)
let ptree = fix @@ fun self -&gt;
skip_space *&gt;
( (try_ (char '(') *&gt; (pure mk_node &lt;*&gt; self &lt;*&gt; self) &lt;* char ')')
&lt;|&gt;
(U.int &gt;|= mk_leaf) )
;;
parse_string_exn ptree &quot;(1 (2 3))&quot; ;;
parse_string_exn ptree &quot;((1 2) (3 (4 5)))&quot; ;;
</code></pre><h5>Parse a list of words</h5><pre><code class="code"> open Containers.Parse;;
let p = U.list ~sep:&quot;,&quot; U.word;;
parse_string_exn p &quot;[abc , de, hello ,world ]&quot;;;</code></pre><h5>Stress Test</h5><p>
This makes a list of 100_000 integers, prints it and parses it back.</p><pre><code class="code"> let p = CCParse.(U.list ~sep:&quot;,&quot; U.int);;
let l = CCList.(1 -- 100_000);;
let l_printed =
CCFormat.(to_string (within &quot;[&quot; &quot;]&quot; (list ~sep:(return &quot;,@,&quot;) int))) l;;
let l' = CCParse.parse_string_exn p l_printed;;
assert (l=l');;</code></pre><div class="spec type" id="type-or_error"><a href="#type-or_error" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>'a or_error</code><code><span class="keyword"> = </span>(<span class="type-var">'a</span>, string) Result.result</code><code></code></div><div class="doc"></div></div><div class="spec type" id="type-line_num"><a href="#type-line_num" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>line_num</code><code><span class="keyword"> = </span>int</code><code></code></div><div class="doc"></div></div><div class="spec type" id="type-col_num"><a href="#type-col_num" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>col_num</code><code><span class="keyword"> = </span>int</code><code></code></div><div class="doc"></div></div><div class="spec type" id="type-parse_branch"><a href="#type-parse_branch" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>parse_branch</code><code></code><code></code></div><div class="doc"></div></div><div class="spec val" id="val-string_of_branch"><a href="#val-string_of_branch" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>string_of_branch : <a href="index.html#type-parse_branch">parse_branch</a> <span class="keyword">&#8209;&gt;</span> string</code></div><div class="doc"></div></div><div class="spec exception" id="exception-ParseError"><a href="#exception-ParseError" class="anchor"></a><div class="def exception"><code><span class="keyword">exception </span></code><code><span class="exception">ParseError</span><span class="keyword"> of </span><a href="index.html#type-parse_branch">parse_branch</a><span class="keyword"> * </span>unit <span class="keyword">&#8209;&gt;</span> string</code></div><div class="doc"><p>parsing branch * message.</p></div></div><h3>Input</h3><div class="spec type" id="type-position"><a href="#type-position" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>position</code><code></code><code></code></div><div class="doc"></div></div><div class="spec type" id="type-state"><a href="#type-state" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>state</code><code></code><code></code></div><div class="doc"></div></div><div class="spec val" id="val-state_of_string"><a href="#val-state_of_string" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>state_of_string : string <span class="keyword">&#8209;&gt;</span> <a href="index.html#type-state">state</a></code></div><div class="doc"></div></div><h3>Combinators</h3><div class="spec type" id="type-t"><a href="#type-t" class="anchor"></a><div class="def type"><code><span class="keyword">type </span>'a t</code><code><span class="keyword"> = </span><a href="index.html#type-state">state</a> <span class="keyword">&#8209;&gt;</span> ok:(<span class="type-var">'a</span> <span class="keyword">&#8209;&gt;</span> unit) <span class="keyword">&#8209;&gt;</span> err:(exn <span class="keyword">&#8209;&gt;</span> unit) <span class="keyword">&#8209;&gt;</span> unit</code><code></code></div><div class="doc"><p>Takes the input and two continuations:
</p><ul><li><code class="code">ok</code> to call with the result when it's done</li><li><code class="code">err</code> to call when the parser met an error</li></ul><ul class="at-tag"><li><span class="at-tag raise">Raises</span> <span class="module-path">ParseError</span>: in case of failure.</li></ul></div></div><div class="spec val" id="val-return"><a href="#val-return" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>return : <span class="type-var">'a</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Always succeeds, without consuming its input.</p></div></div><div class="spec val" id="val-pure"><a href="#val-pure" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>pure : <span class="type-var">'a</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Synonym to <a href="index.html#val-return">return</a>.</p></div></div><div class="spec val" id="val-(&gt;|=)"><a href="#val-(&gt;|=)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(&gt;|=) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> (<span class="type-var">'a</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span>) <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Map.</p></div></div><div class="spec val" id="val-map"><a href="#val-map" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>map : (<span class="type-var">'a</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span>) <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a></code></div><div class="doc"></div></div><div class="spec val" id="val-map2"><a href="#val-map2" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>map2 : (<span class="type-var">'a</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'c</span>) <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'c</span> <a href="index.html#type-t">t</a></code></div><div class="doc"></div></div><div class="spec val" id="val-map3"><a href="#val-map3" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>map3 : (<span class="type-var">'a</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'c</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'d</span>) <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'c</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'d</span> <a href="index.html#type-t">t</a></code></div><div class="doc"></div></div><div class="spec val" id="val-(&gt;&gt;=)"><a href="#val-(&gt;&gt;=)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(&gt;&gt;=) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> (<span class="type-var">'a</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a>) <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Monadic bind.
<code class="code">p &gt;&gt;= f</code> results in a new parser which behaves as <code class="code">p</code> then,
in case of success, applies <code class="code">f</code> to the result.</p></div></div><div class="spec val" id="val-(&lt;*&gt;)"><a href="#val-(&lt;*&gt;)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(&lt;*&gt;) : (<span class="type-var">'a</span> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span>) <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Applicative.</p></div></div><div class="spec val" id="val-(&lt;*)"><a href="#val-(&lt;*)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(&lt;*) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">a &lt;* b</code> parses <code class="code">a</code> into <code class="code">x</code>, parses <code class="code">b</code> and ignores its result,
and returns <code class="code">x</code>.</p></div></div><div class="spec val" id="val-(*&gt;)"><a href="#val-(*&gt;)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(*&gt;) : <span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">a *&gt; b</code> parses <code class="code">a</code>, then parses <code class="code">b</code> into <code class="code">x</code>, and returns <code class="code">x</code>. The
results of <code class="code">a</code> is ignored.</p></div></div><div class="spec val" id="val-fail"><a href="#val-fail" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>fail : string <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">fail msg</code> fails with the given message. It can trigger a backtrack.</p></div></div><div class="spec val" id="val-failf"><a href="#val-failf" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>failf : (<span class="type-var">'a</span>, unit, string, <span class="type-var">'b</span> <a href="index.html#type-t">t</a>) Pervasives.format4 <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span></code></div><div class="doc"><p><code class="code">Format.sprintf</code> version of <a href="index.html#val-fail">fail</a>.</p></div></div><div class="spec val" id="val-parsing"><a href="#val-parsing" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>parsing : string <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">parsing s p</code> behaves the same as <code class="code">p</code>, with the information that
we are parsing <code class="code">s</code>, if <code class="code">p</code> fails.</p></div></div><div class="spec val" id="val-eoi"><a href="#val-eoi" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>eoi : unit <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Expect the end of input, fails otherwise.</p></div></div><div class="spec val" id="val-nop"><a href="#val-nop" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>nop : unit <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Succeed with <code class="code">()</code>.</p></div></div><div class="spec val" id="val-char"><a href="#val-char" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>char : char <span class="keyword">&#8209;&gt;</span> char <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">char c</code> parses the character <code class="code">c</code> and nothing else.</p></div></div><div class="spec val" id="val-char_if"><a href="#val-char_if" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>char_if : (char <span class="keyword">&#8209;&gt;</span> bool) <span class="keyword">&#8209;&gt;</span> char <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">char_if f</code> parses a character <code class="code">c</code> if <code class="code">f c = true</code>.</p></div></div><div class="spec val" id="val-chars_if"><a href="#val-chars_if" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>chars_if : (char <span class="keyword">&#8209;&gt;</span> bool) <span class="keyword">&#8209;&gt;</span> string <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">chars_if f</code> parses a string of chars that satisfy <code class="code">f</code>.</p></div></div><div class="spec val" id="val-chars1_if"><a href="#val-chars1_if" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>chars1_if : (char <span class="keyword">&#8209;&gt;</span> bool) <span class="keyword">&#8209;&gt;</span> string <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Like <a href="index.html#val-chars_if">chars_if</a>, but only non-empty strings.</p></div></div><div class="spec val" id="val-endline"><a href="#val-endline" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>endline : char <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Parse '\n'.</p></div></div><div class="spec val" id="val-space"><a href="#val-space" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>space : char <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Tab or space.</p></div></div><div class="spec val" id="val-white"><a href="#val-white" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>white : char <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Tab or space or newline.</p></div></div><div class="spec val" id="val-skip_chars"><a href="#val-skip_chars" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>skip_chars : (char <span class="keyword">&#8209;&gt;</span> bool) <span class="keyword">&#8209;&gt;</span> unit <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Skip 0 or more chars satisfying the predicate.</p></div></div><div class="spec val" id="val-skip_space"><a href="#val-skip_space" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>skip_space : unit <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Skip ' ' and '\t'.</p></div></div><div class="spec val" id="val-skip_white"><a href="#val-skip_white" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>skip_white : unit <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Skip ' ' and '\t' and '\n'.</p></div></div><div class="spec val" id="val-is_alpha"><a href="#val-is_alpha" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>is_alpha : char <span class="keyword">&#8209;&gt;</span> bool</code></div><div class="doc"><p>Is the char a letter?</p></div></div><div class="spec val" id="val-is_num"><a href="#val-is_num" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>is_num : char <span class="keyword">&#8209;&gt;</span> bool</code></div><div class="doc"><p>Is the char a digit?</p></div></div><div class="spec val" id="val-is_alpha_num"><a href="#val-is_alpha_num" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>is_alpha_num : char <span class="keyword">&#8209;&gt;</span> bool</code></div><div class="doc"><p>Is the char a letter or a digit?</p></div></div><div class="spec val" id="val-is_space"><a href="#val-is_space" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>is_space : char <span class="keyword">&#8209;&gt;</span> bool</code></div><div class="doc"><p>True on ' ' and '\t'.</p></div></div><div class="spec val" id="val-is_white"><a href="#val-is_white" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>is_white : char <span class="keyword">&#8209;&gt;</span> bool</code></div><div class="doc"><p>True on ' ' and '\t' and '\n'.</p></div></div><div class="spec val" id="val-(&lt;|&gt;)"><a href="#val-(&lt;|&gt;)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(&lt;|&gt;) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">a &lt;|&gt; b</code> tries to parse <code class="code">a</code>, and if <code class="code">a</code> fails without
consuming any input, backtracks and tries
to parse <code class="code">b</code>, otherwise it fails as <code class="code">a</code>.
See <a href="index.html#val-try_">try_</a> to ensure <code class="code">a</code> does not consume anything (but it is best
to avoid wrapping large parsers with <a href="index.html#val-try_">try_</a>).</p></div></div><div class="spec val" id="val-(&lt;?&gt;)"><a href="#val-(&lt;?&gt;)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(&lt;?&gt;) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> string <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">a &lt;?&gt; msg</code> behaves like <code class="code">a</code>, but if <code class="code">a</code> fails without
consuming any input, it fails with <code class="code">msg</code>
instead. Useful as the last choice in a series of <code class="code">&lt;|&gt;</code>:
<code class="code">a &lt;|&gt; b &lt;|&gt; c &lt;?&gt; &quot;expected a|b|c&quot;</code>.</p></div></div><div class="spec val" id="val-try_"><a href="#val-try_" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>try_ : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">try_ p</code> tries to parse like <code class="code">p</code>, but backtracks if <code class="code">p</code> fails.
Useful in combination with <code class="code">&lt;|&gt;</code>.</p></div></div><div class="spec val" id="val-suspend"><a href="#val-suspend" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>suspend : (unit <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a>) <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">suspend f</code> is the same as <code class="code">f ()</code>, but evaluates <code class="code">f ()</code> only
when needed.</p></div></div><div class="spec val" id="val-string"><a href="#val-string" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>string : string <span class="keyword">&#8209;&gt;</span> string <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">string s</code> parses exactly the string <code class="code">s</code>, and nothing else.</p></div></div><div class="spec val" id="val-many"><a href="#val-many" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>many : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> list <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">many p</code> parses a list of <code class="code">p</code>, eagerly (as long as possible).</p></div></div><div class="spec val" id="val-many1"><a href="#val-many1" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>many1 : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> list <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Parse a non-empty list.</p></div></div><div class="spec val" id="val-skip"><a href="#val-skip" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>skip : <span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> unit <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">skip p</code> parses zero or more times <code class="code">p</code> and ignores its result.</p></div></div><div class="spec val" id="val-sep"><a href="#val-sep" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>sep : by:<span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> list <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">sep ~by p</code> parses a list of <code class="code">p</code> separated by <code class="code">by</code>.</p></div></div><div class="spec val" id="val-sep1"><a href="#val-sep1" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>sep1 : by:<span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> list <a href="index.html#type-t">t</a></code></div><div class="doc"><p><code class="code">sep1 ~by p</code> parses a non empty list of <code class="code">p</code>, separated by <code class="code">by</code>.</p></div></div><div class="spec val" id="val-fix"><a href="#val-fix" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>fix : (<span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a>) <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Fixpoint combinator.</p></div></div><div class="spec val" id="val-memo"><a href="#val-memo" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>memo : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Memoize the parser. <code class="code">memo p</code> will behave like <code class="code">p</code>, but when called
in a state (read: position in input) it has already processed, <code class="code">memo p</code>
returns a result directly. The implementation uses an underlying
hashtable.
This can be costly in memory, but improve the run time a lot if there
is a lot of backtracking involving <code class="code">p</code>.</p><p>This function is not thread-safe.</p></div></div><div class="spec val" id="val-fix_memo"><a href="#val-fix_memo" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>fix_memo : (<span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a>) <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Like <a href="index.html#val-fix">fix</a>, but the fixpoint is memoized.</p></div></div><div class="spec val" id="val-get_lnum"><a href="#val-get_lnum" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>get_lnum : int <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Reflect the current line number.</p></div></div><div class="spec val" id="val-get_cnum"><a href="#val-get_cnum" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>get_cnum : int <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Reflect the current column number.</p></div></div><div class="spec val" id="val-get_pos"><a href="#val-get_pos" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>get_pos : (int<span class="keyword"> * </span>int) <a href="index.html#type-t">t</a></code></div><div class="doc"><p>Reflect the current (line, column) numbers.</p></div></div><h3>Parse</h3><p>Those functions have a label <code class="code">~p</code> on the parser, since 0.14.</p><div class="spec val" id="val-parse"><a href="#val-parse" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>parse : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <a href="index.html#type-state">state</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-or_error">or_error</a></code></div><div class="doc"><p><code class="code">parse p st</code> applies <code class="code">p</code> on the input, and returns <code class="code">Ok x</code> if
<code class="code">p</code> succeeds with <code class="code">x</code>, or <code class="code">Error s</code> otherwise.</p></div></div><div class="spec val" id="val-parse_exn"><a href="#val-parse_exn" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>parse_exn : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> <a href="index.html#type-state">state</a> <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span></code></div><div class="doc"><p>Unsafe version of <a href="index.html#val-parse">parse</a>.</p><ul class="at-tag"><li><span class="at-tag raise">Raises</span> <span class="module-path">ParseError</span>: if it fails.</li></ul></div></div><div class="spec val" id="val-parse_string"><a href="#val-parse_string" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>parse_string : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> string <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-or_error">or_error</a></code></div><div class="doc"><p>Specialization of <a href="index.html#val-parse">parse</a> for string inputs.</p></div></div><div class="spec val" id="val-parse_string_exn"><a href="#val-parse_string_exn" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>parse_string_exn : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> string <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span></code></div><div class="doc"><ul class="at-tag"><li><span class="at-tag raise">Raises</span> <span class="module-path">ParseError</span>: if it fails.</li></ul></div></div><div class="spec val" id="val-parse_file"><a href="#val-parse_file" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>parse_file : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> string <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span> <a href="index.html#type-or_error">or_error</a></code></div><div class="doc"><p><code class="code">parse_file p file</code> parses <code class="code">file</code> with <code class="code">p</code> by opening the file
and reading it whole.</p></div></div><div class="spec val" id="val-parse_file_exn"><a href="#val-parse_file_exn" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>parse_file_exn : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">&#8209;&gt;</span> string <span class="keyword">&#8209;&gt;</span> <span class="type-var">'a</span></code></div><div class="doc"><ul class="at-tag"><li><span class="at-tag raise">Raises</span> <span class="module-path">ParseError</span>: if it fails.</li></ul></div></div><h3>Infix</h3><div class="spec module" id="module-Infix"><a href="#module-Infix" class="anchor"></a><div class="def module"><code><span class="keyword">module </span><a href="Infix/index.html">Infix</a> : <span class="keyword">sig</span> ... <span class="keyword">end</span></code></div><div class="doc"></div></div><h3>Utils</h3><p>This is useful to parse OCaml-like values in a simple way.</p><div class="spec module" id="module-U"><a href="#module-U" class="anchor"></a><div class="def module"><code><span class="keyword">module </span><a href="U/index.html">U</a> : <span class="keyword">sig</span> ... <span class="keyword">end</span></code></div><div class="doc"></div></div></body></html>