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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +139 -5
  3. data/lib/iparser/version.rb +1 -1
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 74b3def90b2fb587ba964156f44d311a931f9978
4
- data.tar.gz: b6fa824918d59bcce6ec0867ef778c4b097b3475
3
+ metadata.gz: 3555749815afc60628a413163df6b49cd54df7d0
4
+ data.tar.gz: 06cdd3a7557d8a2177ca4824e7246836405040ff
5
5
  SHA512:
6
- metadata.gz: 8a56f7c33f4582f05e655ea0d1106d4e6f54ead2d57c274d6fb018ff942160ae2594df1b346b16ff5307ae0bb48adee902ee1b501f6e6589dd9c8f002f11a26b
7
- data.tar.gz: d3426a1e514372f664b8801caab325ebd66c3063c4c7732efe868daf3f5abec4d1285264dbaf9122a943d9d8ec016f2fdddb97178265e5d18ac0fc6808d0a309
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
- Now developing of the simple parser has been finished. You can create test file, for example 'test.c':
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 № 4*.
340
+ И наконец создадим тестовый файл с именем 'test.c' и наполним его содержимым из *source № 6*.
207
341
  Наш простой парсер готов. Теперь запустим его набрав следующую команду:
208
342
 
209
343
  $ ruby parser_example.rb test.c
@@ -1,3 +1,3 @@
1
1
  module Iparser
2
- VERSION = "1.1.1"
2
+ VERSION = "1.1.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - gera-gas