1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Lexer Semantic Actions</title> 5<link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css"> 6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 7<link rel="home" href="../../../index.html" title="Spirit 2.5.8"> 8<link rel="up" href="../abstracts.html" title="Abstracts"> 9<link rel="prev" href="lexer_tokenizing.html" title="Tokenizing Input Data"> 10<link rel="next" href="lexer_static_model.html" title="The Static Lexer Model"> 11</head> 12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 13<table cellpadding="2" width="100%"><tr> 14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td> 15<td align="center"><a href="../../../../../../../index.html">Home</a></td> 16<td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td> 17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 19<td align="center"><a href="../../../../../../../more/index.htm">More</a></td> 20</tr></table> 21<hr> 22<div class="spirit-nav"> 23<a accesskey="p" href="lexer_tokenizing.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../abstracts.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lexer_static_model.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h4 class="title"> 27<a name="spirit.lex.abstracts.lexer_semantic_actions"></a><a class="link" href="lexer_semantic_actions.html" title="Lexer Semantic Actions">Lexer 28 Semantic Actions</a> 29</h4></div></div></div> 30<p> 31 The main task of a lexer normally is to recognize tokens in the input. 32 Traditionally this has been complemented with the possibility to execute 33 arbitrary code whenever a certain token has been detected. <span class="emphasis"><em>Spirit.Lex</em></span> 34 has been designed to support this mode of operation as well. We borrow 35 from the concept of semantic actions for parsers (<span class="emphasis"><em>Spirit.Qi</em></span>) 36 and generators (<span class="emphasis"><em>Spirit.Karma</em></span>). Lexer semantic actions 37 may be attached to any token definition. These are C++ functions or function 38 objects that are called whenever a token definition successfully recognizes 39 a portion of the input. Say you have a token definition <code class="computeroutput"><span class="identifier">D</span></code>, 40 and a C++ function <code class="computeroutput"><span class="identifier">f</span></code>, you 41 can make the lexer call <code class="computeroutput"><span class="identifier">f</span></code> 42 whenever it matches an input by attaching <code class="computeroutput"><span class="identifier">f</span></code>: 43 </p> 44<pre class="programlisting"><span class="identifier">D</span><span class="special">[</span><span class="identifier">f</span><span class="special">]</span> 45</pre> 46<p> 47 The expression above links <code class="computeroutput"><span class="identifier">f</span></code> 48 to the token definition, <code class="computeroutput"><span class="identifier">D</span></code>. 49 The required prototype of <code class="computeroutput"><span class="identifier">f</span></code> 50 is: 51 </p> 52<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">start</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">pass_flag</span><span class="special">&</span> <span class="identifier">matched</span><span class="special">,</span> <span class="identifier">Idtype</span><span class="special">&</span> <span class="identifier">id</span><span class="special">,</span> <span class="identifier">Context</span><span class="special">&</span> <span class="identifier">ctx</span><span class="special">);</span> 53</pre> 54<div class="variablelist"> 55<p class="title"><b>where:</b></p> 56<dl class="variablelist"> 57<dt><span class="term"><code class="computeroutput"><span class="identifier">Iterator</span><span class="special">&</span> 58 <span class="identifier">start</span></code></span></dt> 59<dd><p> 60 This is the iterator pointing to the begin of the matched range in 61 the underlying input sequence. The type of the iterator is the same 62 as specified while defining the type of the <code class="computeroutput"><span class="identifier">lexertl</span><span class="special">::</span><span class="identifier">actor_lexer</span><span class="special"><...></span></code> (its first template parameter). 63 The semantic action is allowed to change the value of this iterator 64 influencing, the matched input sequence. 65 </p></dd> 66<dt><span class="term"><code class="computeroutput"><span class="identifier">Iterator</span><span class="special">&</span> 67 <span class="identifier">end</span></code></span></dt> 68<dd><p> 69 This is the iterator pointing to the end of the matched range in 70 the underlying input sequence. The type of the iterator is the same 71 as specified while defining the type of the <code class="computeroutput"><span class="identifier">lexertl</span><span class="special">::</span><span class="identifier">actor_lexer</span><span class="special"><...></span></code> (its first template parameter). 72 The semantic action is allowed to change the value of this iterator 73 influencing, the matched input sequence. 74 </p></dd> 75<dt><span class="term"><code class="computeroutput"><span class="identifier">pass_flag</span><span class="special">&</span> 76 <span class="identifier">matched</span></code></span></dt> 77<dd><p> 78 This value is pre/initialized to <code class="computeroutput"><span class="identifier">pass_normal</span></code>. 79 If the semantic action sets it to <code class="computeroutput"><span class="identifier">pass_fail</span></code> 80 this behaves as if the token has not been matched in the first place. 81 If the semantic action sets this to <code class="computeroutput"><span class="identifier">pass_ignore</span></code> 82 the lexer ignores the current token and tries to match a next token 83 from the input. 84 </p></dd> 85<dt><span class="term"><code class="computeroutput"><span class="identifier">Idtype</span><span class="special">&</span> 86 <span class="identifier">id</span></code></span></dt> 87<dd><p> 88 This is the token id of the type Idtype (most of the time this will 89 be a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span></code>) for the matched token. 90 The semantic action is allowed to change the value of this token 91 id, influencing the if of the created token. 92 </p></dd> 93<dt><span class="term"><code class="computeroutput"><span class="identifier">Context</span><span class="special">&</span> 94 <span class="identifier">ctx</span></code></span></dt> 95<dd><p> 96 This is a reference to a lexer specific, unspecified type, providing 97 the context for the current lexer state. It can be used to access 98 different internal data items and is needed for lexer state control 99 from inside a semantic action. 100 </p></dd> 101</dl> 102</div> 103<p> 104 When using a C++ function as the semantic action the following prototypes 105 are allowed as well: 106 </p> 107<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">f</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">start</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">pass_flag</span><span class="special">&</span> <span class="identifier">matched</span><span class="special">,</span> <span class="identifier">Idtype</span><span class="special">&</span> <span class="identifier">id</span><span class="special">);</span> 108<span class="keyword">void</span> <span class="identifier">f</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">start</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">end</span><span class="special">,</span> <span class="identifier">pass_flag</span><span class="special">&</span> <span class="identifier">matched</span><span class="special">);</span> 109<span class="keyword">void</span> <span class="identifier">f</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">start</span><span class="special">,</span> <span class="identifier">Iterator</span><span class="special">&</span> <span class="identifier">end</span><span class="special">);</span> 110<span class="keyword">void</span> <span class="identifier">f</span> <span class="special">();</span> 111</pre> 112<div class="important"><table border="0" summary="Important"> 113<tr> 114<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../images/important.png"></td> 115<th align="left">Important</th> 116</tr> 117<tr><td align="left" valign="top"><p> 118 In order to use lexer semantic actions you need to use type <code class="computeroutput"><span class="identifier">lexertl</span><span class="special">::</span><span class="identifier">actor_lexer</span><span class="special"><></span></code> 119 as your lexer class (instead of the type <code class="computeroutput"><span class="identifier">lexertl</span><span class="special">::</span><span class="identifier">lexer</span><span class="special"><></span></code> as described in earlier examples). 120 </p></td></tr> 121</table></div> 122<h6> 123<a name="spirit.lex.abstracts.lexer_semantic_actions.h0"></a> 124 <span class="phrase"><a name="spirit.lex.abstracts.lexer_semantic_actions.the_context_of_a_lexer_semantic_action"></a></span><a class="link" href="lexer_semantic_actions.html#spirit.lex.abstracts.lexer_semantic_actions.the_context_of_a_lexer_semantic_action">The 125 context of a lexer semantic action</a> 126 </h6> 127<p> 128 The last parameter passed to any lexer semantic action is a reference to 129 an unspecified type (see the <code class="computeroutput"><span class="identifier">Context</span></code> 130 type in the table above). This type is unspecified because it depends on 131 the token type returned by the lexer. It is implemented in the internals 132 of the iterator type exposed by the lexer. Nevertheless, any context type 133 is expected to expose a couple of functions allowing to influence the behavior 134 of the lexer. The following table gives an overview and a short description 135 of the available functionality. 136 </p> 137<div class="table"> 138<a name="spirit.lex.abstracts.lexer_semantic_actions.functions_exposed_by_any_context_passed_to_a_lexer_semantic_action"></a><p class="title"><b>Table 8. Functions exposed by any context passed to a lexer semantic action</b></p> 139<div class="table-contents"><table class="table" summary="Functions exposed by any context passed to a lexer semantic action"> 140<colgroup> 141<col> 142<col> 143</colgroup> 144<thead><tr> 145<th> 146 <p> 147 Name 148 </p> 149 </th> 150<th> 151 <p> 152 Description 153 </p> 154 </th> 155</tr></thead> 156<tbody> 157<tr> 158<td> 159 <p> 160 <code class="computeroutput"><span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">get_eoi</span><span class="special">()</span> <span class="keyword">const</span></code> 161 </p> 162 </td> 163<td> 164 <p> 165 The function <code class="computeroutput"><span class="identifier">get_eoi</span><span class="special">()</span></code> may be used by to access the 166 end iterator of the input stream the lexer has been initialized 167 with 168 </p> 169 </td> 170</tr> 171<tr> 172<td> 173 <p> 174 <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">more</span><span class="special">()</span></code> 175 </p> 176 </td> 177<td> 178 <p> 179 The function <code class="computeroutput"><span class="identifier">more</span><span class="special">()</span></code> tells the lexer that the next 180 time it matches a rule, the corresponding token should be appended 181 onto the current token value rather than replacing it. 182 </p> 183 </td> 184</tr> 185<tr> 186<td> 187 <p> 188 <code class="computeroutput"><span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">less</span><span class="special">(</span><span class="identifier">Iterator</span> 189 <span class="keyword">const</span><span class="special">&</span> 190 <span class="identifier">it</span><span class="special">,</span> 191 <span class="keyword">int</span> <span class="identifier">n</span><span class="special">)</span></code> 192 </p> 193 </td> 194<td> 195 <p> 196 The function <code class="computeroutput"><span class="identifier">less</span><span class="special">()</span></code> returns an iterator positioned 197 to the nth input character beyond the current token start iterator 198 (i.e. by passing the return value to the parameter <code class="computeroutput"><span class="identifier">end</span></code> it is possible to return 199 all but the first n characters of the current token back to the 200 input stream. 201 </p> 202 </td> 203</tr> 204<tr> 205<td> 206 <p> 207 <code class="computeroutput"><span class="keyword">bool</span> <span class="identifier">lookahead</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> 208 <span class="identifier">id</span><span class="special">)</span></code> 209 </p> 210 </td> 211<td> 212 <p> 213 The function <code class="computeroutput"><span class="identifier">lookahead</span><span class="special">()</span></code> can be used to implement lookahead 214 for lexer engines not supporting constructs like flex' <code class="computeroutput"><span class="identifier">a</span><span class="special">/</span><span class="identifier">b</span></code> (match <code class="computeroutput"><span class="identifier">a</span></code>, 215 but only when followed by <code class="computeroutput"><span class="identifier">b</span></code>). 216 It invokes the lexer on the input following the current token 217 without actually moving forward in the input stream. The function 218 returns whether the lexer was able to match a token with the 219 given token-id <code class="computeroutput"><span class="identifier">id</span></code>. 220 </p> 221 </td> 222</tr> 223<tr> 224<td> 225 <p> 226 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">get_state</span><span class="special">()</span> <span class="keyword">const</span></code> 227 and <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">set_state</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> 228 <span class="identifier">state</span><span class="special">)</span></code> 229 </p> 230 </td> 231<td> 232 <p> 233 The functions <code class="computeroutput"><span class="identifier">get_state</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">set_state</span><span class="special">()</span></code> may be used to introspect and 234 change the current lexer state. 235 </p> 236 </td> 237</tr> 238<tr> 239<td> 240 <p> 241 <code class="computeroutput"><span class="identifier">token_value_type</span> <span class="identifier">get_value</span><span class="special">()</span> 242 <span class="keyword">const</span></code> and <code class="computeroutput"><span class="keyword">void</span> <span class="identifier">set_value</span><span class="special">(</span><span class="identifier">Value</span> 243 <span class="keyword">const</span><span class="special">&)</span></code> 244 </p> 245 </td> 246<td> 247 <p> 248 The functions <code class="computeroutput"><span class="identifier">get_value</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">set_value</span><span class="special">()</span></code> may be used to introspect and 249 change the current token value. 250 </p> 251 </td> 252</tr> 253</tbody> 254</table></div> 255</div> 256<br class="table-break"><h6> 257<a name="spirit.lex.abstracts.lexer_semantic_actions.h1"></a> 258 <span class="phrase"><a name="spirit.lex.abstracts.lexer_semantic_actions.lexer_semantic_actions_using_phoenix"></a></span><a class="link" href="lexer_semantic_actions.html#spirit.lex.abstracts.lexer_semantic_actions.lexer_semantic_actions_using_phoenix">Lexer 259 Semantic Actions Using Phoenix</a> 260 </h6> 261<p> 262 Even if it is possible to write your own function object implementations 263 (i.e. using Boost.Lambda or Boost.Bind), the preferred way of defining 264 lexer semantic actions is to use <a href="../../../../../../../libs/phoenix/doc/html/index.html" target="_top">Boost.Phoenix</a>. 265 In this case you can access the parameters described above by using the 266 predefined <a href="http://boost-spirit.com" target="_top">Spirit</a> placeholders: 267 </p> 268<div class="table"> 269<a name="spirit.lex.abstracts.lexer_semantic_actions.predefined_phoenix_placeholders_for_lexer_semantic_actions"></a><p class="title"><b>Table 9. Predefined Phoenix placeholders for lexer semantic actions</b></p> 270<div class="table-contents"><table class="table" summary="Predefined Phoenix placeholders for lexer semantic actions"> 271<colgroup> 272<col> 273<col> 274</colgroup> 275<thead><tr> 276<th> 277 <p> 278 Placeholder 279 </p> 280 </th> 281<th> 282 <p> 283 Description 284 </p> 285 </th> 286</tr></thead> 287<tbody> 288<tr> 289<td> 290 <p> 291 <code class="computeroutput"><span class="identifier">_start</span></code> 292 </p> 293 </td> 294<td> 295 <p> 296 Refers to the iterator pointing to the beginning of the matched 297 input sequence. Any modifications to this iterator value will 298 be reflected in the generated token. 299 </p> 300 </td> 301</tr> 302<tr> 303<td> 304 <p> 305 <code class="computeroutput"><span class="identifier">_end</span></code> 306 </p> 307 </td> 308<td> 309 <p> 310 Refers to the iterator pointing past the end of the matched input 311 sequence. Any modifications to this iterator value will be reflected 312 in the generated token. 313 </p> 314 </td> 315</tr> 316<tr> 317<td> 318 <p> 319 <code class="computeroutput"><span class="identifier">_pass</span></code> 320 </p> 321 </td> 322<td> 323 <p> 324 References the value signaling the outcome of the semantic action. 325 This is pre-initialized to <code class="computeroutput"><span class="identifier">lex</span><span class="special">::</span><span class="identifier">pass_flags</span><span class="special">::</span><span class="identifier">pass_normal</span></code>. 326 If this is set to <code class="computeroutput"><span class="identifier">lex</span><span class="special">::</span><span class="identifier">pass_flags</span><span class="special">::</span><span class="identifier">pass_fail</span></code>, 327 the lexer will behave as if no token has been matched, if is 328 set to <code class="computeroutput"><span class="identifier">lex</span><span class="special">::</span><span class="identifier">pass_flags</span><span class="special">::</span><span class="identifier">pass_ignore</span></code>, the lexer will 329 ignore the current match and proceed trying to match tokens from 330 the input. 331 </p> 332 </td> 333</tr> 334<tr> 335<td> 336 <p> 337 <code class="computeroutput"><span class="identifier">_tokenid</span></code> 338 </p> 339 </td> 340<td> 341 <p> 342 Refers to the token id of the token to be generated. Any modifications 343 to this value will be reflected in the generated token. 344 </p> 345 </td> 346</tr> 347<tr> 348<td> 349 <p> 350 <code class="computeroutput"><span class="identifier">_val</span></code> 351 </p> 352 </td> 353<td> 354 <p> 355 Refers to the value the next token will be initialized from. 356 Any modifications to this value will be reflected in the generated 357 token. 358 </p> 359 </td> 360</tr> 361<tr> 362<td> 363 <p> 364 <code class="computeroutput"><span class="identifier">_state</span></code> 365 </p> 366 </td> 367<td> 368 <p> 369 Refers to the lexer state the input has been match in. Any modifications 370 to this value will be reflected in the lexer itself (the next 371 match will start in the new state). The currently generated token 372 is not affected by changes to this variable. 373 </p> 374 </td> 375</tr> 376<tr> 377<td> 378 <p> 379 <code class="computeroutput"><span class="identifier">_eoi</span></code> 380 </p> 381 </td> 382<td> 383 <p> 384 References the end iterator of the overall lexer input. This 385 value cannot be changed. 386 </p> 387 </td> 388</tr> 389</tbody> 390</table></div> 391</div> 392<br class="table-break"><p> 393 The context object passed as the last parameter to any lexer semantic action 394 is not directly accessible while using <a href="../../../../../../../libs/phoenix/doc/html/index.html" target="_top">Boost.Phoenix</a> 395 expressions. We rather provide predefined Phoenix functions allowing to 396 invoke the different support functions as mentioned above. The following 397 table lists the available support functions and describes their functionality: 398 </p> 399<div class="table"> 400<a name="spirit.lex.abstracts.lexer_semantic_actions.support_functions_usable_from_phoenix_expressions_inside_lexer_semantic_actions"></a><p class="title"><b>Table 10. Support functions usable from Phoenix expressions inside lexer semantic 401 actions</b></p> 402<div class="table-contents"><table class="table" summary="Support functions usable from Phoenix expressions inside lexer semantic 403 actions"> 404<colgroup> 405<col> 406<col> 407<col> 408</colgroup> 409<thead><tr> 410<th> 411 <p> 412 Plain function 413 </p> 414 </th> 415<th> 416 <p> 417 Phoenix function 418 </p> 419 </th> 420<th> 421 <p> 422 Description 423 </p> 424 </th> 425</tr></thead> 426<tbody> 427<tr> 428<td> 429 <p> 430 <code class="computeroutput"><span class="identifier">ctx</span><span class="special">.</span><span class="identifier">more</span><span class="special">()</span></code> 431 </p> 432 </td> 433<td> 434 <p> 435 <code class="computeroutput"><span class="identifier">more</span><span class="special">()</span></code> 436 </p> 437 </td> 438<td> 439 <p> 440 The function <code class="computeroutput"><span class="identifier">more</span><span class="special">()</span></code> tells the lexer that the next 441 time it matches a rule, the corresponding token should be appended 442 onto the current token value rather than replacing it. 443 </p> 444 </td> 445</tr> 446<tr> 447<td> 448 <p> 449 <code class="computeroutput"><span class="identifier">ctx</span><span class="special">.</span><span class="identifier">less</span><span class="special">()</span></code> 450 </p> 451 </td> 452<td> 453 <p> 454 <code class="computeroutput"><span class="identifier">less</span><span class="special">(</span><span class="identifier">n</span><span class="special">)</span></code> 455 </p> 456 </td> 457<td> 458 <p> 459 The function <code class="computeroutput"><span class="identifier">less</span><span class="special">()</span></code> takes a single integer parameter 460 <code class="computeroutput"><span class="identifier">n</span></code> and returns 461 an iterator positioned to the nth input character beyond the 462 current token start iterator (i.e. by assigning the return value 463 to the placeholder <code class="computeroutput"><span class="identifier">_end</span></code> 464 it is possible to return all but the first <code class="computeroutput"><span class="identifier">n</span></code> 465 characters of the current token back to the input stream. 466 </p> 467 </td> 468</tr> 469<tr> 470<td> 471 <p> 472 <code class="computeroutput"><span class="identifier">ctx</span><span class="special">.</span><span class="identifier">lookahead</span><span class="special">()</span></code> 473 </p> 474 </td> 475<td> 476 <p> 477 <code class="computeroutput"><span class="identifier">lookahead</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">)</span></code> 478 or <code class="computeroutput"><span class="identifier">lookahead</span><span class="special">(</span><span class="identifier">token_def</span><span class="special">)</span></code> 479 </p> 480 </td> 481<td> 482 <p> 483 The function <code class="computeroutput"><span class="identifier">lookahead</span><span class="special">()</span></code> takes a single parameter specifying 484 the token to match in the input. The function can be used for 485 instance to implement lookahead for lexer engines not supporting 486 constructs like flex' <code class="computeroutput"><span class="identifier">a</span><span class="special">/</span><span class="identifier">b</span></code> 487 (match <code class="computeroutput"><span class="identifier">a</span></code>, but 488 only when followed by <code class="computeroutput"><span class="identifier">b</span></code>). 489 It invokes the lexer on the input following the current token 490 without actually moving forward in the input stream. The function 491 returns whether the lexer was able to match the specified token. 492 </p> 493 </td> 494</tr> 495</tbody> 496</table></div> 497</div> 498<br class="table-break"> 499</div> 500<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 501<td align="left"></td> 502<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p> 503 Distributed under the Boost Software License, Version 1.0. (See accompanying 504 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 505 </p> 506</div></td> 507</tr></table> 508<hr> 509<div class="spirit-nav"> 510<a accesskey="p" href="lexer_tokenizing.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../abstracts.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="lexer_static_model.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a> 511</div> 512</body> 513</html> 514