kpeg 0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,299 @@
1
+ require 'kpeg/position'
2
+
3
+ module KPeg
4
+ class CompiledParser
5
+
6
+ # Leave these markers in! They allow us to generate standalone
7
+ # code automatically!
8
+ #
9
+ # STANDALONE START
10
+ def setup_parser(str, debug=false)
11
+ @string = str
12
+ @pos = 0
13
+ @memoizations = Hash.new { |h,k| h[k] = {} }
14
+ @result = nil
15
+ @failed_rule = nil
16
+ @failing_rule_offset = -1
17
+
18
+ setup_foreign_grammar
19
+ end
20
+
21
+ def setup_foreign_grammar
22
+ end
23
+
24
+ # This is distinct from setup_parser so that a standalone parser
25
+ # can redefine #initialize and still have access to the proper
26
+ # parser setup code.
27
+ #
28
+ def initialize(str, debug=false)
29
+ setup_parser(str, debug)
30
+ end
31
+
32
+ attr_reader :string
33
+ attr_reader :result, :failing_rule_offset
34
+ attr_accessor :pos
35
+
36
+ include Position
37
+
38
+ def get_text(start)
39
+ @string[start..@pos-1]
40
+ end
41
+
42
+ def show_pos
43
+ width = 10
44
+ if @pos < width
45
+ "#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
46
+ else
47
+ "#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
48
+ end
49
+ end
50
+
51
+ def failure_info
52
+ l = current_line @failing_rule_offset
53
+ c = current_column @failing_rule_offset
54
+
55
+ if @failed_rule.kind_of? Symbol
56
+ info = self.class::Rules[@failed_rule]
57
+ "line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'"
58
+ else
59
+ "line #{l}, column #{c}: failed rule '#{@failed_rule}'"
60
+ end
61
+ end
62
+
63
+ def failure_caret
64
+ l = current_line @failing_rule_offset
65
+ c = current_column @failing_rule_offset
66
+
67
+ line = lines[l-1]
68
+ "#{line}\n#{' ' * (c - 1)}^"
69
+ end
70
+
71
+ def failure_character
72
+ l = current_line @failing_rule_offset
73
+ c = current_column @failing_rule_offset
74
+ lines[l-1][c-1, 1]
75
+ end
76
+
77
+ def failure_oneline
78
+ l = current_line @failing_rule_offset
79
+ c = current_column @failing_rule_offset
80
+
81
+ char = lines[l-1][c-1, 1]
82
+
83
+ if @failed_rule.kind_of? Symbol
84
+ info = self.class::Rules[@failed_rule]
85
+ "@#{l}:#{c} failed rule '#{info.name}', got '#{char}'"
86
+ else
87
+ "@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'"
88
+ end
89
+ end
90
+
91
+ class ParseError < RuntimeError
92
+ end
93
+
94
+ def raise_error
95
+ raise ParseError, failure_oneline
96
+ end
97
+
98
+ def show_error(io=STDOUT)
99
+ error_pos = @failing_rule_offset
100
+ line_no = current_line(error_pos)
101
+ col_no = current_column(error_pos)
102
+
103
+ io.puts "On line #{line_no}, column #{col_no}:"
104
+
105
+ if @failed_rule.kind_of? Symbol
106
+ info = self.class::Rules[@failed_rule]
107
+ io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')"
108
+ else
109
+ io.puts "Failed to match rule '#{@failed_rule}'"
110
+ end
111
+
112
+ io.puts "Got: #{string[error_pos,1].inspect}"
113
+ line = lines[line_no-1]
114
+ io.puts "=> #{line}"
115
+ io.print(" " * (col_no + 3))
116
+ io.puts "^"
117
+ end
118
+
119
+ def set_failed_rule(name)
120
+ if @pos > @failing_rule_offset
121
+ @failed_rule = name
122
+ @failing_rule_offset = @pos
123
+ end
124
+ end
125
+
126
+ attr_reader :failed_rule
127
+
128
+ def match_string(str)
129
+ len = str.size
130
+ if @string[pos,len] == str
131
+ @pos += len
132
+ return str
133
+ end
134
+
135
+ return nil
136
+ end
137
+
138
+ def scan(reg)
139
+ if m = reg.match(@string[@pos..-1])
140
+ width = m.end(0)
141
+ @pos += width
142
+ return true
143
+ end
144
+
145
+ return nil
146
+ end
147
+
148
+ if "".respond_to? :getbyte
149
+ def get_byte
150
+ if @pos >= @string.size
151
+ return nil
152
+ end
153
+
154
+ s = @string.getbyte @pos
155
+ @pos += 1
156
+ s
157
+ end
158
+ else
159
+ def get_byte
160
+ if @pos >= @string.size
161
+ return nil
162
+ end
163
+
164
+ s = @string[@pos]
165
+ @pos += 1
166
+ s
167
+ end
168
+ end
169
+
170
+ def parse(rule=nil)
171
+ if !rule
172
+ _root ? true : false
173
+ else
174
+ # This is not shared with code_generator.rb so this can be standalone
175
+ method = rule.gsub("-","_hyphen_")
176
+ __send__("_#{method}") ? true : false
177
+ end
178
+ end
179
+
180
+ class LeftRecursive
181
+ def initialize(detected=false)
182
+ @detected = detected
183
+ end
184
+
185
+ attr_accessor :detected
186
+ end
187
+
188
+ class MemoEntry
189
+ def initialize(ans, pos)
190
+ @ans = ans
191
+ @pos = pos
192
+ @uses = 1
193
+ @result = nil
194
+ end
195
+
196
+ attr_reader :ans, :pos, :uses, :result
197
+
198
+ def inc!
199
+ @uses += 1
200
+ end
201
+
202
+ def move!(ans, pos, result)
203
+ @ans = ans
204
+ @pos = pos
205
+ @result = result
206
+ end
207
+ end
208
+
209
+ def external_invoke(other, rule, *args)
210
+ old_pos = @pos
211
+ old_string = @string
212
+
213
+ @pos = other.pos
214
+ @string = other.string
215
+
216
+ begin
217
+ if val = __send__(rule, *args)
218
+ other.pos = @pos
219
+ else
220
+ other.set_failed_rule "#{self.class}##{rule}"
221
+ end
222
+ val
223
+ ensure
224
+ @pos = old_pos
225
+ @string = old_string
226
+ end
227
+ end
228
+
229
+ def apply(rule)
230
+ if m = @memoizations[rule][@pos]
231
+ m.inc!
232
+
233
+ prev = @pos
234
+ @pos = m.pos
235
+ if m.ans.kind_of? LeftRecursive
236
+ m.ans.detected = true
237
+ return nil
238
+ end
239
+
240
+ @result = m.result
241
+
242
+ return m.ans
243
+ else
244
+ lr = LeftRecursive.new(false)
245
+ m = MemoEntry.new(lr, @pos)
246
+ @memoizations[rule][@pos] = m
247
+ start_pos = @pos
248
+
249
+ ans = __send__ rule
250
+
251
+ m.move! ans, @pos, @result
252
+
253
+ # Don't bother trying to grow the left recursion
254
+ # if it's failing straight away (thus there is no seed)
255
+ if ans and lr.detected
256
+ return grow_lr(rule, start_pos, m)
257
+ else
258
+ return ans
259
+ end
260
+
261
+ return ans
262
+ end
263
+ end
264
+
265
+ def grow_lr(rule, start_pos, m)
266
+ while true
267
+ @pos = start_pos
268
+ @result = m.result
269
+
270
+ ans = __send__ rule
271
+ return nil unless ans
272
+
273
+ break if @pos <= m.pos
274
+
275
+ m.move! ans, @pos, @result
276
+ end
277
+
278
+ @result = m.result
279
+ @pos = m.pos
280
+ return m.ans
281
+ end
282
+
283
+ class RuleInfo
284
+ def initialize(name, rendered)
285
+ @name = name
286
+ @rendered = rendered
287
+ end
288
+
289
+ attr_reader :name, :rendered
290
+ end
291
+
292
+ def self.rule_info(name, rendered)
293
+ RuleInfo.new(name, rendered)
294
+ end
295
+
296
+ # STANDALONE END
297
+
298
+ end
299
+ end
@@ -0,0 +1,2440 @@
1
+ class KPeg::FormatParser
2
+ # STANDALONE START
3
+ def setup_parser(str, debug=false)
4
+ @string = str
5
+ @pos = 0
6
+ @memoizations = Hash.new { |h,k| h[k] = {} }
7
+ @result = nil
8
+ @failed_rule = nil
9
+ @failing_rule_offset = -1
10
+
11
+ setup_foreign_grammar
12
+ end
13
+
14
+ def setup_foreign_grammar
15
+ end
16
+
17
+ # This is distinct from setup_parser so that a standalone parser
18
+ # can redefine #initialize and still have access to the proper
19
+ # parser setup code.
20
+ #
21
+ def initialize(str, debug=false)
22
+ setup_parser(str, debug)
23
+ end
24
+
25
+ attr_reader :string
26
+ attr_reader :result, :failing_rule_offset
27
+ attr_accessor :pos
28
+
29
+ # STANDALONE START
30
+ def current_column(target=pos)
31
+ if c = string.rindex("\n", target-1)
32
+ return target - c - 1
33
+ end
34
+
35
+ target + 1
36
+ end
37
+
38
+ def current_line(target=pos)
39
+ cur_offset = 0
40
+ cur_line = 0
41
+
42
+ string.each_line do |line|
43
+ cur_line += 1
44
+ cur_offset += line.size
45
+ return cur_line if cur_offset >= target
46
+ end
47
+
48
+ -1
49
+ end
50
+
51
+ def lines
52
+ lines = []
53
+ string.each_line { |l| lines << l }
54
+ lines
55
+ end
56
+
57
+ #
58
+
59
+ def get_text(start)
60
+ @string[start..@pos-1]
61
+ end
62
+
63
+ def show_pos
64
+ width = 10
65
+ if @pos < width
66
+ "#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
67
+ else
68
+ "#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
69
+ end
70
+ end
71
+
72
+ def failure_info
73
+ l = current_line @failing_rule_offset
74
+ c = current_column @failing_rule_offset
75
+
76
+ if @failed_rule.kind_of? Symbol
77
+ info = self.class::Rules[@failed_rule]
78
+ "line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'"
79
+ else
80
+ "line #{l}, column #{c}: failed rule '#{@failed_rule}'"
81
+ end
82
+ end
83
+
84
+ def failure_caret
85
+ l = current_line @failing_rule_offset
86
+ c = current_column @failing_rule_offset
87
+
88
+ line = lines[l-1]
89
+ "#{line}\n#{' ' * (c - 1)}^"
90
+ end
91
+
92
+ def failure_character
93
+ l = current_line @failing_rule_offset
94
+ c = current_column @failing_rule_offset
95
+ lines[l-1][c-1, 1]
96
+ end
97
+
98
+ def failure_oneline
99
+ l = current_line @failing_rule_offset
100
+ c = current_column @failing_rule_offset
101
+
102
+ char = lines[l-1][c-1, 1]
103
+
104
+ if @failed_rule.kind_of? Symbol
105
+ info = self.class::Rules[@failed_rule]
106
+ "@#{l}:#{c} failed rule '#{info.name}', got '#{char}'"
107
+ else
108
+ "@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'"
109
+ end
110
+ end
111
+
112
+ class ParseError < RuntimeError
113
+ end
114
+
115
+ def raise_error
116
+ raise ParseError, failure_oneline
117
+ end
118
+
119
+ def show_error(io=STDOUT)
120
+ error_pos = @failing_rule_offset
121
+ line_no = current_line(error_pos)
122
+ col_no = current_column(error_pos)
123
+
124
+ io.puts "On line #{line_no}, column #{col_no}:"
125
+
126
+ if @failed_rule.kind_of? Symbol
127
+ info = self.class::Rules[@failed_rule]
128
+ io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')"
129
+ else
130
+ io.puts "Failed to match rule '#{@failed_rule}'"
131
+ end
132
+
133
+ io.puts "Got: #{string[error_pos,1].inspect}"
134
+ line = lines[line_no-1]
135
+ io.puts "=> #{line}"
136
+ io.print(" " * (col_no + 3))
137
+ io.puts "^"
138
+ end
139
+
140
+ def set_failed_rule(name)
141
+ if @pos > @failing_rule_offset
142
+ @failed_rule = name
143
+ @failing_rule_offset = @pos
144
+ end
145
+ end
146
+
147
+ attr_reader :failed_rule
148
+
149
+ def match_string(str)
150
+ len = str.size
151
+ if @string[pos,len] == str
152
+ @pos += len
153
+ return str
154
+ end
155
+
156
+ return nil
157
+ end
158
+
159
+ def scan(reg)
160
+ if m = reg.match(@string[@pos..-1])
161
+ width = m.end(0)
162
+ @pos += width
163
+ return true
164
+ end
165
+
166
+ return nil
167
+ end
168
+
169
+ if "".respond_to? :getbyte
170
+ def get_byte
171
+ if @pos >= @string.size
172
+ return nil
173
+ end
174
+
175
+ s = @string.getbyte @pos
176
+ @pos += 1
177
+ s
178
+ end
179
+ else
180
+ def get_byte
181
+ if @pos >= @string.size
182
+ return nil
183
+ end
184
+
185
+ s = @string[@pos]
186
+ @pos += 1
187
+ s
188
+ end
189
+ end
190
+
191
+ def parse(rule=nil)
192
+ if !rule
193
+ _root ? true : false
194
+ else
195
+ # This is not shared with code_generator.rb so this can be standalone
196
+ method = rule.gsub("-","_hyphen_")
197
+ __send__("_#{method}") ? true : false
198
+ end
199
+ end
200
+
201
+ class LeftRecursive
202
+ def initialize(detected=false)
203
+ @detected = detected
204
+ end
205
+
206
+ attr_accessor :detected
207
+ end
208
+
209
+ class MemoEntry
210
+ def initialize(ans, pos)
211
+ @ans = ans
212
+ @pos = pos
213
+ @uses = 1
214
+ @result = nil
215
+ end
216
+
217
+ attr_reader :ans, :pos, :uses, :result
218
+
219
+ def inc!
220
+ @uses += 1
221
+ end
222
+
223
+ def move!(ans, pos, result)
224
+ @ans = ans
225
+ @pos = pos
226
+ @result = result
227
+ end
228
+ end
229
+
230
+ def external_invoke(other, rule, *args)
231
+ old_pos = @pos
232
+ old_string = @string
233
+
234
+ @pos = other.pos
235
+ @string = other.string
236
+
237
+ begin
238
+ if val = __send__(rule, *args)
239
+ other.pos = @pos
240
+ else
241
+ other.set_failed_rule "#{self.class}##{rule}"
242
+ end
243
+ val
244
+ ensure
245
+ @pos = old_pos
246
+ @string = old_string
247
+ end
248
+ end
249
+
250
+ def apply(rule)
251
+ if m = @memoizations[rule][@pos]
252
+ m.inc!
253
+
254
+ prev = @pos
255
+ @pos = m.pos
256
+ if m.ans.kind_of? LeftRecursive
257
+ m.ans.detected = true
258
+ return nil
259
+ end
260
+
261
+ @result = m.result
262
+
263
+ return m.ans
264
+ else
265
+ lr = LeftRecursive.new(false)
266
+ m = MemoEntry.new(lr, @pos)
267
+ @memoizations[rule][@pos] = m
268
+ start_pos = @pos
269
+
270
+ ans = __send__ rule
271
+
272
+ m.move! ans, @pos, @result
273
+
274
+ # Don't bother trying to grow the left recursion
275
+ # if it's failing straight away (thus there is no seed)
276
+ if ans and lr.detected
277
+ return grow_lr(rule, start_pos, m)
278
+ else
279
+ return ans
280
+ end
281
+
282
+ return ans
283
+ end
284
+ end
285
+
286
+ def grow_lr(rule, start_pos, m)
287
+ while true
288
+ @pos = start_pos
289
+ @result = m.result
290
+
291
+ ans = __send__ rule
292
+ return nil unless ans
293
+
294
+ break if @pos <= m.pos
295
+
296
+ m.move! ans, @pos, @result
297
+ end
298
+
299
+ @result = m.result
300
+ @pos = m.pos
301
+ return m.ans
302
+ end
303
+
304
+ class RuleInfo
305
+ def initialize(name, rendered)
306
+ @name = name
307
+ @rendered = rendered
308
+ end
309
+
310
+ attr_reader :name, :rendered
311
+ end
312
+
313
+ def self.rule_info(name, rendered)
314
+ RuleInfo.new(name, rendered)
315
+ end
316
+
317
+ #
318
+
319
+
320
+ require 'kpeg/grammar'
321
+
322
+ def initialize(str, debug=false)
323
+ setup_parser(str, debug)
324
+ @g = KPeg::Grammar.new
325
+ end
326
+
327
+ attr_reader :g
328
+ alias_method :grammar, :g
329
+
330
+
331
+ def setup_foreign_grammar; end
332
+
333
+ # eol = "\n"
334
+ def _eol
335
+ _tmp = match_string("\n")
336
+ set_failed_rule :_eol unless _tmp
337
+ return _tmp
338
+ end
339
+
340
+ # comment = "#" (!eol .)* eol
341
+ def _comment
342
+
343
+ _save = self.pos
344
+ while true # sequence
345
+ _tmp = match_string("#")
346
+ unless _tmp
347
+ self.pos = _save
348
+ break
349
+ end
350
+ while true
351
+
352
+ _save2 = self.pos
353
+ while true # sequence
354
+ _save3 = self.pos
355
+ _tmp = apply(:_eol)
356
+ _tmp = _tmp ? nil : true
357
+ self.pos = _save3
358
+ unless _tmp
359
+ self.pos = _save2
360
+ break
361
+ end
362
+ _tmp = get_byte
363
+ unless _tmp
364
+ self.pos = _save2
365
+ end
366
+ break
367
+ end # end sequence
368
+
369
+ break unless _tmp
370
+ end
371
+ _tmp = true
372
+ unless _tmp
373
+ self.pos = _save
374
+ break
375
+ end
376
+ _tmp = apply(:_eol)
377
+ unless _tmp
378
+ self.pos = _save
379
+ end
380
+ break
381
+ end # end sequence
382
+
383
+ set_failed_rule :_comment unless _tmp
384
+ return _tmp
385
+ end
386
+
387
+ # space = (" " | "\t" | eol)
388
+ def _space
389
+
390
+ _save = self.pos
391
+ while true # choice
392
+ _tmp = match_string(" ")
393
+ break if _tmp
394
+ self.pos = _save
395
+ _tmp = match_string("\t")
396
+ break if _tmp
397
+ self.pos = _save
398
+ _tmp = apply(:_eol)
399
+ break if _tmp
400
+ self.pos = _save
401
+ break
402
+ end # end choice
403
+
404
+ set_failed_rule :_space unless _tmp
405
+ return _tmp
406
+ end
407
+
408
+ # - = (space | comment)*
409
+ def __hyphen_
410
+ while true
411
+
412
+ _save1 = self.pos
413
+ while true # choice
414
+ _tmp = apply(:_space)
415
+ break if _tmp
416
+ self.pos = _save1
417
+ _tmp = apply(:_comment)
418
+ break if _tmp
419
+ self.pos = _save1
420
+ break
421
+ end # end choice
422
+
423
+ break unless _tmp
424
+ end
425
+ _tmp = true
426
+ set_failed_rule :__hyphen_ unless _tmp
427
+ return _tmp
428
+ end
429
+
430
+ # var = < ("-" | /[a-zA-Z][\-_a-zA-Z0-9]*/) > { text }
431
+ def _var
432
+
433
+ _save = self.pos
434
+ while true # sequence
435
+ _text_start = self.pos
436
+
437
+ _save1 = self.pos
438
+ while true # choice
439
+ _tmp = match_string("-")
440
+ break if _tmp
441
+ self.pos = _save1
442
+ _tmp = scan(/\A(?-mix:[a-zA-Z][\-_a-zA-Z0-9]*)/)
443
+ break if _tmp
444
+ self.pos = _save1
445
+ break
446
+ end # end choice
447
+
448
+ if _tmp
449
+ text = get_text(_text_start)
450
+ end
451
+ unless _tmp
452
+ self.pos = _save
453
+ break
454
+ end
455
+ @result = begin; text ; end
456
+ _tmp = true
457
+ unless _tmp
458
+ self.pos = _save
459
+ end
460
+ break
461
+ end # end sequence
462
+
463
+ set_failed_rule :_var unless _tmp
464
+ return _tmp
465
+ end
466
+
467
+ # dbl_escapes = ("\\\"" { '"' } | "\\n" { "\n" } | "\\t" { "\t" } | "\\b" { "\b" } | "\\\\" { "\\" })
468
+ def _dbl_escapes
469
+
470
+ _save = self.pos
471
+ while true # choice
472
+
473
+ _save1 = self.pos
474
+ while true # sequence
475
+ _tmp = match_string("\\\"")
476
+ unless _tmp
477
+ self.pos = _save1
478
+ break
479
+ end
480
+ @result = begin; '"' ; end
481
+ _tmp = true
482
+ unless _tmp
483
+ self.pos = _save1
484
+ end
485
+ break
486
+ end # end sequence
487
+
488
+ break if _tmp
489
+ self.pos = _save
490
+
491
+ _save2 = self.pos
492
+ while true # sequence
493
+ _tmp = match_string("\\n")
494
+ unless _tmp
495
+ self.pos = _save2
496
+ break
497
+ end
498
+ @result = begin; "\n" ; end
499
+ _tmp = true
500
+ unless _tmp
501
+ self.pos = _save2
502
+ end
503
+ break
504
+ end # end sequence
505
+
506
+ break if _tmp
507
+ self.pos = _save
508
+
509
+ _save3 = self.pos
510
+ while true # sequence
511
+ _tmp = match_string("\\t")
512
+ unless _tmp
513
+ self.pos = _save3
514
+ break
515
+ end
516
+ @result = begin; "\t" ; end
517
+ _tmp = true
518
+ unless _tmp
519
+ self.pos = _save3
520
+ end
521
+ break
522
+ end # end sequence
523
+
524
+ break if _tmp
525
+ self.pos = _save
526
+
527
+ _save4 = self.pos
528
+ while true # sequence
529
+ _tmp = match_string("\\b")
530
+ unless _tmp
531
+ self.pos = _save4
532
+ break
533
+ end
534
+ @result = begin; "\b" ; end
535
+ _tmp = true
536
+ unless _tmp
537
+ self.pos = _save4
538
+ end
539
+ break
540
+ end # end sequence
541
+
542
+ break if _tmp
543
+ self.pos = _save
544
+
545
+ _save5 = self.pos
546
+ while true # sequence
547
+ _tmp = match_string("\\\\")
548
+ unless _tmp
549
+ self.pos = _save5
550
+ break
551
+ end
552
+ @result = begin; "\\" ; end
553
+ _tmp = true
554
+ unless _tmp
555
+ self.pos = _save5
556
+ end
557
+ break
558
+ end # end sequence
559
+
560
+ break if _tmp
561
+ self.pos = _save
562
+ break
563
+ end # end choice
564
+
565
+ set_failed_rule :_dbl_escapes unless _tmp
566
+ return _tmp
567
+ end
568
+
569
+ # dbl_seq = < /[^\\"]+/ > { text }
570
+ def _dbl_seq
571
+
572
+ _save = self.pos
573
+ while true # sequence
574
+ _text_start = self.pos
575
+ _tmp = scan(/\A(?-mix:[^\\"]+)/)
576
+ if _tmp
577
+ text = get_text(_text_start)
578
+ end
579
+ unless _tmp
580
+ self.pos = _save
581
+ break
582
+ end
583
+ @result = begin; text ; end
584
+ _tmp = true
585
+ unless _tmp
586
+ self.pos = _save
587
+ end
588
+ break
589
+ end # end sequence
590
+
591
+ set_failed_rule :_dbl_seq unless _tmp
592
+ return _tmp
593
+ end
594
+
595
+ # dbl_not_quote = (dbl_escapes:s | dbl_seq:s)+:ary { ary }
596
+ def _dbl_not_quote
597
+
598
+ _save = self.pos
599
+ while true # sequence
600
+ _save1 = self.pos
601
+ _ary = []
602
+
603
+ _save2 = self.pos
604
+ while true # choice
605
+ _tmp = apply(:_dbl_escapes)
606
+ s = @result
607
+ break if _tmp
608
+ self.pos = _save2
609
+ _tmp = apply(:_dbl_seq)
610
+ s = @result
611
+ break if _tmp
612
+ self.pos = _save2
613
+ break
614
+ end # end choice
615
+
616
+ if _tmp
617
+ _ary << @result
618
+ while true
619
+
620
+ _save3 = self.pos
621
+ while true # choice
622
+ _tmp = apply(:_dbl_escapes)
623
+ s = @result
624
+ break if _tmp
625
+ self.pos = _save3
626
+ _tmp = apply(:_dbl_seq)
627
+ s = @result
628
+ break if _tmp
629
+ self.pos = _save3
630
+ break
631
+ end # end choice
632
+
633
+ _ary << @result if _tmp
634
+ break unless _tmp
635
+ end
636
+ _tmp = true
637
+ @result = _ary
638
+ else
639
+ self.pos = _save1
640
+ end
641
+ ary = @result
642
+ unless _tmp
643
+ self.pos = _save
644
+ break
645
+ end
646
+ @result = begin; ary ; end
647
+ _tmp = true
648
+ unless _tmp
649
+ self.pos = _save
650
+ end
651
+ break
652
+ end # end sequence
653
+
654
+ set_failed_rule :_dbl_not_quote unless _tmp
655
+ return _tmp
656
+ end
657
+
658
+ # dbl_string = "\"" dbl_not_quote:s "\"" { @g.str(s.join) }
659
+ def _dbl_string
660
+
661
+ _save = self.pos
662
+ while true # sequence
663
+ _tmp = match_string("\"")
664
+ unless _tmp
665
+ self.pos = _save
666
+ break
667
+ end
668
+ _tmp = apply(:_dbl_not_quote)
669
+ s = @result
670
+ unless _tmp
671
+ self.pos = _save
672
+ break
673
+ end
674
+ _tmp = match_string("\"")
675
+ unless _tmp
676
+ self.pos = _save
677
+ break
678
+ end
679
+ @result = begin; @g.str(s.join) ; end
680
+ _tmp = true
681
+ unless _tmp
682
+ self.pos = _save
683
+ end
684
+ break
685
+ end # end sequence
686
+
687
+ set_failed_rule :_dbl_string unless _tmp
688
+ return _tmp
689
+ end
690
+
691
+ # sgl_escape_quote = "\\'" { "'" }
692
+ def _sgl_escape_quote
693
+
694
+ _save = self.pos
695
+ while true # sequence
696
+ _tmp = match_string("\\'")
697
+ unless _tmp
698
+ self.pos = _save
699
+ break
700
+ end
701
+ @result = begin; "'" ; end
702
+ _tmp = true
703
+ unless _tmp
704
+ self.pos = _save
705
+ end
706
+ break
707
+ end # end sequence
708
+
709
+ set_failed_rule :_sgl_escape_quote unless _tmp
710
+ return _tmp
711
+ end
712
+
713
+ # sgl_seq = < /[^']/ > { text }
714
+ def _sgl_seq
715
+
716
+ _save = self.pos
717
+ while true # sequence
718
+ _text_start = self.pos
719
+ _tmp = scan(/\A(?-mix:[^'])/)
720
+ if _tmp
721
+ text = get_text(_text_start)
722
+ end
723
+ unless _tmp
724
+ self.pos = _save
725
+ break
726
+ end
727
+ @result = begin; text ; end
728
+ _tmp = true
729
+ unless _tmp
730
+ self.pos = _save
731
+ end
732
+ break
733
+ end # end sequence
734
+
735
+ set_failed_rule :_sgl_seq unless _tmp
736
+ return _tmp
737
+ end
738
+
739
+ # sgl_not_quote = (sgl_escape_quote | sgl_seq)+:segs { segs.join }
740
+ def _sgl_not_quote
741
+
742
+ _save = self.pos
743
+ while true # sequence
744
+ _save1 = self.pos
745
+ _ary = []
746
+
747
+ _save2 = self.pos
748
+ while true # choice
749
+ _tmp = apply(:_sgl_escape_quote)
750
+ break if _tmp
751
+ self.pos = _save2
752
+ _tmp = apply(:_sgl_seq)
753
+ break if _tmp
754
+ self.pos = _save2
755
+ break
756
+ end # end choice
757
+
758
+ if _tmp
759
+ _ary << @result
760
+ while true
761
+
762
+ _save3 = self.pos
763
+ while true # choice
764
+ _tmp = apply(:_sgl_escape_quote)
765
+ break if _tmp
766
+ self.pos = _save3
767
+ _tmp = apply(:_sgl_seq)
768
+ break if _tmp
769
+ self.pos = _save3
770
+ break
771
+ end # end choice
772
+
773
+ _ary << @result if _tmp
774
+ break unless _tmp
775
+ end
776
+ _tmp = true
777
+ @result = _ary
778
+ else
779
+ self.pos = _save1
780
+ end
781
+ segs = @result
782
+ unless _tmp
783
+ self.pos = _save
784
+ break
785
+ end
786
+ @result = begin; segs.join ; end
787
+ _tmp = true
788
+ unless _tmp
789
+ self.pos = _save
790
+ end
791
+ break
792
+ end # end sequence
793
+
794
+ set_failed_rule :_sgl_not_quote unless _tmp
795
+ return _tmp
796
+ end
797
+
798
+ # sgl_string = "'" sgl_not_quote:s "'" { @g.str(s) }
799
+ def _sgl_string
800
+
801
+ _save = self.pos
802
+ while true # sequence
803
+ _tmp = match_string("'")
804
+ unless _tmp
805
+ self.pos = _save
806
+ break
807
+ end
808
+ _tmp = apply(:_sgl_not_quote)
809
+ s = @result
810
+ unless _tmp
811
+ self.pos = _save
812
+ break
813
+ end
814
+ _tmp = match_string("'")
815
+ unless _tmp
816
+ self.pos = _save
817
+ break
818
+ end
819
+ @result = begin; @g.str(s) ; end
820
+ _tmp = true
821
+ unless _tmp
822
+ self.pos = _save
823
+ end
824
+ break
825
+ end # end sequence
826
+
827
+ set_failed_rule :_sgl_string unless _tmp
828
+ return _tmp
829
+ end
830
+
831
+ # string = (dbl_string | sgl_string)
832
+ def _string
833
+
834
+ _save = self.pos
835
+ while true # choice
836
+ _tmp = apply(:_dbl_string)
837
+ break if _tmp
838
+ self.pos = _save
839
+ _tmp = apply(:_sgl_string)
840
+ break if _tmp
841
+ self.pos = _save
842
+ break
843
+ end # end choice
844
+
845
+ set_failed_rule :_string unless _tmp
846
+ return _tmp
847
+ end
848
+
849
+ # not_slash = < ("\\/" | /[^\/]/)+ > { text }
850
+ def _not_slash
851
+
852
+ _save = self.pos
853
+ while true # sequence
854
+ _text_start = self.pos
855
+ _save1 = self.pos
856
+
857
+ _save2 = self.pos
858
+ while true # choice
859
+ _tmp = match_string("\\/")
860
+ break if _tmp
861
+ self.pos = _save2
862
+ _tmp = scan(/\A(?-mix:[^\/])/)
863
+ break if _tmp
864
+ self.pos = _save2
865
+ break
866
+ end # end choice
867
+
868
+ if _tmp
869
+ while true
870
+
871
+ _save3 = self.pos
872
+ while true # choice
873
+ _tmp = match_string("\\/")
874
+ break if _tmp
875
+ self.pos = _save3
876
+ _tmp = scan(/\A(?-mix:[^\/])/)
877
+ break if _tmp
878
+ self.pos = _save3
879
+ break
880
+ end # end choice
881
+
882
+ break unless _tmp
883
+ end
884
+ _tmp = true
885
+ else
886
+ self.pos = _save1
887
+ end
888
+ if _tmp
889
+ text = get_text(_text_start)
890
+ end
891
+ unless _tmp
892
+ self.pos = _save
893
+ break
894
+ end
895
+ @result = begin; text ; end
896
+ _tmp = true
897
+ unless _tmp
898
+ self.pos = _save
899
+ end
900
+ break
901
+ end # end sequence
902
+
903
+ set_failed_rule :_not_slash unless _tmp
904
+ return _tmp
905
+ end
906
+
907
+ # regexp_opts = < [a-z]* > { text }
908
+ def _regexp_opts
909
+
910
+ _save = self.pos
911
+ while true # sequence
912
+ _text_start = self.pos
913
+ while true
914
+ _save2 = self.pos
915
+ _tmp = get_byte
916
+ if _tmp
917
+ unless _tmp >= 97 and _tmp <= 122
918
+ self.pos = _save2
919
+ _tmp = nil
920
+ end
921
+ end
922
+ break unless _tmp
923
+ end
924
+ _tmp = true
925
+ if _tmp
926
+ text = get_text(_text_start)
927
+ end
928
+ unless _tmp
929
+ self.pos = _save
930
+ break
931
+ end
932
+ @result = begin; text ; end
933
+ _tmp = true
934
+ unless _tmp
935
+ self.pos = _save
936
+ end
937
+ break
938
+ end # end sequence
939
+
940
+ set_failed_rule :_regexp_opts unless _tmp
941
+ return _tmp
942
+ end
943
+
944
+ # regexp = "/" not_slash:body "/" regexp_opts:opts { @g.reg body, opts }
945
+ def _regexp
946
+
947
+ _save = self.pos
948
+ while true # sequence
949
+ _tmp = match_string("/")
950
+ unless _tmp
951
+ self.pos = _save
952
+ break
953
+ end
954
+ _tmp = apply(:_not_slash)
955
+ body = @result
956
+ unless _tmp
957
+ self.pos = _save
958
+ break
959
+ end
960
+ _tmp = match_string("/")
961
+ unless _tmp
962
+ self.pos = _save
963
+ break
964
+ end
965
+ _tmp = apply(:_regexp_opts)
966
+ opts = @result
967
+ unless _tmp
968
+ self.pos = _save
969
+ break
970
+ end
971
+ @result = begin; @g.reg body, opts ; end
972
+ _tmp = true
973
+ unless _tmp
974
+ self.pos = _save
975
+ end
976
+ break
977
+ end # end sequence
978
+
979
+ set_failed_rule :_regexp unless _tmp
980
+ return _tmp
981
+ end
982
+
983
+ # char = < /[a-zA-Z0-9]/ > { text }
984
+ def _char
985
+
986
+ _save = self.pos
987
+ while true # sequence
988
+ _text_start = self.pos
989
+ _tmp = scan(/\A(?-mix:[a-zA-Z0-9])/)
990
+ if _tmp
991
+ text = get_text(_text_start)
992
+ end
993
+ unless _tmp
994
+ self.pos = _save
995
+ break
996
+ end
997
+ @result = begin; text ; end
998
+ _tmp = true
999
+ unless _tmp
1000
+ self.pos = _save
1001
+ end
1002
+ break
1003
+ end # end sequence
1004
+
1005
+ set_failed_rule :_char unless _tmp
1006
+ return _tmp
1007
+ end
1008
+
1009
+ # char_range = "[" char:l "-" char:r "]" { @g.range(l,r) }
1010
+ def _char_range
1011
+
1012
+ _save = self.pos
1013
+ while true # sequence
1014
+ _tmp = match_string("[")
1015
+ unless _tmp
1016
+ self.pos = _save
1017
+ break
1018
+ end
1019
+ _tmp = apply(:_char)
1020
+ l = @result
1021
+ unless _tmp
1022
+ self.pos = _save
1023
+ break
1024
+ end
1025
+ _tmp = match_string("-")
1026
+ unless _tmp
1027
+ self.pos = _save
1028
+ break
1029
+ end
1030
+ _tmp = apply(:_char)
1031
+ r = @result
1032
+ unless _tmp
1033
+ self.pos = _save
1034
+ break
1035
+ end
1036
+ _tmp = match_string("]")
1037
+ unless _tmp
1038
+ self.pos = _save
1039
+ break
1040
+ end
1041
+ @result = begin; @g.range(l,r) ; end
1042
+ _tmp = true
1043
+ unless _tmp
1044
+ self.pos = _save
1045
+ end
1046
+ break
1047
+ end # end sequence
1048
+
1049
+ set_failed_rule :_char_range unless _tmp
1050
+ return _tmp
1051
+ end
1052
+
1053
+ # range_elem = < /([1-9][0-9]*)|\*/ > { text }
1054
+ def _range_elem
1055
+
1056
+ _save = self.pos
1057
+ while true # sequence
1058
+ _text_start = self.pos
1059
+ _tmp = scan(/\A(?-mix:([1-9][0-9]*)|\*)/)
1060
+ if _tmp
1061
+ text = get_text(_text_start)
1062
+ end
1063
+ unless _tmp
1064
+ self.pos = _save
1065
+ break
1066
+ end
1067
+ @result = begin; text ; end
1068
+ _tmp = true
1069
+ unless _tmp
1070
+ self.pos = _save
1071
+ end
1072
+ break
1073
+ end # end sequence
1074
+
1075
+ set_failed_rule :_range_elem unless _tmp
1076
+ return _tmp
1077
+ end
1078
+
1079
+ # mult_range = "[" - range_elem:l - "," - range_elem:r - "]" { [l == "*" ? nil : l.to_i, r == "*" ? nil : r.to_i] }
1080
+ def _mult_range
1081
+
1082
+ _save = self.pos
1083
+ while true # sequence
1084
+ _tmp = match_string("[")
1085
+ unless _tmp
1086
+ self.pos = _save
1087
+ break
1088
+ end
1089
+ _tmp = apply(:__hyphen_)
1090
+ unless _tmp
1091
+ self.pos = _save
1092
+ break
1093
+ end
1094
+ _tmp = apply(:_range_elem)
1095
+ l = @result
1096
+ unless _tmp
1097
+ self.pos = _save
1098
+ break
1099
+ end
1100
+ _tmp = apply(:__hyphen_)
1101
+ unless _tmp
1102
+ self.pos = _save
1103
+ break
1104
+ end
1105
+ _tmp = match_string(",")
1106
+ unless _tmp
1107
+ self.pos = _save
1108
+ break
1109
+ end
1110
+ _tmp = apply(:__hyphen_)
1111
+ unless _tmp
1112
+ self.pos = _save
1113
+ break
1114
+ end
1115
+ _tmp = apply(:_range_elem)
1116
+ r = @result
1117
+ unless _tmp
1118
+ self.pos = _save
1119
+ break
1120
+ end
1121
+ _tmp = apply(:__hyphen_)
1122
+ unless _tmp
1123
+ self.pos = _save
1124
+ break
1125
+ end
1126
+ _tmp = match_string("]")
1127
+ unless _tmp
1128
+ self.pos = _save
1129
+ break
1130
+ end
1131
+ @result = begin; [l == "*" ? nil : l.to_i, r == "*" ? nil : r.to_i] ; end
1132
+ _tmp = true
1133
+ unless _tmp
1134
+ self.pos = _save
1135
+ end
1136
+ break
1137
+ end # end sequence
1138
+
1139
+ set_failed_rule :_mult_range unless _tmp
1140
+ return _tmp
1141
+ end
1142
+
1143
+ # curly_block = curly
1144
+ def _curly_block
1145
+ _tmp = apply(:_curly)
1146
+ set_failed_rule :_curly_block unless _tmp
1147
+ return _tmp
1148
+ end
1149
+
1150
+ # curly = "{" < (/[^{}]+/ | curly)* > "}" { @g.action(text) }
1151
+ def _curly
1152
+
1153
+ _save = self.pos
1154
+ while true # sequence
1155
+ _tmp = match_string("{")
1156
+ unless _tmp
1157
+ self.pos = _save
1158
+ break
1159
+ end
1160
+ _text_start = self.pos
1161
+ while true
1162
+
1163
+ _save2 = self.pos
1164
+ while true # choice
1165
+ _tmp = scan(/\A(?-mix:[^{}]+)/)
1166
+ break if _tmp
1167
+ self.pos = _save2
1168
+ _tmp = apply(:_curly)
1169
+ break if _tmp
1170
+ self.pos = _save2
1171
+ break
1172
+ end # end choice
1173
+
1174
+ break unless _tmp
1175
+ end
1176
+ _tmp = true
1177
+ if _tmp
1178
+ text = get_text(_text_start)
1179
+ end
1180
+ unless _tmp
1181
+ self.pos = _save
1182
+ break
1183
+ end
1184
+ _tmp = match_string("}")
1185
+ unless _tmp
1186
+ self.pos = _save
1187
+ break
1188
+ end
1189
+ @result = begin; @g.action(text) ; end
1190
+ _tmp = true
1191
+ unless _tmp
1192
+ self.pos = _save
1193
+ end
1194
+ break
1195
+ end # end sequence
1196
+
1197
+ set_failed_rule :_curly unless _tmp
1198
+ return _tmp
1199
+ end
1200
+
1201
+ # nested_paren = "(" (/[^()]+/ | nested_paren)* ")"
1202
+ def _nested_paren
1203
+
1204
+ _save = self.pos
1205
+ while true # sequence
1206
+ _tmp = match_string("(")
1207
+ unless _tmp
1208
+ self.pos = _save
1209
+ break
1210
+ end
1211
+ while true
1212
+
1213
+ _save2 = self.pos
1214
+ while true # choice
1215
+ _tmp = scan(/\A(?-mix:[^()]+)/)
1216
+ break if _tmp
1217
+ self.pos = _save2
1218
+ _tmp = apply(:_nested_paren)
1219
+ break if _tmp
1220
+ self.pos = _save2
1221
+ break
1222
+ end # end choice
1223
+
1224
+ break unless _tmp
1225
+ end
1226
+ _tmp = true
1227
+ unless _tmp
1228
+ self.pos = _save
1229
+ break
1230
+ end
1231
+ _tmp = match_string(")")
1232
+ unless _tmp
1233
+ self.pos = _save
1234
+ end
1235
+ break
1236
+ end # end sequence
1237
+
1238
+ set_failed_rule :_nested_paren unless _tmp
1239
+ return _tmp
1240
+ end
1241
+
1242
+ # value = (value:v ":" var:n { @g.t(v,n) } | value:v "?" { @g.maybe(v) } | value:v "+" { @g.many(v) } | value:v "*" { @g.kleene(v) } | value:v mult_range:r { @g.multiple(v, *r) } | "&" value:v { @g.andp(v) } | "!" value:v { @g.notp(v) } | "(" - expression:o - ")" { o } | "<" - expression:o - ">" { @g.collect(o) } | curly_block | "." { @g.dot } | "@" var:name !(- "=") { @g.invoke(name) } | "^" var:name < nested_paren? > { @g.foreign_invoke("parent", name, text) } | "%" var:gram "." var:name < nested_paren? > { @g.foreign_invoke(gram, name, text) } | var:name < nested_paren? > !(- "=") { text.empty? ? @g.ref(name) : @g.invoke(name, text) } | char_range | regexp | string)
1243
+ def _value
1244
+
1245
+ _save = self.pos
1246
+ while true # choice
1247
+
1248
+ _save1 = self.pos
1249
+ while true # sequence
1250
+ _tmp = apply(:_value)
1251
+ v = @result
1252
+ unless _tmp
1253
+ self.pos = _save1
1254
+ break
1255
+ end
1256
+ _tmp = match_string(":")
1257
+ unless _tmp
1258
+ self.pos = _save1
1259
+ break
1260
+ end
1261
+ _tmp = apply(:_var)
1262
+ n = @result
1263
+ unless _tmp
1264
+ self.pos = _save1
1265
+ break
1266
+ end
1267
+ @result = begin; @g.t(v,n) ; end
1268
+ _tmp = true
1269
+ unless _tmp
1270
+ self.pos = _save1
1271
+ end
1272
+ break
1273
+ end # end sequence
1274
+
1275
+ break if _tmp
1276
+ self.pos = _save
1277
+
1278
+ _save2 = self.pos
1279
+ while true # sequence
1280
+ _tmp = apply(:_value)
1281
+ v = @result
1282
+ unless _tmp
1283
+ self.pos = _save2
1284
+ break
1285
+ end
1286
+ _tmp = match_string("?")
1287
+ unless _tmp
1288
+ self.pos = _save2
1289
+ break
1290
+ end
1291
+ @result = begin; @g.maybe(v) ; end
1292
+ _tmp = true
1293
+ unless _tmp
1294
+ self.pos = _save2
1295
+ end
1296
+ break
1297
+ end # end sequence
1298
+
1299
+ break if _tmp
1300
+ self.pos = _save
1301
+
1302
+ _save3 = self.pos
1303
+ while true # sequence
1304
+ _tmp = apply(:_value)
1305
+ v = @result
1306
+ unless _tmp
1307
+ self.pos = _save3
1308
+ break
1309
+ end
1310
+ _tmp = match_string("+")
1311
+ unless _tmp
1312
+ self.pos = _save3
1313
+ break
1314
+ end
1315
+ @result = begin; @g.many(v) ; end
1316
+ _tmp = true
1317
+ unless _tmp
1318
+ self.pos = _save3
1319
+ end
1320
+ break
1321
+ end # end sequence
1322
+
1323
+ break if _tmp
1324
+ self.pos = _save
1325
+
1326
+ _save4 = self.pos
1327
+ while true # sequence
1328
+ _tmp = apply(:_value)
1329
+ v = @result
1330
+ unless _tmp
1331
+ self.pos = _save4
1332
+ break
1333
+ end
1334
+ _tmp = match_string("*")
1335
+ unless _tmp
1336
+ self.pos = _save4
1337
+ break
1338
+ end
1339
+ @result = begin; @g.kleene(v) ; end
1340
+ _tmp = true
1341
+ unless _tmp
1342
+ self.pos = _save4
1343
+ end
1344
+ break
1345
+ end # end sequence
1346
+
1347
+ break if _tmp
1348
+ self.pos = _save
1349
+
1350
+ _save5 = self.pos
1351
+ while true # sequence
1352
+ _tmp = apply(:_value)
1353
+ v = @result
1354
+ unless _tmp
1355
+ self.pos = _save5
1356
+ break
1357
+ end
1358
+ _tmp = apply(:_mult_range)
1359
+ r = @result
1360
+ unless _tmp
1361
+ self.pos = _save5
1362
+ break
1363
+ end
1364
+ @result = begin; @g.multiple(v, *r) ; end
1365
+ _tmp = true
1366
+ unless _tmp
1367
+ self.pos = _save5
1368
+ end
1369
+ break
1370
+ end # end sequence
1371
+
1372
+ break if _tmp
1373
+ self.pos = _save
1374
+
1375
+ _save6 = self.pos
1376
+ while true # sequence
1377
+ _tmp = match_string("&")
1378
+ unless _tmp
1379
+ self.pos = _save6
1380
+ break
1381
+ end
1382
+ _tmp = apply(:_value)
1383
+ v = @result
1384
+ unless _tmp
1385
+ self.pos = _save6
1386
+ break
1387
+ end
1388
+ @result = begin; @g.andp(v) ; end
1389
+ _tmp = true
1390
+ unless _tmp
1391
+ self.pos = _save6
1392
+ end
1393
+ break
1394
+ end # end sequence
1395
+
1396
+ break if _tmp
1397
+ self.pos = _save
1398
+
1399
+ _save7 = self.pos
1400
+ while true # sequence
1401
+ _tmp = match_string("!")
1402
+ unless _tmp
1403
+ self.pos = _save7
1404
+ break
1405
+ end
1406
+ _tmp = apply(:_value)
1407
+ v = @result
1408
+ unless _tmp
1409
+ self.pos = _save7
1410
+ break
1411
+ end
1412
+ @result = begin; @g.notp(v) ; end
1413
+ _tmp = true
1414
+ unless _tmp
1415
+ self.pos = _save7
1416
+ end
1417
+ break
1418
+ end # end sequence
1419
+
1420
+ break if _tmp
1421
+ self.pos = _save
1422
+
1423
+ _save8 = self.pos
1424
+ while true # sequence
1425
+ _tmp = match_string("(")
1426
+ unless _tmp
1427
+ self.pos = _save8
1428
+ break
1429
+ end
1430
+ _tmp = apply(:__hyphen_)
1431
+ unless _tmp
1432
+ self.pos = _save8
1433
+ break
1434
+ end
1435
+ _tmp = apply(:_expression)
1436
+ o = @result
1437
+ unless _tmp
1438
+ self.pos = _save8
1439
+ break
1440
+ end
1441
+ _tmp = apply(:__hyphen_)
1442
+ unless _tmp
1443
+ self.pos = _save8
1444
+ break
1445
+ end
1446
+ _tmp = match_string(")")
1447
+ unless _tmp
1448
+ self.pos = _save8
1449
+ break
1450
+ end
1451
+ @result = begin; o ; end
1452
+ _tmp = true
1453
+ unless _tmp
1454
+ self.pos = _save8
1455
+ end
1456
+ break
1457
+ end # end sequence
1458
+
1459
+ break if _tmp
1460
+ self.pos = _save
1461
+
1462
+ _save9 = self.pos
1463
+ while true # sequence
1464
+ _tmp = match_string("<")
1465
+ unless _tmp
1466
+ self.pos = _save9
1467
+ break
1468
+ end
1469
+ _tmp = apply(:__hyphen_)
1470
+ unless _tmp
1471
+ self.pos = _save9
1472
+ break
1473
+ end
1474
+ _tmp = apply(:_expression)
1475
+ o = @result
1476
+ unless _tmp
1477
+ self.pos = _save9
1478
+ break
1479
+ end
1480
+ _tmp = apply(:__hyphen_)
1481
+ unless _tmp
1482
+ self.pos = _save9
1483
+ break
1484
+ end
1485
+ _tmp = match_string(">")
1486
+ unless _tmp
1487
+ self.pos = _save9
1488
+ break
1489
+ end
1490
+ @result = begin; @g.collect(o) ; end
1491
+ _tmp = true
1492
+ unless _tmp
1493
+ self.pos = _save9
1494
+ end
1495
+ break
1496
+ end # end sequence
1497
+
1498
+ break if _tmp
1499
+ self.pos = _save
1500
+ _tmp = apply(:_curly_block)
1501
+ break if _tmp
1502
+ self.pos = _save
1503
+
1504
+ _save10 = self.pos
1505
+ while true # sequence
1506
+ _tmp = match_string(".")
1507
+ unless _tmp
1508
+ self.pos = _save10
1509
+ break
1510
+ end
1511
+ @result = begin; @g.dot ; end
1512
+ _tmp = true
1513
+ unless _tmp
1514
+ self.pos = _save10
1515
+ end
1516
+ break
1517
+ end # end sequence
1518
+
1519
+ break if _tmp
1520
+ self.pos = _save
1521
+
1522
+ _save11 = self.pos
1523
+ while true # sequence
1524
+ _tmp = match_string("@")
1525
+ unless _tmp
1526
+ self.pos = _save11
1527
+ break
1528
+ end
1529
+ _tmp = apply(:_var)
1530
+ name = @result
1531
+ unless _tmp
1532
+ self.pos = _save11
1533
+ break
1534
+ end
1535
+ _save12 = self.pos
1536
+
1537
+ _save13 = self.pos
1538
+ while true # sequence
1539
+ _tmp = apply(:__hyphen_)
1540
+ unless _tmp
1541
+ self.pos = _save13
1542
+ break
1543
+ end
1544
+ _tmp = match_string("=")
1545
+ unless _tmp
1546
+ self.pos = _save13
1547
+ end
1548
+ break
1549
+ end # end sequence
1550
+
1551
+ _tmp = _tmp ? nil : true
1552
+ self.pos = _save12
1553
+ unless _tmp
1554
+ self.pos = _save11
1555
+ break
1556
+ end
1557
+ @result = begin; @g.invoke(name) ; end
1558
+ _tmp = true
1559
+ unless _tmp
1560
+ self.pos = _save11
1561
+ end
1562
+ break
1563
+ end # end sequence
1564
+
1565
+ break if _tmp
1566
+ self.pos = _save
1567
+
1568
+ _save14 = self.pos
1569
+ while true # sequence
1570
+ _tmp = match_string("^")
1571
+ unless _tmp
1572
+ self.pos = _save14
1573
+ break
1574
+ end
1575
+ _tmp = apply(:_var)
1576
+ name = @result
1577
+ unless _tmp
1578
+ self.pos = _save14
1579
+ break
1580
+ end
1581
+ _text_start = self.pos
1582
+ _save15 = self.pos
1583
+ _tmp = apply(:_nested_paren)
1584
+ unless _tmp
1585
+ _tmp = true
1586
+ self.pos = _save15
1587
+ end
1588
+ if _tmp
1589
+ text = get_text(_text_start)
1590
+ end
1591
+ unless _tmp
1592
+ self.pos = _save14
1593
+ break
1594
+ end
1595
+ @result = begin; @g.foreign_invoke("parent", name, text) ; end
1596
+ _tmp = true
1597
+ unless _tmp
1598
+ self.pos = _save14
1599
+ end
1600
+ break
1601
+ end # end sequence
1602
+
1603
+ break if _tmp
1604
+ self.pos = _save
1605
+
1606
+ _save16 = self.pos
1607
+ while true # sequence
1608
+ _tmp = match_string("%")
1609
+ unless _tmp
1610
+ self.pos = _save16
1611
+ break
1612
+ end
1613
+ _tmp = apply(:_var)
1614
+ gram = @result
1615
+ unless _tmp
1616
+ self.pos = _save16
1617
+ break
1618
+ end
1619
+ _tmp = match_string(".")
1620
+ unless _tmp
1621
+ self.pos = _save16
1622
+ break
1623
+ end
1624
+ _tmp = apply(:_var)
1625
+ name = @result
1626
+ unless _tmp
1627
+ self.pos = _save16
1628
+ break
1629
+ end
1630
+ _text_start = self.pos
1631
+ _save17 = self.pos
1632
+ _tmp = apply(:_nested_paren)
1633
+ unless _tmp
1634
+ _tmp = true
1635
+ self.pos = _save17
1636
+ end
1637
+ if _tmp
1638
+ text = get_text(_text_start)
1639
+ end
1640
+ unless _tmp
1641
+ self.pos = _save16
1642
+ break
1643
+ end
1644
+ @result = begin; @g.foreign_invoke(gram, name, text) ; end
1645
+ _tmp = true
1646
+ unless _tmp
1647
+ self.pos = _save16
1648
+ end
1649
+ break
1650
+ end # end sequence
1651
+
1652
+ break if _tmp
1653
+ self.pos = _save
1654
+
1655
+ _save18 = self.pos
1656
+ while true # sequence
1657
+ _tmp = apply(:_var)
1658
+ name = @result
1659
+ unless _tmp
1660
+ self.pos = _save18
1661
+ break
1662
+ end
1663
+ _text_start = self.pos
1664
+ _save19 = self.pos
1665
+ _tmp = apply(:_nested_paren)
1666
+ unless _tmp
1667
+ _tmp = true
1668
+ self.pos = _save19
1669
+ end
1670
+ if _tmp
1671
+ text = get_text(_text_start)
1672
+ end
1673
+ unless _tmp
1674
+ self.pos = _save18
1675
+ break
1676
+ end
1677
+ _save20 = self.pos
1678
+
1679
+ _save21 = self.pos
1680
+ while true # sequence
1681
+ _tmp = apply(:__hyphen_)
1682
+ unless _tmp
1683
+ self.pos = _save21
1684
+ break
1685
+ end
1686
+ _tmp = match_string("=")
1687
+ unless _tmp
1688
+ self.pos = _save21
1689
+ end
1690
+ break
1691
+ end # end sequence
1692
+
1693
+ _tmp = _tmp ? nil : true
1694
+ self.pos = _save20
1695
+ unless _tmp
1696
+ self.pos = _save18
1697
+ break
1698
+ end
1699
+ @result = begin; text.empty? ? @g.ref(name) : @g.invoke(name, text) ; end
1700
+ _tmp = true
1701
+ unless _tmp
1702
+ self.pos = _save18
1703
+ end
1704
+ break
1705
+ end # end sequence
1706
+
1707
+ break if _tmp
1708
+ self.pos = _save
1709
+ _tmp = apply(:_char_range)
1710
+ break if _tmp
1711
+ self.pos = _save
1712
+ _tmp = apply(:_regexp)
1713
+ break if _tmp
1714
+ self.pos = _save
1715
+ _tmp = apply(:_string)
1716
+ break if _tmp
1717
+ self.pos = _save
1718
+ break
1719
+ end # end choice
1720
+
1721
+ set_failed_rule :_value unless _tmp
1722
+ return _tmp
1723
+ end
1724
+
1725
+ # spaces = (space | comment)+
1726
+ def _spaces
1727
+ _save = self.pos
1728
+
1729
+ _save1 = self.pos
1730
+ while true # choice
1731
+ _tmp = apply(:_space)
1732
+ break if _tmp
1733
+ self.pos = _save1
1734
+ _tmp = apply(:_comment)
1735
+ break if _tmp
1736
+ self.pos = _save1
1737
+ break
1738
+ end # end choice
1739
+
1740
+ if _tmp
1741
+ while true
1742
+
1743
+ _save2 = self.pos
1744
+ while true # choice
1745
+ _tmp = apply(:_space)
1746
+ break if _tmp
1747
+ self.pos = _save2
1748
+ _tmp = apply(:_comment)
1749
+ break if _tmp
1750
+ self.pos = _save2
1751
+ break
1752
+ end # end choice
1753
+
1754
+ break unless _tmp
1755
+ end
1756
+ _tmp = true
1757
+ else
1758
+ self.pos = _save
1759
+ end
1760
+ set_failed_rule :_spaces unless _tmp
1761
+ return _tmp
1762
+ end
1763
+
1764
+ # values = (values:s spaces value:v { @g.seq(s, v) } | value:l spaces value:r { @g.seq(l, r) } | value)
1765
+ def _values
1766
+
1767
+ _save = self.pos
1768
+ while true # choice
1769
+
1770
+ _save1 = self.pos
1771
+ while true # sequence
1772
+ _tmp = apply(:_values)
1773
+ s = @result
1774
+ unless _tmp
1775
+ self.pos = _save1
1776
+ break
1777
+ end
1778
+ _tmp = apply(:_spaces)
1779
+ unless _tmp
1780
+ self.pos = _save1
1781
+ break
1782
+ end
1783
+ _tmp = apply(:_value)
1784
+ v = @result
1785
+ unless _tmp
1786
+ self.pos = _save1
1787
+ break
1788
+ end
1789
+ @result = begin; @g.seq(s, v) ; end
1790
+ _tmp = true
1791
+ unless _tmp
1792
+ self.pos = _save1
1793
+ end
1794
+ break
1795
+ end # end sequence
1796
+
1797
+ break if _tmp
1798
+ self.pos = _save
1799
+
1800
+ _save2 = self.pos
1801
+ while true # sequence
1802
+ _tmp = apply(:_value)
1803
+ l = @result
1804
+ unless _tmp
1805
+ self.pos = _save2
1806
+ break
1807
+ end
1808
+ _tmp = apply(:_spaces)
1809
+ unless _tmp
1810
+ self.pos = _save2
1811
+ break
1812
+ end
1813
+ _tmp = apply(:_value)
1814
+ r = @result
1815
+ unless _tmp
1816
+ self.pos = _save2
1817
+ break
1818
+ end
1819
+ @result = begin; @g.seq(l, r) ; end
1820
+ _tmp = true
1821
+ unless _tmp
1822
+ self.pos = _save2
1823
+ end
1824
+ break
1825
+ end # end sequence
1826
+
1827
+ break if _tmp
1828
+ self.pos = _save
1829
+ _tmp = apply(:_value)
1830
+ break if _tmp
1831
+ self.pos = _save
1832
+ break
1833
+ end # end choice
1834
+
1835
+ set_failed_rule :_values unless _tmp
1836
+ return _tmp
1837
+ end
1838
+
1839
+ # choose_cont = - "|" - values:v { v }
1840
+ def _choose_cont
1841
+
1842
+ _save = self.pos
1843
+ while true # sequence
1844
+ _tmp = apply(:__hyphen_)
1845
+ unless _tmp
1846
+ self.pos = _save
1847
+ break
1848
+ end
1849
+ _tmp = match_string("|")
1850
+ unless _tmp
1851
+ self.pos = _save
1852
+ break
1853
+ end
1854
+ _tmp = apply(:__hyphen_)
1855
+ unless _tmp
1856
+ self.pos = _save
1857
+ break
1858
+ end
1859
+ _tmp = apply(:_values)
1860
+ v = @result
1861
+ unless _tmp
1862
+ self.pos = _save
1863
+ break
1864
+ end
1865
+ @result = begin; v ; end
1866
+ _tmp = true
1867
+ unless _tmp
1868
+ self.pos = _save
1869
+ end
1870
+ break
1871
+ end # end sequence
1872
+
1873
+ set_failed_rule :_choose_cont unless _tmp
1874
+ return _tmp
1875
+ end
1876
+
1877
+ # expression = (values:v choose_cont+:alts { @g.any(v, *alts) } | values)
1878
+ def _expression
1879
+
1880
+ _save = self.pos
1881
+ while true # choice
1882
+
1883
+ _save1 = self.pos
1884
+ while true # sequence
1885
+ _tmp = apply(:_values)
1886
+ v = @result
1887
+ unless _tmp
1888
+ self.pos = _save1
1889
+ break
1890
+ end
1891
+ _save2 = self.pos
1892
+ _ary = []
1893
+ _tmp = apply(:_choose_cont)
1894
+ if _tmp
1895
+ _ary << @result
1896
+ while true
1897
+ _tmp = apply(:_choose_cont)
1898
+ _ary << @result if _tmp
1899
+ break unless _tmp
1900
+ end
1901
+ _tmp = true
1902
+ @result = _ary
1903
+ else
1904
+ self.pos = _save2
1905
+ end
1906
+ alts = @result
1907
+ unless _tmp
1908
+ self.pos = _save1
1909
+ break
1910
+ end
1911
+ @result = begin; @g.any(v, *alts) ; end
1912
+ _tmp = true
1913
+ unless _tmp
1914
+ self.pos = _save1
1915
+ end
1916
+ break
1917
+ end # end sequence
1918
+
1919
+ break if _tmp
1920
+ self.pos = _save
1921
+ _tmp = apply(:_values)
1922
+ break if _tmp
1923
+ self.pos = _save
1924
+ break
1925
+ end # end choice
1926
+
1927
+ set_failed_rule :_expression unless _tmp
1928
+ return _tmp
1929
+ end
1930
+
1931
+ # args = (args:a "," - var:n - { a + [n] } | - var:n - { [n] })
1932
+ def _args
1933
+
1934
+ _save = self.pos
1935
+ while true # choice
1936
+
1937
+ _save1 = self.pos
1938
+ while true # sequence
1939
+ _tmp = apply(:_args)
1940
+ a = @result
1941
+ unless _tmp
1942
+ self.pos = _save1
1943
+ break
1944
+ end
1945
+ _tmp = match_string(",")
1946
+ unless _tmp
1947
+ self.pos = _save1
1948
+ break
1949
+ end
1950
+ _tmp = apply(:__hyphen_)
1951
+ unless _tmp
1952
+ self.pos = _save1
1953
+ break
1954
+ end
1955
+ _tmp = apply(:_var)
1956
+ n = @result
1957
+ unless _tmp
1958
+ self.pos = _save1
1959
+ break
1960
+ end
1961
+ _tmp = apply(:__hyphen_)
1962
+ unless _tmp
1963
+ self.pos = _save1
1964
+ break
1965
+ end
1966
+ @result = begin; a + [n] ; end
1967
+ _tmp = true
1968
+ unless _tmp
1969
+ self.pos = _save1
1970
+ end
1971
+ break
1972
+ end # end sequence
1973
+
1974
+ break if _tmp
1975
+ self.pos = _save
1976
+
1977
+ _save2 = self.pos
1978
+ while true # sequence
1979
+ _tmp = apply(:__hyphen_)
1980
+ unless _tmp
1981
+ self.pos = _save2
1982
+ break
1983
+ end
1984
+ _tmp = apply(:_var)
1985
+ n = @result
1986
+ unless _tmp
1987
+ self.pos = _save2
1988
+ break
1989
+ end
1990
+ _tmp = apply(:__hyphen_)
1991
+ unless _tmp
1992
+ self.pos = _save2
1993
+ break
1994
+ end
1995
+ @result = begin; [n] ; end
1996
+ _tmp = true
1997
+ unless _tmp
1998
+ self.pos = _save2
1999
+ end
2000
+ break
2001
+ end # end sequence
2002
+
2003
+ break if _tmp
2004
+ self.pos = _save
2005
+ break
2006
+ end # end choice
2007
+
2008
+ set_failed_rule :_args unless _tmp
2009
+ return _tmp
2010
+ end
2011
+
2012
+ # statement = (- var:v "(" args:a ")" - "=" - expression:o { @g.set(v, o, a) } | - var:v - "=" - expression:o { @g.set(v, o) } | - "%" var:name - "=" - < /[::A-Za-z]+/ > { @g.add_foreign_grammar(name, text) } | - "%%" - curly:act { @g.add_setup act } | - "%%" - var:name - "=" - < (!"\n" .)+ > { @g.set_variable(name, text) })
2013
+ def _statement
2014
+
2015
+ _save = self.pos
2016
+ while true # choice
2017
+
2018
+ _save1 = self.pos
2019
+ while true # sequence
2020
+ _tmp = apply(:__hyphen_)
2021
+ unless _tmp
2022
+ self.pos = _save1
2023
+ break
2024
+ end
2025
+ _tmp = apply(:_var)
2026
+ v = @result
2027
+ unless _tmp
2028
+ self.pos = _save1
2029
+ break
2030
+ end
2031
+ _tmp = match_string("(")
2032
+ unless _tmp
2033
+ self.pos = _save1
2034
+ break
2035
+ end
2036
+ _tmp = apply(:_args)
2037
+ a = @result
2038
+ unless _tmp
2039
+ self.pos = _save1
2040
+ break
2041
+ end
2042
+ _tmp = match_string(")")
2043
+ unless _tmp
2044
+ self.pos = _save1
2045
+ break
2046
+ end
2047
+ _tmp = apply(:__hyphen_)
2048
+ unless _tmp
2049
+ self.pos = _save1
2050
+ break
2051
+ end
2052
+ _tmp = match_string("=")
2053
+ unless _tmp
2054
+ self.pos = _save1
2055
+ break
2056
+ end
2057
+ _tmp = apply(:__hyphen_)
2058
+ unless _tmp
2059
+ self.pos = _save1
2060
+ break
2061
+ end
2062
+ _tmp = apply(:_expression)
2063
+ o = @result
2064
+ unless _tmp
2065
+ self.pos = _save1
2066
+ break
2067
+ end
2068
+ @result = begin; @g.set(v, o, a) ; end
2069
+ _tmp = true
2070
+ unless _tmp
2071
+ self.pos = _save1
2072
+ end
2073
+ break
2074
+ end # end sequence
2075
+
2076
+ break if _tmp
2077
+ self.pos = _save
2078
+
2079
+ _save2 = self.pos
2080
+ while true # sequence
2081
+ _tmp = apply(:__hyphen_)
2082
+ unless _tmp
2083
+ self.pos = _save2
2084
+ break
2085
+ end
2086
+ _tmp = apply(:_var)
2087
+ v = @result
2088
+ unless _tmp
2089
+ self.pos = _save2
2090
+ break
2091
+ end
2092
+ _tmp = apply(:__hyphen_)
2093
+ unless _tmp
2094
+ self.pos = _save2
2095
+ break
2096
+ end
2097
+ _tmp = match_string("=")
2098
+ unless _tmp
2099
+ self.pos = _save2
2100
+ break
2101
+ end
2102
+ _tmp = apply(:__hyphen_)
2103
+ unless _tmp
2104
+ self.pos = _save2
2105
+ break
2106
+ end
2107
+ _tmp = apply(:_expression)
2108
+ o = @result
2109
+ unless _tmp
2110
+ self.pos = _save2
2111
+ break
2112
+ end
2113
+ @result = begin; @g.set(v, o) ; end
2114
+ _tmp = true
2115
+ unless _tmp
2116
+ self.pos = _save2
2117
+ end
2118
+ break
2119
+ end # end sequence
2120
+
2121
+ break if _tmp
2122
+ self.pos = _save
2123
+
2124
+ _save3 = self.pos
2125
+ while true # sequence
2126
+ _tmp = apply(:__hyphen_)
2127
+ unless _tmp
2128
+ self.pos = _save3
2129
+ break
2130
+ end
2131
+ _tmp = match_string("%")
2132
+ unless _tmp
2133
+ self.pos = _save3
2134
+ break
2135
+ end
2136
+ _tmp = apply(:_var)
2137
+ name = @result
2138
+ unless _tmp
2139
+ self.pos = _save3
2140
+ break
2141
+ end
2142
+ _tmp = apply(:__hyphen_)
2143
+ unless _tmp
2144
+ self.pos = _save3
2145
+ break
2146
+ end
2147
+ _tmp = match_string("=")
2148
+ unless _tmp
2149
+ self.pos = _save3
2150
+ break
2151
+ end
2152
+ _tmp = apply(:__hyphen_)
2153
+ unless _tmp
2154
+ self.pos = _save3
2155
+ break
2156
+ end
2157
+ _text_start = self.pos
2158
+ _tmp = scan(/\A(?-mix:[::A-Za-z]+)/)
2159
+ if _tmp
2160
+ text = get_text(_text_start)
2161
+ end
2162
+ unless _tmp
2163
+ self.pos = _save3
2164
+ break
2165
+ end
2166
+ @result = begin; @g.add_foreign_grammar(name, text) ; end
2167
+ _tmp = true
2168
+ unless _tmp
2169
+ self.pos = _save3
2170
+ end
2171
+ break
2172
+ end # end sequence
2173
+
2174
+ break if _tmp
2175
+ self.pos = _save
2176
+
2177
+ _save4 = self.pos
2178
+ while true # sequence
2179
+ _tmp = apply(:__hyphen_)
2180
+ unless _tmp
2181
+ self.pos = _save4
2182
+ break
2183
+ end
2184
+ _tmp = match_string("%%")
2185
+ unless _tmp
2186
+ self.pos = _save4
2187
+ break
2188
+ end
2189
+ _tmp = apply(:__hyphen_)
2190
+ unless _tmp
2191
+ self.pos = _save4
2192
+ break
2193
+ end
2194
+ _tmp = apply(:_curly)
2195
+ act = @result
2196
+ unless _tmp
2197
+ self.pos = _save4
2198
+ break
2199
+ end
2200
+ @result = begin; @g.add_setup act ; end
2201
+ _tmp = true
2202
+ unless _tmp
2203
+ self.pos = _save4
2204
+ end
2205
+ break
2206
+ end # end sequence
2207
+
2208
+ break if _tmp
2209
+ self.pos = _save
2210
+
2211
+ _save5 = self.pos
2212
+ while true # sequence
2213
+ _tmp = apply(:__hyphen_)
2214
+ unless _tmp
2215
+ self.pos = _save5
2216
+ break
2217
+ end
2218
+ _tmp = match_string("%%")
2219
+ unless _tmp
2220
+ self.pos = _save5
2221
+ break
2222
+ end
2223
+ _tmp = apply(:__hyphen_)
2224
+ unless _tmp
2225
+ self.pos = _save5
2226
+ break
2227
+ end
2228
+ _tmp = apply(:_var)
2229
+ name = @result
2230
+ unless _tmp
2231
+ self.pos = _save5
2232
+ break
2233
+ end
2234
+ _tmp = apply(:__hyphen_)
2235
+ unless _tmp
2236
+ self.pos = _save5
2237
+ break
2238
+ end
2239
+ _tmp = match_string("=")
2240
+ unless _tmp
2241
+ self.pos = _save5
2242
+ break
2243
+ end
2244
+ _tmp = apply(:__hyphen_)
2245
+ unless _tmp
2246
+ self.pos = _save5
2247
+ break
2248
+ end
2249
+ _text_start = self.pos
2250
+ _save6 = self.pos
2251
+
2252
+ _save7 = self.pos
2253
+ while true # sequence
2254
+ _save8 = self.pos
2255
+ _tmp = match_string("\n")
2256
+ _tmp = _tmp ? nil : true
2257
+ self.pos = _save8
2258
+ unless _tmp
2259
+ self.pos = _save7
2260
+ break
2261
+ end
2262
+ _tmp = get_byte
2263
+ unless _tmp
2264
+ self.pos = _save7
2265
+ end
2266
+ break
2267
+ end # end sequence
2268
+
2269
+ if _tmp
2270
+ while true
2271
+
2272
+ _save9 = self.pos
2273
+ while true # sequence
2274
+ _save10 = self.pos
2275
+ _tmp = match_string("\n")
2276
+ _tmp = _tmp ? nil : true
2277
+ self.pos = _save10
2278
+ unless _tmp
2279
+ self.pos = _save9
2280
+ break
2281
+ end
2282
+ _tmp = get_byte
2283
+ unless _tmp
2284
+ self.pos = _save9
2285
+ end
2286
+ break
2287
+ end # end sequence
2288
+
2289
+ break unless _tmp
2290
+ end
2291
+ _tmp = true
2292
+ else
2293
+ self.pos = _save6
2294
+ end
2295
+ if _tmp
2296
+ text = get_text(_text_start)
2297
+ end
2298
+ unless _tmp
2299
+ self.pos = _save5
2300
+ break
2301
+ end
2302
+ @result = begin; @g.set_variable(name, text) ; end
2303
+ _tmp = true
2304
+ unless _tmp
2305
+ self.pos = _save5
2306
+ end
2307
+ break
2308
+ end # end sequence
2309
+
2310
+ break if _tmp
2311
+ self.pos = _save
2312
+ break
2313
+ end # end choice
2314
+
2315
+ set_failed_rule :_statement unless _tmp
2316
+ return _tmp
2317
+ end
2318
+
2319
+ # statements = statement (- statements)?
2320
+ def _statements
2321
+
2322
+ _save = self.pos
2323
+ while true # sequence
2324
+ _tmp = apply(:_statement)
2325
+ unless _tmp
2326
+ self.pos = _save
2327
+ break
2328
+ end
2329
+ _save1 = self.pos
2330
+
2331
+ _save2 = self.pos
2332
+ while true # sequence
2333
+ _tmp = apply(:__hyphen_)
2334
+ unless _tmp
2335
+ self.pos = _save2
2336
+ break
2337
+ end
2338
+ _tmp = apply(:_statements)
2339
+ unless _tmp
2340
+ self.pos = _save2
2341
+ end
2342
+ break
2343
+ end # end sequence
2344
+
2345
+ unless _tmp
2346
+ _tmp = true
2347
+ self.pos = _save1
2348
+ end
2349
+ unless _tmp
2350
+ self.pos = _save
2351
+ end
2352
+ break
2353
+ end # end sequence
2354
+
2355
+ set_failed_rule :_statements unless _tmp
2356
+ return _tmp
2357
+ end
2358
+
2359
+ # eof = !.
2360
+ def _eof
2361
+ _save = self.pos
2362
+ _tmp = get_byte
2363
+ _tmp = _tmp ? nil : true
2364
+ self.pos = _save
2365
+ set_failed_rule :_eof unless _tmp
2366
+ return _tmp
2367
+ end
2368
+
2369
+ # root = statements - "\n"? eof
2370
+ def _root
2371
+
2372
+ _save = self.pos
2373
+ while true # sequence
2374
+ _tmp = apply(:_statements)
2375
+ unless _tmp
2376
+ self.pos = _save
2377
+ break
2378
+ end
2379
+ _tmp = apply(:__hyphen_)
2380
+ unless _tmp
2381
+ self.pos = _save
2382
+ break
2383
+ end
2384
+ _save1 = self.pos
2385
+ _tmp = match_string("\n")
2386
+ unless _tmp
2387
+ _tmp = true
2388
+ self.pos = _save1
2389
+ end
2390
+ unless _tmp
2391
+ self.pos = _save
2392
+ break
2393
+ end
2394
+ _tmp = apply(:_eof)
2395
+ unless _tmp
2396
+ self.pos = _save
2397
+ end
2398
+ break
2399
+ end # end sequence
2400
+
2401
+ set_failed_rule :_root unless _tmp
2402
+ return _tmp
2403
+ end
2404
+
2405
+ Rules = {}
2406
+ Rules[:_eol] = rule_info("eol", "\"\\n\"")
2407
+ Rules[:_comment] = rule_info("comment", "\"\#\" (!eol .)* eol")
2408
+ Rules[:_space] = rule_info("space", "(\" \" | \"\\t\" | eol)")
2409
+ Rules[:__hyphen_] = rule_info("-", "(space | comment)*")
2410
+ Rules[:_var] = rule_info("var", "< (\"-\" | /[a-zA-Z][\\-_a-zA-Z0-9]*/) > { text }")
2411
+ Rules[:_dbl_escapes] = rule_info("dbl_escapes", "(\"\\\\\\\"\" { '\"' } | \"\\\\n\" { \"\\n\" } | \"\\\\t\" { \"\\t\" } | \"\\\\b\" { \"\\b\" } | \"\\\\\\\\\" { \"\\\\\" })")
2412
+ Rules[:_dbl_seq] = rule_info("dbl_seq", "< /[^\\\\\"]+/ > { text }")
2413
+ Rules[:_dbl_not_quote] = rule_info("dbl_not_quote", "(dbl_escapes:s | dbl_seq:s)+:ary { ary }")
2414
+ Rules[:_dbl_string] = rule_info("dbl_string", "\"\\\"\" dbl_not_quote:s \"\\\"\" { @g.str(s.join) }")
2415
+ Rules[:_sgl_escape_quote] = rule_info("sgl_escape_quote", "\"\\\\'\" { \"'\" }")
2416
+ Rules[:_sgl_seq] = rule_info("sgl_seq", "< /[^']/ > { text }")
2417
+ Rules[:_sgl_not_quote] = rule_info("sgl_not_quote", "(sgl_escape_quote | sgl_seq)+:segs { segs.join }")
2418
+ Rules[:_sgl_string] = rule_info("sgl_string", "\"'\" sgl_not_quote:s \"'\" { @g.str(s) }")
2419
+ Rules[:_string] = rule_info("string", "(dbl_string | sgl_string)")
2420
+ Rules[:_not_slash] = rule_info("not_slash", "< (\"\\\\/\" | /[^\\/]/)+ > { text }")
2421
+ Rules[:_regexp_opts] = rule_info("regexp_opts", "< [a-z]* > { text }")
2422
+ Rules[:_regexp] = rule_info("regexp", "\"/\" not_slash:body \"/\" regexp_opts:opts { @g.reg body, opts }")
2423
+ Rules[:_char] = rule_info("char", "< /[a-zA-Z0-9]/ > { text }")
2424
+ Rules[:_char_range] = rule_info("char_range", "\"[\" char:l \"-\" char:r \"]\" { @g.range(l,r) }")
2425
+ Rules[:_range_elem] = rule_info("range_elem", "< /([1-9][0-9]*)|\\*/ > { text }")
2426
+ Rules[:_mult_range] = rule_info("mult_range", "\"[\" - range_elem:l - \",\" - range_elem:r - \"]\" { [l == \"*\" ? nil : l.to_i, r == \"*\" ? nil : r.to_i] }")
2427
+ Rules[:_curly_block] = rule_info("curly_block", "curly")
2428
+ Rules[:_curly] = rule_info("curly", "\"{\" < (/[^{}]+/ | curly)* > \"}\" { @g.action(text) }")
2429
+ Rules[:_nested_paren] = rule_info("nested_paren", "\"(\" (/[^()]+/ | nested_paren)* \")\"")
2430
+ Rules[:_value] = rule_info("value", "(value:v \":\" var:n { @g.t(v,n) } | value:v \"?\" { @g.maybe(v) } | value:v \"+\" { @g.many(v) } | value:v \"*\" { @g.kleene(v) } | value:v mult_range:r { @g.multiple(v, *r) } | \"&\" value:v { @g.andp(v) } | \"!\" value:v { @g.notp(v) } | \"(\" - expression:o - \")\" { o } | \"<\" - expression:o - \">\" { @g.collect(o) } | curly_block | \".\" { @g.dot } | \"@\" var:name !(- \"=\") { @g.invoke(name) } | \"^\" var:name < nested_paren? > { @g.foreign_invoke(\"parent\", name, text) } | \"%\" var:gram \".\" var:name < nested_paren? > { @g.foreign_invoke(gram, name, text) } | var:name < nested_paren? > !(- \"=\") { text.empty? ? @g.ref(name) : @g.invoke(name, text) } | char_range | regexp | string)")
2431
+ Rules[:_spaces] = rule_info("spaces", "(space | comment)+")
2432
+ Rules[:_values] = rule_info("values", "(values:s spaces value:v { @g.seq(s, v) } | value:l spaces value:r { @g.seq(l, r) } | value)")
2433
+ Rules[:_choose_cont] = rule_info("choose_cont", "- \"|\" - values:v { v }")
2434
+ Rules[:_expression] = rule_info("expression", "(values:v choose_cont+:alts { @g.any(v, *alts) } | values)")
2435
+ Rules[:_args] = rule_info("args", "(args:a \",\" - var:n - { a + [n] } | - var:n - { [n] })")
2436
+ Rules[:_statement] = rule_info("statement", "(- var:v \"(\" args:a \")\" - \"=\" - expression:o { @g.set(v, o, a) } | - var:v - \"=\" - expression:o { @g.set(v, o) } | - \"%\" var:name - \"=\" - < /[::A-Za-z]+/ > { @g.add_foreign_grammar(name, text) } | - \"%%\" - curly:act { @g.add_setup act } | - \"%%\" - var:name - \"=\" - < (!\"\\n\" .)+ > { @g.set_variable(name, text) })")
2437
+ Rules[:_statements] = rule_info("statements", "statement (- statements)?")
2438
+ Rules[:_eof] = rule_info("eof", "!.")
2439
+ Rules[:_root] = rule_info("root", "statements - \"\\n\"? eof")
2440
+ end