annotate lib/Parsers/YYLexer.pm @ 0:4816e4a8ae95 draft default tip

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