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