[29] | 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> |
---|