Blame view

3rdparty/boost_1_81_0/libs/spirit/doc/preface.qbk 10.1 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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
  [/==============================================================================
      Copyright (C) 2001-2011 Joel de Guzman
      Copyright (C) 2001-2011 Hartmut Kaiser
  
      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)
  ===============================================================================/]
  
  [section Preface]
  
  [:['["Examples of designs that meet most of the criteria for
  "goodness" (easy to understand, flexible, efficient) are a
  recursive-descent parser, which is traditional procedural
  code. Another example is the STL, which is a generic library of
  containers and algorithms depending crucially on both traditional
  procedural code and on parametric polymorphism.]] [*--Bjarne
  Stroustrup]]
  
  [heading History]
  
  [heading /80s/]
  
  In the mid-80s, Joel wrote his first calculator in Pascal. Such an
  unforgettable coding experience, he was amazed at how a mutually
  recursive set of functions can model a grammar specification. In time,
  the skills he acquired from that academic experience became very
  practical as he was tasked to do some parsing. For instance, whenever he
  needed to perform any form of binary or text I/O, he tried to approach
  each task somewhat formally by writing a grammar using Pascal-like
  syntax diagrams and then a corresponding recursive-descent parser. This
  process worked very well.
  
  [heading /90s/]
  
  The arrival of the Internet and the World Wide Web magnified the need
  for parsing a thousand-fold. At one point Joel had to write an HTML
  parser for a Web browser project. Using the W3C formal specifications,
  he easily wrote a recursive-descent HTML parser. With the influence of
  the Internet, RFC specifications were abundent. SGML, HTML, XML, email
  addresses and even those seemingly trivial URLs were all formally
  specified using small EBNF-style grammar specifications. Joel had more
  parsing to do, and he wished for a tool similar to larger parser
  generators such as YACC and ANTLR, where a parser is built automatically
  from a grammar specification. 
  
  This ideal tool would be able to parse anything from email addresses and
  command lines, to XML and scripting languages. Scalability was a primary
  goal. The tool would be able to do this without incurring a heavy
  development load, which was not possible with the above mentioned parser
  generators. The result was Spirit.
  
  Spirit was a personal project that was conceived when Joel was involved
  in R&D in Japan. Inspired by the GoF's composite and interpreter
  patterns, he realized that he can model a recursive-descent parser with
  hierarchical-object composition of primitives (terminals) and composites
  (productions). The original version was implemented with run-time
  polymorphic classes. A parser was generated at run time by feeding in
  production rule strings such as: 
  
      "prod ::= {'A' | 'B'} 'C';"
  
  A compile function compiled the parser, dynamically creating a hierarchy
  of objects and linking semantic actions on the fly. A very early text
  can be found here: __early_spirit__.
  
  [heading /2001 to 2006/]
  
  Version 1.0 to 1.8 was a complete rewrite of the original Spirit parser
  using expression templates and static polymorphism, inspired by the
  works of Todd Veldhuizen (__exprtemplates__, C++ Report, June
  1995). Initially, the static-Spirit version was meant only to replace
  the core of the original dynamic-Spirit. Dynamic-Spirit needed a parser
  to implement itself anyway. The original employed a hand-coded
  recursive-descent parser to parse the input grammar specification
  strings. It was at this time when Hartmut Kaiser joined the Spirit
  development. 
  
  After its initial "open-source" debut in May 2001, static-Spirit became
  a success. At around November 2001, the Spirit website had an activity
  percentile of 98%, making it the number one parser tool at Source Forge
  at the time. Not bad for a niche project like a parser library. The
  "static" portion of Spirit was forgotten and static-Spirit simply became
  Spirit. The library soon evolved to acquire more dynamic features.
  
  Spirit was formally accepted into __boost__ in October 2002. Boost is a
  peer-reviewed, open collaborative development effort around a collection
  of free Open Source C++ libraries covering a wide range of domains. The
  Boost Libraries have become widely known as an industry standard for
  design and implementation quality, robustness, and reusability.
  
  [heading /2007/]
  
  Over the years, especially after Spirit was accepted into Boost, Spirit
  has served its purpose quite admirably. [*/Classic-Spirit/] (versions
  prior to 2.0) focused on transduction parsing, where the input string is
  merely translated to an output string. Many parsers fall into the
  transduction type. When the time came to add attributes to the parser
  library, it was done in a rather ad-hoc manner, with the goal being 100%
  backward compatible with Classic Spirit. As a result, some parsers have
  attributes, some don't. 
  
  Spirit V2 is another major rewrite. Spirit V2 grammars are fully
  attributed (see __attr_grammar__) which means that all parser components
  have attributes. To do this efficiently and elegantly, we had to use a
  couple of infrastructure libraries. Some did not exist, some were quite
  new when Spirit debuted, and some needed work. __mpl__ is an important
  infrastructure library, yet is not sufficient to implement Spirit V2.
  Another library had to be written: __fusion__. Fusion sits between MPL
  and STL --between compile time and runtime -- mapping types to values.
  Fusion is a direct descendant of both MPL and __boost_tuples__. Fusion
  is now a full-fledged __boost__ library. __phoenix__ also had to be
  beefed up to support Spirit V2. The result is __phoenix__. Last
  but not least, Spirit V2 uses an __exprtemplates__ library called
  __boost_proto__.
  
  Even though it has evolved and matured to become a multi-module library,
  Spirit is still used for micro-parsing tasks as well as scripting
  languages. Like C++, you only pay for features that you need. The power
  of Spirit comes from its modularity and extensibility. Instead of giving
  you a sledgehammer, it gives you the right ingredients to easily create
  a sledgehammer.
  
  [heading New Ideas: Spirit V2]
  
  Just before the development of Spirit V2 began, Hartmut came across the
  __string_template__ library that is a part of the ANTLR parser
  framework. [footnote Quote from http://www.stringtemplate.org/: It is a
  Java template engine (with ports for C# and Python) for generating
  source code, web pages, emails, or any other formatted text output.]
  The concepts presented in that library lead Hartmut to
  the next step in the evolution of Spirit. Parsing and generation are
  tightly connected to a formal notation, or a grammar. The grammar
  describes both input and output, and therefore, a parser library should
  have a grammar driven output. This duality is expressed in Spirit by the
  parser library __qi__ and the generator library __karma__ using the same
  component infrastructure. 
  
  The idea of creating a lexer library well integrated with the Spirit
  parsers is not new. This has been discussed almost since Classic-Spirit
  (pre V2) initially debuted. Several attempts to integrate existing lexer
  libraries and frameworks with Spirit have been made and served as a
  proof of concept and usability (for example see __wave__: The Boost
  C/C++ Preprocessor Library, and __slex__: a fully dynamic C++ lexer
  implemented with Spirit). Based on these experiences we added __lex__: a
  fully integrated lexer library to the mix, allowing the user to take
  advantage of the power of regular expressions for token matching,
  removing pressure from the parser components, simplifying parser
  grammars. Again, Spirit's modular structure allowed us to reuse the same
  underlying component library as for the parser and generator libraries.
  
  [heading How to use this manual]
  
  Each major section (there are 3: __sec_qi__, __sec_karma__, and
  __sec_lex__) is roughly divided into 3 parts:
  
  # Tutorials: A step by step guide with heavily annotated code. These
    are meant to get the user acquainted with the library as quickly as
    possible. The objective is to build the confidence of the user in
    using the library through abundant examples and detailed
    instructions. Examples speak volumes and we have volumes of
    examples!
  
  # Abstracts: A high level summary of key topics. The objective is to
    give the user a high level view of the library, the key concepts,
    background and theories.
  
  # Reference: Detailed formal technical reference. We start with a quick
    reference -- an easy to use table that maps into the reference proper.
    The reference proper starts with C++ concepts followed by
    models of the concepts.
  
  Some icons are used to mark certain topics indicative of their relevance.
  These icons precede some text to indicate:
  
  [table Icons
  
      [[Icon]             [Name]          [Meaning]]
  
      [[__note__]         [Note]          [Generally useful information (an aside that
                                          doesn't fit in the flow of the text)]]
  
      [[__tip__]          [Tip]           [Suggestion on how to do something
                                          (especially something that is not obvious)]]
  
      [[__important__]    [Important]     [Important note on something to take
                                          particular notice of]]
  
      [[__caution__]      [Caution]       [Take special care with this - it may
                                          not be what you expect and may cause bad
                                          results]]
  
      [[__danger__]       [Danger]        [This is likely to cause serious
                                          trouble if ignored]]
  ]
  
  This documentation is automatically generated by Boost QuickBook
  documentation tool. QuickBook can be found in the __boost_tools__.
  
  [heading Support]
  
  Please direct all questions to Spirit's mailing list. You can subscribe
  to the __spirit_list__. The mailing list has a searchable archive. A
  search link to this archive is provided in __spirit__'s home page. You
  may also read and post messages to the mailing list through
  __spirit_general__ (thanks to __gmane__). The news group mirrors the
  mailing list. Here is a link to the archives: __mlist_archive__.
  
  [endsect] [/ Preface]