annotate docs/modules/txt/Lexer.txt @ 3:90ea638ce878 draft default tip

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 09:11:59 -0500
parents 2abf0d43254d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
1 NAME
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
2 Parsers::Lexer
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
3
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
4 SYNOPSIS
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
5 use Parsers::Lexer;
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
6
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
7 use Parsers::Lexer qw(:all);
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
8
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
9 DESCRIPTION
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
10 Lexer class provides the following methods:
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
11
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
12 new, GetLex, Lex, Next, Peek, StringifyLexer
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
13
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
14 The object oriented chained Lexer is implemented based on examples
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
15 available in Higher-order Perl [ Ref 126 ] book by Mark J. Dominus. It
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
16 is designed to be used both in standalone mode or as a base class for
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
17 YYLexer.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
18
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
19 A chained lexer is created by generating a lexer for for the first
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
20 specified token specification using specified input and chaining it with
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
21 other lexers generated for all subsequent token specifications. The
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
22 lexer generated for the first token specification uses input iterator to
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
23 retrieve any available input text; the subsequent chained lexeres for
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
24 rest of the token specifications use lexers generated for previous token
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
25 specifications to get next input, which might be unmatched input text or
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
26 a reference to an array containing token and matched text pair.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
27
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
28 METHODS
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
29 new
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
30 $Lexer = new Parsers::Lexer($Input, @TokensSpec);
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
31
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
32 Using specified *Input* and *TokensSpec*, new method generates a new
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
33 lexer and returns a reference to newly created Lexer object.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
34
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
35 Example:
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
36
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
37 # Tokens specifications supplied by the caller. It's an array containing references
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
38 # to arrays with each containing TokenLabel and TokenMatchRegex pair along with
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
39 # an option reference to code to be executed after a matched.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
40 #
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
41 @LexerTokensSpec = (
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
42 [ 'LETTER', qr/[a-zA-Z]/ ],
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
43 [ 'NUMBER', qr/\d+/ ],
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
44 [ 'SPACE', qr/[ ]*/,
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
45 sub { my($This, $TokenLabel, $MatchedText) = @_; return ''; }
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
46 ],
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
47 [ 'NEWLINE', qr/(?:\r\n|\r|\n)/,
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
48 sub { my($This, $TokenLabel, $MatchedText) = @_; return "\n"; }
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
49 ],
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
50 [ 'CHAR', qr/./ ]
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
51 );
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
52
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
53 # Input string...
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
54 $InputText = 'y = 3 + 4';
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
55 $Lexer = new Parsers::Lexer($InputText, @LexerTokensSpec);
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
56
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
57 # Process input stream...
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
58 while (defined($Token = $Lexer->Lex())) {
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
59 print "Token: " . ((ref $Token) ? "@{$Token}" : "$Token") . "\n";
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
60 }
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
61
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
62 # Input file...
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
63 $InputFile = "Input.txt";
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
64 open INPUTFILE, "$InputFile" or die "Couldn't open $InputFile: $!\n";
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
65 $Lexer = new Parsers::Lexer(\*INPUTFILE, @LexerTokensSpec);
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
66
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
67 # Input file iterator...
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
68 $InputFile = "TestSimpleCalcParser.txt";
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
69 open INPUTFILE, "$InputFile" or die "Couldn't open $InputFile: $!\n";
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
70 $InputIterator = sub { return <INPUTFILE>; };
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
71 $Lexer = new Parsers::Lexer($InputIterator, @LexerTokensSpec);
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
72
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
73 @LexerTokensSpec = (
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
74 [ 'VAR', qr/[[:alpha:]]+/ ],
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
75 [ 'NUM', qr/\d+/ ],
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
76 [ 'OP', qr/[-+=\/]/,
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
77 sub { my($This, $Label, $Value) = @_;
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
78 $Value .= "; ord: " . ord $Value;
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
79 return [$Label, $Value];
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
80 }
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
81 ],
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
82 [ 'NEWLINE', qr/(?:\r\n|\r|\n)/, sub { return [$_[1], 'NewLine']; } ],
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
83 [ 'SPACE', qr/\s*/, sub { return [$_[1], 'Space']; } ],
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
84 );
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
85
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
86 # Look ahead without removing...
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
87 $Token = $Lexer->Lex('Peek');
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
88 if (defined $Token && ref $Token) {
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
89 print "PEEK: Token: @{$Token}\n\n";
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
90 }
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
91
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
92 # Process input stream...
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
93 while (defined($Token = $Lexer->Lex())) {
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
94 print "Token: " . ((ref $Token) ? "@{$Token}" : "$Token") . "\n";
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
95 }
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
96
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
97 GetLex
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
98 $LexerRef = $Lexer->GetLex();
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
99
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
100 Returns a refernece to *Lexer* method to the caller for use in a
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
101 specific YYLexer.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
102
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
103 Lex
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
104 $TokenRefOrText = $Lexer->Lex($Mode);
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
105 if (ref $TokenRefOrText) {
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
106 ($TokenLabel, $TokenValue) = @{$TokenRefOrText};
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
107 }
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
108 else {
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
109 $TokenText = $TokenRefOrText;
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
110 }
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
111
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
112 Get next available token label and value pair as an array reference
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
113 or unrecognized text from input stream by either removing it from
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
114 the input or simply peeking ahead and without removing it from the
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
115 input stream.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
116
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
117 Possible *Mode* values: *Peek, Next*. Default: *Next*.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
118
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
119 Next
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
120 $TokenRefOrText = $Lexer->Next();
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
121
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
122 Get next available token label and value pair as an array reference
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
123 or unrecognized text from input stream by removing it from the input
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
124 stream.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
125
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
126 Peek
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
127 $TokenRefOrText = $Lexer->Peek();
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
128
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
129 Get next available token label and value pair as an array reference
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
130 or unrecognized text from input stream by by simply peeking ahead
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
131 and without removing it from the input stream.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
132
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
133 StringifyLexer
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
134 $LexerString = $Lexer->StringifyLexer();
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
135
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
136 Returns a string containing information about *Lexer* object.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
137
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
138 AUTHOR
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
139 Manish Sud <msud@san.rr.com>
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
140
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
141 SEE ALSO
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
142 YYLexer.pm, SimpleCalcYYLexer.pm, SimpleCalcParser.yy
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
143
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
144 COPYRIGHT
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
145 Copyright (C) 2015 Manish Sud. All rights reserved.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
146
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
147 This file is part of MayaChemTools.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
148
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
149 MayaChemTools is free software; you can redistribute it and/or modify it
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
150 under the terms of the GNU Lesser General Public License as published by
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
151 the Free Software Foundation; either version 3 of the License, or (at
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
152 your option) any later version.
2abf0d43254d Uploaded
deepakjadmin
parents:
diff changeset
153