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

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