Blame view

3rdparty/boost_1_81_0/libs/wave/doc/introduction.html 6.27 KB
73ef4ff3   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  <!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://www.boost.org"><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 C99/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 monolithic 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 built 
    on the fly from the given input stream. </P>
  <P dir="ltr"> The C++ preprocessor iterator itself is fed by a C++ lexer iterator, 
    which implements an abstract interface. The C++ lexers packaged 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 independent from the preprocessor. To prove this concept, 
    two different, but functionally identical C++ lexers were
  implemented. Additionally there is implemented a IDL lexer, which allows to use the preprocessor library as the lexing component of a IDL oriented tool. All these lexers implement the mentioned abstract interface, 
    so that the C++ preprocessor iterator may be used with all of them. The abstraction 
    of the lexer from the preprocessor iterator library was done to allow 
     plugging in different lexers without the need to reimplement the preprocessor. 
    This will allow for benchmarking and specific fine tuning of the process of preprocessing 
    itself.</P>
  <P dir="ltr">The first of these C++ lexers is implemented with the help of the 
    well known <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 directly code the token building logic 
  (very similar to hand coded lexers). 
  </P>
  <P dir="ltr">The second of these C++ lexers is built around a table driven lexer, 
    where the DFA tables (discrete finite automaton 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 fed 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 lexemes (tokens). The generated DFA table 
    can be saved to disk 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 also based on the <tt>Re2C</tt> tool, 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 language flavours, where identifiers of one flavour may be keywords of others - Ok, this requires postponement of keyword identification until after the 
  preprocessing, but allows to use Wave 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">Both of the included lexers and the library itself are able 
    to act in a C99 compliant mode. In this mode the lexers reject C++-only tokens 
    (<tt>'::'</tt>, <tt>'-&gt;*'</tt>, <tt>'.*'</tt> and the alternate keywords 
    such as <tt>'and'</tt>, etc.). The preprocessor additionally handles placemarkers 
    (empty macro arguments) and variadics (macros with variable parameter counts). 
    As an extension to the C++ Standard, the library can be enabled to handle placemarkers 
    and variadics in  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 &copy; 2003-2011 Hartmut Kaiser<br>
    <br>
  <font size="2">Distributed under 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"></span>
  <p class="copyright"><span class="updated">Last updated: 
    <!-- #BeginDate format:fcAm1m -->Sunday, December 2, 2007  19:03<!-- #EndDate -->
  </span>  </p>
  </body>
  </html>