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