mirror of
https://github.com/boostorg/parser.git
synced 2026-01-22 05:22:32 +00:00
257 lines
34 KiB
HTML
257 lines
34 KiB
HTML
<html>
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
<title>Rule Parsers</title>
|
||
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
|
||
<link rel="home" href="../../index.html" title="Chapter 1. Boost.Parser">
|
||
<link rel="up" href="../tutorial.html" title="Tutorial">
|
||
<link rel="prev" href="the_parse_context.html" title="The Parse Context">
|
||
<link rel="next" href="parsing_into__struct_s_and__class_es.html" title="Parsing into structs and classes">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
</head>
|
||
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||
<div class="spirit-nav">
|
||
<a accesskey="p" href="the_parse_context.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="parsing_into__struct_s_and__class_es.html"><img src="../../images/next.png" alt="Next"></a>
|
||
</div>
|
||
<div class="section">
|
||
<div class="titlepage"><div><div><h3 class="title">
|
||
<a name="boost_parser.tutorial.rule_parsers"></a><a class="link" href="rule_parsers.html" title="Rule Parsers">Rule Parsers</a>
|
||
</h3></div></div></div>
|
||
<p>
|
||
This example is very similar to the others we've seen so far. This one is
|
||
different only because it uses a <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rule</a></code>. As an analogy, think
|
||
of a parser like <code class="computeroutput"><a class="link" href="../../boost/parser/char_.html" title="Global char_">char_</a></code>
|
||
or <code class="computeroutput"><a class="link" href="../../boost/parser/double_.html" title="Global double_">double_</a></code>
|
||
as an individual line of code, and a <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rule</a></code> as a function. Like a
|
||
function, a <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rule</a></code>
|
||
has its own name, and can even be forward declared. Here is how we define
|
||
a <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rule</a></code>,
|
||
which is analogous to forward declaring a function:
|
||
</p>
|
||
<p>
|
||
</p>
|
||
<pre class="programlisting"><span class="identifier">bp</span><span class="special">::</span><span class="identifier">rule</span><span class="special"><</span><span class="keyword">struct</span> <span class="identifier">doubles</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">double</span><span class="special">>></span> <span class="identifier">doubles</span> <span class="special">=</span> <span class="string">"doubles"</span><span class="special">;</span>
|
||
</pre>
|
||
<p>
|
||
</p>
|
||
<p>
|
||
This declares the rule itself. The <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rule</a></code> is a parser, and we can
|
||
immediately use it in other parsers. That definition is pretty dense; take
|
||
note of these things:
|
||
</p>
|
||
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
|
||
<li class="listitem">
|
||
The first template parameter is a tag type <code class="computeroutput"><span class="keyword">struct</span>
|
||
<span class="identifier">doubles</span></code>. Here we've declared
|
||
the tag type and used it all in one go; you can also use a previously
|
||
declared tag type.
|
||
</li>
|
||
<li class="listitem">
|
||
The second template parameter is the attribute type of the parser. If
|
||
you don't provide this, the rule will have no attribute.
|
||
</li>
|
||
<li class="listitem">
|
||
This rule object itself is called <code class="computeroutput"><span class="identifier">doubles</span></code>.
|
||
</li>
|
||
<li class="listitem">
|
||
We've given <code class="computeroutput"><span class="identifier">doubles</span></code> the
|
||
diagnstic text <code class="computeroutput"><span class="string">"doubles"</span></code>
|
||
so that Boost.Parser knows how to refer to it when producing a trace
|
||
of the parser during debugging.
|
||
</li>
|
||
</ul></div>
|
||
<p>
|
||
Ok, so if <code class="computeroutput"><span class="identifier">doubles</span></code> is a parser,
|
||
what does it do? We define the rule's behavior by defining a separate parser
|
||
that by now should look pretty familiar:
|
||
</p>
|
||
<p>
|
||
</p>
|
||
<pre class="programlisting"><span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">doubles_def</span> <span class="special">=</span> <span class="identifier">bp</span><span class="special">::</span><span class="identifier">double_</span> <span class="special">%</span> <span class="char">','</span><span class="special">;</span>
|
||
</pre>
|
||
<p>
|
||
</p>
|
||
<p>
|
||
This is analogous to writing a definition for a forward-declared function.
|
||
Note that we used the name <code class="computeroutput"><span class="identifier">doubles_def</span></code>.
|
||
Right now, the <code class="computeroutput"><span class="identifier">doubles</span></code> rule
|
||
parser and the <code class="computeroutput"><span class="identifier">doubles_def</span></code>
|
||
non-rule parser have no connection to each other. That's intentional —
|
||
we want to be able to define them separately. To connect them, we declare
|
||
functions with an interface that Boost.Parser understands, and use the tag
|
||
type <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">doubles</span></code>
|
||
to connect them together. We use a macro for that:
|
||
</p>
|
||
<p>
|
||
</p>
|
||
<pre class="programlisting"><span class="identifier">BOOST_PARSER_DEFINE_RULES</span><span class="special">(</span><span class="identifier">doubles</span><span class="special">);</span>
|
||
</pre>
|
||
<p>
|
||
</p>
|
||
<p>
|
||
This macro expands to the code necessary to make the rule <code class="computeroutput"><span class="identifier">doubles</span></code>
|
||
and its parser <code class="computeroutput"><span class="identifier">doubles_def</span></code>
|
||
work together. The <code class="computeroutput"><span class="identifier">_def</span></code> suffix
|
||
is a naming convention that this macro relies on to work. The tag type allows
|
||
the rule parser, <code class="computeroutput"><span class="identifier">doubles</span></code>,
|
||
to call one of these overloads when used as a parser.
|
||
</p>
|
||
<p>
|
||
<code class="computeroutput"><a class="link" href="../../BOOST_PARSER_DEFINE_RULES.html" title="Macro BOOST_PARSER_DEFINE_RULES">BOOST_PARSER_DEFINE_RULES</a></code>
|
||
expands to two overloads of a function called <code class="computeroutput"><span class="identifier">parse_rule</span><span class="special">()</span></code>. In the case above, the overloads each
|
||
take a <code class="computeroutput"><span class="keyword">struct</span> <span class="identifier">doubles</span></code>
|
||
parameter (to distinguish them from the other overloads of <code class="computeroutput"><span class="identifier">parse_rule</span><span class="special">()</span></code>
|
||
for other rules) and parse using <code class="computeroutput"><span class="identifier">doubles_def</span></code>.
|
||
You will never need to call any overload of <code class="computeroutput"><span class="identifier">parse_rule</span><span class="special">()</span></code> yourself; it is used internally by the
|
||
parser that implements <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rules</a></code>, <code class="computeroutput"><span class="identifier">rule_parser</span></code>.
|
||
</p>
|
||
<p>
|
||
Here is the definition of the macro that is expanded for each rule:
|
||
</p>
|
||
<p>
|
||
</p>
|
||
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_PARSER_DEFINE_IMPL</span><span class="special">(</span><span class="identifier">_</span><span class="special">,</span> <span class="identifier">rule_name_</span><span class="special">)</span> <span class="special">\</span>
|
||
<span class="keyword">template</span><span class="special"><</span> <span class="special">\</span>
|
||
<span class="keyword">typename</span> <span class="identifier">Iter</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">typename</span> <span class="identifier">Sentinel</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">typename</span> <span class="identifier">Context</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">typename</span> <span class="identifier">SkipParser</span><span class="special">></span> <span class="special">\</span>
|
||
<span class="keyword">decltype</span><span class="special">(</span><span class="identifier">rule_name_</span><span class="special">)::</span><span class="identifier">parser_type</span><span class="special">::</span><span class="identifier">attr_type</span> <span class="identifier">parse_rule</span><span class="special">(</span> <span class="special">\</span>
|
||
<span class="keyword">decltype</span><span class="special">(</span><span class="identifier">rule_name_</span><span class="special">)::</span><span class="identifier">parser_type</span><span class="special">::</span><span class="identifier">tag_type</span> <span class="special">*,</span> <span class="special">\</span>
|
||
<span class="identifier">Iter</span> <span class="special">&</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="identifier">Sentinel</span> <span class="identifier">last</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="identifier">Context</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">context</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="identifier">SkipParser</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">skip</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">parser</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">bool</span> <span class="special">&</span> <span class="identifier">success</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">bool</span> <span class="special">&</span> <span class="identifier">dont_assign</span><span class="special">)</span> <span class="special">\</span>
|
||
<span class="special">{</span> <span class="special">\</span>
|
||
<span class="keyword">auto</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">parser</span> <span class="special">=</span> <span class="identifier">BOOST_PARSER_PP_CAT</span><span class="special">(</span><span class="identifier">rule_name_</span><span class="special">,</span> <span class="identifier">_def</span><span class="special">);</span> <span class="special">\</span>
|
||
<span class="keyword">using</span> <span class="identifier">attr_t</span> <span class="special">=</span> <span class="special">\</span>
|
||
<span class="keyword">decltype</span><span class="special">(</span><span class="identifier">parser</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">context</span><span class="special">,</span> <span class="identifier">skip</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">success</span><span class="special">));</span> <span class="special">\</span>
|
||
<span class="keyword">using</span> <span class="identifier">attr_type</span> <span class="special">=</span> <span class="keyword">decltype</span><span class="special">(</span><span class="identifier">rule_name_</span><span class="special">)::</span><span class="identifier">parser_type</span><span class="special">::</span><span class="identifier">attr_type</span><span class="special">;</span> <span class="special">\</span>
|
||
<span class="keyword">if</span> <span class="keyword">constexpr</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">parser</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">is_nope_v</span><span class="special"><</span><span class="identifier">attr_t</span><span class="special">>)</span> <span class="special">{</span> <span class="special">\</span>
|
||
<span class="identifier">dont_assign</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> <span class="special">\</span>
|
||
<span class="identifier">parser</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">context</span><span class="special">,</span> <span class="identifier">skip</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">success</span><span class="special">);</span> <span class="special">\</span>
|
||
<span class="keyword">return</span> <span class="special">{};</span> <span class="special">\</span>
|
||
<span class="special">}</span> <span class="keyword">else</span> <span class="keyword">if</span> <span class="keyword">constexpr</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">is_same_v</span><span class="special"><</span><span class="identifier">attr_type</span><span class="special">,</span> <span class="identifier">attr_t</span><span class="special">>)</span> <span class="special">{</span> <span class="special">\</span>
|
||
<span class="keyword">return</span> <span class="identifier">parser</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">context</span><span class="special">,</span> <span class="identifier">skip</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">success</span><span class="special">);</span> <span class="special">\</span>
|
||
<span class="special">}</span> <span class="keyword">else</span> <span class="keyword">if</span> <span class="keyword">constexpr</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">is_constructible_v</span><span class="special"><</span><span class="identifier">attr_type</span><span class="special">,</span> <span class="identifier">attr_t</span><span class="special">>)</span> <span class="special">{</span> <span class="special">\</span>
|
||
<span class="keyword">return</span> <span class="identifier">attr_type</span><span class="special">(</span> <span class="special">\</span>
|
||
<span class="identifier">parser</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">context</span><span class="special">,</span> <span class="identifier">skip</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">success</span><span class="special">));</span> <span class="special">\</span>
|
||
<span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span> <span class="special">\</span>
|
||
<span class="identifier">attr_type</span> <span class="identifier">attr</span><span class="special">{};</span> <span class="special">\</span>
|
||
<span class="identifier">parser</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">context</span><span class="special">,</span> <span class="identifier">skip</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">success</span><span class="special">,</span> <span class="identifier">attr</span><span class="special">);</span> <span class="special">\</span>
|
||
<span class="keyword">return</span> <span class="identifier">attr</span><span class="special">;</span> <span class="special">\</span>
|
||
<span class="special">}</span> <span class="special">\</span>
|
||
<span class="special">}</span> <span class="special">\</span>
|
||
<span class="special">\</span>
|
||
<span class="keyword">template</span><span class="special"><</span> <span class="special">\</span>
|
||
<span class="keyword">typename</span> <span class="identifier">Iter</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">typename</span> <span class="identifier">Sentinel</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">typename</span> <span class="identifier">Context</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">typename</span> <span class="identifier">SkipParser</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">typename</span> <span class="identifier">Attribute</span><span class="special">></span> <span class="special">\</span>
|
||
<span class="keyword">void</span> <span class="identifier">parse_rule</span><span class="special">(</span> <span class="special">\</span>
|
||
<span class="keyword">decltype</span><span class="special">(</span><span class="identifier">rule_name_</span><span class="special">)::</span><span class="identifier">parser_type</span><span class="special">::</span><span class="identifier">tag_type</span> <span class="special">*,</span> <span class="special">\</span>
|
||
<span class="identifier">Iter</span> <span class="special">&</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="identifier">Sentinel</span> <span class="identifier">last</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="identifier">Context</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">context</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="identifier">SkipParser</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">skip</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">parser</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">flags</span> <span class="identifier">flags</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">bool</span> <span class="special">&</span> <span class="identifier">success</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="keyword">bool</span> <span class="special">&</span> <span class="identifier">dont_assign</span><span class="special">,</span> <span class="special">\</span>
|
||
<span class="identifier">Attribute</span> <span class="special">&</span> <span class="identifier">retval</span><span class="special">)</span> <span class="special">\</span>
|
||
<span class="special">{</span> <span class="special">\</span>
|
||
<span class="keyword">auto</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">parser</span> <span class="special">=</span> <span class="identifier">BOOST_PARSER_PP_CAT</span><span class="special">(</span><span class="identifier">rule_name_</span><span class="special">,</span> <span class="identifier">_def</span><span class="special">);</span> <span class="special">\</span>
|
||
<span class="keyword">using</span> <span class="identifier">attr_t</span> <span class="special">=</span> <span class="special">\</span>
|
||
<span class="keyword">decltype</span><span class="special">(</span><span class="identifier">parser</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">context</span><span class="special">,</span> <span class="identifier">skip</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">success</span><span class="special">));</span> <span class="special">\</span>
|
||
<span class="keyword">if</span> <span class="keyword">constexpr</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">parser</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">is_nope_v</span><span class="special"><</span><span class="identifier">attr_t</span><span class="special">>)</span> <span class="special">{</span> <span class="special">\</span>
|
||
<span class="identifier">parser</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">context</span><span class="special">,</span> <span class="identifier">skip</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">success</span><span class="special">);</span> <span class="special">\</span>
|
||
<span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span> <span class="special">\</span>
|
||
<span class="identifier">parser</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">context</span><span class="special">,</span> <span class="identifier">skip</span><span class="special">,</span> <span class="identifier">flags</span><span class="special">,</span> <span class="identifier">success</span><span class="special">,</span> <span class="identifier">retval</span><span class="special">);</span> <span class="special">\</span>
|
||
<span class="special">}</span> <span class="special">\</span>
|
||
<span class="special">}</span>
|
||
</pre>
|
||
<p>
|
||
</p>
|
||
<p>
|
||
Now that we have the <code class="computeroutput"><span class="identifier">doubles</span></code>
|
||
parser, we can use it like we might any other parser:
|
||
</p>
|
||
<p>
|
||
</p>
|
||
<pre class="programlisting"><span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">bp</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">input</span><span class="special">,</span> <span class="identifier">doubles</span><span class="special">,</span> <span class="identifier">bp</span><span class="special">::</span><span class="identifier">ws</span><span class="special">);</span>
|
||
</pre>
|
||
<p>
|
||
</p>
|
||
<p>
|
||
The full program:
|
||
</p>
|
||
<p>
|
||
</p>
|
||
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">parser</span><span class="special">/</span><span class="identifier">parser</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
|
||
|
||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">deque</span><span class="special">></span>
|
||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
|
||
<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">string</span><span class="special">></span>
|
||
|
||
|
||
<span class="keyword">namespace</span> <span class="identifier">bp</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">parser</span><span class="special">;</span>
|
||
|
||
|
||
<span class="identifier">bp</span><span class="special">::</span><span class="identifier">rule</span><span class="special"><</span><span class="keyword">struct</span> <span class="identifier">doubles</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">double</span><span class="special">>></span> <span class="identifier">doubles</span> <span class="special">=</span> <span class="string">"doubles"</span><span class="special">;</span>
|
||
<span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">doubles_def</span> <span class="special">=</span> <span class="identifier">bp</span><span class="special">::</span><span class="identifier">double_</span> <span class="special">%</span> <span class="char">','</span><span class="special">;</span>
|
||
<span class="identifier">BOOST_PARSER_DEFINE_RULES</span><span class="special">(</span><span class="identifier">doubles</span><span class="special">);</span>
|
||
|
||
<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
|
||
<span class="special">{</span>
|
||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Please enter a list of doubles, separated by commas. "</span><span class="special">;</span>
|
||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">input</span><span class="special">;</span>
|
||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">getline</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">cin</span><span class="special">,</span> <span class="identifier">input</span><span class="special">);</span>
|
||
|
||
<span class="keyword">auto</span> <span class="keyword">const</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">bp</span><span class="special">::</span><span class="identifier">parse</span><span class="special">(</span><span class="identifier">input</span><span class="special">,</span> <span class="identifier">doubles</span><span class="special">,</span> <span class="identifier">bp</span><span class="special">::</span><span class="identifier">ws</span><span class="special">);</span>
|
||
|
||
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
|
||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"You entered:\n"</span><span class="special">;</span>
|
||
<span class="keyword">for</span> <span class="special">(</span><span class="keyword">double</span> <span class="identifier">x</span> <span class="special">:</span> <span class="special">*</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
|
||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">x</span> <span class="special"><<</span> <span class="string">"\n"</span><span class="special">;</span>
|
||
<span class="special">}</span>
|
||
<span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
|
||
<span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"Parse failure.\n"</span><span class="special">;</span>
|
||
<span class="special">}</span>
|
||
<span class="special">}</span>
|
||
</pre>
|
||
<p>
|
||
</p>
|
||
<p>
|
||
All this is intended to introduce the notion of <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rules</a></code>. It still may be a bit
|
||
unclear why you would want to use <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rules</a></code>. The use cases for, and
|
||
lots of detail about, <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rules</a></code> is in a later section,
|
||
<a class="link" href="more_about_rules.html" title="More About Rules">More About Rules</a>.
|
||
</p>
|
||
<div class="note"><table border="0" summary="Note">
|
||
<tr>
|
||
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../images/note.png"></td>
|
||
<th align="left">Note</th>
|
||
</tr>
|
||
<tr><td align="left" valign="top"><p>
|
||
The existence of <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rules</a></code>
|
||
means that will probably never have to write a low-level parser. You can
|
||
just put existing parsers together into <code class="computeroutput"><a class="link" href="../../boost/parser/rule.html" title="Struct template rule">rules</a></code> instead.
|
||
</p></td></tr>
|
||
</table></div>
|
||
</div>
|
||
<div class="copyright-footer">Copyright © 2020 T. Zachary Laine<p>
|
||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||
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>)
|
||
</p>
|
||
</div>
|
||
<hr>
|
||
<div class="spirit-nav">
|
||
<a accesskey="p" href="the_parse_context.html"><img src="../../images/prev.png" alt="Prev"></a><a accesskey="u" href="../tutorial.html"><img src="../../images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../images/home.png" alt="Home"></a><a accesskey="n" href="parsing_into__struct_s_and__class_es.html"><img src="../../images/next.png" alt="Next"></a>
|
||
</div>
|
||
</body>
|
||
</html>
|