2
0
mirror of https://github.com/boostorg/parser.git synced 2026-01-22 05:22:32 +00:00
Files
parser/doc/html/boost_parser/tutorial/rule_parsers.html
2024-12-08 17:19:48 -06:00

257 lines
34 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<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">&lt;</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">&lt;</span><span class="keyword">double</span><span class="special">&gt;&gt;</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">&lt;</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">&gt;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</span> <span class="identifier">success</span><span class="special">,</span> <span class="special">\</span>
<span class="keyword">bool</span> <span class="special">&amp;</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">&amp;</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">&lt;</span><span class="identifier">attr_t</span><span class="special">&gt;)</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">&lt;</span><span class="identifier">attr_type</span><span class="special">,</span> <span class="identifier">attr_t</span><span class="special">&gt;)</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">&lt;</span><span class="identifier">attr_type</span><span class="special">,</span> <span class="identifier">attr_t</span><span class="special">&gt;)</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">&lt;</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">&gt;</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">&amp;</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">&amp;</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">&amp;</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">&amp;</span> <span class="identifier">success</span><span class="special">,</span> <span class="special">\</span>
<span class="keyword">bool</span> <span class="special">&amp;</span> <span class="identifier">dont_assign</span><span class="special">,</span> <span class="special">\</span>
<span class="identifier">Attribute</span> <span class="special">&amp;</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">&amp;</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">&lt;</span><span class="identifier">attr_t</span><span class="special">&gt;)</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">&lt;</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">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">deque</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">string</span><span class="special">&gt;</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">&lt;</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">&lt;</span><span class="keyword">double</span><span class="special">&gt;&gt;</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">&lt;&lt;</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">&lt;&lt;</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">&lt;&lt;</span> <span class="identifier">x</span> <span class="special">&lt;&lt;</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">&lt;&lt;</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>