mirror of
https://github.com/boostorg/parser.git
synced 2026-01-21 17:12:16 +00:00
706 lines
42 KiB
HTML
706 lines
42 KiB
HTML
<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">>></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">&</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"><</span><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>
|
||
<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"><</span><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>
|
||
<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"><</span><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 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"><</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">)></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; 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 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"><</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">)></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; 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 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"><</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">)></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"><</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">)></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">>></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">>></span> <span class="special">*(</span><span class="identifier">p2</span> <span class="special">>></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"><</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></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"><</span><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="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"><</span><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">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"><</span><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>"
|
||
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>
|