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