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,1326 @@
1
+ class EmailAddressValidator::RFC822Parser
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
+ # HTAB = /\x09/
324
+ def _HTAB
325
+ _tmp = scan(/\A(?-mix:\x09)/)
326
+ set_failed_rule :_HTAB unless _tmp
327
+ return _tmp
328
+ end
329
+
330
+ # LF = /\x0A/
331
+ def _LF
332
+ _tmp = scan(/\A(?-mix:\x0A)/)
333
+ set_failed_rule :_LF unless _tmp
334
+ return _tmp
335
+ end
336
+
337
+ # CR = /\x0D/
338
+ def _CR
339
+ _tmp = scan(/\A(?-mix:\x0D)/)
340
+ set_failed_rule :_CR unless _tmp
341
+ return _tmp
342
+ end
343
+
344
+ # SPACE = " "
345
+ def _SPACE
346
+ _tmp = match_string(" ")
347
+ set_failed_rule :_SPACE unless _tmp
348
+ return _tmp
349
+ end
350
+
351
+ # - = SPACE*
352
+ def __hyphen_
353
+ while true
354
+ _tmp = apply(:_SPACE)
355
+ break unless _tmp
356
+ end
357
+ _tmp = true
358
+ set_failed_rule :__hyphen_ unless _tmp
359
+ return _tmp
360
+ end
361
+
362
+ # AT = "@"
363
+ def _AT
364
+ _tmp = match_string("@")
365
+ set_failed_rule :_AT unless _tmp
366
+ return _tmp
367
+ end
368
+
369
+ # LWSP_char = (SPACE | HTAB)
370
+ def _LWSP_char
371
+
372
+ _save = self.pos
373
+ while true # choice
374
+ _tmp = apply(:_SPACE)
375
+ break if _tmp
376
+ self.pos = _save
377
+ _tmp = apply(:_HTAB)
378
+ break if _tmp
379
+ self.pos = _save
380
+ break
381
+ end # end choice
382
+
383
+ set_failed_rule :_LWSP_char unless _tmp
384
+ return _tmp
385
+ end
386
+
387
+ # CHAR = /[\x00-\x7f]/
388
+ def _CHAR
389
+ _tmp = scan(/\A(?-mix:[\x00-\x7f])/)
390
+ set_failed_rule :_CHAR unless _tmp
391
+ return _tmp
392
+ end
393
+
394
+ # CTL = /[\x00-\x1f\x7f]/
395
+ def _CTL
396
+ _tmp = scan(/\A(?-mix:[\x00-\x1f\x7f])/)
397
+ set_failed_rule :_CTL unless _tmp
398
+ return _tmp
399
+ end
400
+
401
+ # special = /[\]()<>@,;:\\".\[]/
402
+ def _special
403
+ _tmp = scan(/\A(?-mix:[\]()<>@,;:\\".\[])/)
404
+ set_failed_rule :_special unless _tmp
405
+ return _tmp
406
+ end
407
+
408
+ # CRLF = CR LF
409
+ def _CRLF
410
+
411
+ _save = self.pos
412
+ while true # sequence
413
+ _tmp = apply(:_CR)
414
+ unless _tmp
415
+ self.pos = _save
416
+ break
417
+ end
418
+ _tmp = apply(:_LF)
419
+ unless _tmp
420
+ self.pos = _save
421
+ end
422
+ break
423
+ end # end sequence
424
+
425
+ set_failed_rule :_CRLF unless _tmp
426
+ return _tmp
427
+ end
428
+
429
+ # linear_white_space = (CRLF? LWSP_char)+
430
+ def _linear_white_space
431
+ _save = self.pos
432
+
433
+ _save1 = self.pos
434
+ while true # sequence
435
+ _save2 = self.pos
436
+ _tmp = apply(:_CRLF)
437
+ unless _tmp
438
+ _tmp = true
439
+ self.pos = _save2
440
+ end
441
+ unless _tmp
442
+ self.pos = _save1
443
+ break
444
+ end
445
+ _tmp = apply(:_LWSP_char)
446
+ unless _tmp
447
+ self.pos = _save1
448
+ end
449
+ break
450
+ end # end sequence
451
+
452
+ if _tmp
453
+ while true
454
+
455
+ _save3 = self.pos
456
+ while true # sequence
457
+ _save4 = self.pos
458
+ _tmp = apply(:_CRLF)
459
+ unless _tmp
460
+ _tmp = true
461
+ self.pos = _save4
462
+ end
463
+ unless _tmp
464
+ self.pos = _save3
465
+ break
466
+ end
467
+ _tmp = apply(:_LWSP_char)
468
+ unless _tmp
469
+ self.pos = _save3
470
+ end
471
+ break
472
+ end # end sequence
473
+
474
+ break unless _tmp
475
+ end
476
+ _tmp = true
477
+ else
478
+ self.pos = _save
479
+ end
480
+ set_failed_rule :_linear_white_space unless _tmp
481
+ return _tmp
482
+ end
483
+
484
+ # atom = /[^\]\x00-\x20 \x7F\x80-\xFF()<>@,;:\\".\[]+/
485
+ def _atom
486
+ _tmp = scan(/\A(?-mix:[^\]\x00-\x20 \x7F\x80-\xFF()<>@,;:\\".\[]+)/)
487
+ set_failed_rule :_atom unless _tmp
488
+ return _tmp
489
+ end
490
+
491
+ # ctext = (/[^)\\\x0D\x80-\xFF(]+/ | linear_white_space)
492
+ def _ctext
493
+
494
+ _save = self.pos
495
+ while true # choice
496
+ _tmp = scan(/\A(?-mix:[^)\\\x0D\x80-\xFF(]+)/)
497
+ break if _tmp
498
+ self.pos = _save
499
+ _tmp = apply(:_linear_white_space)
500
+ break if _tmp
501
+ self.pos = _save
502
+ break
503
+ end # end choice
504
+
505
+ set_failed_rule :_ctext unless _tmp
506
+ return _tmp
507
+ end
508
+
509
+ # dtext = (/[^\]\\\x0D\x80-\xFF\[]+/ | linear_white_space)
510
+ def _dtext
511
+
512
+ _save = self.pos
513
+ while true # choice
514
+ _tmp = scan(/\A(?-mix:[^\]\\\x0D\x80-\xFF\[]+)/)
515
+ break if _tmp
516
+ self.pos = _save
517
+ _tmp = apply(:_linear_white_space)
518
+ break if _tmp
519
+ self.pos = _save
520
+ break
521
+ end # end choice
522
+
523
+ set_failed_rule :_dtext unless _tmp
524
+ return _tmp
525
+ end
526
+
527
+ # qtext = (/[^"\\\x0D\x80-\xFF]+/ | linear_white_space)
528
+ def _qtext
529
+
530
+ _save = self.pos
531
+ while true # choice
532
+ _tmp = scan(/\A(?-mix:[^"\\\x0D\x80-\xFF]+)/)
533
+ break if _tmp
534
+ self.pos = _save
535
+ _tmp = apply(:_linear_white_space)
536
+ break if _tmp
537
+ self.pos = _save
538
+ break
539
+ end # end choice
540
+
541
+ set_failed_rule :_qtext unless _tmp
542
+ return _tmp
543
+ end
544
+
545
+ # quoted_pair = "\\" CHAR
546
+ def _quoted_pair
547
+
548
+ _save = self.pos
549
+ while true # sequence
550
+ _tmp = match_string("\\")
551
+ unless _tmp
552
+ self.pos = _save
553
+ break
554
+ end
555
+ _tmp = apply(:_CHAR)
556
+ unless _tmp
557
+ self.pos = _save
558
+ end
559
+ break
560
+ end # end sequence
561
+
562
+ set_failed_rule :_quoted_pair unless _tmp
563
+ return _tmp
564
+ end
565
+
566
+ # quoted_string = "\"" (qtext | quoted_pair)* "\""
567
+ def _quoted_string
568
+
569
+ _save = self.pos
570
+ while true # sequence
571
+ _tmp = match_string("\"")
572
+ unless _tmp
573
+ self.pos = _save
574
+ break
575
+ end
576
+ while true
577
+
578
+ _save2 = self.pos
579
+ while true # choice
580
+ _tmp = apply(:_qtext)
581
+ break if _tmp
582
+ self.pos = _save2
583
+ _tmp = apply(:_quoted_pair)
584
+ break if _tmp
585
+ self.pos = _save2
586
+ break
587
+ end # end choice
588
+
589
+ break unless _tmp
590
+ end
591
+ _tmp = true
592
+ unless _tmp
593
+ self.pos = _save
594
+ break
595
+ end
596
+ _tmp = match_string("\"")
597
+ unless _tmp
598
+ self.pos = _save
599
+ end
600
+ break
601
+ end # end sequence
602
+
603
+ set_failed_rule :_quoted_string unless _tmp
604
+ return _tmp
605
+ end
606
+
607
+ # domain_literal = "[" (dtext | quoted_pair)* "]"
608
+ def _domain_literal
609
+
610
+ _save = self.pos
611
+ while true # sequence
612
+ _tmp = match_string("[")
613
+ unless _tmp
614
+ self.pos = _save
615
+ break
616
+ end
617
+ while true
618
+
619
+ _save2 = self.pos
620
+ while true # choice
621
+ _tmp = apply(:_dtext)
622
+ break if _tmp
623
+ self.pos = _save2
624
+ _tmp = apply(:_quoted_pair)
625
+ break if _tmp
626
+ self.pos = _save2
627
+ break
628
+ end # end choice
629
+
630
+ break unless _tmp
631
+ end
632
+ _tmp = true
633
+ unless _tmp
634
+ self.pos = _save
635
+ break
636
+ end
637
+ _tmp = match_string("]")
638
+ unless _tmp
639
+ self.pos = _save
640
+ end
641
+ break
642
+ end # end sequence
643
+
644
+ set_failed_rule :_domain_literal unless _tmp
645
+ return _tmp
646
+ end
647
+
648
+ # comment = "(" (ctext | quoted_pair | comment)* ")"
649
+ def _comment
650
+
651
+ _save = self.pos
652
+ while true # sequence
653
+ _tmp = match_string("(")
654
+ unless _tmp
655
+ self.pos = _save
656
+ break
657
+ end
658
+ while true
659
+
660
+ _save2 = self.pos
661
+ while true # choice
662
+ _tmp = apply(:_ctext)
663
+ break if _tmp
664
+ self.pos = _save2
665
+ _tmp = apply(:_quoted_pair)
666
+ break if _tmp
667
+ self.pos = _save2
668
+ _tmp = apply(:_comment)
669
+ break if _tmp
670
+ self.pos = _save2
671
+ break
672
+ end # end choice
673
+
674
+ break unless _tmp
675
+ end
676
+ _tmp = true
677
+ unless _tmp
678
+ self.pos = _save
679
+ break
680
+ end
681
+ _tmp = match_string(")")
682
+ unless _tmp
683
+ self.pos = _save
684
+ end
685
+ break
686
+ end # end sequence
687
+
688
+ set_failed_rule :_comment unless _tmp
689
+ return _tmp
690
+ end
691
+
692
+ # ocms = comment*
693
+ def _ocms
694
+ while true
695
+ _tmp = apply(:_comment)
696
+ break unless _tmp
697
+ end
698
+ _tmp = true
699
+ set_failed_rule :_ocms unless _tmp
700
+ return _tmp
701
+ end
702
+
703
+ # word = (atom | quoted_string)
704
+ def _word
705
+
706
+ _save = self.pos
707
+ while true # choice
708
+ _tmp = apply(:_atom)
709
+ break if _tmp
710
+ self.pos = _save
711
+ _tmp = apply(:_quoted_string)
712
+ break if _tmp
713
+ self.pos = _save
714
+ break
715
+ end # end choice
716
+
717
+ set_failed_rule :_word unless _tmp
718
+ return _tmp
719
+ end
720
+
721
+ # phrase = (word -)+
722
+ def _phrase
723
+ _save = self.pos
724
+
725
+ _save1 = self.pos
726
+ while true # sequence
727
+ _tmp = apply(:_word)
728
+ unless _tmp
729
+ self.pos = _save1
730
+ break
731
+ end
732
+ _tmp = apply(:__hyphen_)
733
+ unless _tmp
734
+ self.pos = _save1
735
+ end
736
+ break
737
+ end # end sequence
738
+
739
+ if _tmp
740
+ while true
741
+
742
+ _save2 = self.pos
743
+ while true # sequence
744
+ _tmp = apply(:_word)
745
+ unless _tmp
746
+ self.pos = _save2
747
+ break
748
+ end
749
+ _tmp = apply(:__hyphen_)
750
+ unless _tmp
751
+ self.pos = _save2
752
+ end
753
+ break
754
+ end # end sequence
755
+
756
+ break unless _tmp
757
+ end
758
+ _tmp = true
759
+ else
760
+ self.pos = _save
761
+ end
762
+ set_failed_rule :_phrase unless _tmp
763
+ return _tmp
764
+ end
765
+
766
+ # valid = ocms address ocms
767
+ def _valid
768
+
769
+ _save = self.pos
770
+ while true # sequence
771
+ _tmp = apply(:_ocms)
772
+ unless _tmp
773
+ self.pos = _save
774
+ break
775
+ end
776
+ _tmp = apply(:_address)
777
+ unless _tmp
778
+ self.pos = _save
779
+ break
780
+ end
781
+ _tmp = apply(:_ocms)
782
+ unless _tmp
783
+ self.pos = _save
784
+ end
785
+ break
786
+ end # end sequence
787
+
788
+ set_failed_rule :_valid unless _tmp
789
+ return _tmp
790
+ end
791
+
792
+ # address = (mailbox | group)
793
+ def _address
794
+
795
+ _save = self.pos
796
+ while true # choice
797
+ _tmp = apply(:_mailbox)
798
+ break if _tmp
799
+ self.pos = _save
800
+ _tmp = apply(:_group)
801
+ break if _tmp
802
+ self.pos = _save
803
+ break
804
+ end # end choice
805
+
806
+ set_failed_rule :_address unless _tmp
807
+ return _tmp
808
+ end
809
+
810
+ # group = phrase ocms ":" ocms mailbox (ocms "," ocms mailbox)* ocms ";"
811
+ def _group
812
+
813
+ _save = self.pos
814
+ while true # sequence
815
+ _tmp = apply(:_phrase)
816
+ unless _tmp
817
+ self.pos = _save
818
+ break
819
+ end
820
+ _tmp = apply(:_ocms)
821
+ unless _tmp
822
+ self.pos = _save
823
+ break
824
+ end
825
+ _tmp = match_string(":")
826
+ unless _tmp
827
+ self.pos = _save
828
+ break
829
+ end
830
+ _tmp = apply(:_ocms)
831
+ unless _tmp
832
+ self.pos = _save
833
+ break
834
+ end
835
+ _tmp = apply(:_mailbox)
836
+ unless _tmp
837
+ self.pos = _save
838
+ break
839
+ end
840
+ while true
841
+
842
+ _save2 = self.pos
843
+ while true # sequence
844
+ _tmp = apply(:_ocms)
845
+ unless _tmp
846
+ self.pos = _save2
847
+ break
848
+ end
849
+ _tmp = match_string(",")
850
+ unless _tmp
851
+ self.pos = _save2
852
+ break
853
+ end
854
+ _tmp = apply(:_ocms)
855
+ unless _tmp
856
+ self.pos = _save2
857
+ break
858
+ end
859
+ _tmp = apply(:_mailbox)
860
+ unless _tmp
861
+ self.pos = _save2
862
+ end
863
+ break
864
+ end # end sequence
865
+
866
+ break unless _tmp
867
+ end
868
+ _tmp = true
869
+ unless _tmp
870
+ self.pos = _save
871
+ break
872
+ end
873
+ _tmp = apply(:_ocms)
874
+ unless _tmp
875
+ self.pos = _save
876
+ break
877
+ end
878
+ _tmp = match_string(";")
879
+ unless _tmp
880
+ self.pos = _save
881
+ end
882
+ break
883
+ end # end sequence
884
+
885
+ set_failed_rule :_group unless _tmp
886
+ return _tmp
887
+ end
888
+
889
+ # mailbox = (addr_spec | phrase - ocms - angle_addr)
890
+ def _mailbox
891
+
892
+ _save = self.pos
893
+ while true # choice
894
+ _tmp = apply(:_addr_spec)
895
+ break if _tmp
896
+ self.pos = _save
897
+
898
+ _save1 = self.pos
899
+ while true # sequence
900
+ _tmp = apply(:_phrase)
901
+ unless _tmp
902
+ self.pos = _save1
903
+ break
904
+ end
905
+ _tmp = apply(:__hyphen_)
906
+ unless _tmp
907
+ self.pos = _save1
908
+ break
909
+ end
910
+ _tmp = apply(:_ocms)
911
+ unless _tmp
912
+ self.pos = _save1
913
+ break
914
+ end
915
+ _tmp = apply(:__hyphen_)
916
+ unless _tmp
917
+ self.pos = _save1
918
+ break
919
+ end
920
+ _tmp = apply(:_angle_addr)
921
+ unless _tmp
922
+ self.pos = _save1
923
+ end
924
+ break
925
+ end # end sequence
926
+
927
+ break if _tmp
928
+ self.pos = _save
929
+ break
930
+ end # end choice
931
+
932
+ set_failed_rule :_mailbox unless _tmp
933
+ return _tmp
934
+ end
935
+
936
+ # angle_addr = "<" ocms route? ocms addr_spec ">"
937
+ def _angle_addr
938
+
939
+ _save = self.pos
940
+ while true # sequence
941
+ _tmp = match_string("<")
942
+ unless _tmp
943
+ self.pos = _save
944
+ break
945
+ end
946
+ _tmp = apply(:_ocms)
947
+ unless _tmp
948
+ self.pos = _save
949
+ break
950
+ end
951
+ _save1 = self.pos
952
+ _tmp = apply(:_route)
953
+ unless _tmp
954
+ _tmp = true
955
+ self.pos = _save1
956
+ end
957
+ unless _tmp
958
+ self.pos = _save
959
+ break
960
+ end
961
+ _tmp = apply(:_ocms)
962
+ unless _tmp
963
+ self.pos = _save
964
+ break
965
+ end
966
+ _tmp = apply(:_addr_spec)
967
+ unless _tmp
968
+ self.pos = _save
969
+ break
970
+ end
971
+ _tmp = match_string(">")
972
+ unless _tmp
973
+ self.pos = _save
974
+ end
975
+ break
976
+ end # end sequence
977
+
978
+ set_failed_rule :_angle_addr unless _tmp
979
+ return _tmp
980
+ end
981
+
982
+ # route = (AT ocms domain)+ ":"
983
+ def _route
984
+
985
+ _save = self.pos
986
+ while true # sequence
987
+ _save1 = self.pos
988
+
989
+ _save2 = self.pos
990
+ while true # sequence
991
+ _tmp = apply(:_AT)
992
+ unless _tmp
993
+ self.pos = _save2
994
+ break
995
+ end
996
+ _tmp = apply(:_ocms)
997
+ unless _tmp
998
+ self.pos = _save2
999
+ break
1000
+ end
1001
+ _tmp = apply(:_domain)
1002
+ unless _tmp
1003
+ self.pos = _save2
1004
+ end
1005
+ break
1006
+ end # end sequence
1007
+
1008
+ if _tmp
1009
+ while true
1010
+
1011
+ _save3 = self.pos
1012
+ while true # sequence
1013
+ _tmp = apply(:_AT)
1014
+ unless _tmp
1015
+ self.pos = _save3
1016
+ break
1017
+ end
1018
+ _tmp = apply(:_ocms)
1019
+ unless _tmp
1020
+ self.pos = _save3
1021
+ break
1022
+ end
1023
+ _tmp = apply(:_domain)
1024
+ unless _tmp
1025
+ self.pos = _save3
1026
+ end
1027
+ break
1028
+ end # end sequence
1029
+
1030
+ break unless _tmp
1031
+ end
1032
+ _tmp = true
1033
+ else
1034
+ self.pos = _save1
1035
+ end
1036
+ unless _tmp
1037
+ self.pos = _save
1038
+ break
1039
+ end
1040
+ _tmp = match_string(":")
1041
+ unless _tmp
1042
+ self.pos = _save
1043
+ end
1044
+ break
1045
+ end # end sequence
1046
+
1047
+ set_failed_rule :_route unless _tmp
1048
+ return _tmp
1049
+ end
1050
+
1051
+ # addr_spec = local_part ocms "@" ocms domain
1052
+ def _addr_spec
1053
+
1054
+ _save = self.pos
1055
+ while true # sequence
1056
+ _tmp = apply(:_local_part)
1057
+ unless _tmp
1058
+ self.pos = _save
1059
+ break
1060
+ end
1061
+ _tmp = apply(:_ocms)
1062
+ unless _tmp
1063
+ self.pos = _save
1064
+ break
1065
+ end
1066
+ _tmp = match_string("@")
1067
+ unless _tmp
1068
+ self.pos = _save
1069
+ break
1070
+ end
1071
+ _tmp = apply(:_ocms)
1072
+ unless _tmp
1073
+ self.pos = _save
1074
+ break
1075
+ end
1076
+ _tmp = apply(:_domain)
1077
+ unless _tmp
1078
+ self.pos = _save
1079
+ end
1080
+ break
1081
+ end # end sequence
1082
+
1083
+ set_failed_rule :_addr_spec unless _tmp
1084
+ return _tmp
1085
+ end
1086
+
1087
+ # local_part = word ocms ("." ocms word)*
1088
+ def _local_part
1089
+
1090
+ _save = self.pos
1091
+ while true # sequence
1092
+ _tmp = apply(:_word)
1093
+ unless _tmp
1094
+ self.pos = _save
1095
+ break
1096
+ end
1097
+ _tmp = apply(:_ocms)
1098
+ unless _tmp
1099
+ self.pos = _save
1100
+ break
1101
+ end
1102
+ while true
1103
+
1104
+ _save2 = self.pos
1105
+ while true # sequence
1106
+ _tmp = match_string(".")
1107
+ unless _tmp
1108
+ self.pos = _save2
1109
+ break
1110
+ end
1111
+ _tmp = apply(:_ocms)
1112
+ unless _tmp
1113
+ self.pos = _save2
1114
+ break
1115
+ end
1116
+ _tmp = apply(:_word)
1117
+ unless _tmp
1118
+ self.pos = _save2
1119
+ end
1120
+ break
1121
+ end # end sequence
1122
+
1123
+ break unless _tmp
1124
+ end
1125
+ _tmp = true
1126
+ unless _tmp
1127
+ self.pos = _save
1128
+ end
1129
+ break
1130
+ end # end sequence
1131
+
1132
+ set_failed_rule :_local_part unless _tmp
1133
+ return _tmp
1134
+ end
1135
+
1136
+ # domain = (domain_literal | < sub_domain ocms ("." ocms sub_domain)* > &{ @validate_domain ? EmailAddressValidator::DomainParser.new(text).parse : true })
1137
+ def _domain
1138
+
1139
+ _save = self.pos
1140
+ while true # choice
1141
+ _tmp = apply(:_domain_literal)
1142
+ break if _tmp
1143
+ self.pos = _save
1144
+
1145
+ _save1 = self.pos
1146
+ while true # sequence
1147
+ _text_start = self.pos
1148
+
1149
+ _save2 = self.pos
1150
+ while true # sequence
1151
+ _tmp = apply(:_sub_domain)
1152
+ unless _tmp
1153
+ self.pos = _save2
1154
+ break
1155
+ end
1156
+ _tmp = apply(:_ocms)
1157
+ unless _tmp
1158
+ self.pos = _save2
1159
+ break
1160
+ end
1161
+ while true
1162
+
1163
+ _save4 = self.pos
1164
+ while true # sequence
1165
+ _tmp = match_string(".")
1166
+ unless _tmp
1167
+ self.pos = _save4
1168
+ break
1169
+ end
1170
+ _tmp = apply(:_ocms)
1171
+ unless _tmp
1172
+ self.pos = _save4
1173
+ break
1174
+ end
1175
+ _tmp = apply(:_sub_domain)
1176
+ unless _tmp
1177
+ self.pos = _save4
1178
+ end
1179
+ break
1180
+ end # end sequence
1181
+
1182
+ break unless _tmp
1183
+ end
1184
+ _tmp = true
1185
+ unless _tmp
1186
+ self.pos = _save2
1187
+ end
1188
+ break
1189
+ end # end sequence
1190
+
1191
+ if _tmp
1192
+ text = get_text(_text_start)
1193
+ end
1194
+ unless _tmp
1195
+ self.pos = _save1
1196
+ break
1197
+ end
1198
+ _save5 = self.pos
1199
+ _tmp = begin; @validate_domain ? EmailAddressValidator::DomainParser.new(text).parse : true ; end
1200
+ self.pos = _save5
1201
+ unless _tmp
1202
+ self.pos = _save1
1203
+ end
1204
+ break
1205
+ end # end sequence
1206
+
1207
+ break if _tmp
1208
+ self.pos = _save
1209
+ break
1210
+ end # end choice
1211
+
1212
+ set_failed_rule :_domain unless _tmp
1213
+ return _tmp
1214
+ end
1215
+
1216
+ # sub_domain = (domain_ref | domain_literal)
1217
+ def _sub_domain
1218
+
1219
+ _save = self.pos
1220
+ while true # choice
1221
+ _tmp = apply(:_domain_ref)
1222
+ break if _tmp
1223
+ self.pos = _save
1224
+ _tmp = apply(:_domain_literal)
1225
+ break if _tmp
1226
+ self.pos = _save
1227
+ break
1228
+ end # end choice
1229
+
1230
+ set_failed_rule :_sub_domain unless _tmp
1231
+ return _tmp
1232
+ end
1233
+
1234
+ # domain_ref = atom
1235
+ def _domain_ref
1236
+ _tmp = apply(:_atom)
1237
+ set_failed_rule :_domain_ref unless _tmp
1238
+ return _tmp
1239
+ end
1240
+
1241
+ # root = valid !.
1242
+ def _root
1243
+
1244
+ _save = self.pos
1245
+ while true # sequence
1246
+ _tmp = apply(:_valid)
1247
+ unless _tmp
1248
+ self.pos = _save
1249
+ break
1250
+ end
1251
+ _save1 = self.pos
1252
+ _tmp = get_byte
1253
+ _tmp = _tmp ? nil : true
1254
+ self.pos = _save1
1255
+ unless _tmp
1256
+ self.pos = _save
1257
+ end
1258
+ break
1259
+ end # end sequence
1260
+
1261
+ set_failed_rule :_root unless _tmp
1262
+ return _tmp
1263
+ end
1264
+
1265
+ # only_addr_spec = addr_spec !.
1266
+ def _only_addr_spec
1267
+
1268
+ _save = self.pos
1269
+ while true # sequence
1270
+ _tmp = apply(:_addr_spec)
1271
+ unless _tmp
1272
+ self.pos = _save
1273
+ break
1274
+ end
1275
+ _save1 = self.pos
1276
+ _tmp = get_byte
1277
+ _tmp = _tmp ? nil : true
1278
+ self.pos = _save1
1279
+ unless _tmp
1280
+ self.pos = _save
1281
+ end
1282
+ break
1283
+ end # end sequence
1284
+
1285
+ set_failed_rule :_only_addr_spec unless _tmp
1286
+ return _tmp
1287
+ end
1288
+
1289
+ Rules = {}
1290
+ Rules[:_HTAB] = rule_info("HTAB", "/\\x09/")
1291
+ Rules[:_LF] = rule_info("LF", "/\\x0A/")
1292
+ Rules[:_CR] = rule_info("CR", "/\\x0D/")
1293
+ Rules[:_SPACE] = rule_info("SPACE", "\" \"")
1294
+ Rules[:__hyphen_] = rule_info("-", "SPACE*")
1295
+ Rules[:_AT] = rule_info("AT", "\"@\"")
1296
+ Rules[:_LWSP_char] = rule_info("LWSP_char", "(SPACE | HTAB)")
1297
+ Rules[:_CHAR] = rule_info("CHAR", "/[\\x00-\\x7f]/")
1298
+ Rules[:_CTL] = rule_info("CTL", "/[\\x00-\\x1f\\x7f]/")
1299
+ Rules[:_special] = rule_info("special", "/[\\]()<>@,;:\\\\\".\\[]/")
1300
+ Rules[:_CRLF] = rule_info("CRLF", "CR LF")
1301
+ Rules[:_linear_white_space] = rule_info("linear_white_space", "(CRLF? LWSP_char)+")
1302
+ Rules[:_atom] = rule_info("atom", "/[^\\]\\x00-\\x20 \\x7F\\x80-\\xFF()<>@,;:\\\\\".\\[]+/")
1303
+ Rules[:_ctext] = rule_info("ctext", "(/[^)\\\\\\x0D\\x80-\\xFF(]+/ | linear_white_space)")
1304
+ Rules[:_dtext] = rule_info("dtext", "(/[^\\]\\\\\\x0D\\x80-\\xFF\\[]+/ | linear_white_space)")
1305
+ Rules[:_qtext] = rule_info("qtext", "(/[^\"\\\\\\x0D\\x80-\\xFF]+/ | linear_white_space)")
1306
+ Rules[:_quoted_pair] = rule_info("quoted_pair", "\"\\\\\" CHAR")
1307
+ Rules[:_quoted_string] = rule_info("quoted_string", "\"\\\"\" (qtext | quoted_pair)* \"\\\"\"")
1308
+ Rules[:_domain_literal] = rule_info("domain_literal", "\"[\" (dtext | quoted_pair)* \"]\"")
1309
+ Rules[:_comment] = rule_info("comment", "\"(\" (ctext | quoted_pair | comment)* \")\"")
1310
+ Rules[:_ocms] = rule_info("ocms", "comment*")
1311
+ Rules[:_word] = rule_info("word", "(atom | quoted_string)")
1312
+ Rules[:_phrase] = rule_info("phrase", "(word -)+")
1313
+ Rules[:_valid] = rule_info("valid", "ocms address ocms")
1314
+ Rules[:_address] = rule_info("address", "(mailbox | group)")
1315
+ Rules[:_group] = rule_info("group", "phrase ocms \":\" ocms mailbox (ocms \",\" ocms mailbox)* ocms \";\"")
1316
+ Rules[:_mailbox] = rule_info("mailbox", "(addr_spec | phrase - ocms - angle_addr)")
1317
+ Rules[:_angle_addr] = rule_info("angle_addr", "\"<\" ocms route? ocms addr_spec \">\"")
1318
+ Rules[:_route] = rule_info("route", "(AT ocms domain)+ \":\"")
1319
+ Rules[:_addr_spec] = rule_info("addr_spec", "local_part ocms \"@\" ocms domain")
1320
+ Rules[:_local_part] = rule_info("local_part", "word ocms (\".\" ocms word)*")
1321
+ Rules[:_domain] = rule_info("domain", "(domain_literal | < sub_domain ocms (\".\" ocms sub_domain)* > &{ @validate_domain ? EmailAddressValidator::DomainParser.new(text).parse : true })")
1322
+ Rules[:_sub_domain] = rule_info("sub_domain", "(domain_ref | domain_literal)")
1323
+ Rules[:_domain_ref] = rule_info("domain_ref", "atom")
1324
+ Rules[:_root] = rule_info("root", "valid !.")
1325
+ Rules[:_only_addr_spec] = rule_info("only_addr_spec", "addr_spec !.")
1326
+ end