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

706 lines
42 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>Combining Operations</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="directives.html" title="Directives">
<link rel="next" href="attribute_generation.html" title="Attribute Generation">
<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="directives.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="attribute_generation.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.combining_operations"></a><a class="link" href="combining_operations.html" title="Combining Operations">Combining
Operations</a>
</h3></div></div></div>
<p>
Certain overloaded operators are defined for all parsers in Boost.Parser.
We've already seen some of them used in this tutorial, especially <code class="computeroutput"><span class="keyword">operator</span><span class="special">&gt;&gt;</span></code>,
<code class="computeroutput"><span class="keyword">operator</span><span class="special">|</span></code>,
and <code class="computeroutput"><span class="keyword">operator</span><span class="special">||</span></code>,
which are used to form sequence parsers, alternative parsers, and permutation
parsers, respectively.
</p>
<p>
Here are all the operator overloaded for parsers. In the tables below:
</p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem">
<code class="computeroutput"><span class="identifier">c</span></code> is a character of type
<code class="computeroutput"><span class="keyword">char</span></code> or <code class="computeroutput"><span class="keyword">char32_t</span></code>;
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">a</span></code> is a semantic action;
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">r</span></code> is an object whose
type models <code class="computeroutput"><span class="identifier">parsable_range</span></code>
(see <a class="link" href="../concepts.html" title="Concepts">Concepts</a>); and
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">p</span></code>, <code class="computeroutput"><span class="identifier">p1</span></code>,
<code class="computeroutput"><span class="identifier">p2</span></code>, ... are parsers.
</li>
</ul></div>
<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>
Some of the expressions in this table consume no input. All parsers consume
the input they match unless otherwise stated in the table below.
</p></td></tr>
</table></div>
<div class="table">
<a name="boost_parser.tutorial.combining_operations.t0"></a><p class="title"><b>Table 1.7. Combining Operations and Their Semantics</b></p>
<div class="table-contents"><table class="table" summary="Combining Operations and Their Semantics">
<colgroup>
<col>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Expression
</p>
</th>
<th>
<p>
Semantics
</p>
</th>
<th>
<p>
Attribute Type
</p>
</th>
<th>
<p>
Notes
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput"><span class="special">!</span><span class="identifier">p</span></code>
</p>
</td>
<td>
<p>
Matches iff <code class="computeroutput"><span class="identifier">p</span></code> does
not match; consumes no input.
</p>
</td>
<td>
<p>
None.
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="special">&amp;</span><span class="identifier">p</span></code>
</p>
</td>
<td>
<p>
Matches iff <code class="computeroutput"><span class="identifier">p</span></code> matches;
consumes no input.
</p>
</td>
<td>
<p>
None.
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="special">*</span><span class="identifier">p</span></code>
</p>
</td>
<td>
<p>
Parses using <code class="computeroutput"><span class="identifier">p</span></code>
repeatedly until <code class="computeroutput"><span class="identifier">p</span></code>
no longer matches; always matches.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> if <code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code> is <code class="computeroutput"><span class="keyword">char</span></code>
or <code class="computeroutput"><span class="keyword">char32_t</span></code>, otherwise
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)&gt;</span></code>
</p>
</td>
<td>
<p>
Matching <code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code>
an unlimited number of times creates an infinite loop, which is
undefined behavior in C++. Boost.Parser will assert in debug mode
when it encounters <code class="computeroutput"><span class="special">*</span><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code>
(this applies to unconditional <code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code> only).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="special">+</span><span class="identifier">p</span></code>
</p>
</td>
<td>
<p>
Parses using <code class="computeroutput"><span class="identifier">p</span></code>
repeatedly until <code class="computeroutput"><span class="identifier">p</span></code>
no longer matches; matches iff <code class="computeroutput"><span class="identifier">p</span></code>
matches at least once.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> if <code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code> is <code class="computeroutput"><span class="keyword">char</span></code>
or <code class="computeroutput"><span class="keyword">char32_t</span></code>, otherwise
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)&gt;</span></code>
</p>
</td>
<td>
<p>
Matching <code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code>
an unlimited number of times creates an infinite loop, which is
undefined behavior in C++. Boost.Parser will assert in debug mode
when it encounters <code class="computeroutput"><span class="special">+</span><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code>
(this applies to unconditional <code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code> only).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="special">-</span><span class="identifier">p</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">|</span> <a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">optional</span><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)&gt;</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">&gt;&gt;</span>
<span class="identifier">p2</span></code>
</p>
</td>
<td>
<p>
Matches iff <code class="computeroutput"><span class="identifier">p1</span></code>
matches and then <code class="computeroutput"><span class="identifier">p2</span></code>
matches.
</p>
</td>
<td>
<p>
<code class="computeroutput"><a class="link" href="../../boost/parser/tuple.html" title="Type definition tuple">boost::parser::tuple</a><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p1</span><span class="special">),</span> <span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p2</span><span class="special">)&gt;</span></code> (See note.)
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="special">&gt;&gt;</span></code> is associative;
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">&gt;&gt;</span>
<span class="identifier">p2</span> <span class="special">&gt;&gt;</span>
<span class="identifier">p3</span></code>, <code class="computeroutput"><span class="special">(</span><span class="identifier">p1</span> <span class="special">&gt;&gt;</span>
<span class="identifier">p2</span><span class="special">)</span>
<span class="special">&gt;&gt;</span> <span class="identifier">p3</span></code>,
and <code class="computeroutput"><span class="identifier">p1</span> <span class="special">&gt;&gt;</span>
<span class="special">(</span><span class="identifier">p2</span>
<span class="special">&gt;&gt;</span> <span class="identifier">p3</span><span class="special">)</span></code> are all equivalent. This attribute
type only applies to the case where <code class="computeroutput"><span class="identifier">p1</span></code>
and <code class="computeroutput"><span class="identifier">p2</span></code> both generate
attributes; see <a class="link" href="attribute_generation.html" title="Attribute Generation">Attribute
Generation</a> for the full rules.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">&gt;&gt;</span>
<span class="identifier">c</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">&gt;&gt;</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">&gt;&gt;</span>
<span class="identifier">r</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">&gt;&gt;</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">r</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">&gt;</span>
<span class="identifier">p2</span></code>
</p>
</td>
<td>
<p>
Matches iff <code class="computeroutput"><span class="identifier">p1</span></code>
matches and then <code class="computeroutput"><span class="identifier">p2</span></code>
matches. No back-tracking is allowed after <code class="computeroutput"><span class="identifier">p1</span></code>
matches; if <code class="computeroutput"><span class="identifier">p1</span></code>
matches but then <code class="computeroutput"><span class="identifier">p2</span></code>
does not, the top-level parse fails.
</p>
</td>
<td>
<p>
<code class="computeroutput"><a class="link" href="../../boost/parser/tuple.html" title="Type definition tuple">boost::parser::tuple</a><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p1</span><span class="special">),</span> <span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p2</span><span class="special">)&gt;</span></code> (See note.)
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="special">&gt;</span></code> is associative;
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">&gt;</span>
<span class="identifier">p2</span> <span class="special">&gt;</span>
<span class="identifier">p3</span></code>, <code class="computeroutput"><span class="special">(</span><span class="identifier">p1</span> <span class="special">&gt;</span>
<span class="identifier">p2</span><span class="special">)</span>
<span class="special">&gt;</span> <span class="identifier">p3</span></code>,
and <code class="computeroutput"><span class="identifier">p1</span> <span class="special">&gt;</span>
<span class="special">(</span><span class="identifier">p2</span>
<span class="special">&gt;</span> <span class="identifier">p3</span><span class="special">)</span></code> are all equivalent. This attribute
type only applies to the case where <code class="computeroutput"><span class="identifier">p1</span></code>
and <code class="computeroutput"><span class="identifier">p2</span></code> both generate
attributes; see <a class="link" href="attribute_generation.html" title="Attribute Generation">Attribute
Generation</a> for the full rules.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">&gt;</span>
<span class="identifier">c</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">&gt;</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">&gt;</span>
<span class="identifier">r</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">&gt;</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">r</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">|</span>
<span class="identifier">p2</span></code>
</p>
</td>
<td>
<p>
Matches iff either <code class="computeroutput"><span class="identifier">p1</span></code>
matches or <code class="computeroutput"><span class="identifier">p2</span></code> matches.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">variant</span><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p1</span><span class="special">),</span> <span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p2</span><span class="special">)&gt;</span></code> (See note.)
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="special">|</span></code> is associative;
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">|</span>
<span class="identifier">p2</span> <span class="special">|</span>
<span class="identifier">p3</span></code>, <code class="computeroutput"><span class="special">(</span><span class="identifier">p1</span> <span class="special">|</span>
<span class="identifier">p2</span><span class="special">)</span>
<span class="special">|</span> <span class="identifier">p3</span></code>,
and <code class="computeroutput"><span class="identifier">p1</span> <span class="special">|</span>
<span class="special">(</span><span class="identifier">p2</span>
<span class="special">|</span> <span class="identifier">p3</span><span class="special">)</span></code> are all equivalent. This attribute
type only applies to the case where <code class="computeroutput"><span class="identifier">p1</span></code>
and <code class="computeroutput"><span class="identifier">p2</span></code> both generate
attributes, and where the attribute types are different; see <a class="link" href="attribute_generation.html" title="Attribute Generation">Attribute
Generation</a> for the full rules.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">|</span>
<span class="identifier">c</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">|</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">|</span>
<span class="identifier">r</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">|</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">r</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">||</span>
<span class="identifier">p2</span></code>
</p>
</td>
<td>
<p>
Matches iff <code class="computeroutput"><span class="identifier">p1</span></code>
matches and <code class="computeroutput"><span class="identifier">p2</span></code>
matches, regardless of the order they match in.
</p>
</td>
<td>
<p>
<code class="computeroutput"><a class="link" href="../../boost/parser/tuple.html" title="Type definition tuple">boost::parser::tuple</a><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p1</span><span class="special">),</span> <span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p2</span><span class="special">)&gt;</span></code>
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="special">||</span></code> is associative;
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">||</span>
<span class="identifier">p2</span> <span class="special">||</span>
<span class="identifier">p3</span></code>, <code class="computeroutput"><span class="special">(</span><span class="identifier">p1</span> <span class="special">||</span>
<span class="identifier">p2</span><span class="special">)</span>
<span class="special">||</span> <span class="identifier">p3</span></code>,
and <code class="computeroutput"><span class="identifier">p1</span> <span class="special">||</span>
<span class="special">(</span><span class="identifier">p2</span>
<span class="special">||</span> <span class="identifier">p3</span><span class="special">)</span></code> are all equivalent. It is an error
to include a <code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code> (conditional
or non-conditional) in an <code class="computeroutput"><span class="keyword">operator</span><span class="special">||</span></code> expression. Though the parsers
are matched in any order, the attribute elements are always in
the order written in the <code class="computeroutput"><span class="keyword">operator</span><span class="special">||</span></code> expression.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">-</span>
<span class="identifier">p2</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="special">!</span><span class="identifier">p2</span>
<span class="special">&gt;&gt;</span> <span class="identifier">p1</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p1</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">-</span>
<span class="identifier">c</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">-</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">-</span>
<span class="identifier">r</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">-</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">r</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p1</span> <span class="special">%</span>
<span class="identifier">p2</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p1</span> <span class="special">&gt;&gt;</span> <span class="special">*(</span><span class="identifier">p2</span> <span class="special">&gt;&gt;</span>
<span class="identifier">p1</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> if <code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code> is <code class="computeroutput"><span class="keyword">char</span></code>
or <code class="computeroutput"><span class="keyword">char32_t</span></code>, otherwise
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p1</span><span class="special">)&gt;</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">%</span>
<span class="identifier">c</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">%</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> if <code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code> is <code class="computeroutput"><span class="keyword">char</span></code>
or <code class="computeroutput"><span class="keyword">char32_t</span></code>, otherwise
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)&gt;</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span> <span class="special">%</span>
<span class="identifier">r</span></code>
</p>
</td>
<td>
<p>
Equivalent to <code class="computeroutput"><span class="identifier">p</span> <span class="special">%</span> <span class="identifier">lit</span><span class="special">(</span><span class="identifier">r</span><span class="special">)</span></code>.
</p>
</td>
<td>
<p>
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> if <code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code> is <code class="computeroutput"><span class="keyword">char</span></code>
or <code class="computeroutput"><span class="keyword">char32_t</span></code>, otherwise
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)&gt;</span></code>
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">p</span><span class="special">[</span><span class="identifier">a</span><span class="special">]</span></code>
</p>
</td>
<td>
<p>
Matches iff <code class="computeroutput"><span class="identifier">p</span></code> matches.
If <code class="computeroutput"><span class="identifier">p</span></code> matches, the
semantic action <code class="computeroutput"><span class="identifier">a</span></code>
is executed.
</p>
</td>
<td>
<p>
None.
</p>
</td>
<td>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><div class="important"><table border="0" summary="Important">
<tr>
<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../images/important.png"></td>
<th align="left">Important</th>
</tr>
<tr><td align="left" valign="top"><p>
All the character parsers, like <code class="computeroutput"><a class="link" href="../../boost/parser/char_.html" title="Global char_">char_</a></code>, <code class="computeroutput"><a class="link" href="../../boost/parser/cp.html" title="Global cp">cp</a></code> and <code class="computeroutput"><a class="link" href="../../boost/parser/cu.html" title="Global cu">cu</a></code> produce either <code class="computeroutput"><span class="keyword">char</span></code> or <code class="computeroutput"><span class="keyword">char32_t</span></code>
attributes. So when you see "<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>
if <code class="computeroutput"><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)</span></code> is
<code class="computeroutput"><span class="keyword">char</span></code> or <code class="computeroutput"><span class="keyword">char32_t</span></code>,
otherwise <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="emphasis"><em><code class="literal">ATTR</code></em></span><span class="special">(</span><span class="identifier">p</span><span class="special">)&gt;</span></code>"
in the table above, that effectively means that every sequences of character
attributes get turned into a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>.
The only time this does not happen is when you introduce your own rules
with attributes using another character type (or use <code class="computeroutput"><a class="link" href="../../boost/parser/attribute.html" title="Struct template attribute">attribute</a></code> to do so).
</p></td></tr>
</table></div>
<p>
There are a couple of special rules not captured in the table above:
</p>
<p>
First, the zero-or-more and one-or-more repetitions (<code class="computeroutput"><span class="keyword">operator</span><span class="special">*()</span></code> and <code class="computeroutput"><span class="keyword">operator</span><span class="special">+()</span></code>, respectively) may collapse when combined.
For any parser <code class="computeroutput"><span class="identifier">p</span></code>, <code class="computeroutput"><span class="special">+(+</span><span class="identifier">p</span><span class="special">)</span></code>
collapses to <code class="computeroutput"><span class="special">+</span><span class="identifier">p</span></code>;
<code class="computeroutput"><span class="special">**</span><span class="identifier">p</span></code>,
<code class="computeroutput"><span class="special">*+</span><span class="identifier">p</span></code>,
and <code class="computeroutput"><span class="special">+*</span><span class="identifier">p</span></code>
each collapse to just <code class="computeroutput"><span class="special">*</span><span class="identifier">p</span></code>.
</p>
<p>
Second, using <code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code>
in an alternative parser as any alternative <span class="bold"><strong>except</strong></span>
the last one is a common source of errors; Boost.Parser disallows it. This
is true because, for any parser <code class="computeroutput"><span class="identifier">p</span></code>,
<code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a>
<span class="special">|</span> <span class="identifier">p</span></code>
is equivalent to <code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code>,
since <code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code>
always matches. This is not true for <code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a></code> parameterized with a condition.
For any condition <code class="computeroutput"><span class="identifier">cond</span></code>,
<code class="computeroutput"><a class="link" href="../../boost/parser/eps.html" title="Global eps">eps</a><span class="special">(</span><span class="identifier">cond</span><span class="special">)</span></code>
is allowed to appear anywhere within an alternative parser.
</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>
When looking at Boost.Parser parsers in a debugger, or when looking at
their reference documentation, you may see reference to the template <code class="computeroutput"><a class="link" href="../../boost/parser/parser_interface.html" title="Struct template parser_interface">parser_interface</a></code>.
This template exists to provide the operator overloads described above.
It allows the parsers themselves to be very simple — most parsers
are just a struct with two member functions. <code class="computeroutput"><a class="link" href="../../boost/parser/parser_interface.html" title="Struct template parser_interface">parser_interface</a></code> is essentially
invisible when using Boost.Parser, and you should never have to name this
template in your own code.
</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="directives.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="attribute_generation.html"><img src="../../images/next.png" alt="Next"></a>
</div>
</body>
</html>