kpeg 0.7

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.
@@ -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