1 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
---|
2 | <html> |
---|
3 | <head> |
---|
4 | <meta content= |
---|
5 | "HTML Tidy for Windows (vers 1st February 2003), see www.w3.org" |
---|
6 | name="generator"> |
---|
7 | <title> |
---|
8 | Preface |
---|
9 | </title> |
---|
10 | <meta http-equiv="Content-Type" content="text/html; charset=us-ascii"> |
---|
11 | <link rel="stylesheet" href="theme/style.css" type="text/css"> |
---|
12 | </head> |
---|
13 | <body> |
---|
14 | <table width="100%" border="0" background="theme/bkd2.gif" cellspacing="2"> |
---|
15 | <tr> |
---|
16 | <td width="10"></td> |
---|
17 | <td width="85%"> |
---|
18 | <font size="6" face= |
---|
19 | "Verdana, Arial, Helvetica, sans-serif"><b>Preface</b></font> |
---|
20 | </td> |
---|
21 | <td width="112"> |
---|
22 | <a href="http://spirit.sf.net"><img src="theme/spirit.gif" |
---|
23 | width="112" height="48" align="right" border="0"></a> |
---|
24 | </td> |
---|
25 | </tr> |
---|
26 | </table><br> |
---|
27 | |
---|
28 | <table border="0"> |
---|
29 | <tr> |
---|
30 | <td width="10"></td> |
---|
31 | <td width="30"> |
---|
32 | <a href="../index.html"><img src="theme/u_arr.gif" border="0"></a> |
---|
33 | </td> |
---|
34 | <td width="30"> |
---|
35 | <img src="theme/l_arr_disabled.gif" width="20" height="19"> |
---|
36 | </td> |
---|
37 | <td width="30"> |
---|
38 | <a href="introduction.html"><img src="theme/r_arr.gif" border="0"> |
---|
39 | </a> |
---|
40 | </td> |
---|
41 | </tr> |
---|
42 | </table><br> |
---|
43 | |
---|
44 | <table width="80%" border="0" align="center"> |
---|
45 | <tr> |
---|
46 | <td> |
---|
47 | <p> |
---|
48 | <i>"Examples of designs that meet most of the criteria for |
---|
49 | "goodness" (easy to understand, flexible, efficient) are a |
---|
50 | recursive-descent parser, which is traditional procedural code. |
---|
51 | Another example is the STL, which is a generic library of |
---|
52 | containers and algorithms depending crucially on both traditional |
---|
53 | procedural code and on parametric polymorphism."</i> |
---|
54 | </p> |
---|
55 | <p> |
---|
56 | <b><font color="#003366">Bjarne Stroustrup</font></b> |
---|
57 | </p> |
---|
58 | </td> |
---|
59 | </tr> |
---|
60 | </table> |
---|
61 | <p> |
---|
62 | <b>History</b> |
---|
63 | </p> |
---|
64 | <p> |
---|
65 | A decade and a half ago, I wrote my first calculator in Pascal. It is one |
---|
66 | of my most unforgettable coding experiences. I was amazed how a mutually |
---|
67 | recursive set of functions can model a grammar specification. In time, |
---|
68 | the skills I acquired from that academic experience became very |
---|
69 | practical. Periodically I was tasked to do some parsing. For instance, |
---|
70 | whenever I need to perform any form of I/O, even in binary, I try to |
---|
71 | approach the task somewhat formally by writing a grammar using |
---|
72 | Pascal-like syntax diagrams and then write a corresponding |
---|
73 | recursive-descent parser. This worked very well. |
---|
74 | </p> |
---|
75 | <p> |
---|
76 | The arrival of the Internet and the World Wide Web magnified this |
---|
77 | thousand-fold. At one point I had to write an HTML parser for a Web |
---|
78 | browser project. I got a recursive-descent HTML parser working based on |
---|
79 | the W3C formal specifications easily. I was certainly glad that HTML had |
---|
80 | a formal grammar specification. Because of the influence of the Internet, |
---|
81 | I then had to do more parsing. RFC specifications were everywhere. SGML, |
---|
82 | HTML, XML, even email addresses and those seemingly trivial URLs were all |
---|
83 | formally specified using small EBNF-style grammar specifications. This |
---|
84 | made me wish for a tool similar to big-time parser generators such as |
---|
85 | YACC and <a href="http://www.antlr.org/">ANTLR</a>, where a parser is |
---|
86 | built automatically from a grammar specification. Yet, I want it to be |
---|
87 | extremely small; small enough to fit in my pocket, yet scalable. |
---|
88 | </p> |
---|
89 | <p> |
---|
90 | It must be able to practically parse simple grammars such as email |
---|
91 | addresses to moderately complex grammars such as XML and perhaps some |
---|
92 | small to medium-sized scripting languages. Scalability is a prime goal. |
---|
93 | You should be able to use it for small tasks such as parsing command |
---|
94 | lines without incurring a heavy payload, as you do when you are using |
---|
95 | YACC or PCCTS. Even now that it has evolved and matured to become a |
---|
96 | multi-module library, true to its original intent, Spirit can still be |
---|
97 | used for extreme micro-parsing tasks. You only pay for features that you |
---|
98 | need. The power of Spirit comes from its modularity and extensibility. |
---|
99 | Instead of giving you a sledgehammer, it gives you the right ingredients |
---|
100 | to create a sledgehammer easily. For instance, it does not really have a |
---|
101 | lexer, but you have all the raw ingredients to write one, if you need |
---|
102 | one. |
---|
103 | </p> |
---|
104 | <p> |
---|
105 | The result was Spirit. Spirit was a personal project that was conceived |
---|
106 | when I was doing R&D in Japan. Inspired by the GoF's composite and |
---|
107 | interpreter patterns, I realized that I can model a recursive-descent |
---|
108 | parser with hierarchical-object composition of primitives (terminals) and |
---|
109 | composites (productions). The original version was implemented with |
---|
110 | run-time polymorphic classes. A parser is generated at run time by |
---|
111 | feeding in production rule strings such as <tt>"prod ::= {‘A’ |
---|
112 | | ‘B’} ‘C’;"</tt>A compile function compiled the |
---|
113 | parser, dynamically creating a hierarchy of objects and linking semantic |
---|
114 | actions on the fly. A very early text can be found <a href= |
---|
115 | "http://spirit.sourceforge.net/dl_docs/pre-spirit.htm">here</a>. |
---|
116 | </p> |
---|
117 | <p> |
---|
118 | The version that we have now is a complete rewrite of the original Spirit |
---|
119 | parser using expression templates and static polymorphism, inspired by |
---|
120 | the works of Todd Veldhuizen (" <a href= |
---|
121 | "http://www.extreme.indiana.edu/%7Etveldhui/papers/Expression-Templates/exprtmpl.html"> |
---|
122 | Expression Templates</a>", C++ Report, June 1995). Initially, the |
---|
123 | <i><b>static-Spirit</b></i> version was meant only to replace the core of |
---|
124 | the original <i><b>dynamic-Spirit</b></i>. Dynamic-spirit needed a parser |
---|
125 | to implement itself anyway. The original employed a hand-coded |
---|
126 | recursive-descent parser to parse the input grammar specification |
---|
127 | strings. |
---|
128 | </p> |
---|
129 | <p> |
---|
130 | After its initial "open-source" debut in May 2001, static-Spirit became a |
---|
131 | success. At around November 2001, the Spirit website had an activity |
---|
132 | percentile of 98%, making it the number one parser tool at Source Forge |
---|
133 | at the time. Not bad for such a niche project such as a parser library. |
---|
134 | The "static" portion of Spirit was forgotten and static-Spirit simply |
---|
135 | became Spirit. The framework soon evolved to acquire more dynamic |
---|
136 | features. |
---|
137 | </p> |
---|
138 | <p> |
---|
139 | <b>How to use this manual</b> |
---|
140 | </p> |
---|
141 | <p> |
---|
142 | The Spirit framework is organized in logical modules starting from the |
---|
143 | core. This documentation provides a user's guide and reference for each |
---|
144 | module in the framework. A simple and clear code example is worth a |
---|
145 | hundred lines of documentation; therefore, the user's guide is presented |
---|
146 | with abundant examples annotated and explained in step-wise manner. The |
---|
147 | user's guide is based on examples -lots of them. |
---|
148 | </p> |
---|
149 | <p> |
---|
150 | As much as possible, forward information (i.e. citing a specific piece of |
---|
151 | information that has not yet been discussed) is avoided in the user's |
---|
152 | manual portion of each module. In many cases, though, it is unavoidable |
---|
153 | that advanced but related topics are interspersed with the normal flow of |
---|
154 | discussion. To alleviate this problem, topics categorized as "advanced" |
---|
155 | may be skipped at first reading. |
---|
156 | </p> |
---|
157 | <p> |
---|
158 | Some icons are used to mark certain topics indicative of their relevance. |
---|
159 | These icons precede some text to indicate: |
---|
160 | </p> |
---|
161 | <table width="90%" border="0" align="center"> |
---|
162 | <tr> |
---|
163 | <td> |
---|
164 | <table width="100%" border="0"> |
---|
165 | <tr> |
---|
166 | <td colspan="3" class="table_title"> |
---|
167 | Icons |
---|
168 | </td> |
---|
169 | </tr> |
---|
170 | <tr> |
---|
171 | <td width="19" class="table_cells"> |
---|
172 | <img src="theme/note.gif" width="16" height="16"> |
---|
173 | </td> |
---|
174 | <td width="58" class="table_cells"> |
---|
175 | <b>Note</b> |
---|
176 | </td> |
---|
177 | <td width="627" class="table_cells"> |
---|
178 | Information provided is moderately important and should be |
---|
179 | noted by the reader. |
---|
180 | </td> |
---|
181 | </tr> |
---|
182 | <tr> |
---|
183 | <td width="19" class="table_cells"> |
---|
184 | <img src="theme/alert.gif"> |
---|
185 | </td> |
---|
186 | <td width="58" class="table_cells"> |
---|
187 | <b>Alert</b> |
---|
188 | </td> |
---|
189 | <td width="627" class="table_cells"> |
---|
190 | Information provided is of utmost importance. |
---|
191 | </td> |
---|
192 | </tr> |
---|
193 | <tr> |
---|
194 | <td width="19" class="table_cells"> |
---|
195 | <img src="theme/lens.gif" width="15" height="16"> |
---|
196 | </td> |
---|
197 | <td width="58" class="table_cells"> |
---|
198 | <b>Detail</b> |
---|
199 | </td> |
---|
200 | <td width="627" class="table_cells"> |
---|
201 | Information provided is auxiliary but will give the reader a |
---|
202 | deeper insight into a specific topic. May be skipped. |
---|
203 | </td> |
---|
204 | </tr> |
---|
205 | <tr> |
---|
206 | <td width="19" class="table_cells"> |
---|
207 | <img src="theme/bulb.gif" width="13" height="18"> |
---|
208 | </td> |
---|
209 | <td width="58" class="table_cells"> |
---|
210 | <b>Tip</b> |
---|
211 | </td> |
---|
212 | <td width="627" class="table_cells"> |
---|
213 | A potentially useful and helpful piece of information. |
---|
214 | </td> |
---|
215 | </tr> |
---|
216 | </table> |
---|
217 | </td> |
---|
218 | </tr> |
---|
219 | </table> |
---|
220 | <p> |
---|
221 | <b>Support</b> |
---|
222 | </p> |
---|
223 | <p> |
---|
224 | Please direct all questions to Spirit's mailing list. You can subscribe |
---|
225 | to the mailing list <a href= |
---|
226 | "https://lists.sourceforge.net/lists/listinfo/spirit-general">here</a>. |
---|
227 | The mailing list has a searchable archive. A search link to this archive |
---|
228 | is provided in <a href="http://spirit.sf.net">Spirit's home page</a>. You |
---|
229 | may also read and post messages to the mailing list through an |
---|
230 | <a href="http://news.gmane.org/thread.php?group=gmane.comp.parsers.spirit.general"> |
---|
231 | NNTP news portal</a> (thanks to <a href= |
---|
232 | "http://www.gmane.org">www.gmane.org</a>). The news group mirrors the |
---|
233 | mailing list. Here are two links to the archives: via <a href= |
---|
234 | "http://dir.gmane.org/gmane.comp.parsers.spirit.general"> |
---|
235 | gmane</a>, via <a href= |
---|
236 | "http://sourceforge.net/mailarchive/forum.php?forum_id=1595gmane.org">geocrawler</a>. |
---|
237 | </p> |
---|
238 | <table width="100%" border="0" align="center"> |
---|
239 | <tr> |
---|
240 | <td> |
---|
241 | <div align="center"> |
---|
242 | <i><b><font size="5">To my dear daughter Phoenix</font></b></i> |
---|
243 | </div> |
---|
244 | </td> |
---|
245 | </tr> |
---|
246 | </table> |
---|
247 | <table width="100%" border="0"> |
---|
248 | <tr> |
---|
249 | <td width="72%"> |
---|
250 | |
---|
251 | </td> |
---|
252 | <td width="28%"> |
---|
253 | <div align="right"> |
---|
254 | <p> |
---|
255 | <b>Joel de Guzman<br></b> September 2002 |
---|
256 | </p> |
---|
257 | </div> |
---|
258 | </td> |
---|
259 | </tr> |
---|
260 | </table> |
---|
261 | <table border="0"> |
---|
262 | <tr> |
---|
263 | <td width="10"></td> |
---|
264 | <td width="30"> |
---|
265 | <a href="../index.html"><img src="theme/u_arr.gif" border="0"></a> |
---|
266 | </td> |
---|
267 | <td width="30"> |
---|
268 | <img src="theme/l_arr_disabled.gif" width="20" height="19"> |
---|
269 | </td> |
---|
270 | <td width="30"> |
---|
271 | <a href="introduction.html"><img src="theme/r_arr.gif" border="0"> |
---|
272 | </a> |
---|
273 | </td> |
---|
274 | </tr> |
---|
275 | </table><br> |
---|
276 | |
---|
277 | <hr size="1"> |
---|
278 | <p class="copyright"> |
---|
279 | Copyright © 1998-2003 Joel de Guzman<br> |
---|
280 | <br> |
---|
281 | <font size="2">Use, modification and distribution is subject to the |
---|
282 | Boost Software License, Version 1.0. (See accompanying file |
---|
283 | LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)</font> |
---|
284 | </p> |
---|
285 | <p> |
---|
286 | |
---|
287 | </p> |
---|
288 | </body> |
---|
289 | </html> |
---|