Mercurial > repos > deepakjadmin > mayatool3_test3
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mayachemtools/docs/modules/html/code/YYLexer.html Wed Jan 20 11:55:01 2016 -0500 @@ -0,0 +1,325 @@ +<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>