annotate lib/Parsers/YYLexer.pm @ 3:90ea638ce878 draft default tip

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