mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
51 lines
No EOL
30 KiB
HTML
51 lines
No EOL
30 KiB
HTML
<!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> — <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 ->
|
||
skip_space *>
|
||
( (try_ (char '(') *> (pure mk_node <*> self <*> self) <* char ')')
|
||
<|>
|
||
(U.int >|= mk_leaf) )
|
||
;;
|
||
|
||
parse_string_exn ptree "(1 (2 3))" ;;
|
||
parse_string_exn ptree "((1 2) (3 (4 5)))" ;;
|
||
</code></pre><div class="h7">Parse a list of words</div><pre><code class="code"> open Containers.Parse;;
|
||
let p = U.list ~sep:"," U.word;;
|
||
parse_string_exn p "[abc , de, hello ,world ]";;</code></pre><div class="h7">Stress Test</div><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:"," U.int);;
|
||
|
||
let l = CCList.(1 -- 100_000);;
|
||
let l_printed =
|
||
CCFormat.(to_string (within "[" "]" (list ~sep:(return ",@,") 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">‑></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">‑></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">‑></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">‑></span> ok:(<span class="type-var">'a</span> <span class="keyword">‑></span> unit) <span class="keyword">‑></span> err:(exn <span class="keyword">‑></span> unit) <span class="keyword">‑></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">‑></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">‑></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-(>|=)"><a href="#val-(>|=)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(>|=) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> (<span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'b</span>) <span class="keyword">‑></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">‑></span> <span class="type-var">'b</span>) <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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">‑></span> <span class="type-var">'b</span> <span class="keyword">‑></span> <span class="type-var">'c</span>) <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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">‑></span> <span class="type-var">'b</span> <span class="keyword">‑></span> <span class="type-var">'c</span> <span class="keyword">‑></span> <span class="type-var">'d</span>) <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'c</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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-(>>=)"><a href="#val-(>>=)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(>>=) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> (<span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'b</span> <a href="index.html#type-t">t</a>) <span class="keyword">‑></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 >>= 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-(<*>)"><a href="#val-(<*>)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(<*>) : (<span class="type-var">'a</span> <span class="keyword">‑></span> <span class="type-var">'b</span>) <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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-(<*)"><a href="#val-(<*)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(<*) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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 <* 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-(*>)"><a href="#val-(*>)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(*>) : <span class="type-var">_</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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 *> 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">‑></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">‑></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">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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">‑></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">‑></span> bool) <span class="keyword">‑></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">‑></span> bool) <span class="keyword">‑></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">‑></span> bool) <span class="keyword">‑></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>Parses '\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">‑></span> bool) <span class="keyword">‑></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">‑></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">‑></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">‑></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">‑></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">‑></span> bool</code></div><div class="doc"><p>True on ' ' and '\t' and '\n'.</p></div></div><div class="spec val" id="val-(<|>)"><a href="#val-(<|>)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(<|>) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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 <|> 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-(<?>)"><a href="#val-(<?>)" class="anchor"></a><div class="def val"><code><span class="keyword">val </span>(<?>) : <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></span> string <span class="keyword">‑></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 <?> 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"><|></code>:
|
||
<code class="code">a <|> b <|> c <?> "expected a|b|c"</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">‑></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"><|></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">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a>) <span class="keyword">‑></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">‑></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">‑></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">‑></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">‑></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">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a> <span class="keyword">‑></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">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a>) <span class="keyword">‑></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">‑></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">‑></span> <span class="type-var">'a</span> <a href="index.html#type-t">t</a>) <span class="keyword">‑></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">‑></span> <a href="index.html#type-state">state</a> <span class="keyword">‑></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">‑></span> <a href="index.html#type-state">state</a> <span class="keyword">‑></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">‑></span> string <span class="keyword">‑></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">‑></span> string <span class="keyword">‑></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">‑></span> string <span class="keyword">‑></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">‑></span> string <span class="keyword">‑></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> |