/fparsec/main/Doc/html/reference/charstream.html
http://github.com/sandersn/fing · HTML · 1839 lines · 1804 code · 29 blank · 6 comment · 0 complexity · 0eb8354014409e44363fac4b55d0b5f9 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.CharStream</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>
- <tr class="nav-entry n3 _4">
- <td class="nav-number n3">
- <a href="operatorprecedenceparser.html"><span class="section-number">4</span><span class="nav-space"></span></a>
- </td>
- <td class="nav-title n3"><a href="operatorprecedenceparser.html">FParsec.OperatorPrecedenceParser</a></td>
- </tr>
- <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>
- </tbody>
- <tbody class="nav-open selected n3">
- <tr class="nav-entry selected n3 _8">
- <td class="nav-number selected n3"><a href="#"><span class="section-number">8</span><span class="nav-space"></span></a></td>
- <td class="nav-title selected n3"><a href="#">FParsec.CharStream</a></td>
- </tr>
- <tr class="nav-sub-entries selected n3 _8">
- <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="#remarks"><span class="section-number">2</span><span class="nav-space"></span></a></td>
- <td class="nav-title n4"><a href="#remarks">Remarks</a></td>
- </tr>
- <tr class="nav-entry n4 _3">
- <td class="nav-number n4"><a href="#exceptions"><span class="section-number">3</span><span class="nav-space"></span></a></td>
- <td class="nav-title n4"><a href="#exceptions">I/O exceptions</a></td>
- </tr>
- <tr class="nav-entry n4 _4">
- <td class="nav-number n4"><a href="#members"><span class="section-number">4</span><span class="nav-space"></span></a></td>
- <td class="nav-title n4"><a href="#members">Members</a></td>
- </tr>
- <tr class="nav-entry n4 _5">
- <td class="nav-number n4"><a href="#Iterator"><span class="section-number">5</span><span class="nav-space"></span></a></td>
- <td class="nav-title n4"><a href="#Iterator">CharStream.Iterator</a></td>
- </tr>
- <tr class="nav-sub-entries n4 _5">
- <td class="nav-sub-entries-number n4"></td>
- <td class="nav-sub-entries n4">
- <table class="nav n5">
- <tbody class="nav-before-open n5">
- <tr class="nav-entry n5 _1">
- <td class="nav-number n5">
- <a href="#Iterator.interface"><span class="section-number">1</span><span class="nav-space"></span></a>
- </td>
- <td class="nav-title n5"><a href="#Iterator.interface">Interface</a></td>
- </tr>
- <tr class="nav-entry n5 _2">
- <td class="nav-number n5">
- <a href="#Iterator.members"><span class="section-number">2</span><span class="nav-space"></span></a>
- </td>
- <td class="nav-title n5"><a href="#Iterator.members">Members</a></td>
- </tr>
- </tbody>
- </table>
- </td>
- </tr>
- </tbody>
- </table>
- </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.CharStream
- </span>
- </div>
- <div class="section s2">
- <h1 class="title h2"><span class="section-number">2.8</span> FParsec.CharStream</h1>
- <div class="intro i2">
- <p class="para _1">
- The <code class="fsharp"><span class="ci">CharStream</span></code> class provides a unified interface for reading the UTF‐16 char content from
- binary streams or in‐memory char buffers.
- </p>
- </div>
- <div id="interface" class="section s3">
- <h2 class="title h3"><span class="section-number">2.8.1</span> Interface</h2>
- <div class="intro i3">
- <div class="para _1">
- <pre class="code fsharp"><span class="ck">namespace</span> <span class="ci">FParsec</span>
- <span class="cp">[<</span><span class="ci">Sealed</span><span class="cp">>]</span>
- <span class="ck">type</span> <span class="ci">CharStream</span> <span class="cp">=</span>
- <span class="ck">interface</span> <span class="ci">System</span><span class="cm">.</span><span class="ci">IDisposable</span>
- <a id="interface.new_string:B:" href="#members.new_string"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">string</span> <span class="cp">*</span> <span class="ci">index</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_string_offset:B:" href="#members.new_string_offset"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">string</span> <span class="cp">*</span> <span class="ci">index</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">streamBeginIndex</span><span class="cp">:</span> <span class="ci">int64</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_char-array:B:" href="#members.new_char-array"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">char</span><span class="cp">[]</span> <span class="cp">*</span> <span class="ci">index</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_char-array_offset:B:" href="#members.new_char-array_offset"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">char</span><span class="cp">[]</span> <span class="cp">*</span> <span class="ci">index</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">streamBeginIndex</span><span class="cp">:</span> <span class="ci">int64</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_char-pointer:B:" href="#members.new_char-pointer"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">NativePtr</span><span class="cp"><</span><span class="ci">char</span><span class="cp">></span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_char-pointer_offset:B:" href="#members.new_char-pointer_offset"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">NativePtr</span><span class="cp"><</span><span class="ci">char</span><span class="cp">></span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">streamBeginIndex</span><span class="cp">:</span> <span class="ci">int64</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_file-path:B:" href="#members.new_file-path"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">path</span><span class="cp">:</span> <span class="ci">string</span> <span class="cp">*</span> <span class="ci">encoding</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">Text</span><span class="cm">.</span><span class="ci">Encoding</span></a>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_file-path_2:B:" href="#members.new_file-path_2"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">path</span><span class="cp">:</span> <span class="ci">string</span>
- <span class="cp">*</span> <span class="ci">encoding</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">Text</span><span class="cm">.</span><span class="ci">Encoding</span></a> <span class="cp">*</span> <span class="ci">detectEncodingFromByteOrderMarks</span><span class="cp">:</span> <span class="ci">bool</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_file-path_3:B:" href="#members.new_file-path_3"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">path</span><span class="cp">:</span> <span class="ci">string</span>
- <span class="cp">*</span> <span class="ci">encoding</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">Text</span><span class="cm">.</span><span class="ci">Encoding</span></a> <span class="cp">*</span> <span class="ci">detectEncodingFromByteOrderMarks</span><span class="cp">:</span> <span class="ci">bool</span>
- <span class="cp">*</span> <span class="ci">blockSize</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">blockOverlap</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">minRegexSpace</span><span class="cp">:</span> <span class="ci">int</span>
- <span class="cp">*</span> <span class="ci">byteBufferLength</span><span class="cp">:</span> <span class="ci">int</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_stream:B:" href="#members.new_stream"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">stream</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a> <span class="cp">*</span> <span class="ci">encoding</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">Text</span><span class="cm">.</span><span class="ci">Encoding</span></a>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_stream_2:B:" href="#members.new_stream_2"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">stream</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a> <span class="cp">*</span> <span class="ci">leaveOpen</span><span class="cp">:</span> <span class="ci">bool</span>
- <span class="cp">*</span> <span class="ci">encoding</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">Text</span><span class="cm">.</span><span class="ci">Encoding</span></a>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_stream_3:B:" href="#members.new_stream_3"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">stream</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a> <span class="cp">*</span> <span class="ci">leaveOpen</span><span class="cp">:</span> <span class="ci">bool</span>
- <span class="cp">*</span> <span class="ci">encoding</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">Text</span><span class="cm">.</span><span class="ci">Encoding</span></a> <span class="cp">*</span> <span class="ci">detectEncodingFromByteOrderMarks</span><span class="cp">:</span> <span class="ci">bool</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <a id="interface.new_stream_4:B:" href="#members.new_stream_4"><span class="interface-member-marker"><span class="ck">new</span></span></a><span class="cp">:</span> <span class="ci">stream</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a> <span class="cp">*</span> <span class="ci">leaveOpen</span><span class="cp">:</span> <span class="ci">bool</span>
- <span class="cp">*</span> <span class="ci">encoding</span><span class="cp">:</span> <a href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx"><span class="ci">System</span><span class="cm">.</span><span class="ci">Text</span><span class="cm">.</span><span class="ci">Encoding</span></a> <span class="cp">*</span> <span class="ci">detectEncodingFromByteOrderMarks</span><span class="cp">:</span> <span class="ci">bool</span>
- <span class="cp">*</span> <span class="ci">blockSize</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">blockOverlap</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">minRegexSpace</span><span class="cp">:</span> <span class="ci">int</span>
- <span class="cp">*</span> <span class="ci">byteBufferLength</span><span class="cp">:</span> <span class="ci">int</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- <span class="ck">member</span> <a id="interface.Dispose:B:" href="#members.Dispose"><span class="interface-member-marker"><span class="ci">Dispose</span></span></a><span class="cp">:</span> <span class="ci">unit</span> <span class="cr">-></span> <span class="ci">unit</span>
- <span class="ck">member</span> <a id="interface.Begin:B:" href="#members.Begin"><span class="interface-member-marker"><span class="ci">Begin</span></span></a><span class="cp">:</span> <a href="#Iterator"><span class="ci">Iterator</span></a>
- <span class="ck">member</span> <a id="interface.Seek:B:" href="#members.Seek"><span class="interface-member-marker"><span class="ci">Seek</span></span></a><span class="cp">:</span> <span class="ci">int64</span> <span class="cr">-></span> <a href="#Iterator"><span class="ci">Iterator</span></a>
- <span class="ck">member</span> <a id="interface.BeginIndex:B:" href="#members.BeginIndex"><span class="interface-member-marker"><span class="ci">BeginIndex</span></span></a><span class="cp">:</span> <span class="ci">int64</span>
- <span class="ck">member</span> <a id="interface.EndIndex:B:" href="#members.EndIndex"><span class="interface-member-marker"><span class="ci">EndIndex</span></span></a><span class="cp">:</span> <span class="ci">int64</span>
- <span class="ck">static</span> <span class="ck">member</span> <a id="interface.FoldCase:B:" href="#members.FoldCase"><span class="interface-member-marker"><span class="ci">FoldCase</span></span></a><span class="cp">:</span> <span class="ci">string</span> <span class="cr">-></span> <span class="ci">string</span>
- <span class="ck">static</span> <span class="ck">member</span> <a id="interface.NormalizeNewlines:B:" href="#members.NormalizeNewlines"><span class="interface-member-marker"><span class="ci">NormalizeNewlines</span></span></a><span class="cp">:</span> <span class="ci">string</span> <span class="cr">-></span> <span class="ci">string</span>
- <span class="cp">[<</span><span class="ci">Struct</span><span class="cp">>]</span>
- <span class="ck">type</span> <span class="bold"><a href="#Iterator"><span class="ci">Iterator</span></a></span> <span class="cp">=</span> <span class="cbc"><span class="left-delimiter">(*</span> see below <span class="right-delimiter">*)</span></span>
- </pre>
- </div>
- </div>
- </div>
- <div id="remarks" class="section s3">
- <h2 class="title h3"><span class="section-number">2.8.2</span> Remarks</h2>
- <div class="intro i3">
- <p class="para _1">
- The <code class="fsharp"><span class="ci">CharStream</span></code> class provides an <a
- href="http://en.wikipedia.org/wiki/Iterator">iterator‐based</a> interface for reading UTF‐16 chars from a binary stream or an in‐memory char
- buffer (e.g. a string). It is optimized for use in backtracking parser applications and supports arbitrary <em>char‐based</em> seeking, even for
- streams larger than physical memory.
- </p>
- <p class="para _2">
- A <code class="fsharp"><span class="ci">CharStream</span></code> constructed from a <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span class="ci">System</span><span class="cm">.</span><span
- class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a></code> or a file path reads the stream block‐wise and only holds
- the most recently accessed block in memory. The blocks overlap in order to provide efficient access on the boundary between blocks.
- </p>
- <p class="para _3">
- If the char content is already available as a string or a char array, a <code class="fsharp"><span class="ci">CharStream</span></code> can be
- directly constructed from the char buffer (without needing to copy the buffer). The overhead of accessing an in‐memory char buffer through a
- <code class="fsharp"><span class="ci">CharStream</span></code> is minimal.
- </p>
- <p class="para _4">
- You can access the content of a <code class="fsharp"><span class="ci">CharStream</span></code> only through its <code class="fsharp"><a
- href="#Iterator"><span class="ci">Iterator</span></a></code> instances. The <code class="fsharp"><a href="#members.Begin"><span
- class="ci">Begin</span></a></code> property returns an iterator pointing to the first char in the stream. The <code class="fsharp"><a
- href="#members.Seek"><span class="ci">Seek</span></a></code> method returns an iterator pointing to the char with a given index.
- </p>
- <div class="para _5">
- <div class="dl multi-para">
- <dl class="dl multi-para">
- <dt class="_1"><a id="remarks.low-trust-version"></a>Low‐Trust version</dt>
- <dd class="_1">
- <div class="para _1">
- <p>
- If you compile FParsec with the <code class="fsharp"><span class="ci">LOW_TRUST</span></code> conditional compiler symbol, the <code
- class="fsharp"><span class="ci">CharStream</span></code> class differs from the normal version as follows:
- </p>
- <ul class="l1">
- <li class="_1">
- No <a href="http://msdn.microsoft.com/en-us/library/t2yzs44b.aspx">unverifiable code</a> involving pointers is used. <em>This allows
- FParsec to be executed in an environment with reduced trust</em>, such as medium trust ASP.NET applications.
- </li>
- <li class="_2">
- A <code class="fsharp"><span class="ci">CharStream</span></code> that is constructed from a <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span class="ci">System</span><span class="cm">.</span><span
- class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a></code> or a file path reads the complete file into a single
- string during construction. <em>This severely limits the maximum practical stream size.</em>
- </li>
- <li class="_3">
- Although the <code class="fsharp"><span class="ci">CharStream</span></code> class still supports the <code class="fsharp"><span
- class="ci">IDisposable</span></code> interface, disposing the <code class="fsharp"><span class="ci">CharStream</span></code> instances is
- no longer necessary, since no resources are hold that need to be explicitly released.
- </li>
- </ul>
- </div>
- </dd>
- <dt class="_2"><a id="remarks.non-sequential-access"></a>Non‐sequential access</dt>
- <dd class="_2">
- <p class="para _1">
- <span class="small"><span class="italic">This note does not apply to the <a href="#remarks.low-trust-version">Low‐Trust version</a> of
- FParsec.</span></span><br /> If you construct a <code class="fsharp"><span class="ci">CharStream</span></code> from a <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span class="ci">System</span><span class="cm">.</span><span
- class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a></code> or a file path and you backtrack over a distance long
- enough to require the <code class="fsharp"><span class="ci">CharStream</span></code> to reread a previous block, then the underlying
- <strong>byte stream needs to support seeking</strong>, otherwise a <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.notsupportedexception.aspx"><span class="ci">NotSupportedException</span></a></code> is
- thrown. Furthermore, the <strong><a href="http://msdn.microsoft.com/en-us/library/system.text.decoder.aspx">Decoder</a> for the input <a
- href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx">Encoding</a> must be serializable</strong> if you backtrack to a
- block other than the first in the stream. Note that <em>file streams created for regular disk files are always seekable and all the .NET
- standard decoders are serializable</em>. In order to support non‐seekable streams for applications which don’t require extensive
- backtracking, no exception will be thrown before an operation actually requires backtracking and the necessary capabilities of the stream or
- decoder are not available.
- </p>
- </dd>
- <dt class="_3">Decoder errors</dt>
- <dd class="_3">
- <p class="para _1">
- A <code class="fsharp"><span class="ci">CharStream</span></code> constructed from a binary input stream decodes the input data with the help
- of a <code class="fsharp"><a href="http://msdn.microsoft.com/en-us/library/system.text.decoder.aspx"><span
- class="ci">Decoder</span></a></code> instance obtained via the <code class="fsharp"><span class="ci">Encodings</span></code>’s <code
- class="fsharp"><span class="ci">GetDecoder</span></code> method. Depending on the configuration of the encoding the decoder might throw an
- exception if it encounters invalid byte sequences, usually a <code class="fsharp"><span class="ci">System</span><span
- class="cm">.</span><span class="ci">Text</span><span class="cm">.</span><a
- href="http://msdn.microsoft.com/en-us/library/system.text.decoderfallbackexception.aspx"><span
- class="ci">DecoderFallbackException</span></a></code> or a <code class="fsharp"><span class="ci">System</span><span class="cm">.</span><span
- class="ci">IO</span><span class="cm">.</span><a href="http://msdn.microsoft.com/en-us/library/system.argumentexception.aspx"><span
- class="ci">ArgumentException</span></a></code>. <sup class="fn-mark"><a id="remarks.:FN:1:B:" href="#remarks.:FN:1">[1]</a></sup>
- </p>
- </dd>
- <dt class="_4"><a id="remarks.case-insensitive-matching"></a>Case‐insensitive matching</dt>
- <dd class="_4">
- <p class="para _1">
- The <code class="fsharp"><a href="#Iterator.members.MatchCaseFolded"><span class="ci">MatchCaseFolded</span></a></code> member matches the
- content of the stream “case‐insensitively” with a reference string. In this instance “case‐insensitive” means
- that before the chars are matched with the reference string they are <a
- href="http://unicode.org/reports/tr21/tr21-5.html#Caseless_Matching">mapped to a canonical form where case differences are erased</a>. For
- performance reasons <code class="fsharp"><a href="#Iterator.members.MatchCaseFolded"><span class="ci">MatchCaseFolded</span></a></code> only
- applies the (non‐Turkic) 1‐to‐1 <a href="http://unicode.org/Public/UNIDATA/CaseFolding.txt">case folding mappings</a> (v. 5.1) for Unicode
- code points in the Basic Multilingual Plane, i.e. code points below 0x10000. These mappings are sufficient for many case‐insensitive parser
- grammars encountered in practice, but they are not appropriate for matching arbitrary natural language content. Also note that the <code
- class="fsharp"><span class="ci">CharStream</span></code> class performs no Unicode <a
- href="http://unicode.org/reports/tr15/">normalization</a>.
- </p>
- </dd>
- <dt class="_5">Newlines</dt>
- <dd class="_5">
- <p class="para _1">
- The <code class="fsharp"><span class="ci">CharStream</span></code> class itself does not apply any automatic newline conversion to the
- processed input. A useful helper function for this purpose is <code class="fsharp"><a href="#members.NormalizeNewlines"><span
- class="ci">NormalizeNewlines</span></a></code>, which replaces all ASCII newline character sequences (<code class="fsharp"><span
- class="cs"><span class="left-delimiter">"</span><span class="ce">\n</span><span class="right-delimiter">"</span></span></code>, <code
- class="fsharp"><span class="cs"><span class="left-delimiter">"</span><span class="ce">\r</span><span class="ce">\n</span><span
- class="right-delimiter">"</span></span></code> or <code class="fsharp"><span class="cs"><span class="left-delimiter">"</span><span
- class="ce">\r</span><span class="right-delimiter">"</span></span></code>) in a given string with <code class="fsharp"><span class="cs"><span
- class="left-delimiter">"</span><span class="ce">\n</span><span class="right-delimiter">"</span></span></code>.
- </p>
- </dd>
- <dt class="_6">Disposable interface</dt>
- <dd class="_6">
- <p class="para _1">
- <span class="small"><span class="italic">This note does not apply to the <a href="#remarks.low-trust-version">Low‐Trust version</a> of
- FParsec.</span></span><br /> A <code class="fsharp"><span class="ci">CharStream</span></code> holds managed and unmanaged resources that need
- to be explicitly released. Hence, it is very important that <code class="fsharp"><span class="ci">CharStream</span></code> objects are
- promptly disposed after use. Where possible <code class="fsharp"><span class="ci">CharStream</span></code> objects should only be used within
- a “using” block (C#), a “use” expression( F#) or similar constructs in other languages. Members of <code
- class="fsharp"><a href="#Iterator"><span class="ci">CharStream</span><span class="cm">.</span><span class="ci">Iterator</span></a></code>
- instances must not be accessed after the corresponding <code class="fsharp"><span class="ci">CharStream</span></code> has been disposed, of
- course.
- </p>
- </dd>
- <dt class="_7">Thread safety</dt>
- <dd class="_7">
- <p class="para _1">
- A <code class="fsharp"><span class="ci">CharStream</span></code> constructed from a <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span class="ci">System</span><span class="cm">.</span><span
- class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a></code> or a file path is not thread safe and its members may
- not be accessed by multiple threads, except in the <a href="#remarks.low-trust-version">Low‐Trust version</a> of FParsec. A <code
- class="fsharp"><span class="ci">CharStream</span></code> constructed directly from a string, char array or char pointer can always be safely
- accessed concurrently using different <code class="fsharp"><span class="ci">Iterators</span></code> (provided that the <code
- class="fsharp"><span class="ci">CharStream</span></code> is disposed by only one thread, of course). <span class="italic"><code
- class="fsharp"><a href="#Iterator"><span class="ci">CharStream</span><span class="cm">.</span><span class="ci">Iterator</span></a></code>
- instances are never thread safe.</span>
- </p>
- </dd>
- </dl>
- </div>
- </div>
- </div>
- </div>
- <div id="exceptions" class="section s3">
- <h2 class="title h3"><span class="section-number">2.8.3</span> I/O exceptions</h2>
- <div class="intro i3">
- <p class="para _1">
- If you construct a <code class="fsharp"><span class="ci">CharStream</span></code> from a <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span class="ci">System</span><span class="cm">.</span><span
- class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a></code> or a file path, any <code class="fsharp"><span
- class="ci">CharStream</span></code> operation that requires reading chars from the underlying byte stream may throw one of the following
- exceptions.
- </p>
- <p class="para _2">
- In general it is <em>not</em> safe to continue to use a <code class="fsharp"><span class="ci">CharStream</span></code> instance after one of
- these exceptions was thrown. Calling <code class="fsharp"><a href="#members.Dispose"><span class="ci">Dispose</span></a><span
- class="cp">()</span></code> on an <code class="fsharp"><span class="ci">CharStream</span></code> instance after the instance or one of its
- iterators has thrown an exception is always safe.
- </p>
- <div class="para _3">
- <div class="dl multi-para">
- <dl class="dl multi-para">
- <dt class="_1"><code class="fsharp"><span class="ci">NotSupportedException</span></code></dt>
- <dd class="_1">
- <p class="para _1">
- Seeking of the underlying byte stream is required, but the byte stream does not support seeking or the <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx"><span class="ci">Encoding</span></a></code>’s <code
- class="fsharp"><a href="http://msdn.microsoft.com/en-us/library/system.text.decoder.aspx"><span class="ci">Decoder</span></a></code> is not
- serializable. See also the remarks above on <a href="#remarks.non-sequential-access">non‐sequential access</a>.
- </p>
- </dd>
- <dt class="_2"><code class="fsharp"><span class="ci">IOException</span></code></dt>
- <dd class="_2">
- <p class="para _1">An I/O occured while reading data from the underlying byte stream.</p>
- </dd>
- <dt class="_3"><code class="fsharp"><span class="ci">ArgumentException</span></code></dt>
- <dd class="_3">
- <p class="para _1">
- The underlying byte stream contains invalid bytes and the <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx"><span class="ci">Encoding</span></a></code> was constructed with the
- <code class="fsharp"><span class="ci">throwOnInvalidBytes</span></code> option.
- </p>
- </dd>
- <dt class="_4"><code class="fsharp"><span class="ci">DecoderFallbackException</span></code></dt>
- <dd class="_4">
- <p class="para _1">The underlying byte stream contains invalid bytes for which the decoder fallback threw this exception.</p>
- <p class="para _2">
- The byte index of the invalid bytes in the stream is stored as a boxed <code class="fsharp"><span class="ci">System</span><span
- class="cm">.</span><span class="ci">Int64</span></code> in the <code class="fsharp"><span class="cs"><span
- class="left-delimiter">"</span>Stream.Position<span class="right-delimiter">"</span></span></code> entry of the <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.exception.data.aspx"><span class="ci">Data</span></a></code> member of the exception
- instance. The precision of the index depends on the precision of the <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.text.decoderfallbackexception.aspx"><span
- class="ci">DecoderFallbackException</span></a></code>’s <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.text.decoderfallbackexception.index.aspx"><span class="ci">Index</span></a></code>
- member. If the underlying <code class="fsharp"><a href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx"><span
- class="ci">System</span><span class="cm">.</span><span class="ci">IO</span><span class="cm">.</span><span class="ci">Stream</span></a></code>
- is not seekable, the byte index only takes into account the bytes read by the <code class="fsharp"><span class="ci">CharStream</span></code>,
- but not any bytes read before the <code class="fsharp"><span class="ci">CharStream</span></code> was constructed.
- </p>
- </dd>
- </dl>
- </div>
- </div>
- </div>
- </div>
- <div id="members" class="section s3">
- <h2 class="title h3"><span class="section-number">2.8.4</span> Members</h2>
- <div class="intro i3">
- <div class="para _1">
- <div class="interface-members">
- <div class="interface-member _1" id="members.new_string">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.new_string:B:">⇧</a>
- <pre class="code fsharp"><span class="interface-member-marker"><span class="ck">new</span></span><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">string</span> <span class="cp">*</span> <span class="ci">index</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- Is equivalent to <code class="fsharp"><a href="#members.new_string_offset"><span class="ck">new</span> <span
- class="ci">CharStream</span></a><span class="cp">(</span><span class="ci">chars</span><span class="cp">,</span> <span
- class="ci">index</span><span class="cp">,</span> <span class="ci">length</span><span class="cp">,</span> <span class="cn">0L</span><span
- class="cp">)</span></code>.
- </p>
- </div>
- </div>
- <div class="interface-member _2" id="members.new_string_offset">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.new_string_offset:B:">⇧</a>
- <pre class="code fsharp"><span class="interface-member-marker"><span class="ck">new</span></span><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">string</span> <span class="cp">*</span> <span class="ci">index</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">streamBeginIndex</span><span class="cp">:</span> <span class="ci">int64</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- Constructs a <code class="fsharp"><span class="ci">CharStream</span></code> from the chars in the string argument between the indices <code
- class="fsharp"><span class="ci">index</span></code> (inclusive) and <code class="fsharp"><span class="ci">index</span> <span
- class="co">+</span> <span class="ci">length</span></code> (exclusive). By directly referencing the chars in the string this constructor
- avoids any copy of the string content.
- </p>
- <p class="para _2">
- The first char in the stream is assigned the index <code class="fsharp"><span class="ci">streamBeginIndex</span></code>. A positive <code
- class="fsharp"><span class="ci">streamBeginIndex</span></code> allows you for example to create a substream of another <code
- class="fsharp"><span class="ci">CharStream</span></code>, i.e. a <code class="fsharp"><span class="ci">CharStream</span></code> instance that
- only contains a sub‐segment of another char stream but is accessible through the same char indices.
- </p>
- <div class="para _3">
- <p>
- <code class="fsharp"><span class="ci">chars</span></code> must not be null. An <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.argumentoutofrangeexception.aspx"><span
- class="ci">ArgumentOutOfRangeException</span></a></code> is thrown if the arguments do not satisfy the following conditions:
- </p>
- <ul class="l1">
- <li class="_1">
- <code class="fsharp"><span class="ci">index</span></code> ≥ 0, <code class="fsharp"><span class="ci">length</span></code> ≥ 0, <code
- class="fsharp"><span class="ci">index</span></code> + <code class="fsharp"><span class="ci">length</span></code> ≤ <code
- class="fsharp"><span class="ci">chars</span><span class="cm">.</span><span class="ci">Length</span></code> and
- </li>
- <li class="_2">0 ≤ <code class="fsharp"><span class="ci">streamBeginIndex</span></code> < 2<sup>60</sup>.</li>
- </ul>
- </div>
- <div class="para _4">
- <div class="admonition">
- <div class="admonition-title">Important</div>
- <div class="admonition-body">
- <p class="para _1">
- <span class="small"><span class="italic">This note does not apply to the <a href="#remarks.low-trust-version">Low‐Trust version</a> of
- FParsec.</span></span><br /> The given string is “<a
- href="http://msdn.microsoft.com/en-us/library/83y4ak54.aspx">pinned</a>” until the <code class="fsharp"><span
- class="ci">CharStream</span></code> is disposed. Pinning the string prevents the GC from moving it around in memory during garbage
- collection. On .NET (at least in versions up to and including 4.0) the pinning has no effect if the string is large enough to be allocated
- on the Large Object Heap, i.e. has a length of about 42500 chars or more. However, pinning smaller strings does constrain the normal
- operations of the GC. Thus, <strong>to minimize the negative impact on the GC, you should dispose <code class="fsharp"><span
- class="ci">CharStream</span></code> instances constructed from small strings as soon as you’re done parsing it</strong>. If you keep a
- large number of <code class="fsharp"><span class="ci">CharStream</span></code> instances constructed from small strings around for an
- extended period of time, you risk fragmenting the heap.
- </p>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="interface-member _3" id="members.new_char-array">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.new_char-array:B:">⇧</a>
- <pre class="code fsharp"><span class="interface-member-marker"><span class="ck">new</span></span><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">char</span><span class="cp">[]</span> <span class="cp">*</span> <span class="ci">index</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- <span class="small"><span class="italic">This constructor is not available in the <a href="#remarks.low-trust-version">Low‐Trust version</a>
- of FParsec.</span></span>
- </p>
- <p class="para _2">
- Is equivalent to <code class="fsharp"><a href="#members.new_char-array_offset"><span class="ck">new</span> <span
- class="ci">CharStream</span></a><span class="cp">(</span><span class="ci">chars</span><span class="cp">,</span> <span
- class="ci">index</span><span class="cp">,</span> <span class="ci">length</span><span class="cp">,</span> <span class="cn">0L</span><span
- class="cp">)</span></code>.
- </p>
- </div>
- </div>
- <div class="interface-member _4" id="members.new_char-array_offset">
- <div class="interface-member-code">
- <a class="interface-member-backlink" href="#interface.new_char-array_offset:B:">⇧</a>
- <pre class="code fsharp"><span class="interface-member-marker"><span class="ck">new</span></span><span class="cp">:</span> <span class="ci">chars</span><span class="cp">:</span> <span class="ci">char</span><span class="cp">[]</span> <span class="cp">*</span> <span class="ci">index</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">length</span><span class="cp">:</span> <span class="ci">int</span> <span class="cp">*</span> <span class="ci">streamBeginIndex</span><span class="cp">:</span> <span class="ci">int64</span>
- <span class="cr">-></span> <span class="ci">CharStream</span>
- </pre>
- </div>
- <div class="interface-member-description">
- <p class="para _1">
- <span class="small"><span class="italic">This constructor is not available in the <a href="#remarks.low-trust-version">Low‐Trust version</a>
- of FParsec.</span></span>
- </p>
- <p class="para _2">
- Constructs a <code class="fsharp"><span class="ci">CharStream</span></code> from the chars in the char array argument between the indices
- <code class="fsharp"><span class="ci">index</span></code> (inclusive) and <code class="fsharp"><span class="ci">index</span> <span
- class="co">+</span> <span class="ci">length</span></code> (exclusive). By directly referencing the chars in the char array this constructor
- avoids any copy of the char array content.
- </p>
- <p class="para _3">
- The first char in the stream is assigned the index <code class="fsharp"><span class="ci">streamBeginIndex</span></code>. A positive <code
- class="fsharp"><span class="ci">streamBeginIndex</span></code> allows you for example to create a substream of another <code
- class="fsharp"><span class="ci">CharStream</span></code>, i.e. a <code class="fsharp"><span class="ci">CharStream</span></code> instance that
- only contains a sub‐segment of another char stream but is accessible through the same char indices.
- </p>
- <div class="para _4">
- <p>
- <code class="fsharp"><span class="ci">chars</span></code> must not be null. An <code class="fsharp"><a
- href="http://msdn.microsoft.com/en-us/library/system.argumentoutofrangeexception.aspx"><span
- class="ci">ArgumentOutOfRangeException</span></a></code> is thrown if the arguments do not satisfy the following conditions:
- </p>
- <ul class="l1">
- <li class="_1">…