annotate mayachemtools/docs/modules/txt/Lexer.txt @ 9:ab29fa5c8c1f draft default tip

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