mirror of
https://github.com/boostorg/wave.git
synced 2026-01-26 07:02:23 +00:00
93 lines
6.1 KiB
HTML
93 lines
6.1 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<html>
|
|
<head>
|
|
<title>Introduction</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<link href="theme/style.css" rel="stylesheet" type="text/css">
|
|
</head>
|
|
|
|
<body text="#000000" background="theme/bkd.gif">
|
|
<table width="100%" border="0" cellspacing="2" background="theme/bkd2.gif">
|
|
<tr>
|
|
<td width="21"> <h1></h1></td>
|
|
<td width="885"> <font face="Verdana, Arial, Helvetica, sans-serif"><b><font size="6">Introduction</font></b></font></td>
|
|
<td width="96"><a href="http://spirit.sf.net"><img src="theme/wave.gif" width="93" height="68" align="right" border="0"></a></td>
|
|
</tr>
|
|
</table>
|
|
<br>
|
|
<table border="0">
|
|
<tr>
|
|
<td width="10"></td>
|
|
<td width="30"><a href="index.html"><img src="theme/u_arr.gif" border="0"></a></td>
|
|
<td width="30"><a href="preface.html"><img src="theme/l_arr.gif" width="20" height="19" border="0"></a></td>
|
|
<td width="30"><a href="quickstart.html"><img src="theme/r_arr.gif" border="0"></a></td>
|
|
</tr>
|
|
</table>
|
|
<P dir="ltr">The <tt>Wave</tt> C++ preprocessor library is a Standards conformant
|
|
implementation of the mandated C++ preprocessor functionality packed behind
|
|
a simple to use interface, which integrates well with the well known idioms
|
|
of the Standard Template Library (STL).</P>
|
|
<P dir="ltr">The <tt>Wave</tt> C++ preprocessor is not a monolitic application,
|
|
it's rather a modular library, which exposes mainly a context object and an
|
|
iterator interface. The context object helps to configure the actual preprocessing
|
|
process (as search path's, predefined macros, etc.). The exposed iterators are
|
|
generated by this context object too. Iterating over the sequence defined by
|
|
the two iterators will return the preprocessed tokens, which are to be built
|
|
on the fly from the given input stream. </P>
|
|
<P dir="ltr"> The C++ preprocessor iterator itself is feeded by a C++ lexer iterator,
|
|
which implements an unified interface. BTW, the C++ lexers contained with the
|
|
<tt>Wave</tt> library may be used standalone too and are not tied to the C++
|
|
preprocessor iterator at all. </P>
|
|
<P dir="ltr">To make the C++ preprocessing library modular, the C++ lexer is held
|
|
completely separate and independend from the preprocessor. To proof this concept,
|
|
there are two different C++ lexers and aIDL lexer implemented by now, which are functionally
|
|
completely identical. The C++ lexers expose the mentioned unified interface,
|
|
so that the C++ preprocessor iterator may be used with both of them. The abstraction
|
|
of the C++ lexer from the C++ preprocessor iterator library was done to allow
|
|
to plug in different C++ lexers without the need to reimplement the preprocessor.
|
|
This will allow for benchmarking and specific finetuning of the process of preprocessing
|
|
itself.</P>
|
|
<P dir="ltr">The first of this C++ lexers is implemented with the help of the
|
|
wellknown <tt>Re2C</tt> <a href="references.html#re2c">[3]</a> tool, which generates
|
|
C code from given regular expressions. The lexers generated with <tt>Re2C</tt>
|
|
are known to be very fast, because they are not table driven but the whole
|
|
token building logic is coded directly (very similar to hand coded lexers).
|
|
</P>
|
|
<P dir="ltr">The second of this C++ lexers is build around a table driven lexer,
|
|
where the DFA tables are generated from regular expressions with the help of
|
|
a Spirit based lexer generating framework named <tt>Slex</tt> <a href="references.html#slex">[5]</a>.
|
|
The <tt>Slex</tt> is feeded during runtime with the token definitions (regular
|
|
expressions) and generates the resulting DFA table. This table is used to combine
|
|
the input characters into corresponding lexems (tokens). The generated DFA table
|
|
can be saved to disc to avoid the generation process at program startup.</P>
|
|
<P dir="ltr">Wave may be used for preprocessing IDL files too, since the token set needed for the IDL language is very similar to the C++ token set. That's the reason, why the <tt>Wave</tt> preprocessor library contains also an IDL lexer. The IDL lexer is based on the <tt>re2c</tt> tool too, but recognizes a different set of tokens. So this lexer does not recognize any keywords (except <tt>true</tt> and <tt>false</tt>, which are needed by the preprocessor itself). This is needed because there exist different IDL languages, where identifiers of one language may be keywords of others. Ok, this implies to postpone keyword identification after the preprocessing, but allows to use <tt>Wave</tt> for all of the IDL derivatives. </P>
|
|
<P dir="ltr">It is possible to build other C++ lexers if needed. Currently there
|
|
are plans to adapt the <tt>Spirit</tt> C++ lexer example <tt>cpplexer</tt> <a href="references.html#cpplexer">[6]</a>,
|
|
which is completely based on static <tt>Spirit<a href="references.html#spirit">[4]</a></tt>
|
|
grammars.</P>
|
|
<P dir="ltr">In fact both of the embedded lexers and the library itself is able
|
|
to act in a C99 compliant mode. In this mode the lexers reject C++ only tokens
|
|
(<tt>'::'</tt>, <tt>'->*'</tt>, <tt>'.*'</tt> and the alternate keywords
|
|
as <tt>'and'</tt> etc.). The preprocessor additionally handles placemarkers
|
|
(empty macro arguments) and variadics (macros with variable parameter count).
|
|
As an extension to the C++ Standard the library can be enabled to handle placemarkers
|
|
and variadics in the C++ mode too.</P>
|
|
<table border="0">
|
|
<tr>
|
|
<td width="10"></td>
|
|
<td width="30"><a href="index.html"><img src="theme/u_arr.gif" border="0"></a></td>
|
|
<td width="30"><a href="preface.html"><img src="theme/l_arr.gif" width="20" height="19" border="0"></a></td>
|
|
<td width="30"><a href="quickstart.html"><img src="theme/r_arr.gif" border="0"></a></td>
|
|
</tr>
|
|
</table>
|
|
<hr size="1">
|
|
<p class="copyright">Copyright © 2003-2004 Hartmut Kaiser<br>
|
|
<br>
|
|
<font size="2">Use, modification and distribution is subject to the Boost Software
|
|
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
</font> </p>
|
|
<span class="updated">Last updated:
|
|
<!-- #BeginDate format:fcAm1m -->Saturday, January 24, 2004 18:25<!-- #EndDate -->
|
|
</span> </body>
|
|
</html>
|