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>
|