email_address_validator 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2543 @@
1
+ class EmailAddressValidator::RFC2822Parser
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
+ attr_accessor :validate_domain
320
+
321
+ def setup_foreign_grammar; end
322
+
323
+ # d = < . > &{ text[0] == num }
324
+ def _d(num)
325
+
326
+ _save = self.pos
327
+ while true # sequence
328
+ _text_start = self.pos
329
+ _tmp = get_byte
330
+ if _tmp
331
+ text = get_text(_text_start)
332
+ end
333
+ unless _tmp
334
+ self.pos = _save
335
+ break
336
+ end
337
+ _save1 = self.pos
338
+ _tmp = begin; text[0] == num ; end
339
+ self.pos = _save1
340
+ unless _tmp
341
+ self.pos = _save
342
+ end
343
+ break
344
+ end # end sequence
345
+
346
+ set_failed_rule :_d unless _tmp
347
+ return _tmp
348
+ end
349
+
350
+ # d_btw = < . > &{ t = text[0]; t >= start && t <= fin }
351
+ def _d_btw(start,fin)
352
+
353
+ _save = self.pos
354
+ while true # sequence
355
+ _text_start = self.pos
356
+ _tmp = get_byte
357
+ if _tmp
358
+ text = get_text(_text_start)
359
+ end
360
+ unless _tmp
361
+ self.pos = _save
362
+ break
363
+ end
364
+ _save1 = self.pos
365
+ _tmp = begin; t = text[0]; t >= start && t <= fin ; end
366
+ self.pos = _save1
367
+ unless _tmp
368
+ self.pos = _save
369
+ end
370
+ break
371
+ end # end sequence
372
+
373
+ set_failed_rule :_d_btw unless _tmp
374
+ return _tmp
375
+ end
376
+
377
+ # WSP = (" " | d(9))
378
+ def _WSP
379
+
380
+ _save = self.pos
381
+ while true # choice
382
+ _tmp = match_string(" ")
383
+ break if _tmp
384
+ self.pos = _save
385
+ _tmp = _d(9)
386
+ break if _tmp
387
+ self.pos = _save
388
+ break
389
+ end # end choice
390
+
391
+ set_failed_rule :_WSP unless _tmp
392
+ return _tmp
393
+ end
394
+
395
+ # LF = /\x0A/
396
+ def _LF
397
+ _tmp = scan(/\A(?-mix:\x0A)/)
398
+ set_failed_rule :_LF unless _tmp
399
+ return _tmp
400
+ end
401
+
402
+ # CR = /\x0D/
403
+ def _CR
404
+ _tmp = scan(/\A(?-mix:\x0D)/)
405
+ set_failed_rule :_CR unless _tmp
406
+ return _tmp
407
+ end
408
+
409
+ # CRLF = CR LF
410
+ def _CRLF
411
+
412
+ _save = self.pos
413
+ while true # sequence
414
+ _tmp = apply(:_CR)
415
+ unless _tmp
416
+ self.pos = _save
417
+ break
418
+ end
419
+ _tmp = apply(:_LF)
420
+ unless _tmp
421
+ self.pos = _save
422
+ end
423
+ break
424
+ end # end sequence
425
+
426
+ set_failed_rule :_CRLF unless _tmp
427
+ return _tmp
428
+ end
429
+
430
+ # ALPHA = /[A-Za-z]/
431
+ def _ALPHA
432
+ _tmp = scan(/\A(?-mix:[A-Za-z])/)
433
+ set_failed_rule :_ALPHA unless _tmp
434
+ return _tmp
435
+ end
436
+
437
+ # DIGIT = /[0-9]/
438
+ def _DIGIT
439
+ _tmp = scan(/\A(?-mix:[0-9])/)
440
+ set_failed_rule :_DIGIT unless _tmp
441
+ return _tmp
442
+ end
443
+
444
+ # NO-WS-CTL = (d_btw(1,8) | d(11) | d(12) | d_btw(14,31) | d(127))
445
+ def _NO_hyphen_WS_hyphen_CTL
446
+
447
+ _save = self.pos
448
+ while true # choice
449
+ _tmp = _d_btw(1,8)
450
+ break if _tmp
451
+ self.pos = _save
452
+ _tmp = _d(11)
453
+ break if _tmp
454
+ self.pos = _save
455
+ _tmp = _d(12)
456
+ break if _tmp
457
+ self.pos = _save
458
+ _tmp = _d_btw(14,31)
459
+ break if _tmp
460
+ self.pos = _save
461
+ _tmp = _d(127)
462
+ break if _tmp
463
+ self.pos = _save
464
+ break
465
+ end # end choice
466
+
467
+ set_failed_rule :_NO_hyphen_WS_hyphen_CTL unless _tmp
468
+ return _tmp
469
+ end
470
+
471
+ # text = (d_btw(1,9) | d(11) | d(12) | d_btw(14,127) | obs-text)
472
+ def _text
473
+
474
+ _save = self.pos
475
+ while true # choice
476
+ _tmp = _d_btw(1,9)
477
+ break if _tmp
478
+ self.pos = _save
479
+ _tmp = _d(11)
480
+ break if _tmp
481
+ self.pos = _save
482
+ _tmp = _d(12)
483
+ break if _tmp
484
+ self.pos = _save
485
+ _tmp = _d_btw(14,127)
486
+ break if _tmp
487
+ self.pos = _save
488
+ _tmp = apply(:_obs_hyphen_text)
489
+ break if _tmp
490
+ self.pos = _save
491
+ break
492
+ end # end choice
493
+
494
+ set_failed_rule :_text unless _tmp
495
+ return _tmp
496
+ end
497
+
498
+ # quoted-pair = ("\\" text | obs-qp)
499
+ def _quoted_hyphen_pair
500
+
501
+ _save = self.pos
502
+ while true # choice
503
+
504
+ _save1 = self.pos
505
+ while true # sequence
506
+ _tmp = match_string("\\")
507
+ unless _tmp
508
+ self.pos = _save1
509
+ break
510
+ end
511
+ _tmp = apply(:_text)
512
+ unless _tmp
513
+ self.pos = _save1
514
+ end
515
+ break
516
+ end # end sequence
517
+
518
+ break if _tmp
519
+ self.pos = _save
520
+ _tmp = apply(:_obs_hyphen_qp)
521
+ break if _tmp
522
+ self.pos = _save
523
+ break
524
+ end # end choice
525
+
526
+ set_failed_rule :_quoted_hyphen_pair unless _tmp
527
+ return _tmp
528
+ end
529
+
530
+ # FWS = ((WSP* CRLF)? WSP+ | obs-FWS)
531
+ def _FWS
532
+
533
+ _save = self.pos
534
+ while true # choice
535
+
536
+ _save1 = self.pos
537
+ while true # sequence
538
+ _save2 = self.pos
539
+
540
+ _save3 = self.pos
541
+ while true # sequence
542
+ while true
543
+ _tmp = apply(:_WSP)
544
+ break unless _tmp
545
+ end
546
+ _tmp = true
547
+ unless _tmp
548
+ self.pos = _save3
549
+ break
550
+ end
551
+ _tmp = apply(:_CRLF)
552
+ unless _tmp
553
+ self.pos = _save3
554
+ end
555
+ break
556
+ end # end sequence
557
+
558
+ unless _tmp
559
+ _tmp = true
560
+ self.pos = _save2
561
+ end
562
+ unless _tmp
563
+ self.pos = _save1
564
+ break
565
+ end
566
+ _save5 = self.pos
567
+ _tmp = apply(:_WSP)
568
+ if _tmp
569
+ while true
570
+ _tmp = apply(:_WSP)
571
+ break unless _tmp
572
+ end
573
+ _tmp = true
574
+ else
575
+ self.pos = _save5
576
+ end
577
+ unless _tmp
578
+ self.pos = _save1
579
+ end
580
+ break
581
+ end # end sequence
582
+
583
+ break if _tmp
584
+ self.pos = _save
585
+ _tmp = apply(:_obs_hyphen_FWS)
586
+ break if _tmp
587
+ self.pos = _save
588
+ break
589
+ end # end choice
590
+
591
+ set_failed_rule :_FWS unless _tmp
592
+ return _tmp
593
+ end
594
+
595
+ # ctext = (NO-WS-CTL | d_btw(33,39) | d_btw(42,91) | d_btw(93,126))
596
+ def _ctext
597
+
598
+ _save = self.pos
599
+ while true # choice
600
+ _tmp = apply(:_NO_hyphen_WS_hyphen_CTL)
601
+ break if _tmp
602
+ self.pos = _save
603
+ _tmp = _d_btw(33,39)
604
+ break if _tmp
605
+ self.pos = _save
606
+ _tmp = _d_btw(42,91)
607
+ break if _tmp
608
+ self.pos = _save
609
+ _tmp = _d_btw(93,126)
610
+ break if _tmp
611
+ self.pos = _save
612
+ break
613
+ end # end choice
614
+
615
+ set_failed_rule :_ctext unless _tmp
616
+ return _tmp
617
+ end
618
+
619
+ # ccontent = (ctext | quoted-pair | comment)
620
+ def _ccontent
621
+
622
+ _save = self.pos
623
+ while true # choice
624
+ _tmp = apply(:_ctext)
625
+ break if _tmp
626
+ self.pos = _save
627
+ _tmp = apply(:_quoted_hyphen_pair)
628
+ break if _tmp
629
+ self.pos = _save
630
+ _tmp = apply(:_comment)
631
+ break if _tmp
632
+ self.pos = _save
633
+ break
634
+ end # end choice
635
+
636
+ set_failed_rule :_ccontent unless _tmp
637
+ return _tmp
638
+ end
639
+
640
+ # comment = "(" (FWS? ccontent)* FWS? ")"
641
+ def _comment
642
+
643
+ _save = self.pos
644
+ while true # sequence
645
+ _tmp = match_string("(")
646
+ unless _tmp
647
+ self.pos = _save
648
+ break
649
+ end
650
+ while true
651
+
652
+ _save2 = self.pos
653
+ while true # sequence
654
+ _save3 = self.pos
655
+ _tmp = apply(:_FWS)
656
+ unless _tmp
657
+ _tmp = true
658
+ self.pos = _save3
659
+ end
660
+ unless _tmp
661
+ self.pos = _save2
662
+ break
663
+ end
664
+ _tmp = apply(:_ccontent)
665
+ unless _tmp
666
+ self.pos = _save2
667
+ end
668
+ break
669
+ end # end sequence
670
+
671
+ break unless _tmp
672
+ end
673
+ _tmp = true
674
+ unless _tmp
675
+ self.pos = _save
676
+ break
677
+ end
678
+ _save4 = self.pos
679
+ _tmp = apply(:_FWS)
680
+ unless _tmp
681
+ _tmp = true
682
+ self.pos = _save4
683
+ end
684
+ unless _tmp
685
+ self.pos = _save
686
+ break
687
+ end
688
+ _tmp = match_string(")")
689
+ unless _tmp
690
+ self.pos = _save
691
+ end
692
+ break
693
+ end # end sequence
694
+
695
+ set_failed_rule :_comment unless _tmp
696
+ return _tmp
697
+ end
698
+
699
+ # CFWS = (FWS? comment)* (FWS? comment | FWS)
700
+ def _CFWS
701
+
702
+ _save = self.pos
703
+ while true # sequence
704
+ while true
705
+
706
+ _save2 = self.pos
707
+ while true # sequence
708
+ _save3 = self.pos
709
+ _tmp = apply(:_FWS)
710
+ unless _tmp
711
+ _tmp = true
712
+ self.pos = _save3
713
+ end
714
+ unless _tmp
715
+ self.pos = _save2
716
+ break
717
+ end
718
+ _tmp = apply(:_comment)
719
+ unless _tmp
720
+ self.pos = _save2
721
+ end
722
+ break
723
+ end # end sequence
724
+
725
+ break unless _tmp
726
+ end
727
+ _tmp = true
728
+ unless _tmp
729
+ self.pos = _save
730
+ break
731
+ end
732
+
733
+ _save4 = self.pos
734
+ while true # choice
735
+
736
+ _save5 = self.pos
737
+ while true # sequence
738
+ _save6 = self.pos
739
+ _tmp = apply(:_FWS)
740
+ unless _tmp
741
+ _tmp = true
742
+ self.pos = _save6
743
+ end
744
+ unless _tmp
745
+ self.pos = _save5
746
+ break
747
+ end
748
+ _tmp = apply(:_comment)
749
+ unless _tmp
750
+ self.pos = _save5
751
+ end
752
+ break
753
+ end # end sequence
754
+
755
+ break if _tmp
756
+ self.pos = _save4
757
+ _tmp = apply(:_FWS)
758
+ break if _tmp
759
+ self.pos = _save4
760
+ break
761
+ end # end choice
762
+
763
+ unless _tmp
764
+ self.pos = _save
765
+ end
766
+ break
767
+ end # end sequence
768
+
769
+ set_failed_rule :_CFWS unless _tmp
770
+ return _tmp
771
+ end
772
+
773
+ # atext = (ALPHA | DIGIT | "!" | "#" | "$" | "%" | "&" | "'" | "*" | "+" | "-" | "/" | "=" | "?" | "^" | "_" | "`" | "{" | "|" | "}" | "~")
774
+ def _atext
775
+
776
+ _save = self.pos
777
+ while true # choice
778
+ _tmp = apply(:_ALPHA)
779
+ break if _tmp
780
+ self.pos = _save
781
+ _tmp = apply(:_DIGIT)
782
+ break if _tmp
783
+ self.pos = _save
784
+ _tmp = match_string("!")
785
+ break if _tmp
786
+ self.pos = _save
787
+ _tmp = match_string("#")
788
+ break if _tmp
789
+ self.pos = _save
790
+ _tmp = match_string("$")
791
+ break if _tmp
792
+ self.pos = _save
793
+ _tmp = match_string("%")
794
+ break if _tmp
795
+ self.pos = _save
796
+ _tmp = match_string("&")
797
+ break if _tmp
798
+ self.pos = _save
799
+ _tmp = match_string("'")
800
+ break if _tmp
801
+ self.pos = _save
802
+ _tmp = match_string("*")
803
+ break if _tmp
804
+ self.pos = _save
805
+ _tmp = match_string("+")
806
+ break if _tmp
807
+ self.pos = _save
808
+ _tmp = match_string("-")
809
+ break if _tmp
810
+ self.pos = _save
811
+ _tmp = match_string("/")
812
+ break if _tmp
813
+ self.pos = _save
814
+ _tmp = match_string("=")
815
+ break if _tmp
816
+ self.pos = _save
817
+ _tmp = match_string("?")
818
+ break if _tmp
819
+ self.pos = _save
820
+ _tmp = match_string("^")
821
+ break if _tmp
822
+ self.pos = _save
823
+ _tmp = match_string("_")
824
+ break if _tmp
825
+ self.pos = _save
826
+ _tmp = match_string("`")
827
+ break if _tmp
828
+ self.pos = _save
829
+ _tmp = match_string("{")
830
+ break if _tmp
831
+ self.pos = _save
832
+ _tmp = match_string("|")
833
+ break if _tmp
834
+ self.pos = _save
835
+ _tmp = match_string("}")
836
+ break if _tmp
837
+ self.pos = _save
838
+ _tmp = match_string("~")
839
+ break if _tmp
840
+ self.pos = _save
841
+ break
842
+ end # end choice
843
+
844
+ set_failed_rule :_atext unless _tmp
845
+ return _tmp
846
+ end
847
+
848
+ # atom = CFWS? atext+ CFWS?
849
+ def _atom
850
+
851
+ _save = self.pos
852
+ while true # sequence
853
+ _save1 = self.pos
854
+ _tmp = apply(:_CFWS)
855
+ unless _tmp
856
+ _tmp = true
857
+ self.pos = _save1
858
+ end
859
+ unless _tmp
860
+ self.pos = _save
861
+ break
862
+ end
863
+ _save2 = self.pos
864
+ _tmp = apply(:_atext)
865
+ if _tmp
866
+ while true
867
+ _tmp = apply(:_atext)
868
+ break unless _tmp
869
+ end
870
+ _tmp = true
871
+ else
872
+ self.pos = _save2
873
+ end
874
+ unless _tmp
875
+ self.pos = _save
876
+ break
877
+ end
878
+ _save3 = self.pos
879
+ _tmp = apply(:_CFWS)
880
+ unless _tmp
881
+ _tmp = true
882
+ self.pos = _save3
883
+ end
884
+ unless _tmp
885
+ self.pos = _save
886
+ end
887
+ break
888
+ end # end sequence
889
+
890
+ set_failed_rule :_atom unless _tmp
891
+ return _tmp
892
+ end
893
+
894
+ # dot-atom = CFWS? dot-atom-text CFWS?
895
+ def _dot_hyphen_atom
896
+
897
+ _save = self.pos
898
+ while true # sequence
899
+ _save1 = self.pos
900
+ _tmp = apply(:_CFWS)
901
+ unless _tmp
902
+ _tmp = true
903
+ self.pos = _save1
904
+ end
905
+ unless _tmp
906
+ self.pos = _save
907
+ break
908
+ end
909
+ _tmp = apply(:_dot_hyphen_atom_hyphen_text)
910
+ unless _tmp
911
+ self.pos = _save
912
+ break
913
+ end
914
+ _save2 = self.pos
915
+ _tmp = apply(:_CFWS)
916
+ unless _tmp
917
+ _tmp = true
918
+ self.pos = _save2
919
+ end
920
+ unless _tmp
921
+ self.pos = _save
922
+ end
923
+ break
924
+ end # end sequence
925
+
926
+ set_failed_rule :_dot_hyphen_atom unless _tmp
927
+ return _tmp
928
+ end
929
+
930
+ # dot-atom-text = atext+ ("." atext+)*
931
+ def _dot_hyphen_atom_hyphen_text
932
+
933
+ _save = self.pos
934
+ while true # sequence
935
+ _save1 = self.pos
936
+ _tmp = apply(:_atext)
937
+ if _tmp
938
+ while true
939
+ _tmp = apply(:_atext)
940
+ break unless _tmp
941
+ end
942
+ _tmp = true
943
+ else
944
+ self.pos = _save1
945
+ end
946
+ unless _tmp
947
+ self.pos = _save
948
+ break
949
+ end
950
+ while true
951
+
952
+ _save3 = self.pos
953
+ while true # sequence
954
+ _tmp = match_string(".")
955
+ unless _tmp
956
+ self.pos = _save3
957
+ break
958
+ end
959
+ _save4 = self.pos
960
+ _tmp = apply(:_atext)
961
+ if _tmp
962
+ while true
963
+ _tmp = apply(:_atext)
964
+ break unless _tmp
965
+ end
966
+ _tmp = true
967
+ else
968
+ self.pos = _save4
969
+ end
970
+ unless _tmp
971
+ self.pos = _save3
972
+ end
973
+ break
974
+ end # end sequence
975
+
976
+ break unless _tmp
977
+ end
978
+ _tmp = true
979
+ unless _tmp
980
+ self.pos = _save
981
+ end
982
+ break
983
+ end # end sequence
984
+
985
+ set_failed_rule :_dot_hyphen_atom_hyphen_text unless _tmp
986
+ return _tmp
987
+ end
988
+
989
+ # qtext = (NO-WS-CTL | d(33) | d_btw(35,91) | d_btw(93,126))
990
+ def _qtext
991
+
992
+ _save = self.pos
993
+ while true # choice
994
+ _tmp = apply(:_NO_hyphen_WS_hyphen_CTL)
995
+ break if _tmp
996
+ self.pos = _save
997
+ _tmp = _d(33)
998
+ break if _tmp
999
+ self.pos = _save
1000
+ _tmp = _d_btw(35,91)
1001
+ break if _tmp
1002
+ self.pos = _save
1003
+ _tmp = _d_btw(93,126)
1004
+ break if _tmp
1005
+ self.pos = _save
1006
+ break
1007
+ end # end choice
1008
+
1009
+ set_failed_rule :_qtext unless _tmp
1010
+ return _tmp
1011
+ end
1012
+
1013
+ # qcontent = (qtext | quoted-pair)
1014
+ def _qcontent
1015
+
1016
+ _save = self.pos
1017
+ while true # choice
1018
+ _tmp = apply(:_qtext)
1019
+ break if _tmp
1020
+ self.pos = _save
1021
+ _tmp = apply(:_quoted_hyphen_pair)
1022
+ break if _tmp
1023
+ self.pos = _save
1024
+ break
1025
+ end # end choice
1026
+
1027
+ set_failed_rule :_qcontent unless _tmp
1028
+ return _tmp
1029
+ end
1030
+
1031
+ # quoted-string = CFWS? "\"" (FWS? qcontent)* FWS? "\"" CFWS?
1032
+ def _quoted_hyphen_string
1033
+
1034
+ _save = self.pos
1035
+ while true # sequence
1036
+ _save1 = self.pos
1037
+ _tmp = apply(:_CFWS)
1038
+ unless _tmp
1039
+ _tmp = true
1040
+ self.pos = _save1
1041
+ end
1042
+ unless _tmp
1043
+ self.pos = _save
1044
+ break
1045
+ end
1046
+ _tmp = match_string("\"")
1047
+ unless _tmp
1048
+ self.pos = _save
1049
+ break
1050
+ end
1051
+ while true
1052
+
1053
+ _save3 = self.pos
1054
+ while true # sequence
1055
+ _save4 = self.pos
1056
+ _tmp = apply(:_FWS)
1057
+ unless _tmp
1058
+ _tmp = true
1059
+ self.pos = _save4
1060
+ end
1061
+ unless _tmp
1062
+ self.pos = _save3
1063
+ break
1064
+ end
1065
+ _tmp = apply(:_qcontent)
1066
+ unless _tmp
1067
+ self.pos = _save3
1068
+ end
1069
+ break
1070
+ end # end sequence
1071
+
1072
+ break unless _tmp
1073
+ end
1074
+ _tmp = true
1075
+ unless _tmp
1076
+ self.pos = _save
1077
+ break
1078
+ end
1079
+ _save5 = self.pos
1080
+ _tmp = apply(:_FWS)
1081
+ unless _tmp
1082
+ _tmp = true
1083
+ self.pos = _save5
1084
+ end
1085
+ unless _tmp
1086
+ self.pos = _save
1087
+ break
1088
+ end
1089
+ _tmp = match_string("\"")
1090
+ unless _tmp
1091
+ self.pos = _save
1092
+ break
1093
+ end
1094
+ _save6 = self.pos
1095
+ _tmp = apply(:_CFWS)
1096
+ unless _tmp
1097
+ _tmp = true
1098
+ self.pos = _save6
1099
+ end
1100
+ unless _tmp
1101
+ self.pos = _save
1102
+ end
1103
+ break
1104
+ end # end sequence
1105
+
1106
+ set_failed_rule :_quoted_hyphen_string unless _tmp
1107
+ return _tmp
1108
+ end
1109
+
1110
+ # word = (atom | quoted-string)
1111
+ def _word
1112
+
1113
+ _save = self.pos
1114
+ while true # choice
1115
+ _tmp = apply(:_atom)
1116
+ break if _tmp
1117
+ self.pos = _save
1118
+ _tmp = apply(:_quoted_hyphen_string)
1119
+ break if _tmp
1120
+ self.pos = _save
1121
+ break
1122
+ end # end choice
1123
+
1124
+ set_failed_rule :_word unless _tmp
1125
+ return _tmp
1126
+ end
1127
+
1128
+ # phrase = (word+ | obs-phrase)
1129
+ def _phrase
1130
+
1131
+ _save = self.pos
1132
+ while true # choice
1133
+ _save1 = self.pos
1134
+ _tmp = apply(:_word)
1135
+ if _tmp
1136
+ while true
1137
+ _tmp = apply(:_word)
1138
+ break unless _tmp
1139
+ end
1140
+ _tmp = true
1141
+ else
1142
+ self.pos = _save1
1143
+ end
1144
+ break if _tmp
1145
+ self.pos = _save
1146
+ _tmp = apply(:_obs_hyphen_phrase)
1147
+ break if _tmp
1148
+ self.pos = _save
1149
+ break
1150
+ end # end choice
1151
+
1152
+ set_failed_rule :_phrase unless _tmp
1153
+ return _tmp
1154
+ end
1155
+
1156
+ # utext = (NO-WS-CTL | d_btw(33,126) | obs-utext)
1157
+ def _utext
1158
+
1159
+ _save = self.pos
1160
+ while true # choice
1161
+ _tmp = apply(:_NO_hyphen_WS_hyphen_CTL)
1162
+ break if _tmp
1163
+ self.pos = _save
1164
+ _tmp = _d_btw(33,126)
1165
+ break if _tmp
1166
+ self.pos = _save
1167
+ _tmp = apply(:_obs_hyphen_utext)
1168
+ break if _tmp
1169
+ self.pos = _save
1170
+ break
1171
+ end # end choice
1172
+
1173
+ set_failed_rule :_utext unless _tmp
1174
+ return _tmp
1175
+ end
1176
+
1177
+ # unstructured = (FWS? utext)* FWS?
1178
+ def _unstructured
1179
+
1180
+ _save = self.pos
1181
+ while true # sequence
1182
+ while true
1183
+
1184
+ _save2 = self.pos
1185
+ while true # sequence
1186
+ _save3 = self.pos
1187
+ _tmp = apply(:_FWS)
1188
+ unless _tmp
1189
+ _tmp = true
1190
+ self.pos = _save3
1191
+ end
1192
+ unless _tmp
1193
+ self.pos = _save2
1194
+ break
1195
+ end
1196
+ _tmp = apply(:_utext)
1197
+ unless _tmp
1198
+ self.pos = _save2
1199
+ end
1200
+ break
1201
+ end # end sequence
1202
+
1203
+ break unless _tmp
1204
+ end
1205
+ _tmp = true
1206
+ unless _tmp
1207
+ self.pos = _save
1208
+ break
1209
+ end
1210
+ _save4 = self.pos
1211
+ _tmp = apply(:_FWS)
1212
+ unless _tmp
1213
+ _tmp = true
1214
+ self.pos = _save4
1215
+ end
1216
+ unless _tmp
1217
+ self.pos = _save
1218
+ end
1219
+ break
1220
+ end # end sequence
1221
+
1222
+ set_failed_rule :_unstructured unless _tmp
1223
+ return _tmp
1224
+ end
1225
+
1226
+ # address = (mailbox | group)
1227
+ def _address
1228
+
1229
+ _save = self.pos
1230
+ while true # choice
1231
+ _tmp = apply(:_mailbox)
1232
+ break if _tmp
1233
+ self.pos = _save
1234
+ _tmp = apply(:_group)
1235
+ break if _tmp
1236
+ self.pos = _save
1237
+ break
1238
+ end # end choice
1239
+
1240
+ set_failed_rule :_address unless _tmp
1241
+ return _tmp
1242
+ end
1243
+
1244
+ # mailbox = (name-addr | addr-spec)
1245
+ def _mailbox
1246
+
1247
+ _save = self.pos
1248
+ while true # choice
1249
+ _tmp = apply(:_name_hyphen_addr)
1250
+ break if _tmp
1251
+ self.pos = _save
1252
+ _tmp = apply(:_addr_hyphen_spec)
1253
+ break if _tmp
1254
+ self.pos = _save
1255
+ break
1256
+ end # end choice
1257
+
1258
+ set_failed_rule :_mailbox unless _tmp
1259
+ return _tmp
1260
+ end
1261
+
1262
+ # name-addr = display-name? angle-addr
1263
+ def _name_hyphen_addr
1264
+
1265
+ _save = self.pos
1266
+ while true # sequence
1267
+ _save1 = self.pos
1268
+ _tmp = apply(:_display_hyphen_name)
1269
+ unless _tmp
1270
+ _tmp = true
1271
+ self.pos = _save1
1272
+ end
1273
+ unless _tmp
1274
+ self.pos = _save
1275
+ break
1276
+ end
1277
+ _tmp = apply(:_angle_hyphen_addr)
1278
+ unless _tmp
1279
+ self.pos = _save
1280
+ end
1281
+ break
1282
+ end # end sequence
1283
+
1284
+ set_failed_rule :_name_hyphen_addr unless _tmp
1285
+ return _tmp
1286
+ end
1287
+
1288
+ # angle-addr = (CFWS? "<" addr-spec ">" CFWS? | obs-angle-addr)
1289
+ def _angle_hyphen_addr
1290
+
1291
+ _save = self.pos
1292
+ while true # choice
1293
+
1294
+ _save1 = self.pos
1295
+ while true # sequence
1296
+ _save2 = self.pos
1297
+ _tmp = apply(:_CFWS)
1298
+ unless _tmp
1299
+ _tmp = true
1300
+ self.pos = _save2
1301
+ end
1302
+ unless _tmp
1303
+ self.pos = _save1
1304
+ break
1305
+ end
1306
+ _tmp = match_string("<")
1307
+ unless _tmp
1308
+ self.pos = _save1
1309
+ break
1310
+ end
1311
+ _tmp = apply(:_addr_hyphen_spec)
1312
+ unless _tmp
1313
+ self.pos = _save1
1314
+ break
1315
+ end
1316
+ _tmp = match_string(">")
1317
+ unless _tmp
1318
+ self.pos = _save1
1319
+ break
1320
+ end
1321
+ _save3 = self.pos
1322
+ _tmp = apply(:_CFWS)
1323
+ unless _tmp
1324
+ _tmp = true
1325
+ self.pos = _save3
1326
+ end
1327
+ unless _tmp
1328
+ self.pos = _save1
1329
+ end
1330
+ break
1331
+ end # end sequence
1332
+
1333
+ break if _tmp
1334
+ self.pos = _save
1335
+ _tmp = apply(:_obs_hyphen_angle_hyphen_addr)
1336
+ break if _tmp
1337
+ self.pos = _save
1338
+ break
1339
+ end # end choice
1340
+
1341
+ set_failed_rule :_angle_hyphen_addr unless _tmp
1342
+ return _tmp
1343
+ end
1344
+
1345
+ # group = display-name ":" (mailbox-list | CFWS)? ";" CFWS?
1346
+ def _group
1347
+
1348
+ _save = self.pos
1349
+ while true # sequence
1350
+ _tmp = apply(:_display_hyphen_name)
1351
+ unless _tmp
1352
+ self.pos = _save
1353
+ break
1354
+ end
1355
+ _tmp = match_string(":")
1356
+ unless _tmp
1357
+ self.pos = _save
1358
+ break
1359
+ end
1360
+ _save1 = self.pos
1361
+
1362
+ _save2 = self.pos
1363
+ while true # choice
1364
+ _tmp = apply(:_mailbox_hyphen_list)
1365
+ break if _tmp
1366
+ self.pos = _save2
1367
+ _tmp = apply(:_CFWS)
1368
+ break if _tmp
1369
+ self.pos = _save2
1370
+ break
1371
+ end # end choice
1372
+
1373
+ unless _tmp
1374
+ _tmp = true
1375
+ self.pos = _save1
1376
+ end
1377
+ unless _tmp
1378
+ self.pos = _save
1379
+ break
1380
+ end
1381
+ _tmp = match_string(";")
1382
+ unless _tmp
1383
+ self.pos = _save
1384
+ break
1385
+ end
1386
+ _save3 = self.pos
1387
+ _tmp = apply(:_CFWS)
1388
+ unless _tmp
1389
+ _tmp = true
1390
+ self.pos = _save3
1391
+ end
1392
+ unless _tmp
1393
+ self.pos = _save
1394
+ end
1395
+ break
1396
+ end # end sequence
1397
+
1398
+ set_failed_rule :_group unless _tmp
1399
+ return _tmp
1400
+ end
1401
+
1402
+ # display-name = phrase
1403
+ def _display_hyphen_name
1404
+ _tmp = apply(:_phrase)
1405
+ set_failed_rule :_display_hyphen_name unless _tmp
1406
+ return _tmp
1407
+ end
1408
+
1409
+ # mailbox-list = (mailbox ("," mailbox)* | obs-mbox-list)
1410
+ def _mailbox_hyphen_list
1411
+
1412
+ _save = self.pos
1413
+ while true # choice
1414
+
1415
+ _save1 = self.pos
1416
+ while true # sequence
1417
+ _tmp = apply(:_mailbox)
1418
+ unless _tmp
1419
+ self.pos = _save1
1420
+ break
1421
+ end
1422
+ while true
1423
+
1424
+ _save3 = self.pos
1425
+ while true # sequence
1426
+ _tmp = match_string(",")
1427
+ unless _tmp
1428
+ self.pos = _save3
1429
+ break
1430
+ end
1431
+ _tmp = apply(:_mailbox)
1432
+ unless _tmp
1433
+ self.pos = _save3
1434
+ end
1435
+ break
1436
+ end # end sequence
1437
+
1438
+ break unless _tmp
1439
+ end
1440
+ _tmp = true
1441
+ unless _tmp
1442
+ self.pos = _save1
1443
+ end
1444
+ break
1445
+ end # end sequence
1446
+
1447
+ break if _tmp
1448
+ self.pos = _save
1449
+ _tmp = apply(:_obs_hyphen_mbox_hyphen_list)
1450
+ break if _tmp
1451
+ self.pos = _save
1452
+ break
1453
+ end # end choice
1454
+
1455
+ set_failed_rule :_mailbox_hyphen_list unless _tmp
1456
+ return _tmp
1457
+ end
1458
+
1459
+ # address-list = (address ("," address)* | obs-addr-list)
1460
+ def _address_hyphen_list
1461
+
1462
+ _save = self.pos
1463
+ while true # choice
1464
+
1465
+ _save1 = self.pos
1466
+ while true # sequence
1467
+ _tmp = apply(:_address)
1468
+ unless _tmp
1469
+ self.pos = _save1
1470
+ break
1471
+ end
1472
+ while true
1473
+
1474
+ _save3 = self.pos
1475
+ while true # sequence
1476
+ _tmp = match_string(",")
1477
+ unless _tmp
1478
+ self.pos = _save3
1479
+ break
1480
+ end
1481
+ _tmp = apply(:_address)
1482
+ unless _tmp
1483
+ self.pos = _save3
1484
+ end
1485
+ break
1486
+ end # end sequence
1487
+
1488
+ break unless _tmp
1489
+ end
1490
+ _tmp = true
1491
+ unless _tmp
1492
+ self.pos = _save1
1493
+ end
1494
+ break
1495
+ end # end sequence
1496
+
1497
+ break if _tmp
1498
+ self.pos = _save
1499
+ _tmp = apply(:_obs_hyphen_addr_hyphen_list)
1500
+ break if _tmp
1501
+ self.pos = _save
1502
+ break
1503
+ end # end choice
1504
+
1505
+ set_failed_rule :_address_hyphen_list unless _tmp
1506
+ return _tmp
1507
+ end
1508
+
1509
+ # addr-spec = local-part "@" domain
1510
+ def _addr_hyphen_spec
1511
+
1512
+ _save = self.pos
1513
+ while true # sequence
1514
+ _tmp = apply(:_local_hyphen_part)
1515
+ unless _tmp
1516
+ self.pos = _save
1517
+ break
1518
+ end
1519
+ _tmp = match_string("@")
1520
+ unless _tmp
1521
+ self.pos = _save
1522
+ break
1523
+ end
1524
+ _tmp = apply(:_domain)
1525
+ unless _tmp
1526
+ self.pos = _save
1527
+ end
1528
+ break
1529
+ end # end sequence
1530
+
1531
+ set_failed_rule :_addr_hyphen_spec unless _tmp
1532
+ return _tmp
1533
+ end
1534
+
1535
+ # local-part = (dot-atom | quoted-string | obs-local-part)
1536
+ def _local_hyphen_part
1537
+
1538
+ _save = self.pos
1539
+ while true # choice
1540
+ _tmp = apply(:_dot_hyphen_atom)
1541
+ break if _tmp
1542
+ self.pos = _save
1543
+ _tmp = apply(:_quoted_hyphen_string)
1544
+ break if _tmp
1545
+ self.pos = _save
1546
+ _tmp = apply(:_obs_hyphen_local_hyphen_part)
1547
+ break if _tmp
1548
+ self.pos = _save
1549
+ break
1550
+ end # end choice
1551
+
1552
+ set_failed_rule :_local_hyphen_part unless _tmp
1553
+ return _tmp
1554
+ end
1555
+
1556
+ # domain = (< dot-atom > &{ @validate_domain ? EmailAddressValidator::DomainParser.new(text).parse : true } | domain-literal | < obs-domain > &{ @validate_domain ? EmailAddressValidator::DomainParser.new(text).parse : true })
1557
+ def _domain
1558
+
1559
+ _save = self.pos
1560
+ while true # choice
1561
+
1562
+ _save1 = self.pos
1563
+ while true # sequence
1564
+ _text_start = self.pos
1565
+ _tmp = apply(:_dot_hyphen_atom)
1566
+ if _tmp
1567
+ text = get_text(_text_start)
1568
+ end
1569
+ unless _tmp
1570
+ self.pos = _save1
1571
+ break
1572
+ end
1573
+ _save2 = self.pos
1574
+ _tmp = begin; @validate_domain ? EmailAddressValidator::DomainParser.new(text).parse : true ; end
1575
+ self.pos = _save2
1576
+ unless _tmp
1577
+ self.pos = _save1
1578
+ end
1579
+ break
1580
+ end # end sequence
1581
+
1582
+ break if _tmp
1583
+ self.pos = _save
1584
+ _tmp = apply(:_domain_hyphen_literal)
1585
+ break if _tmp
1586
+ self.pos = _save
1587
+
1588
+ _save3 = self.pos
1589
+ while true # sequence
1590
+ _text_start = self.pos
1591
+ _tmp = apply(:_obs_hyphen_domain)
1592
+ if _tmp
1593
+ text = get_text(_text_start)
1594
+ end
1595
+ unless _tmp
1596
+ self.pos = _save3
1597
+ break
1598
+ end
1599
+ _save4 = self.pos
1600
+ _tmp = begin; @validate_domain ? EmailAddressValidator::DomainParser.new(text).parse : true ; end
1601
+ self.pos = _save4
1602
+ unless _tmp
1603
+ self.pos = _save3
1604
+ end
1605
+ break
1606
+ end # end sequence
1607
+
1608
+ break if _tmp
1609
+ self.pos = _save
1610
+ break
1611
+ end # end choice
1612
+
1613
+ set_failed_rule :_domain unless _tmp
1614
+ return _tmp
1615
+ end
1616
+
1617
+ # domain-literal = CFWS? "[" (FWS? dcontent)* FWS? "]" CFWS?
1618
+ def _domain_hyphen_literal
1619
+
1620
+ _save = self.pos
1621
+ while true # sequence
1622
+ _save1 = self.pos
1623
+ _tmp = apply(:_CFWS)
1624
+ unless _tmp
1625
+ _tmp = true
1626
+ self.pos = _save1
1627
+ end
1628
+ unless _tmp
1629
+ self.pos = _save
1630
+ break
1631
+ end
1632
+ _tmp = match_string("[")
1633
+ unless _tmp
1634
+ self.pos = _save
1635
+ break
1636
+ end
1637
+ while true
1638
+
1639
+ _save3 = self.pos
1640
+ while true # sequence
1641
+ _save4 = self.pos
1642
+ _tmp = apply(:_FWS)
1643
+ unless _tmp
1644
+ _tmp = true
1645
+ self.pos = _save4
1646
+ end
1647
+ unless _tmp
1648
+ self.pos = _save3
1649
+ break
1650
+ end
1651
+ _tmp = apply(:_dcontent)
1652
+ unless _tmp
1653
+ self.pos = _save3
1654
+ end
1655
+ break
1656
+ end # end sequence
1657
+
1658
+ break unless _tmp
1659
+ end
1660
+ _tmp = true
1661
+ unless _tmp
1662
+ self.pos = _save
1663
+ break
1664
+ end
1665
+ _save5 = self.pos
1666
+ _tmp = apply(:_FWS)
1667
+ unless _tmp
1668
+ _tmp = true
1669
+ self.pos = _save5
1670
+ end
1671
+ unless _tmp
1672
+ self.pos = _save
1673
+ break
1674
+ end
1675
+ _tmp = match_string("]")
1676
+ unless _tmp
1677
+ self.pos = _save
1678
+ break
1679
+ end
1680
+ _save6 = self.pos
1681
+ _tmp = apply(:_CFWS)
1682
+ unless _tmp
1683
+ _tmp = true
1684
+ self.pos = _save6
1685
+ end
1686
+ unless _tmp
1687
+ self.pos = _save
1688
+ end
1689
+ break
1690
+ end # end sequence
1691
+
1692
+ set_failed_rule :_domain_hyphen_literal unless _tmp
1693
+ return _tmp
1694
+ end
1695
+
1696
+ # dcontent = (dtext | quoted-pair)
1697
+ def _dcontent
1698
+
1699
+ _save = self.pos
1700
+ while true # choice
1701
+ _tmp = apply(:_dtext)
1702
+ break if _tmp
1703
+ self.pos = _save
1704
+ _tmp = apply(:_quoted_hyphen_pair)
1705
+ break if _tmp
1706
+ self.pos = _save
1707
+ break
1708
+ end # end choice
1709
+
1710
+ set_failed_rule :_dcontent unless _tmp
1711
+ return _tmp
1712
+ end
1713
+
1714
+ # dtext = (NO-WS-CTL | d_btw(33,90) | d_btw(94,126))
1715
+ def _dtext
1716
+
1717
+ _save = self.pos
1718
+ while true # choice
1719
+ _tmp = apply(:_NO_hyphen_WS_hyphen_CTL)
1720
+ break if _tmp
1721
+ self.pos = _save
1722
+ _tmp = _d_btw(33,90)
1723
+ break if _tmp
1724
+ self.pos = _save
1725
+ _tmp = _d_btw(94,126)
1726
+ break if _tmp
1727
+ self.pos = _save
1728
+ break
1729
+ end # end choice
1730
+
1731
+ set_failed_rule :_dtext unless _tmp
1732
+ return _tmp
1733
+ end
1734
+
1735
+ # obs-qp = "\\" d_btw(0,127)
1736
+ def _obs_hyphen_qp
1737
+
1738
+ _save = self.pos
1739
+ while true # sequence
1740
+ _tmp = match_string("\\")
1741
+ unless _tmp
1742
+ self.pos = _save
1743
+ break
1744
+ end
1745
+ _tmp = _d_btw(0,127)
1746
+ unless _tmp
1747
+ self.pos = _save
1748
+ end
1749
+ break
1750
+ end # end sequence
1751
+
1752
+ set_failed_rule :_obs_hyphen_qp unless _tmp
1753
+ return _tmp
1754
+ end
1755
+
1756
+ # obs-text = LF* CR* (obs-char LF* CR*)*
1757
+ def _obs_hyphen_text
1758
+
1759
+ _save = self.pos
1760
+ while true # sequence
1761
+ while true
1762
+ _tmp = apply(:_LF)
1763
+ break unless _tmp
1764
+ end
1765
+ _tmp = true
1766
+ unless _tmp
1767
+ self.pos = _save
1768
+ break
1769
+ end
1770
+ while true
1771
+ _tmp = apply(:_CR)
1772
+ break unless _tmp
1773
+ end
1774
+ _tmp = true
1775
+ unless _tmp
1776
+ self.pos = _save
1777
+ break
1778
+ end
1779
+ while true
1780
+
1781
+ _save4 = self.pos
1782
+ while true # sequence
1783
+ _tmp = apply(:_obs_hyphen_char)
1784
+ unless _tmp
1785
+ self.pos = _save4
1786
+ break
1787
+ end
1788
+ while true
1789
+ _tmp = apply(:_LF)
1790
+ break unless _tmp
1791
+ end
1792
+ _tmp = true
1793
+ unless _tmp
1794
+ self.pos = _save4
1795
+ break
1796
+ end
1797
+ while true
1798
+ _tmp = apply(:_CR)
1799
+ break unless _tmp
1800
+ end
1801
+ _tmp = true
1802
+ unless _tmp
1803
+ self.pos = _save4
1804
+ end
1805
+ break
1806
+ end # end sequence
1807
+
1808
+ break unless _tmp
1809
+ end
1810
+ _tmp = true
1811
+ unless _tmp
1812
+ self.pos = _save
1813
+ end
1814
+ break
1815
+ end # end sequence
1816
+
1817
+ set_failed_rule :_obs_hyphen_text unless _tmp
1818
+ return _tmp
1819
+ end
1820
+
1821
+ # obs-char = (d_btw(0,9) | d(11) | d(12) | d_btw(14,127))
1822
+ def _obs_hyphen_char
1823
+
1824
+ _save = self.pos
1825
+ while true # choice
1826
+ _tmp = _d_btw(0,9)
1827
+ break if _tmp
1828
+ self.pos = _save
1829
+ _tmp = _d(11)
1830
+ break if _tmp
1831
+ self.pos = _save
1832
+ _tmp = _d(12)
1833
+ break if _tmp
1834
+ self.pos = _save
1835
+ _tmp = _d_btw(14,127)
1836
+ break if _tmp
1837
+ self.pos = _save
1838
+ break
1839
+ end # end choice
1840
+
1841
+ set_failed_rule :_obs_hyphen_char unless _tmp
1842
+ return _tmp
1843
+ end
1844
+
1845
+ # obs-utext = obs-text
1846
+ def _obs_hyphen_utext
1847
+ _tmp = apply(:_obs_hyphen_text)
1848
+ set_failed_rule :_obs_hyphen_utext unless _tmp
1849
+ return _tmp
1850
+ end
1851
+
1852
+ # obs-phrase = word (word | "." | CFWS)*
1853
+ def _obs_hyphen_phrase
1854
+
1855
+ _save = self.pos
1856
+ while true # sequence
1857
+ _tmp = apply(:_word)
1858
+ unless _tmp
1859
+ self.pos = _save
1860
+ break
1861
+ end
1862
+ while true
1863
+
1864
+ _save2 = self.pos
1865
+ while true # choice
1866
+ _tmp = apply(:_word)
1867
+ break if _tmp
1868
+ self.pos = _save2
1869
+ _tmp = match_string(".")
1870
+ break if _tmp
1871
+ self.pos = _save2
1872
+ _tmp = apply(:_CFWS)
1873
+ break if _tmp
1874
+ self.pos = _save2
1875
+ break
1876
+ end # end choice
1877
+
1878
+ break unless _tmp
1879
+ end
1880
+ _tmp = true
1881
+ unless _tmp
1882
+ self.pos = _save
1883
+ end
1884
+ break
1885
+ end # end sequence
1886
+
1887
+ set_failed_rule :_obs_hyphen_phrase unless _tmp
1888
+ return _tmp
1889
+ end
1890
+
1891
+ # obs-phrase-list = (phrase | (phrase? CFWS? "," CFWS?)+ phrase?)
1892
+ def _obs_hyphen_phrase_hyphen_list
1893
+
1894
+ _save = self.pos
1895
+ while true # choice
1896
+ _tmp = apply(:_phrase)
1897
+ break if _tmp
1898
+ self.pos = _save
1899
+
1900
+ _save1 = self.pos
1901
+ while true # sequence
1902
+ _save2 = self.pos
1903
+
1904
+ _save3 = self.pos
1905
+ while true # sequence
1906
+ _save4 = self.pos
1907
+ _tmp = apply(:_phrase)
1908
+ unless _tmp
1909
+ _tmp = true
1910
+ self.pos = _save4
1911
+ end
1912
+ unless _tmp
1913
+ self.pos = _save3
1914
+ break
1915
+ end
1916
+ _save5 = self.pos
1917
+ _tmp = apply(:_CFWS)
1918
+ unless _tmp
1919
+ _tmp = true
1920
+ self.pos = _save5
1921
+ end
1922
+ unless _tmp
1923
+ self.pos = _save3
1924
+ break
1925
+ end
1926
+ _tmp = match_string(",")
1927
+ unless _tmp
1928
+ self.pos = _save3
1929
+ break
1930
+ end
1931
+ _save6 = self.pos
1932
+ _tmp = apply(:_CFWS)
1933
+ unless _tmp
1934
+ _tmp = true
1935
+ self.pos = _save6
1936
+ end
1937
+ unless _tmp
1938
+ self.pos = _save3
1939
+ end
1940
+ break
1941
+ end # end sequence
1942
+
1943
+ if _tmp
1944
+ while true
1945
+
1946
+ _save7 = self.pos
1947
+ while true # sequence
1948
+ _save8 = self.pos
1949
+ _tmp = apply(:_phrase)
1950
+ unless _tmp
1951
+ _tmp = true
1952
+ self.pos = _save8
1953
+ end
1954
+ unless _tmp
1955
+ self.pos = _save7
1956
+ break
1957
+ end
1958
+ _save9 = self.pos
1959
+ _tmp = apply(:_CFWS)
1960
+ unless _tmp
1961
+ _tmp = true
1962
+ self.pos = _save9
1963
+ end
1964
+ unless _tmp
1965
+ self.pos = _save7
1966
+ break
1967
+ end
1968
+ _tmp = match_string(",")
1969
+ unless _tmp
1970
+ self.pos = _save7
1971
+ break
1972
+ end
1973
+ _save10 = self.pos
1974
+ _tmp = apply(:_CFWS)
1975
+ unless _tmp
1976
+ _tmp = true
1977
+ self.pos = _save10
1978
+ end
1979
+ unless _tmp
1980
+ self.pos = _save7
1981
+ end
1982
+ break
1983
+ end # end sequence
1984
+
1985
+ break unless _tmp
1986
+ end
1987
+ _tmp = true
1988
+ else
1989
+ self.pos = _save2
1990
+ end
1991
+ unless _tmp
1992
+ self.pos = _save1
1993
+ break
1994
+ end
1995
+ _save11 = self.pos
1996
+ _tmp = apply(:_phrase)
1997
+ unless _tmp
1998
+ _tmp = true
1999
+ self.pos = _save11
2000
+ end
2001
+ unless _tmp
2002
+ self.pos = _save1
2003
+ end
2004
+ break
2005
+ end # end sequence
2006
+
2007
+ break if _tmp
2008
+ self.pos = _save
2009
+ break
2010
+ end # end choice
2011
+
2012
+ set_failed_rule :_obs_hyphen_phrase_hyphen_list unless _tmp
2013
+ return _tmp
2014
+ end
2015
+
2016
+ # obs-FWS = WSP+ (CRLF WSP+)*
2017
+ def _obs_hyphen_FWS
2018
+
2019
+ _save = self.pos
2020
+ while true # sequence
2021
+ _save1 = self.pos
2022
+ _tmp = apply(:_WSP)
2023
+ if _tmp
2024
+ while true
2025
+ _tmp = apply(:_WSP)
2026
+ break unless _tmp
2027
+ end
2028
+ _tmp = true
2029
+ else
2030
+ self.pos = _save1
2031
+ end
2032
+ unless _tmp
2033
+ self.pos = _save
2034
+ break
2035
+ end
2036
+ while true
2037
+
2038
+ _save3 = self.pos
2039
+ while true # sequence
2040
+ _tmp = apply(:_CRLF)
2041
+ unless _tmp
2042
+ self.pos = _save3
2043
+ break
2044
+ end
2045
+ _save4 = self.pos
2046
+ _tmp = apply(:_WSP)
2047
+ if _tmp
2048
+ while true
2049
+ _tmp = apply(:_WSP)
2050
+ break unless _tmp
2051
+ end
2052
+ _tmp = true
2053
+ else
2054
+ self.pos = _save4
2055
+ end
2056
+ unless _tmp
2057
+ self.pos = _save3
2058
+ end
2059
+ break
2060
+ end # end sequence
2061
+
2062
+ break unless _tmp
2063
+ end
2064
+ _tmp = true
2065
+ unless _tmp
2066
+ self.pos = _save
2067
+ end
2068
+ break
2069
+ end # end sequence
2070
+
2071
+ set_failed_rule :_obs_hyphen_FWS unless _tmp
2072
+ return _tmp
2073
+ end
2074
+
2075
+ # obs-angle-addr = CFWS? "<" obs-route? addr-spec ">" CFWS?
2076
+ def _obs_hyphen_angle_hyphen_addr
2077
+
2078
+ _save = self.pos
2079
+ while true # sequence
2080
+ _save1 = self.pos
2081
+ _tmp = apply(:_CFWS)
2082
+ unless _tmp
2083
+ _tmp = true
2084
+ self.pos = _save1
2085
+ end
2086
+ unless _tmp
2087
+ self.pos = _save
2088
+ break
2089
+ end
2090
+ _tmp = match_string("<")
2091
+ unless _tmp
2092
+ self.pos = _save
2093
+ break
2094
+ end
2095
+ _save2 = self.pos
2096
+ _tmp = apply(:_obs_hyphen_route)
2097
+ unless _tmp
2098
+ _tmp = true
2099
+ self.pos = _save2
2100
+ end
2101
+ unless _tmp
2102
+ self.pos = _save
2103
+ break
2104
+ end
2105
+ _tmp = apply(:_addr_hyphen_spec)
2106
+ unless _tmp
2107
+ self.pos = _save
2108
+ break
2109
+ end
2110
+ _tmp = match_string(">")
2111
+ unless _tmp
2112
+ self.pos = _save
2113
+ break
2114
+ end
2115
+ _save3 = self.pos
2116
+ _tmp = apply(:_CFWS)
2117
+ unless _tmp
2118
+ _tmp = true
2119
+ self.pos = _save3
2120
+ end
2121
+ unless _tmp
2122
+ self.pos = _save
2123
+ end
2124
+ break
2125
+ end # end sequence
2126
+
2127
+ set_failed_rule :_obs_hyphen_angle_hyphen_addr unless _tmp
2128
+ return _tmp
2129
+ end
2130
+
2131
+ # obs-route = CFWS? obs-domain-list ":" CFWS?
2132
+ def _obs_hyphen_route
2133
+
2134
+ _save = self.pos
2135
+ while true # sequence
2136
+ _save1 = self.pos
2137
+ _tmp = apply(:_CFWS)
2138
+ unless _tmp
2139
+ _tmp = true
2140
+ self.pos = _save1
2141
+ end
2142
+ unless _tmp
2143
+ self.pos = _save
2144
+ break
2145
+ end
2146
+ _tmp = apply(:_obs_hyphen_domain_hyphen_list)
2147
+ unless _tmp
2148
+ self.pos = _save
2149
+ break
2150
+ end
2151
+ _tmp = match_string(":")
2152
+ unless _tmp
2153
+ self.pos = _save
2154
+ break
2155
+ end
2156
+ _save2 = self.pos
2157
+ _tmp = apply(:_CFWS)
2158
+ unless _tmp
2159
+ _tmp = true
2160
+ self.pos = _save2
2161
+ end
2162
+ unless _tmp
2163
+ self.pos = _save
2164
+ end
2165
+ break
2166
+ end # end sequence
2167
+
2168
+ set_failed_rule :_obs_hyphen_route unless _tmp
2169
+ return _tmp
2170
+ end
2171
+
2172
+ # obs-domain-list = "@" domain ((CFWS | ",")* CFWS? "@" domain)*
2173
+ def _obs_hyphen_domain_hyphen_list
2174
+
2175
+ _save = self.pos
2176
+ while true # sequence
2177
+ _tmp = match_string("@")
2178
+ unless _tmp
2179
+ self.pos = _save
2180
+ break
2181
+ end
2182
+ _tmp = apply(:_domain)
2183
+ unless _tmp
2184
+ self.pos = _save
2185
+ break
2186
+ end
2187
+ while true
2188
+
2189
+ _save2 = self.pos
2190
+ while true # sequence
2191
+ while true
2192
+
2193
+ _save4 = self.pos
2194
+ while true # choice
2195
+ _tmp = apply(:_CFWS)
2196
+ break if _tmp
2197
+ self.pos = _save4
2198
+ _tmp = match_string(",")
2199
+ break if _tmp
2200
+ self.pos = _save4
2201
+ break
2202
+ end # end choice
2203
+
2204
+ break unless _tmp
2205
+ end
2206
+ _tmp = true
2207
+ unless _tmp
2208
+ self.pos = _save2
2209
+ break
2210
+ end
2211
+ _save5 = self.pos
2212
+ _tmp = apply(:_CFWS)
2213
+ unless _tmp
2214
+ _tmp = true
2215
+ self.pos = _save5
2216
+ end
2217
+ unless _tmp
2218
+ self.pos = _save2
2219
+ break
2220
+ end
2221
+ _tmp = match_string("@")
2222
+ unless _tmp
2223
+ self.pos = _save2
2224
+ break
2225
+ end
2226
+ _tmp = apply(:_domain)
2227
+ unless _tmp
2228
+ self.pos = _save2
2229
+ end
2230
+ break
2231
+ end # end sequence
2232
+
2233
+ break unless _tmp
2234
+ end
2235
+ _tmp = true
2236
+ unless _tmp
2237
+ self.pos = _save
2238
+ end
2239
+ break
2240
+ end # end sequence
2241
+
2242
+ set_failed_rule :_obs_hyphen_domain_hyphen_list unless _tmp
2243
+ return _tmp
2244
+ end
2245
+
2246
+ # obs-local-part = word ("." word)*
2247
+ def _obs_hyphen_local_hyphen_part
2248
+
2249
+ _save = self.pos
2250
+ while true # sequence
2251
+ _tmp = apply(:_word)
2252
+ unless _tmp
2253
+ self.pos = _save
2254
+ break
2255
+ end
2256
+ while true
2257
+
2258
+ _save2 = self.pos
2259
+ while true # sequence
2260
+ _tmp = match_string(".")
2261
+ unless _tmp
2262
+ self.pos = _save2
2263
+ break
2264
+ end
2265
+ _tmp = apply(:_word)
2266
+ unless _tmp
2267
+ self.pos = _save2
2268
+ end
2269
+ break
2270
+ end # end sequence
2271
+
2272
+ break unless _tmp
2273
+ end
2274
+ _tmp = true
2275
+ unless _tmp
2276
+ self.pos = _save
2277
+ end
2278
+ break
2279
+ end # end sequence
2280
+
2281
+ set_failed_rule :_obs_hyphen_local_hyphen_part unless _tmp
2282
+ return _tmp
2283
+ end
2284
+
2285
+ # obs-domain = atom ("." atom)*
2286
+ def _obs_hyphen_domain
2287
+
2288
+ _save = self.pos
2289
+ while true # sequence
2290
+ _tmp = apply(:_atom)
2291
+ unless _tmp
2292
+ self.pos = _save
2293
+ break
2294
+ end
2295
+ while true
2296
+
2297
+ _save2 = self.pos
2298
+ while true # sequence
2299
+ _tmp = match_string(".")
2300
+ unless _tmp
2301
+ self.pos = _save2
2302
+ break
2303
+ end
2304
+ _tmp = apply(:_atom)
2305
+ unless _tmp
2306
+ self.pos = _save2
2307
+ end
2308
+ break
2309
+ end # end sequence
2310
+
2311
+ break unless _tmp
2312
+ end
2313
+ _tmp = true
2314
+ unless _tmp
2315
+ self.pos = _save
2316
+ end
2317
+ break
2318
+ end # end sequence
2319
+
2320
+ set_failed_rule :_obs_hyphen_domain unless _tmp
2321
+ return _tmp
2322
+ end
2323
+
2324
+ # obs-mbox-list = (address? CFWS? "," CFWS?)+ address?
2325
+ def _obs_hyphen_mbox_hyphen_list
2326
+
2327
+ _save = self.pos
2328
+ while true # sequence
2329
+ _save1 = self.pos
2330
+
2331
+ _save2 = self.pos
2332
+ while true # sequence
2333
+ _save3 = self.pos
2334
+ _tmp = apply(:_address)
2335
+ unless _tmp
2336
+ _tmp = true
2337
+ self.pos = _save3
2338
+ end
2339
+ unless _tmp
2340
+ self.pos = _save2
2341
+ break
2342
+ end
2343
+ _save4 = self.pos
2344
+ _tmp = apply(:_CFWS)
2345
+ unless _tmp
2346
+ _tmp = true
2347
+ self.pos = _save4
2348
+ end
2349
+ unless _tmp
2350
+ self.pos = _save2
2351
+ break
2352
+ end
2353
+ _tmp = match_string(",")
2354
+ unless _tmp
2355
+ self.pos = _save2
2356
+ break
2357
+ end
2358
+ _save5 = self.pos
2359
+ _tmp = apply(:_CFWS)
2360
+ unless _tmp
2361
+ _tmp = true
2362
+ self.pos = _save5
2363
+ end
2364
+ unless _tmp
2365
+ self.pos = _save2
2366
+ end
2367
+ break
2368
+ end # end sequence
2369
+
2370
+ if _tmp
2371
+ while true
2372
+
2373
+ _save6 = self.pos
2374
+ while true # sequence
2375
+ _save7 = self.pos
2376
+ _tmp = apply(:_address)
2377
+ unless _tmp
2378
+ _tmp = true
2379
+ self.pos = _save7
2380
+ end
2381
+ unless _tmp
2382
+ self.pos = _save6
2383
+ break
2384
+ end
2385
+ _save8 = self.pos
2386
+ _tmp = apply(:_CFWS)
2387
+ unless _tmp
2388
+ _tmp = true
2389
+ self.pos = _save8
2390
+ end
2391
+ unless _tmp
2392
+ self.pos = _save6
2393
+ break
2394
+ end
2395
+ _tmp = match_string(",")
2396
+ unless _tmp
2397
+ self.pos = _save6
2398
+ break
2399
+ end
2400
+ _save9 = self.pos
2401
+ _tmp = apply(:_CFWS)
2402
+ unless _tmp
2403
+ _tmp = true
2404
+ self.pos = _save9
2405
+ end
2406
+ unless _tmp
2407
+ self.pos = _save6
2408
+ end
2409
+ break
2410
+ end # end sequence
2411
+
2412
+ break unless _tmp
2413
+ end
2414
+ _tmp = true
2415
+ else
2416
+ self.pos = _save1
2417
+ end
2418
+ unless _tmp
2419
+ self.pos = _save
2420
+ break
2421
+ end
2422
+ _save10 = self.pos
2423
+ _tmp = apply(:_address)
2424
+ unless _tmp
2425
+ _tmp = true
2426
+ self.pos = _save10
2427
+ end
2428
+ unless _tmp
2429
+ self.pos = _save
2430
+ end
2431
+ break
2432
+ end # end sequence
2433
+
2434
+ set_failed_rule :_obs_hyphen_mbox_hyphen_list unless _tmp
2435
+ return _tmp
2436
+ end
2437
+
2438
+ # root = address !.
2439
+ def _root
2440
+
2441
+ _save = self.pos
2442
+ while true # sequence
2443
+ _tmp = apply(:_address)
2444
+ unless _tmp
2445
+ self.pos = _save
2446
+ break
2447
+ end
2448
+ _save1 = self.pos
2449
+ _tmp = get_byte
2450
+ _tmp = _tmp ? nil : true
2451
+ self.pos = _save1
2452
+ unless _tmp
2453
+ self.pos = _save
2454
+ end
2455
+ break
2456
+ end # end sequence
2457
+
2458
+ set_failed_rule :_root unless _tmp
2459
+ return _tmp
2460
+ end
2461
+
2462
+ # only_addr_spec = addr-spec !.
2463
+ def _only_addr_spec
2464
+
2465
+ _save = self.pos
2466
+ while true # sequence
2467
+ _tmp = apply(:_addr_hyphen_spec)
2468
+ unless _tmp
2469
+ self.pos = _save
2470
+ break
2471
+ end
2472
+ _save1 = self.pos
2473
+ _tmp = get_byte
2474
+ _tmp = _tmp ? nil : true
2475
+ self.pos = _save1
2476
+ unless _tmp
2477
+ self.pos = _save
2478
+ end
2479
+ break
2480
+ end # end sequence
2481
+
2482
+ set_failed_rule :_only_addr_spec unless _tmp
2483
+ return _tmp
2484
+ end
2485
+
2486
+ Rules = {}
2487
+ Rules[:_d] = rule_info("d", "< . > &{ text[0] == num }")
2488
+ Rules[:_d_btw] = rule_info("d_btw", "< . > &{ t = text[0]; t >= start && t <= fin }")
2489
+ Rules[:_WSP] = rule_info("WSP", "(\" \" | d(9))")
2490
+ Rules[:_LF] = rule_info("LF", "/\\x0A/")
2491
+ Rules[:_CR] = rule_info("CR", "/\\x0D/")
2492
+ Rules[:_CRLF] = rule_info("CRLF", "CR LF")
2493
+ Rules[:_ALPHA] = rule_info("ALPHA", "/[A-Za-z]/")
2494
+ Rules[:_DIGIT] = rule_info("DIGIT", "/[0-9]/")
2495
+ Rules[:_NO_hyphen_WS_hyphen_CTL] = rule_info("NO-WS-CTL", "(d_btw(1,8) | d(11) | d(12) | d_btw(14,31) | d(127))")
2496
+ Rules[:_text] = rule_info("text", "(d_btw(1,9) | d(11) | d(12) | d_btw(14,127) | obs-text)")
2497
+ Rules[:_quoted_hyphen_pair] = rule_info("quoted-pair", "(\"\\\\\" text | obs-qp)")
2498
+ Rules[:_FWS] = rule_info("FWS", "((WSP* CRLF)? WSP+ | obs-FWS)")
2499
+ Rules[:_ctext] = rule_info("ctext", "(NO-WS-CTL | d_btw(33,39) | d_btw(42,91) | d_btw(93,126))")
2500
+ Rules[:_ccontent] = rule_info("ccontent", "(ctext | quoted-pair | comment)")
2501
+ Rules[:_comment] = rule_info("comment", "\"(\" (FWS? ccontent)* FWS? \")\"")
2502
+ Rules[:_CFWS] = rule_info("CFWS", "(FWS? comment)* (FWS? comment | FWS)")
2503
+ Rules[:_atext] = rule_info("atext", "(ALPHA | DIGIT | \"!\" | \"\#\" | \"$\" | \"%\" | \"&\" | \"'\" | \"*\" | \"+\" | \"-\" | \"/\" | \"=\" | \"?\" | \"^\" | \"_\" | \"`\" | \"{\" | \"|\" | \"}\" | \"~\")")
2504
+ Rules[:_atom] = rule_info("atom", "CFWS? atext+ CFWS?")
2505
+ Rules[:_dot_hyphen_atom] = rule_info("dot-atom", "CFWS? dot-atom-text CFWS?")
2506
+ Rules[:_dot_hyphen_atom_hyphen_text] = rule_info("dot-atom-text", "atext+ (\".\" atext+)*")
2507
+ Rules[:_qtext] = rule_info("qtext", "(NO-WS-CTL | d(33) | d_btw(35,91) | d_btw(93,126))")
2508
+ Rules[:_qcontent] = rule_info("qcontent", "(qtext | quoted-pair)")
2509
+ Rules[:_quoted_hyphen_string] = rule_info("quoted-string", "CFWS? \"\\\"\" (FWS? qcontent)* FWS? \"\\\"\" CFWS?")
2510
+ Rules[:_word] = rule_info("word", "(atom | quoted-string)")
2511
+ Rules[:_phrase] = rule_info("phrase", "(word+ | obs-phrase)")
2512
+ Rules[:_utext] = rule_info("utext", "(NO-WS-CTL | d_btw(33,126) | obs-utext)")
2513
+ Rules[:_unstructured] = rule_info("unstructured", "(FWS? utext)* FWS?")
2514
+ Rules[:_address] = rule_info("address", "(mailbox | group)")
2515
+ Rules[:_mailbox] = rule_info("mailbox", "(name-addr | addr-spec)")
2516
+ Rules[:_name_hyphen_addr] = rule_info("name-addr", "display-name? angle-addr")
2517
+ Rules[:_angle_hyphen_addr] = rule_info("angle-addr", "(CFWS? \"<\" addr-spec \">\" CFWS? | obs-angle-addr)")
2518
+ Rules[:_group] = rule_info("group", "display-name \":\" (mailbox-list | CFWS)? \";\" CFWS?")
2519
+ Rules[:_display_hyphen_name] = rule_info("display-name", "phrase")
2520
+ Rules[:_mailbox_hyphen_list] = rule_info("mailbox-list", "(mailbox (\",\" mailbox)* | obs-mbox-list)")
2521
+ Rules[:_address_hyphen_list] = rule_info("address-list", "(address (\",\" address)* | obs-addr-list)")
2522
+ Rules[:_addr_hyphen_spec] = rule_info("addr-spec", "local-part \"@\" domain")
2523
+ Rules[:_local_hyphen_part] = rule_info("local-part", "(dot-atom | quoted-string | obs-local-part)")
2524
+ Rules[:_domain] = rule_info("domain", "(< dot-atom > &{ @validate_domain ? EmailAddressValidator::DomainParser.new(text).parse : true } | domain-literal | < obs-domain > &{ @validate_domain ? EmailAddressValidator::DomainParser.new(text).parse : true })")
2525
+ Rules[:_domain_hyphen_literal] = rule_info("domain-literal", "CFWS? \"[\" (FWS? dcontent)* FWS? \"]\" CFWS?")
2526
+ Rules[:_dcontent] = rule_info("dcontent", "(dtext | quoted-pair)")
2527
+ Rules[:_dtext] = rule_info("dtext", "(NO-WS-CTL | d_btw(33,90) | d_btw(94,126))")
2528
+ Rules[:_obs_hyphen_qp] = rule_info("obs-qp", "\"\\\\\" d_btw(0,127)")
2529
+ Rules[:_obs_hyphen_text] = rule_info("obs-text", "LF* CR* (obs-char LF* CR*)*")
2530
+ Rules[:_obs_hyphen_char] = rule_info("obs-char", "(d_btw(0,9) | d(11) | d(12) | d_btw(14,127))")
2531
+ Rules[:_obs_hyphen_utext] = rule_info("obs-utext", "obs-text")
2532
+ Rules[:_obs_hyphen_phrase] = rule_info("obs-phrase", "word (word | \".\" | CFWS)*")
2533
+ Rules[:_obs_hyphen_phrase_hyphen_list] = rule_info("obs-phrase-list", "(phrase | (phrase? CFWS? \",\" CFWS?)+ phrase?)")
2534
+ Rules[:_obs_hyphen_FWS] = rule_info("obs-FWS", "WSP+ (CRLF WSP+)*")
2535
+ Rules[:_obs_hyphen_angle_hyphen_addr] = rule_info("obs-angle-addr", "CFWS? \"<\" obs-route? addr-spec \">\" CFWS?")
2536
+ Rules[:_obs_hyphen_route] = rule_info("obs-route", "CFWS? obs-domain-list \":\" CFWS?")
2537
+ Rules[:_obs_hyphen_domain_hyphen_list] = rule_info("obs-domain-list", "\"@\" domain ((CFWS | \",\")* CFWS? \"@\" domain)*")
2538
+ Rules[:_obs_hyphen_local_hyphen_part] = rule_info("obs-local-part", "word (\".\" word)*")
2539
+ Rules[:_obs_hyphen_domain] = rule_info("obs-domain", "atom (\".\" atom)*")
2540
+ Rules[:_obs_hyphen_mbox_hyphen_list] = rule_info("obs-mbox-list", "(address? CFWS? \",\" CFWS?)+ address?")
2541
+ Rules[:_root] = rule_info("root", "address !.")
2542
+ Rules[:_only_addr_spec] = rule_info("only_addr_spec", "addr-spec !.")
2543
+ end