| 
0
 | 
     1 <html>
 | 
| 
 | 
     2 <head>
 | 
| 
 | 
     3 <title>MayaChemTools:Code:Parsers::YYLexer.pm</title>
 | 
| 
 | 
     4 <meta http-equiv="content-type" content="text/html;charset=utf-8">
 | 
| 
 | 
     5 <link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
 | 
| 
 | 
     6 </head>
 | 
| 
 | 
     7 <body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
 | 
| 
 | 
     8 <br/>
 | 
| 
 | 
     9 <center>
 | 
| 
 | 
    10 <a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
 | 
| 
 | 
    11 </center>
 | 
| 
 | 
    12 <br/>
 | 
| 
 | 
    13 <pre>
 | 
| 
 | 
    14 <a name="package-Parsers::YYLexer-"></a>   1 <span class="k">package </span><span class="i">Parsers::YYLexer</span><span class="sc">;</span>
 | 
| 
 | 
    15    2 <span class="c">#</span>
 | 
| 
 | 
    16    3 <span class="c"># $RCSfile: YYLexer.pm,v $</span>
 | 
| 
 | 
    17    4 <span class="c"># $Date: 2015/02/28 20:50:55 $</span>
 | 
| 
 | 
    18    5 <span class="c"># $Revision: 1.10 $</span>
 | 
| 
 | 
    19    6 <span class="c">#</span>
 | 
| 
 | 
    20    7 <span class="c"># Author: Manish Sud <msud@san.rr.com></span>
 | 
| 
 | 
    21    8 <span class="c">#</span>
 | 
| 
 | 
    22    9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
 | 
| 
 | 
    23   10 <span class="c">#</span>
 | 
| 
 | 
    24   11 <span class="c"># This file is part of MayaChemTools.</span>
 | 
| 
 | 
    25   12 <span class="c">#</span>
 | 
| 
 | 
    26   13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
 | 
| 
 | 
    27   14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
 | 
| 
 | 
    28   15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
 | 
| 
 | 
    29   16 <span class="c"># later version.</span>
 | 
| 
 | 
    30   17 <span class="c">#</span>
 | 
| 
 | 
    31   18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
 | 
| 
 | 
    32   19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
 | 
| 
 | 
    33   20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
 | 
| 
 | 
    34   21 <span class="c"># details.</span>
 | 
| 
 | 
    35   22 <span class="c">#</span>
 | 
| 
 | 
    36   23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
 | 
| 
 | 
    37   24 <span class="c"># along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or</span>
 | 
| 
 | 
    38   25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
 | 
| 
 | 
    39   26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
 | 
| 
 | 
    40   27 <span class="c">#</span>
 | 
| 
 | 
    41   28 
 | 
| 
 | 
    42   29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
 | 
| 
 | 
    43   30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span>
 | 
| 
 | 
    44   31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span>
 | 
| 
 | 
    45   32 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
    46   33 <span class="k">use</span> <span class="w">Parsers::Lexer</span><span class="sc">;</span>
 | 
| 
 | 
    47   34 
 | 
| 
 | 
    48   35 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span>
 | 
| 
 | 
    49   36 
 | 
| 
 | 
    50   37 <span class="i">@ISA</span> = <span class="q">qw(Parsers::Lexer Exporter)</span><span class="sc">;</span>
 | 
| 
 | 
    51   38 <span class="i">@EXPORT</span> = <span class="q">qw()</span><span class="sc">;</span>
 | 
| 
 | 
    52   39 <span class="i">@EXPORT_OK</span> = <span class="q">qw()</span><span class="sc">;</span>
 | 
| 
 | 
    53   40 
 | 
| 
 | 
    54   41 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span><span class="w">all</span>  <span class="cm">=></span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
    55   42 
 | 
| 
 | 
    56   43 <span class="c"># Setup class variables...</span>
 | 
| 
 | 
    57   44 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
    58   45 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
    59   46 
 | 
| 
 | 
    60   47 <span class="c"># Overload Perl functions...</span>
 | 
| 
 | 
    61   48 <span class="k">use</span> <span class="w">overload</span> <span class="q">'""'</span> <span class="cm">=></span> <span class="q">'StringifyYYLexer'</span><span class="sc">;</span>
 | 
| 
 | 
    62   49 
 | 
| 
 | 
    63   50 <span class="c"># Class constructor...</span>
 | 
| 
 | 
    64 <a name="new-"></a>  51 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span>
 | 
| 
 | 
    65   52   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">$Input</span><span class="cm">,</span>  <span class="i">@TokensSpec</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
    66   53 
 | 
| 
 | 
    67   54   <span class="c"># Initialize object...</span>
 | 
| 
 | 
    68   55   <span class="k">my</span> <span class="i">$This</span> = <span class="i">$Class</span><span class="i">->SUPER::new</span><span class="s">(</span><span class="i">$Input</span><span class="cm">,</span>  <span class="i">@TokensSpec</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
    69   56   <span class="k">bless</span> <span class="i">$This</span><span class="cm">,</span> <span class="k">ref</span><span class="s">(</span><span class="i">$Class</span><span class="s">)</span> || <span class="i">$Class</span><span class="sc">;</span>
 | 
| 
 | 
    70   57   <span class="i">$This</span><span class="i">->_InitializeYYLexer</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
    71   58 
 | 
| 
 | 
    72   59   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 | 
| 
 | 
    73   60 <span class="s">}</span>
 | 
| 
 | 
    74   61 
 | 
| 
 | 
    75   62 <span class="c"># Initialize object data...</span>
 | 
| 
 | 
    76   63 <span class="c">#</span>
 | 
| 
 | 
    77 <a name="_InitializeYYLexer-"></a>  64 <span class="k">sub </span><span class="m">_InitializeYYLexer</span> <span class="s">{</span>
 | 
| 
 | 
    78   65   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
    79   66 
 | 
| 
 | 
    80   67   <span class="c"># File generated containing mapping of token labels to token numbers by</span>
 | 
| 
 | 
    81   68   <span class="c"># running command byacc with -d option on a parser definition file.</span>
 | 
| 
 | 
    82   69   <span class="c">#</span>
 | 
| 
 | 
    83   70   <span class="c"># For example, "byacc -l -P -d -b Parser Parser.yy" would generate file</span>
 | 
| 
 | 
    84   71   <span class="c"># Parser.tab.ph, which might contain the following tokem name and values</span>
 | 
| 
 | 
    85   72   <span class="c"># for a parser for a simple calculator:</span>
 | 
| 
 | 
    86   73   <span class="c">#</span>
 | 
| 
 | 
    87   74   <span class="c">#  $NUMBER=257;</span>
 | 
| 
 | 
    88   75   <span class="c">#  $LETTER=258;</span>
 | 
| 
 | 
    89   76   <span class="c">#</span>
 | 
| 
 | 
    90   77   <span class="c">#</span>
 | 
| 
 | 
    91   78   <span class="i">$This</span>->{<span class="w">YYTabFile</span>} = <span class="k">undef</span><span class="sc">;</span>
 | 
| 
 | 
    92   79   <span class="i">$This</span>->{<span class="w">YYTabFilePath</span>} = <span class="k">undef</span><span class="sc">;</span>
 | 
| 
 | 
    93   80 
 | 
| 
 | 
    94   81   <span class="c"># Mapping of token lables to token numbers...</span>
 | 
| 
 | 
    95   82   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
    96   83 
 | 
| 
 | 
    97   84   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 | 
| 
 | 
    98   85 <span class="s">}</span>
 | 
| 
 | 
    99   86 
 | 
| 
 | 
   100   87 <span class="c"># Initialize class ...</span>
 | 
| 
 | 
   101 <a name="_InitializeClass-"></a>  88 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span>
 | 
| 
 | 
   102   89   <span class="c">#Class name...</span>
 | 
| 
 | 
   103   90 
 | 
| 
 | 
   104   91   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span>
 | 
| 
 | 
   105   92 <span class="s">}</span>
 | 
| 
 | 
   106   93 
 | 
| 
 | 
   107   94 <span class="c"># Process tokens in YYTab file and load mapping of token labels to integers</span>
 | 
| 
 | 
   108   95 <span class="c"># for return during YYLex method invocation...</span>
 | 
| 
 | 
   109   96 <span class="c">#</span>
 | 
| 
 | 
   110   97 <span class="c"># Notes:</span>
 | 
| 
 | 
   111   98 <span class="c">#   . YYTabFile must be a complete path or available through @INC path in the</span>
 | 
| 
 | 
   112   99 <span class="c">#     same directory where this package is located.</span>
 | 
| 
 | 
   113  100 <span class="c">#   . Name of YYTabFile might start with any valid sub directory name in @INC</span>
 | 
| 
 | 
   114  101 <span class="c">#     For example, "Parsers/<YYTablFile>" implies the tab file in parsers sub directory</span>
 | 
| 
 | 
   115  102 <span class="c">#     under MayaChemTools lib directory as it would be already in @INC path.</span>
 | 
| 
 | 
   116  103 <span class="c">#   . YYTabFile must be explicitly set by the caller. The default YYTabFile name,</span>
 | 
| 
 | 
   117  104 <span class="c">#     y.tab.ph, generated by byacc is not used implicitly to avoid confusion among</span>
 | 
| 
 | 
   118  105 <span class="c">#     multiple distinct instances of YYLexer.</span>
 | 
| 
 | 
   119  106 <span class="c">#   . YYTabFile is generated by byacc during its usage with -d options and contains</span>
 | 
| 
 | 
   120  107 <span class="c">#     mapping of token codes to token names/labels. YYLexer used this file to map</span>
 | 
| 
 | 
   121  108 <span class="c">#     token lables to token codes before retuning token code and value pair back</span>
 | 
| 
 | 
   122  109 <span class="c">#     to yyparse function used by byacc.</span>
 | 
| 
 | 
   123  110 <span class="c">#   . User defined token numbers start from 257</span>
 | 
| 
 | 
   124  111 <span class="c">#</span>
 | 
| 
 | 
   125  112 <span class="c">#     The format of YYTabFile generted by byacc during generation of parser code in</span>
 | 
| 
 | 
   126  113 <span class="c">#     Perl code is:</span>
 | 
| 
 | 
   127  114 <span class="c">#</span>
 | 
| 
 | 
   128  115 <span class="c">#     ... ...</span>
 | 
| 
 | 
   129  116 <span class="c">#     $NUMBER=257;</span>
 | 
| 
 | 
   130  117 <span class="c">#     $ADDOP=258;</span>
 | 
| 
 | 
   131  118 <span class="c">#     $SUBOP=259;</span>
 | 
| 
 | 
   132  119 <span class="c">#     ... ..</span>
 | 
| 
 | 
   133  120 <span class="c">#</span>
 | 
| 
 | 
   134 <a name="SetupYYTabFile-"></a> 121 <span class="k">sub </span><span class="m">SetupYYTabFile</span> <span class="s">{</span>
 | 
| 
 | 
   135  122   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$YYTabFile</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
   136  123   <span class="k">my</span><span class="s">(</span><span class="i">$YYTabFilePath</span><span class="cm">,</span> <span class="i">$Line</span><span class="cm">,</span> <span class="i">$TokenLabel</span><span class="cm">,</span> <span class="i">$TokenNumber</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   137  124 
 | 
| 
 | 
   138  125   <span class="i">$This</span>->{<span class="w">YYTabFile</span>} = <span class="k">undef</span><span class="sc">;</span>
 | 
| 
 | 
   139  126   <span class="i">$This</span>->{<span class="w">YYTabFilePath</span>} = <span class="k">undef</span><span class="sc">;</span>
 | 
| 
 | 
   140  127   <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   141  128 
 | 
| 
 | 
   142  129   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$YYTabFile</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   143  130     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetupYYTabFile: YYTabFile must be specified..."</span><span class="sc">;</span>
 | 
| 
 | 
   144  131   <span class="s">}</span>
 | 
| 
 | 
   145  132   <span class="i">$This</span>->{<span class="w">YYTabFile</span>} = <span class="i">$YYTabFile</span><span class="sc">;</span>
 | 
| 
 | 
   146  133 
 | 
| 
 | 
   147  134   <span class="k">if</span> <span class="s">(</span><span class="k">-e</span> <span class="i">$YYTabFile</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   148  135     <span class="i">$YYTabFilePath</span> = <span class="i">$YYTabFile</span><span class="sc">;</span>
 | 
| 
 | 
   149  136   <span class="s">}</span>
 | 
| 
 | 
   150  137   <span class="k">else</span> <span class="s">{</span>
 | 
| 
 | 
   151  138     <span class="s">(</span><span class="i">$YYTabFilePath</span><span class="s">)</span> = <span class="k">grep</span> <span class="s">{</span><span class="k">-f</span> <span class="q">"$_/$YYTabFile"</span><span class="s">}</span>  <span class="i">@INC</span><span class="sc">;</span>
 | 
| 
 | 
   152  139     <span class="k">if</span> <span class="s">(</span>!<span class="i">$YYTabFilePath</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   153  140       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetupYYTabFile: YYTabFile, $YYTabFile,  can't be located in \@INC path: @INC..."</span><span class="sc">;</span>
 | 
| 
 | 
   154  141       <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 | 
| 
 | 
   155  142     <span class="s">}</span>
 | 
| 
 | 
   156  143     <span class="i">$YYTabFilePath</span> = <span class="q">"${YYTabFilePath}/$YYTabFile"</span><span class="sc">;</span>
 | 
| 
 | 
   157  144   <span class="s">}</span>
 | 
| 
 | 
   158  145 
 | 
| 
 | 
   159  146   <span class="i">$This</span>->{<span class="w">YYTabFilePath</span>} = <span class="i">$YYTabFilePath</span><span class="sc">;</span>
 | 
| 
 | 
   160  147 
 | 
| 
 | 
   161  148   <span class="k">open</span> <span class="w">YYTABFILE</span><span class="cm">,</span> <span class="q">"$YYTabFilePath"</span> <span class="k">or</span> <span class="k">die</span> <span class="q">"Couldn't open $YYTabFilePath: $_\n"</span><span class="sc">;</span>
 | 
| 
 | 
   162  149   <span class="k">while</span> <span class="s">(</span><span class="i">$Line</span> = <span class="q"><YYTABFILE></span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   163  150     <span class="s">(</span><span class="i">$TokenLabel</span><span class="cm">,</span> <span class="i">$TokenNumber</span><span class="s">)</span> = <span class="s">(</span><span class="i">$Line</span> =~ <span class="q">/^\$(.*?)=(.*?);$/</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   164  151     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$TokenLabel</span><span class="s">)</span> && <span class="k">defined</span><span class="s">(</span><span class="i">$TokenNumber</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   165  152       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetupYYTabFile: Couldn't extract token label and number from YYTabFile $YYTabFile at line: $Line..."</span><span class="sc">;</span>
 | 
| 
 | 
   166  153     <span class="s">}</span>
 | 
| 
 | 
   167  154     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}{<span class="i">$TokenLabel</span>}<span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   168  155       <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->SetupYYTabFile: Token lable, $TokenLabel, already defined in YYTabFile $YYTabFile..."</span><span class="sc">;</span>
 | 
| 
 | 
   169  156     <span class="s">}</span>
 | 
| 
 | 
   170  157     <span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}{<span class="i">$TokenLabel</span>} = <span class="i">$TokenNumber</span><span class="sc">;</span>
 | 
| 
 | 
   171  158   <span class="s">}</span>
 | 
| 
 | 
   172  159   <span class="k">close</span> <span class="w">YYTABFILE</span><span class="sc">;</span>
 | 
| 
 | 
   173  160 
 | 
| 
 | 
   174  161   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 | 
| 
 | 
   175  162 <span class="s">}</span>
 | 
| 
 | 
   176  163 
 | 
| 
 | 
   177  164 <span class="c"># Get next available token number and any matched text from input stream</span>
 | 
| 
 | 
   178  165 <span class="c"># by either removing it from the input stream or simply peeking ahead.</span>
 | 
| 
 | 
   179  166 <span class="c">#</span>
 | 
| 
 | 
   180  167 <span class="c"># Supported mode values: Peek, Next. Default: Next</span>
 | 
| 
 | 
   181  168 <span class="c">#</span>
 | 
| 
 | 
   182  169 <span class="c"># Notes:</span>
 | 
| 
 | 
   183  170 <span class="c">#   . Token label and value pairs returned by lexer, which can't be mapped to token</span>
 | 
| 
 | 
   184  171 <span class="c">#     labels specified in YYTabFile are ignored.</span>
 | 
| 
 | 
   185  172 <span class="c">#   . Token text of length 1 returned by lexer without a corresponding explicit token label,</span>
 | 
| 
 | 
   186  173 <span class="c">#     which can't be mapped to a token number using Perl ord function, is ignored.</span>
 | 
| 
 | 
   187  174 <span class="c">#</span>
 | 
| 
 | 
   188 <a name="YYLex-"></a> 175 <span class="k">sub </span><span class="m">YYLex</span> <span class="s">{</span>
 | 
| 
 | 
   189  176   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
   190  177   <span class="k">my</span><span class="s">(</span><span class="i">$LexerToken</span><span class="cm">,</span> <span class="i">$TokenLabel</span><span class="cm">,</span> <span class="i">$TokenNumber</span><span class="cm">,</span> <span class="i">$TokenText</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   191  178 
 | 
| 
 | 
   192  179   <span class="s">(</span><span class="i">$TokenLabel</span><span class="cm">,</span> <span class="i">$TokenNumber</span><span class="cm">,</span> <span class="i">$TokenText</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="s">)</span> x <span class="n">3</span><span class="sc">;</span>
 | 
| 
 | 
   193  180 
 | 
| 
 | 
   194  181   <span class="j">TOKEN:</span> <span class="k">while</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$LexerToken</span> = <span class="i">$This</span><span class="i">->Lex</span><span class="s">(</span><span class="i">$Mode</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   195  182     <span class="k">if</span> <span class="s">(</span><span class="k">ref</span> <span class="i">$LexerToken</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   196  183       <span class="s">(</span><span class="i">$TokenLabel</span><span class="cm">,</span> <span class="i">$TokenText</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$LexerToken</span>}<span class="sc">;</span>
 | 
| 
 | 
   197  184       <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}{<span class="i">$TokenLabel</span>}<span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   198  185         <span class="i">$TokenNumber</span> = <span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}{<span class="i">$TokenLabel</span>}<span class="sc">;</span>
 | 
| 
 | 
   199  186       <span class="s">}</span>
 | 
| 
 | 
   200  187       <span class="k">elsif</span> <span class="s">(</span><span class="i">$TokenLabel</span> =~ <span class="q">/^EOI$/i</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   201  188         <span class="i">$TokenNumber</span> = <span class="n">0</span><span class="sc">;</span>
 | 
| 
 | 
   202  189       <span class="s">}</span>
 | 
| 
 | 
   203  190     <span class="s">}</span>
 | 
| 
 | 
   204  191     <span class="k">else</span> <span class="s">{</span>
 | 
| 
 | 
   205  192       <span class="i">$TokenText</span> = <span class="i">$LexerToken</span><span class="sc">;</span>
 | 
| 
 | 
   206  193     <span class="s">}</span>
 | 
| 
 | 
   207  194 
 | 
| 
 | 
   208  195     <span class="c"># Check for any literals (+, - , = etc.) to generte token numbers...</span>
 | 
| 
 | 
   209  196     <span class="c">#</span>
 | 
| 
 | 
   210  197     <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$TokenNumber</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   211  198       <span class="k">if</span> <span class="s">(</span><span class="k">length</span><span class="s">(</span><span class="i">$TokenText</span><span class="s">)</span> == <span class="n">1</span> && <span class="k">ord</span> <span class="i">$TokenText</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   212  199         <span class="i">$TokenNumber</span> = <span class="k">ord</span> <span class="i">$TokenText</span><span class="sc">;</span>
 | 
| 
 | 
   213  200       <span class="s">}</span>
 | 
| 
 | 
   214  201     <span class="s">}</span>
 | 
| 
 | 
   215  202 
 | 
| 
 | 
   216  203     <span class="c"># Generate error message for no mapping to token numbers...</span>
 | 
| 
 | 
   217  204     <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$TokenNumber</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   218  205       <span class="k">last</span> <span class="j">TOKEN</span><span class="sc">;</span>
 | 
| 
 | 
   219  206     <span class="s">}</span>
 | 
| 
 | 
   220  207     <span class="k">else</span> <span class="s">{</span>
 | 
| 
 | 
   221  208       <span class="k">if</span> <span class="s">(</span><span class="k">defined</span> <span class="i">$TokenLabel</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   222  209         <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->YYLex: Igorning token label, $TokenLabel, with matched text, $TokenText, returned by lexer and retrieving next available token or text. Token label couldn't be mapped to token numbers specified in YYTabFile generated from a parser defintion file using byacc. After updating parser definition file, a new YYTabFile containing entry for token label must be generated..."</span><span class="sc">;</span>
 | 
| 
 | 
   223  210       <span class="s">}</span>
 | 
| 
 | 
   224  211       <span class="k">else</span> <span class="s">{</span>
 | 
| 
 | 
   225  212         <span class="w">carp</span> <span class="q">"Warning: ${ClassName}->YYLex: Igorning token text, $TokenText, returned by lexer and retrieving next available token or text. Token text returned by lexer couldn't be mapped to token number using Perl ord function. After updating lexer token specifications and parser definition file, a new YYTabFile containing entry for a new token label to match unrecognized text must be generated...  "</span><span class="sc">;</span>
 | 
| 
 | 
   226  213       <span class="s">}</span>
 | 
| 
 | 
   227  214       <span class="k">next</span> <span class="j">TOKEN</span><span class="sc">;</span>
 | 
| 
 | 
   228  215     <span class="s">}</span>
 | 
| 
 | 
   229  216   <span class="s">}</span>
 | 
| 
 | 
   230  217 
 | 
| 
 | 
   231  218   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$LexerToken</span><span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   232  219     <span class="c"># Chained lexer returns undefined at end of input. So it's equivalent to EOI</span>
 | 
| 
 | 
   233  220     <span class="c"># token.</span>
 | 
| 
 | 
   234  221     <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}{<span class="w">EOI</span>}<span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   235  222       <span class="i">$TokenLabel</span> = <span class="q">"EOI"</span><span class="sc">;</span>
 | 
| 
 | 
   236  223       <span class="i">$TokenNumber</span> = <span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}{<span class="i">$TokenLabel</span>}<span class="sc">;</span>
 | 
| 
 | 
   237  224       <span class="i">$TokenText</span> = <span class="q">"0"</span><span class="sc">;</span>
 | 
| 
 | 
   238  225     <span class="s">}</span>
 | 
| 
 | 
   239  226     <span class="k">else</span> <span class="s">{</span>
 | 
| 
 | 
   240  227       <span class="s">(</span><span class="i">$TokenLabel</span><span class="cm">,</span> <span class="i">$TokenNumber</span><span class="cm">,</span> <span class="i">$TokenText</span><span class="s">)</span> = <span class="s">(</span><span class="q">"EOI"</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="q">"0"</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   241  228     <span class="s">}</span>
 | 
| 
 | 
   242  229   <span class="s">}</span>
 | 
| 
 | 
   243  230 
 | 
| 
 | 
   244  231   <span class="k">return</span> <span class="s">(</span><span class="i">$TokenNumber</span><span class="cm">,</span> <span class="i">$TokenText</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   245  232 <span class="s">}</span>
 | 
| 
 | 
   246  233 
 | 
| 
 | 
   247  234 <span class="c"># Get next available token number and text pair from input stream by removing it</span>
 | 
| 
 | 
   248  235 <span class="c"># from the input stream...</span>
 | 
| 
 | 
   249  236 <span class="c">#</span>
 | 
| 
 | 
   250 <a name="Next-"></a> 237 <span class="k">sub </span><span class="m">Next</span> <span class="s">{</span>
 | 
| 
 | 
   251  238   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
   252  239 
 | 
| 
 | 
   253  240   <span class="k">return</span> <span class="i">$This</span><span class="i">->YYLex</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   254  241 <span class="s">}</span>
 | 
| 
 | 
   255  242 
 | 
| 
 | 
   256  243 <span class="c"># Get next available token number and text pair from input stream by by simply</span>
 | 
| 
 | 
   257  244 <span class="c"># peeking ahead and without removing it from the input stream...</span>
 | 
| 
 | 
   258  245 <span class="c">#</span>
 | 
| 
 | 
   259 <a name="Peek-"></a> 246 <span class="k">sub </span><span class="m">Peek</span> <span class="s">{</span>
 | 
| 
 | 
   260  247   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
   261  248 
 | 
| 
 | 
   262  249   <span class="k">return</span> <span class="i">$This</span><span class="i">->YYLex</span><span class="s">(</span><span class="q">'Peek'</span><span class="s">)</span>
 | 
| 
 | 
   263  250 <span class="s">}</span>
 | 
| 
 | 
   264  251 
 | 
| 
 | 
   265  252 <span class="c"># Return a curried verson of lexer: yyparse in parser generated by byacc expects it</span>
 | 
| 
 | 
   266  253 <span class="c"># to call without passing any argument for the YYLexer object...</span>
 | 
| 
 | 
   267  254 <span class="c">#</span>
 | 
| 
 | 
   268 <a name="GetYYLex-"></a> 255 <span class="k">sub </span><span class="m">GetYYLex</span> <span class="s">{</span>
 | 
| 
 | 
   269  256   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
   270  257 
 | 
| 
 | 
   271  258   <span class="k">return</span> <span class="k">sub</span> <span class="s">{</span> <span class="k">my</span><span class="s">(</span><span class="i">$Mode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span> <span class="i">$This</span><span class="i">->YYLex</span><span class="s">(</span><span class="i">$Mode</span><span class="s">)</span><span class="sc">;</span> <span class="s">}</span><span class="sc">;</span>
 | 
| 
 | 
   272  259 <span class="s">}</span>
 | 
| 
 | 
   273  260 
 | 
| 
 | 
   274  261 <span class="c"># Is it a lexer object?</span>
 | 
| 
 | 
   275 <a name="_IsYYLexer-"></a> 262 <span class="k">sub </span><span class="m">_IsYYLexer</span> <span class="s">{</span>
 | 
| 
 | 
   276  263   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
   277  264 
 | 
| 
 | 
   278  265   <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> && <span class="i">$Object</span><span class="i">->isa</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 | 
| 
 | 
   279  266 <span class="s">}</span>
 | 
| 
 | 
   280  267 
 | 
| 
 | 
   281  268 <span class="c"># Return a string containing information about lexer...</span>
 | 
| 
 | 
   282 <a name="StringifyYYLexer-"></a> 269 <span class="k">sub </span><span class="m">StringifyYYLexer</span> <span class="s">{</span>
 | 
| 
 | 
   283  270   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
   284  271   <span class="k">my</span><span class="s">(</span><span class="i">$YYLexerString</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   285  272 
 | 
| 
 | 
   286  273   <span class="i">$YYLexerString</span> = <span class="q">"YYLexer: PackageName: $ClassName; "</span> . <span class="i">$This</span><span class="i">->_GetYYLexerInfoString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   287  274 
 | 
| 
 | 
   288  275   <span class="k">return</span> <span class="i">$YYLexerString</span><span class="sc">;</span>
 | 
| 
 | 
   289  276 <span class="s">}</span>
 | 
| 
 | 
   290  277 
 | 
| 
 | 
   291  278 <span class="c"># Stringigy YYTabFile token name and value information...</span>
 | 
| 
 | 
   292  279 <span class="c">#</span>
 | 
| 
 | 
   293 <a name="_GetYYLexerInfoString-"></a> 280 <span class="k">sub </span><span class="m">_GetYYLexerInfoString</span> <span class="s">{</span>
 | 
| 
 | 
   294  281   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 | 
| 
 | 
   295  282   <span class="k">my</span><span class="s">(</span><span class="i">$YYLexerInfoString</span><span class="cm">,</span> <span class="i">$TokenValue</span><span class="cm">,</span> <span class="i">$YYTabFile</span><span class="cm">,</span> <span class="i">$YYTabFilePath</span><span class="cm">,</span> <span class="i">$YYTabDataMapString</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   296  283 
 | 
| 
 | 
   297  284   <span class="i">$YYTabFile</span> = <span class="k">defined</span> <span class="i">$This</span>->{<span class="w">YYTabFile</span>} ? <span class="i">$This</span>->{<span class="w">YYTabFile</span>} <span class="co">:</span> <span class="q">'None'</span><span class="sc">;</span>
 | 
| 
 | 
   298  285   <span class="i">$YYTabFilePath</span> = <span class="k">defined</span> <span class="i">$This</span>->{<span class="w">YYTabFilePath</span>} ? <span class="i">$This</span>->{<span class="w">YYTabFilePath</span>} <span class="co">:</span> <span class="q">'None'</span><span class="sc">;</span>
 | 
| 
 | 
   299  286 
 | 
| 
 | 
   300  287   <span class="i">$YYLexerInfoString</span> = <span class="q">"YYTabFile: $YYTabFile; YYTabFilePath: $YYTabFilePath"</span><span class="sc">;</span>
 | 
| 
 | 
   301  288 
 | 
| 
 | 
   302  289   <span class="i">$YYTabDataMapString</span> = <span class="q">"YYTabDataMap: None"</span><span class="sc">;</span>
 | 
| 
 | 
   303  290   <span class="k">if</span> <span class="s">(</span><span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}}<span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   304  291     <span class="k">my</span><span class="s">(</span><span class="i">$TokenLabel</span><span class="cm">,</span> <span class="i">$TokenNumber</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   305  292 
 | 
| 
 | 
   306  293     <span class="i">$YYTabDataMapString</span> = <span class="q">"YYTabDataMap:"</span><span class="sc">;</span>
 | 
| 
 | 
   307  294     <span class="k">for</span> <span class="i">$TokenLabel</span> <span class="s">(</span><span class="k">sort</span> <span class="k">keys</span> <span class="i">%</span>{<span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}}<span class="s">)</span> <span class="s">{</span>
 | 
| 
 | 
   308  295       <span class="i">$TokenValue</span> = <span class="i">$This</span>->{<span class="w">YYTabDataMap</span>}{<span class="i">$TokenLabel</span>}<span class="sc">;</span>
 | 
| 
 | 
   309  296       <span class="i">$YYTabDataMapString</span> .= <span class="q">" ${TokenLabel}=${TokenValue}"</span><span class="sc">;</span>
 | 
| 
 | 
   310  297     <span class="s">}</span>
 | 
| 
 | 
   311  298   <span class="s">}</span>
 | 
| 
 | 
   312  299 
 | 
| 
 | 
   313  300   <span class="i">$YYLexerInfoString</span> .= <span class="q">"; $YYTabDataMapString; "</span> . <span class="i">$This</span><span class="i">->_GetLexerInfoString</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 | 
| 
 | 
   314  301 
 | 
| 
 | 
   315  302   <span class="k">return</span> <span class="i">$YYLexerInfoString</span><span class="sc">;</span>
 | 
| 
 | 
   316  303 <span class="s">}</span>
 | 
| 
 | 
   317  304 
 | 
| 
 | 
   318 <a name="EOF-"></a></pre>
 | 
| 
 | 
   319 <p> </p>
 | 
| 
 | 
   320 <br />
 | 
| 
 | 
   321 <center>
 | 
| 
 | 
   322 <img src="../../../images/h2o2.png">
 | 
| 
 | 
   323 </center>
 | 
| 
 | 
   324 </body>
 | 
| 
 | 
   325 </html>
 |