email_address_validator 0.0.1

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,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