3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Epsilon Parser (eps)</title>
5 <link rel="stylesheet" href="../../../../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
7 <link rel="home" href="../../../../index.html" title="Spirit 2.5.2">
8 <link rel="up" href="../auxiliary.html" title="Auxiliary Parsers">
9 <link rel="prev" href="eoi.html" title="End of Input Parser (eoi)">
10 <link rel="next" href="lazy.html" title="Lazy Parser (lazy)">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="eoi.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../auxiliary.html"><img src="../../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../../index.html"><img src="../../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lazy.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h5 class="title">
27 <a name="spirit.qi.reference.auxiliary.eps"></a><a class="link" href="eps.html" title="Epsilon Parser (eps)">Epsilon Parser
28 (<code class="computeroutput"><span class="identifier">eps</span></code>)</a>
29 </h5></div></div></div>
31 <a name="spirit.qi.reference.auxiliary.eps.h0"></a>
32 <span><a name="spirit.qi.reference.auxiliary.eps.description"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.description">Description</a>
35 The Epsilon (<code class="computeroutput"><span class="identifier">eps</span></code>) is
36 a multi-purpose parser that returns a zero length match.
39 <a name="spirit.qi.reference.auxiliary.eps.h1"></a>
40 <span><a name="spirit.qi.reference.auxiliary.eps.simple_form"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.simple_form">Simple
44 In its simplest form, <code class="computeroutput"><span class="identifier">eps</span></code>
45 matches the null string and always returns a match of zero length:
47 <pre class="programlisting"><span class="identifier">eps</span> <span class="comment">// always returns a zero-length match</span>
50 This form is usually used to trigger a semantic action unconditionally.
51 For example, it is useful in triggering error messages when a set of
54 <pre class="programlisting"><span class="identifier">r</span> <span class="special">=</span> <span class="identifier">a</span> <span class="special">|</span> <span class="identifier">b</span> <span class="special">|</span> <span class="identifier">c</span> <span class="special">|</span> <span class="identifier">eps</span><span class="special">[</span><span class="identifier">error</span><span class="special">()];</span> <span class="comment">// Call error if a, b, and c fail to match</span>
57 <a name="spirit.qi.reference.auxiliary.eps.h2"></a>
58 <span><a name="spirit.qi.reference.auxiliary.eps.semantic_predicate"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.semantic_predicate">Semantic
62 Semantic predicates allow you to attach a conditional function anywhere
63 in the grammar. In this role, the epsilon takes a <a class="link" href="../basics.html#spirit.qi.reference.basics.lazy_argument">Lazy
64 Argument</a> that returns <code class="computeroutput"><span class="keyword">true</span></code>
65 or <code class="computeroutput"><span class="keyword">false</span></code>. The <a class="link" href="../basics.html#spirit.qi.reference.basics.lazy_argument">Lazy
66 Argument</a> is typically a test that is called to resolve ambiguity
67 in the grammar. A parse failure will be reported when the <a class="link" href="../basics.html#spirit.qi.reference.basics.lazy_argument">Lazy
68 Argument</a> result evaluates to <code class="computeroutput"><span class="keyword">false</span></code>.
69 Otherwise an empty match will be reported. The general form is:
71 <pre class="programlisting"><span class="identifier">eps</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">>></span> <span class="identifier">rest</span><span class="special">;</span>
74 The <a class="link" href="../basics.html#spirit.qi.reference.basics.lazy_argument">Lazy Argument</a>
75 <code class="computeroutput"><span class="identifier">f</span></code> is called to do a semantic
76 test (say, checking if a symbol is in the symbol table). If test returns
77 true, <code class="computeroutput"><span class="identifier">rest</span></code> will be evaluated.
78 Otherwise, the production will return early with a no-match without ever
82 <a name="spirit.qi.reference.auxiliary.eps.h3"></a>
83 <span><a name="spirit.qi.reference.auxiliary.eps.header"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.header">Header</a>
85 <pre class="programlisting"><span class="comment">// forwards to <boost/spirit/home/qi/auxiliary/eps.hpp></span>
86 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">spirit</span><span class="special">/</span><span class="identifier">include</span><span class="special">/</span><span class="identifier">qi_eps</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
89 Also, see <a class="link" href="../../../structure/include.html" title="Include">Include Structure</a>.
92 <a name="spirit.qi.reference.auxiliary.eps.h4"></a>
93 <span><a name="spirit.qi.reference.auxiliary.eps.namespace"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.namespace">Namespace</a>
95 <div class="informaltable"><table class="table">
96 <colgroup><col></colgroup>
104 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">eps</span> <span class="comment">// alias:
105 boost::spirit::qi::eps</span></code>
110 <a name="spirit.qi.reference.auxiliary.eps.h5"></a>
111 <span><a name="spirit.qi.reference.auxiliary.eps.model_of"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.model_of">Model
114 <div class="blockquote"><blockquote class="blockquote"><p>
115 <a class="link" href="../parser_concepts/primitiveparser.html" title="PrimitiveParser"><code class="computeroutput"><span class="identifier">PrimitiveParser</span></code></a>
116 </p></blockquote></div>
117 <div class="variablelist">
118 <p class="title"><b>Notation</b></p>
120 <dt><span class="term"><code class="computeroutput"><span class="identifier">f</span></code></span></dt>
122 A <a class="link" href="../basics.html#spirit.qi.reference.basics.lazy_argument">Lazy
123 Argument</a> that evaluates <code class="computeroutput"><span class="keyword">bool</span></code>.
128 <a name="spirit.qi.reference.auxiliary.eps.h6"></a>
129 <span><a name="spirit.qi.reference.auxiliary.eps.expression_semantics"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.expression_semantics">Expression
133 Semantics of an expression is defined only where it differs from, or
134 is not defined in <a class="link" href="../parser_concepts/primitiveparser.html" title="PrimitiveParser"><code class="computeroutput"><span class="identifier">PrimitiveParser</span></code></a>.
136 <div class="informaltable"><table class="table">
157 <code class="computeroutput"><span class="identifier">eps</span></code>
162 Match an empty string (always matches).
169 <code class="computeroutput"><span class="identifier">eps</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>
174 If <code class="computeroutput"><span class="identifier">f</span></code> evaluates
175 to <code class="computeroutput"><span class="keyword">true</span></code>, return
183 <a name="spirit.qi.reference.auxiliary.eps.h7"></a>
184 <span><a name="spirit.qi.reference.auxiliary.eps.attributes"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.attributes">Attributes</a>
186 <div class="informaltable"><table class="table">
206 <code class="computeroutput"><span class="identifier">eps</span></code>
211 <code class="computeroutput"><span class="identifier">unused</span></code>
217 <a name="spirit.qi.reference.auxiliary.eps.h8"></a>
218 <span><a name="spirit.qi.reference.auxiliary.eps.complexity"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.complexity">Complexity</a>
220 <div class="blockquote"><blockquote class="blockquote"><p>
221 For plain (<code class="computeroutput"><span class="identifier">eps</span></code>) the
222 complexity is O(1). For Semantic predicates (<code class="computeroutput"><span class="identifier">eps</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>) the complexity is defined by the
223 function <code class="computeroutput"><span class="identifier">f</span></code>.
224 </p></blockquote></div>
226 <a name="spirit.qi.reference.auxiliary.eps.h9"></a>
227 <span><a name="spirit.qi.reference.auxiliary.eps.example"></a></span><a class="link" href="eps.html#spirit.qi.reference.auxiliary.eps.example">Example</a>
229 <div class="note"><table border="0" summary="Note">
231 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../images/note.png"></td>
232 <th align="left">Note</th>
234 <tr><td align="left" valign="top"><p>
235 The test harness for the example(s) below is presented in the <a class="link" href="../basics.html#spirit.qi.reference.basics.examples">Basics Examples</a>
240 Some using declarations:
244 <pre class="programlisting"><span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">eps</span><span class="special">;</span>
245 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">int_</span><span class="special">;</span>
246 <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">qi</span><span class="special">::</span><span class="identifier">_1</span><span class="special">;</span>
247 <span class="keyword">namespace</span> <span class="identifier">phx</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">phoenix</span><span class="special">;</span>
252 Basic <code class="computeroutput"><span class="identifier">eps</span></code>:
256 <pre class="programlisting"><span class="identifier">test_parser</span><span class="special">(</span><span class="string">""</span><span class="special">,</span> <span class="identifier">eps</span><span class="special">);</span> <span class="comment">// always matches</span>
261 This example simulates the "classic" <code class="computeroutput"><span class="identifier">if_p</span></code>
262 parser. Here, <code class="computeroutput"><span class="identifier">int_</span></code> will
263 be tried only if the condition, <code class="computeroutput"><span class="identifier">c</span></code>,
268 <pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">c</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> <span class="comment">// a flag</span>
269 <span class="identifier">test_parser</span><span class="special">(</span><span class="string">"1234"</span><span class="special">,</span> <span class="identifier">eps</span><span class="special">(</span><span class="identifier">phx</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">true</span><span class="special">)</span> <span class="special">>></span> <span class="identifier">int_</span><span class="special">);</span>
274 This example simulates the "classic" <code class="computeroutput"><span class="identifier">while_p</span></code>
275 parser. Here, the kleene loop will exit once the condition, <code class="computeroutput"><span class="identifier">c</span></code>, becomes true. Notice that the condition,
276 <code class="computeroutput"><span class="identifier">c</span></code>, is turned to <code class="computeroutput"><span class="keyword">false</span></code> when we get to parse <code class="computeroutput"><span class="number">4</span></code>.
280 <pre class="programlisting"><span class="identifier">test_phrase_parser</span><span class="special">(</span><span class="string">"1 2 3 4"</span><span class="special">,</span>
281 <span class="special">*(</span><span class="identifier">eps</span><span class="special">(</span><span class="identifier">phx</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">true</span><span class="special">)</span> <span class="special">>></span> <span class="identifier">int_</span><span class="special">[</span><span class="identifier">phx</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">_1</span> <span class="special">==</span> <span class="number">4</span><span class="special">)]));</span>
286 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
287 <td align="left"></td>
288 <td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p>
289 Distributed under the Boost Software License, Version 1.0. (See accompanying
290 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
295 <div class="spirit-nav">
296 <a accesskey="p" href="eoi.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../auxiliary.html"><img src="../../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../../index.html"><img src="../../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lazy.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a>