annotate mayachemtool/mayachemtools/lib/Parsers/YYLexer.pm @ 0:68300206e90d draft default tip

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