iparser 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +139 -5
- data/lib/iparser/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3555749815afc60628a413163df6b49cd54df7d0
|
4
|
+
data.tar.gz: 06cdd3a7557d8a2177ca4824e7246836405040ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23ef50eac974c79e83c70827791cda3521a18f2b46479a030fcc9ed2fa9747d1337172d3e7cd1e06d14811891e8ea2da0f198f260cefb52f8793ce9e89e2aa80
|
7
|
+
data.tar.gz: 0d4dc17812d7d65b3f8f86c6d5ac0416bcf922c7ebafc07cf834de1de3cd3c5b482c76e5f8e799dbc8b071388e1e28ec741ed71ca431ab4e688aea54d0eb4bf5
|
data/README.md
CHANGED
@@ -80,7 +80,7 @@ parser.interactive_parser
|
|
80
80
|
```
|
81
81
|
|
82
82
|
Run this script and typing `'///'` for branch to 'comment-line' state. Then type `'\n'` or `'\r'` for leave this state.
|
83
|
-
**NOTE**: Type `'\\'` for input `'\'`. Check each state.
|
83
|
+
**NOTE**: Type `'\\'` for input `'\'`. Check each state. Press <enter> (input empty string) to leave interactive mode.
|
84
84
|
After successfully check, add the following code to the beginning of the file:
|
85
85
|
|
86
86
|
*source № 2*:
|
@@ -145,9 +145,141 @@ $fout.puts "</body>"
|
|
145
145
|
$fout.puts "</html>"
|
146
146
|
$fout.close
|
147
147
|
```
|
148
|
-
|
148
|
+
|
149
|
+
And add this code (*source № 4*) before `addstate` method call.
|
149
150
|
|
150
151
|
*source № 4*:
|
152
|
+
```ruby
|
153
|
+
#
|
154
|
+
# Add handlers for states.
|
155
|
+
#
|
156
|
+
ps_cline.init( method(:doc_init) )
|
157
|
+
ps_cline.handler( method(:doc_handler) )
|
158
|
+
ps_cline.fini( method(:doc_fini) )
|
159
|
+
|
160
|
+
ps_cblock.init( method(:doc_init) )
|
161
|
+
ps_cblock.handler( method(:doc_handler) )
|
162
|
+
ps_cblock.fini( method(:doc_fini) )
|
163
|
+
```
|
164
|
+
|
165
|
+
The result is a file with the following content.
|
166
|
+
|
167
|
+
*source № 5*:
|
168
|
+
```ruby
|
169
|
+
require 'iparser'
|
170
|
+
|
171
|
+
#
|
172
|
+
# Simple check startup arguments.
|
173
|
+
#
|
174
|
+
if( ARGV.size != 1 || !File.exist?(ARGV[0]) )
|
175
|
+
puts
|
176
|
+
puts "ERROR: unable to open file #{ARGV[0]}"
|
177
|
+
puts
|
178
|
+
exit
|
179
|
+
end
|
180
|
+
#
|
181
|
+
# Create output file.
|
182
|
+
#
|
183
|
+
$fout = File.new( 'index.html', 'w' )
|
184
|
+
|
185
|
+
#
|
186
|
+
# Create initializer method for parser-states.
|
187
|
+
#
|
188
|
+
def doc_init ( str )
|
189
|
+
$fout.print "<p>"
|
190
|
+
end
|
191
|
+
#
|
192
|
+
# Create handler method for parser-states.
|
193
|
+
#
|
194
|
+
def doc_handler ( c )
|
195
|
+
$fout.print c
|
196
|
+
end
|
197
|
+
#
|
198
|
+
# Create finalizer method for parser-states.
|
199
|
+
#
|
200
|
+
def doc_fini ( str )
|
201
|
+
$fout.puts "</p>"
|
202
|
+
end
|
203
|
+
|
204
|
+
#
|
205
|
+
# Create parser-machine object.
|
206
|
+
#
|
207
|
+
parser = Iparser::Machine.new
|
208
|
+
|
209
|
+
#
|
210
|
+
# Create startup state for this parser-machine.
|
211
|
+
#
|
212
|
+
ps_idle = Iparser::State.new('idle')
|
213
|
+
|
214
|
+
#
|
215
|
+
# Add branch indexes to 'comment-line' and 'comment-block' state.
|
216
|
+
#
|
217
|
+
ps_idle.branches << 1
|
218
|
+
ps_idle.branches << 2
|
219
|
+
|
220
|
+
#
|
221
|
+
# Create single line comment state for this parser-machine.
|
222
|
+
#
|
223
|
+
ps_cline = Iparser::State.new('comment-line')
|
224
|
+
ps_cline.entry << /\//
|
225
|
+
ps_cline.entry << /\//
|
226
|
+
ps_cline.entry << /\//
|
227
|
+
ps_cline.leave << /[\n\r]/
|
228
|
+
|
229
|
+
#
|
230
|
+
# Create multiline comment state for this parser-machine.
|
231
|
+
#
|
232
|
+
ps_cblock = Iparser::State.new('comment-block')
|
233
|
+
ps_cblock.entry << /\//
|
234
|
+
ps_cblock.entry << /\*/
|
235
|
+
ps_cblock.entry << /\*/
|
236
|
+
ps_cblock.leave << /\*/
|
237
|
+
ps_cblock.leave << /\//
|
238
|
+
ps_cblock.ignore << '*'
|
239
|
+
|
240
|
+
#
|
241
|
+
# Add handlers for states.
|
242
|
+
#
|
243
|
+
ps_cline.init( method(:doc_init) )
|
244
|
+
ps_cline.handler( method(:doc_handler) )
|
245
|
+
ps_cline.fini( method(:doc_fini) )
|
246
|
+
|
247
|
+
ps_cblock.init( method(:doc_init) )
|
248
|
+
ps_cblock.handler( method(:doc_handler) )
|
249
|
+
ps_cblock.fini( method(:doc_fini) )
|
250
|
+
|
251
|
+
#
|
252
|
+
# Add all states to parser-machine.
|
253
|
+
#
|
254
|
+
parser.addstate ps_idle
|
255
|
+
parser.addstate ps_cline
|
256
|
+
parser.addstate ps_cblock
|
257
|
+
|
258
|
+
#
|
259
|
+
# Call parser startup method.
|
260
|
+
#
|
261
|
+
parser.prestart
|
262
|
+
|
263
|
+
#
|
264
|
+
# Call interactive mode for check state-machine.
|
265
|
+
#
|
266
|
+
$fout.puts "<html>"
|
267
|
+
$fout.puts "<body>"
|
268
|
+
|
269
|
+
File.open( ARGV[0], 'r' ).each do |line|
|
270
|
+
line.each_char do |c|
|
271
|
+
parser.parse(c)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
$fout.puts "</body>"
|
276
|
+
$fout.puts "</html>"
|
277
|
+
$fout.close
|
278
|
+
```
|
279
|
+
|
280
|
+
Now developing of the simple parser has been finished. You can create test file, for example 'test.c':
|
281
|
+
|
282
|
+
*source № 6*:
|
151
283
|
```
|
152
284
|
#include <stdlib.h>
|
153
285
|
|
@@ -184,13 +316,15 @@ After work, we should see a file named 'index.html'.
|
|
184
316
|
Для чего введем строку символов `///` и увидим что наш парсер вывел `branch to <comment-line>`, это говорит
|
185
317
|
о том, что парсер перешол в состояние для обработки однострочных комментариев, т.е. в состояние `comment-line`.
|
186
318
|
Теперь введем `\n` или `\r` и увидим что парсер покинул состояние `comment-line` и вернулся в состояние `idle`.
|
187
|
-
Аналогично проведем проверку для всех оставшихся состояний.
|
319
|
+
Аналогично проведем проверку для всех оставшихся состояний. Для выхода из интерактивного режима просто введите
|
320
|
+
<Enter>, т.е. пустую строку.
|
188
321
|
|
189
322
|
**NOTE**: для ввода символа `'\'` необходимо набрать `'\\'`.
|
190
323
|
|
191
324
|
Если все переходы работают как мы и ожидали, то
|
192
325
|
можно перейти к написанию обработчиков наших состояний. Для этого допишем в наш скрипт код из *source № 2*
|
193
|
-
в начало файла и вместо строки `parser.interactive_parser` добавим код из *source № 3*.
|
326
|
+
в начало файла и вместо строки `parser.interactive_parser` добавим код из *source № 3* и *source № 4*.
|
327
|
+
В результате должен получится код как на *source № 5*.
|
194
328
|
|
195
329
|
Метод `doc_init` будет вызываться при входе в состояние, т.е. является конструктором состояния.
|
196
330
|
Метод `doc_handler` будет вызываться каждый раз, до тех пор пока парсер находится в состоянии `comment-line` или `comment-block`.
|
@@ -203,7 +337,7 @@ After work, we should see a file named 'index.html'.
|
|
203
337
|
Дополнительно для состояния `comment-block` мы указали символы, которые надо игнорировать,
|
204
338
|
а именно `'*'` и `doc_handler` не будет вызываться при наличия данного символа во входном потоке.
|
205
339
|
|
206
|
-
И наконец создадим тестовый файл с именем 'test.c' и наполним его содержимым из *source №
|
340
|
+
И наконец создадим тестовый файл с именем 'test.c' и наполним его содержимым из *source № 6*.
|
207
341
|
Наш простой парсер готов. Теперь запустим его набрав следующую команду:
|
208
342
|
|
209
343
|
$ ruby parser_example.rb test.c
|
data/lib/iparser/version.rb
CHANGED