annotate mayachemtools/lib/Parsers/YYLexer.pm @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
1 package Parsers::YYLexer;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
2 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
3 # $RCSfile: YYLexer.pm,v $
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
4 # $Date: 2015/02/28 20:50:55 $
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
5 # $Revision: 1.10 $
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
6 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
7 # Author: Manish Sud <msud@san.rr.com>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
8 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
9 # Copyright (C) 2015 Manish Sud. All rights reserved.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
10 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
11 # This file is part of MayaChemTools.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
12 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
13 # MayaChemTools is free software; you can redistribute it and/or modify it under
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
14 # the terms of the GNU Lesser General Public License as published by the Free
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
15 # Software Foundation; either version 3 of the License, or (at your option) any
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
16 # later version.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
17 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
18 # MayaChemTools is distributed in the hope that it will be useful, but without
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
19 # any warranty; without even the implied warranty of merchantability of fitness
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
20 # for a particular purpose. See the GNU Lesser General Public License for more
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
21 # details.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
22 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
23 # You should have received a copy of the GNU Lesser General Public License
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
26 # Boston, MA, 02111-1307, USA.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
27 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
28
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
29 use strict;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
30 use Carp;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
31 use Exporter;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
32 use Scalar::Util ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
33 use Parsers::Lexer;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
34
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
35 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
36
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
37 @ISA = qw(Parsers::Lexer Exporter);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
38 @EXPORT = qw();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
39 @EXPORT_OK = qw();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
40
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
41 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
42
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
43 # Setup class variables...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
44 my($ClassName);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
45 _InitializeClass();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
46
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
47 # Overload Perl functions...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
48 use overload '""' => 'StringifyYYLexer';
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
49
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
50 # Class constructor...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
51 sub new {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
52 my($Class, $Input, @TokensSpec) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
53
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
54 # Initialize object...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
55 my $This = $Class->SUPER::new($Input, @TokensSpec);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
56 bless $This, ref($Class) || $Class;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
57 $This->_InitializeYYLexer();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
58
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
59 return $This;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
60 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
61
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
62 # Initialize object data...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
63 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
64 sub _InitializeYYLexer {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
65 my($This) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
66
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
67 # File generated containing mapping of token labels to token numbers by
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
68 # running command byacc with -d option on a parser definition file.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
69 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
70 # For example, "byacc -l -P -d -b Parser Parser.yy" would generate file
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
71 # Parser.tab.ph, which might contain the following tokem name and values
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
72 # for a parser for a simple calculator:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
73 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
74 # $NUMBER=257;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
75 # $LETTER=258;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
76 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
77 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
78 $This->{YYTabFile} = undef;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
79 $This->{YYTabFilePath} = undef;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
80
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
81 # Mapping of token lables to token numbers...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
82 %{$This->{YYTabDataMap}} = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
83
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
84 return $This;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
85 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
86
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
87 # Initialize class ...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
88 sub _InitializeClass {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
89 #Class name...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
90
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
91 $ClassName = __PACKAGE__;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
92 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
93
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
94 # Process tokens in YYTab file and load mapping of token labels to integers
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
95 # for return during YYLex method invocation...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
96 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
97 # Notes:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
98 # . YYTabFile must be a complete path or available through @INC path in the
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
99 # same directory where this package is located.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
100 # . Name of YYTabFile might start with any valid sub directory name in @INC
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
101 # For example, "Parsers/<YYTablFile>" implies the tab file in parsers sub directory
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
102 # under MayaChemTools lib directory as it would be already in @INC path.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
103 # . YYTabFile must be explicitly set by the caller. The default YYTabFile name,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
104 # y.tab.ph, generated by byacc is not used implicitly to avoid confusion among
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
105 # multiple distinct instances of YYLexer.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
106 # . YYTabFile is generated by byacc during its usage with -d options and contains
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
107 # mapping of token codes to token names/labels. YYLexer used this file to map
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
108 # token lables to token codes before retuning token code and value pair back
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
109 # to yyparse function used by byacc.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
110 # . User defined token numbers start from 257
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
111 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
112 # The format of YYTabFile generted by byacc during generation of parser code in
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
113 # Perl code is:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
114 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
115 # ... ...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
116 # $NUMBER=257;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
117 # $ADDOP=258;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
118 # $SUBOP=259;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
119 # ... ..
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
120 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
121 sub SetupYYTabFile {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
122 my($This, $YYTabFile) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
123 my($YYTabFilePath, $Line, $TokenLabel, $TokenNumber);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
124
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
125 $This->{YYTabFile} = undef;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
126 $This->{YYTabFilePath} = undef;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
127 %{$This->{YYTabDataMap}} = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
128
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
129 if (!defined $YYTabFile) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
130 croak "Error: ${ClassName}->SetupYYTabFile: YYTabFile must be specified...";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
131 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
132 $This->{YYTabFile} = $YYTabFile;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
133
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
134 if (-e $YYTabFile) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
135 $YYTabFilePath = $YYTabFile;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
136 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
137 else {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
138 ($YYTabFilePath) = grep {-f "$_/$YYTabFile"} @INC;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
139 if (!$YYTabFilePath) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
140 carp "Warning: ${ClassName}->SetupYYTabFile: YYTabFile, $YYTabFile, can't be located in \@INC path: @INC...";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
141 return $This;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
142 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
143 $YYTabFilePath = "${YYTabFilePath}/$YYTabFile";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
144 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
145
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
146 $This->{YYTabFilePath} = $YYTabFilePath;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
147
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
148 open YYTABFILE, "$YYTabFilePath" or die "Couldn't open $YYTabFilePath: $_\n";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
149 while ($Line = <YYTABFILE>) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
150 ($TokenLabel, $TokenNumber) = ($Line =~ /^\$(.*?)=(.*?);$/);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
151 if (!(defined($TokenLabel) && defined($TokenNumber))) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
152 croak "Error: ${ClassName}->SetupYYTabFile: Couldn't extract token label and number from YYTabFile $YYTabFile at line: $Line...";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
153 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
154 if (exists $This->{YYTabDataMap}{$TokenLabel}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
155 carp "Warning: ${ClassName}->SetupYYTabFile: Token lable, $TokenLabel, already defined in YYTabFile $YYTabFile...";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
156 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
157 $This->{YYTabDataMap}{$TokenLabel} = $TokenNumber;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
158 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
159 close YYTABFILE;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
160
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
161 return $This;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
162 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
163
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
164 # Get next available token number and any matched text from input stream
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
165 # by either removing it from the input stream or simply peeking ahead.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
166 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
167 # Supported mode values: Peek, Next. Default: Next
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
168 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
169 # Notes:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
170 # . Token label and value pairs returned by lexer, which can't be mapped to token
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
171 # labels specified in YYTabFile are ignored.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
172 # . Token text of length 1 returned by lexer without a corresponding explicit token label,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
173 # which can't be mapped to a token number using Perl ord function, is ignored.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
174 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
175 sub YYLex {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
176 my($This, $Mode) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
177 my($LexerToken, $TokenLabel, $TokenNumber, $TokenText);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
178
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
179 ($TokenLabel, $TokenNumber, $TokenText) = (undef) x 3;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
180
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
181 TOKEN: while (defined($LexerToken = $This->Lex($Mode))) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
182 if (ref $LexerToken) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
183 ($TokenLabel, $TokenText) = @{$LexerToken};
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
184 if (exists $This->{YYTabDataMap}{$TokenLabel}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
185 $TokenNumber = $This->{YYTabDataMap}{$TokenLabel};
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
186 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
187 elsif ($TokenLabel =~ /^EOI$/i) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
188 $TokenNumber = 0;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
189 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
190 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
191 else {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
192 $TokenText = $LexerToken;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
193 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
194
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
195 # Check for any literals (+, - , = etc.) to generte token numbers...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
196 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
197 if (!defined $TokenNumber) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
198 if (length($TokenText) == 1 && ord $TokenText) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
199 $TokenNumber = ord $TokenText;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
200 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
201 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
202
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
203 # Generate error message for no mapping to token numbers...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
204 if (defined $TokenNumber) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
205 last TOKEN;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
206 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
207 else {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
208 if (defined $TokenLabel) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
209 carp "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...";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
210 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
211 else {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
212 carp "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... ";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
213 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
214 next TOKEN;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
215 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
216 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
217
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
218 if (!defined $LexerToken) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
219 # Chained lexer returns undefined at end of input. So it's equivalent to EOI
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
220 # token.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
221 if (exists $This->{YYTabDataMap}{EOI}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
222 $TokenLabel = "EOI";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
223 $TokenNumber = $This->{YYTabDataMap}{$TokenLabel};
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
224 $TokenText = "0";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
225 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
226 else {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
227 ($TokenLabel, $TokenNumber, $TokenText) = ("EOI", 0, "0");
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
228 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
229 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
230
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
231 return ($TokenNumber, $TokenText);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
232 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
233
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
234 # Get next available token number and text pair from input stream by removing it
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
235 # from the input stream...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
236 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
237 sub Next {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
238 my($This) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
239
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
240 return $This->YYLex();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
241 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
242
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
243 # Get next available token number and text pair from input stream by by simply
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
244 # peeking ahead and without removing it from the input stream...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
245 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
246 sub Peek {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
247 my($This) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
248
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
249 return $This->YYLex('Peek')
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
250 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
251
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
252 # Return a curried verson of lexer: yyparse in parser generated by byacc expects it
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
253 # to call without passing any argument for the YYLexer object...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
254 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
255 sub GetYYLex {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
256 my($This) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
257
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
258 return sub { my($Mode) = @_; $This->YYLex($Mode); };
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
259 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
260
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
261 # Is it a lexer object?
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
262 sub _IsYYLexer {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
263 my($Object) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
264
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
265 return (Scalar::Util::blessed($Object) && $Object->isa($ClassName)) ? 1 : 0;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
266 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
267
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
268 # Return a string containing information about lexer...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
269 sub StringifyYYLexer {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
270 my($This) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
271 my($YYLexerString);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
272
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
273 $YYLexerString = "YYLexer: PackageName: $ClassName; " . $This->_GetYYLexerInfoString();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
274
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
275 return $YYLexerString;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
276 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
277
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
278 # Stringigy YYTabFile token name and value information...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
279 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
280 sub _GetYYLexerInfoString {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
281 my($This) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
282 my($YYLexerInfoString, $TokenValue, $YYTabFile, $YYTabFilePath, $YYTabDataMapString);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
283
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
284 $YYTabFile = defined $This->{YYTabFile} ? $This->{YYTabFile} : 'None';
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
285 $YYTabFilePath = defined $This->{YYTabFilePath} ? $This->{YYTabFilePath} : 'None';
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
286
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
287 $YYLexerInfoString = "YYTabFile: $YYTabFile; YYTabFilePath: $YYTabFilePath";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
288
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
289 $YYTabDataMapString = "YYTabDataMap: None";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
290 if (keys %{$This->{YYTabDataMap}}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
291 my($TokenLabel, $TokenNumber);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
292
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
293 $YYTabDataMapString = "YYTabDataMap:";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
294 for $TokenLabel (sort keys %{$This->{YYTabDataMap}}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
295 $TokenValue = $This->{YYTabDataMap}{$TokenLabel};
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
296 $YYTabDataMapString .= " ${TokenLabel}=${TokenValue}";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
297 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
298 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
299
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
300 $YYLexerInfoString .= "; $YYTabDataMapString; " . $This->_GetLexerInfoString();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
301
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
302 return $YYLexerInfoString;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
303 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
304
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
305 1;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
306
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
307 __END__
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
308
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
309 =head1 NAME
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
310
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
311 Parsers::YYLexer
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
312
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
313 =head1 SYNOPSIS
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
314
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
315 use Parseres::YYLexer;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
316
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
317 use Parsers::YYLexer qw(:all);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
318
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
319 =head1 DESCRIPTION
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
320
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
321 B<YYLexer> class provides the following methods:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
322
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
323 new, GetYYLex, Next, Peek, SetupYYTabFile, StringifyYYLexer, YYLex
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
324
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
325 B<Parsers::YYLexer> class is derived from B<Parsers::Lexer> base class, which provides all
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
326 the underlying lexer functionality. B<YYLexer> class is designed to be used with
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
327 B<yyparse> code generated by running B<byacc> on a parsers defined using
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
328 parser definition B<ParserName.yy> file.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
329
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
330 I<YYTabFile> containing mapping of token labels to integers must be explicitly
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
331 specified by the caller. This file is processed during new method invocation and
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
332 mapping of token labels to integers is loaded in a hash to be used later by B<YYLex>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
333 method to return token number and text pairs to the parser.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
334
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
335 =head2 METHODS
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
336
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
337 =over 4
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
338
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
339 =item B<new>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
340
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
341 $YYLexer = new Parsers::YYLexer($Input, @YYLexerTokensSpec);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
342
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
343 Using specified I<Input> and I<YYLexerTokensSpec>, B<new> method generates a new
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
344 B<YYLexer> and returns a reference to newly created B<YYLexer> object.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
345
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
346 Examples:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
347
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
348 # Tokens specifications supplied by the caller. It's an array containing references
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
349 # to arrays with each containing TokenLabel and TokenMatchRegex pair along with
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
350 # an option reference to code to be executed after a matched.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
351 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
352 @LexerTokensSpec = (
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
353 [ 'LETTER', qr/[a-zA-Z]/ ],
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
354 [ 'NUMBER', qr/\d+/ ],
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
355 [ 'SPACE', qr/[ ]*/,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
356 sub { my($This, $TokenLabel, $MatchedText) = @_; return ''; }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
357 ],
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
358 [ 'NEWLINE', qr/(?:\r\n|\r|\n)/,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
359 sub { my($This, $TokenLabel, $MatchedText) = @_; return "\n"; }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
360 ],
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
361 [ 'CHAR', qr/./ ]
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
362 );
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
363
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
364 # Input string...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
365 $InputText = 'y = 3 + 4';
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
366
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
367 $YLexer = new Parsers::YYLexer($InputText, @LexerTokensSpec);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
368
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
369 # Setup default token table file...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
370 $YYTabFile = "Parsers/SimpleCalcParser.tab.ph";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
371 $This->SetupYYTabFile($YYTabFile);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
372
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
373 # Process input stream...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
374 ($TokenNumber, $TokenText) = $YYLexer->Lex();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
375 print "TokenNumber: $TokenNumber; TokenText: $TokenText\n";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
376
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
377 # Input file...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
378 $InputFile = "Input.txt";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
379 open INPUTFILE, "$InputFile" or die "Couldn't open $InputFile: $!\n";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
380 $Lexer = new Parsers::YYLexer(\*INPUTFILE, @LexerTokensSpec);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
381
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
382 # Input file iterator...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
383 $InputFile = "TestSimpleCalcParser.txt";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
384 open INPUTFILE, "$InputFile" or die "Couldn't open $InputFile: $!\n";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
385 $InputIterator = sub { return <INPUTFILE>; };
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
386 $Lexer = new Parsers::YYLexer($InputIterator, @LexerTokensSpec);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
387
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
388 # Usage with code generated by byacc from a parser definition
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
389 # file SimpleCalcParser.yy...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
390
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
391 $InputText = "3 + 4 +6\nx=3\ny=5\nx+y\nx+z\n";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
392
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
393 $YYLexer = new Parsers::YYLexer($InputText,@LexerTokensSpec);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
394
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
395 $YYLex = $YYLexer->GetYYLex();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
396
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
397 $YYTabFile = "Parsers/SimpleCalcParser.tab.ph";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
398 $YYLexer->SetupYYTabFile($YYTabFile);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
399
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
400 $Debug = 0;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
401 $SimpleCalcParser = new Parsers::SimpleCalcParser($YYLex,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
402 \&Parsers::SimpleCalcParser::yyerror, $Debug);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
403
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
404 $Value = $SimpleCalcParser->yyparse();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
405 print "Value = " . (defined($Value) ? "$Value" : "Undefined") . "\n";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
406
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
407 =item B<GetYYLex>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
408
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
409 $YYLex = $YYLexer->GetYYLex();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
410
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
411 Returns a curried verson of YYLexer as B<YYLex>: yyparse in parser generated by
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
412 byacc expects it to call without passing any argument for the I<YYLexer> object.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
413
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
414 =item B<Next>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
415
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
416 ($TokenNumber, $TokenText) = $YYLexer->Next();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
417
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
418 Returns next available B<TokenNumber> and any matched B<TokenText> from
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
419 input stream by removing it from the input stream. Token number and text of
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
420 zero corresponds to end of input (EOI).
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
421
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
422 =item B<Peek>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
423
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
424 ($TokenNumber, $TokenText) = $YYLexer->Peek();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
425
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
426 Returns next available B<TokenNumber> and any matched B<TokenText> from
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
427 input stream by simply looking ahead and without removing it from the input stream.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
428 Token number and text of zero corresponds to end of input (EOI).
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
429
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
430 =item B<SetupYYTabFile>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
431
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
432 $YYLexer = $YYLexer->SetupYYTabFile($YYTabFile);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
433
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
434 Processes token labels to integers data map in specified I<YYTabFile> and returns
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
435 I<YYLexer>.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
436
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
437 Notes:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
438
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
439 . YYTabFile must be a complete path or available through @INC path in the
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
440 same directory where this package is located.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
441 . Name of YYTabFile might start with any valid sub directory name in @INC
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
442 For example, "Parsers/<YYTablFile>" implies the tab file in parsers sub
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
443 directory under MayaChemTools lib directory as it would be already in @INC
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
444 path.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
445 . YYTabFile must be explicitly set by the caller. The default YYTabFile name,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
446 y.tab.ph, generated by byacc is not used implicitly to avoid confusion
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
447 among multiple distinct instances of YYLexer.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
448 . YYTabFile is generated by byacc during its usage with -d options and
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
449 contains mapping of token codes to token names/labels. YYLexer used this
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
450 file to map token labels to token codes before returning token code and
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
451 value pair back to yyparse function used by byacc.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
452 . User defined token numbers start from 257
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
453 . Token number for any user defined token EOI is mapped to its value before
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
454 default token number of 0 for EOI.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
455
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
456 The format of YYTabFile generated by byacc during generation of parser code in
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
457 Perl code is:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
458
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
459 ... ...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
460 $NUMBER=257;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
461 $ADDOP=258;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
462 $SUBOP=259;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
463 ... ..
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
464
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
465 =item B<YYLex>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
466
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
467 ($TokenNumber, $TokenText) = $YYLexer->YYLex();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
468 ($TokenNumber, $TokenText) = $YYLexer->YYLex($Mode);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
469
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
470 Returns available B<TokenNumber> and any matched B<TokenText> from
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
471 input stream by either removing it from the input stream or by simply looking
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
472 ahead and without removing it from the input stream. Token number and text of
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
473 zero corresponds to end of input (EOI).
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
474
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
475 Possible I<Mode> values: I<Peek, Next>. Default: I<Next>.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
476
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
477 I<YYLex> is designed to be used with B<yyparse> code generated by running
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
478 B<byacc> on a parsers defined using parser definition B<ParserName.yy> file.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
479
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
480 Notes:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
481
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
482 . Token label and value pairs returned by Lexer from by base class, which
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
483 can't be mapped to token labels specified in YYTabFile are ignored.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
484 . Token text of length 1 returned by Lexer from base class without a
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
485 corresponding explicit token label, which can't be mapped to a token
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
486 number using Perl ord function, is ignored.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
487
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
488 =item B<StringifyYYLexer>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
489
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
490 $YYLexerString = $YYLexer->StringifyYYLexer();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
491
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
492 Returns a string containing information about I<YYLexer> object.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
493
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
494 =back
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
495
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
496 =head1 AUTHOR
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
497
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
498 Manish Sud <msud@san.rr.com>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
499
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
500 =head1 SEE ALSO
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
501
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
502 Lexer.pm, SimpleCalcYYLexer.pm, SimpleCalcParser.yy
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
503
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
504 =head1 COPYRIGHT
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
505
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
506 Copyright (C) 2015 Manish Sud. All rights reserved.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
507
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
508 This file is part of MayaChemTools.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
509
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
510 MayaChemTools is free software; you can redistribute it and/or modify it under
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
511 the terms of the GNU Lesser General Public License as published by the Free
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
512 Software Foundation; either version 3 of the License, or (at your option)
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
513 any later version.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
514
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
515 =cut