abnf 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,26 @@
1
+ require 'abnf'
2
+
3
+ p /\A#{ABNF.regexp <<'End'}\z/o =~ "::13.1.68.3"
4
+ IPv6address = "::" /
5
+ 7( hex4 ":" ) hex4 /
6
+ 1*8( hex4 ":" ) ":" /
7
+ 7( hex4 ":" ) ( ":" hex4 ) /
8
+ 6( hex4 ":" ) 1*2( ":" hex4 ) /
9
+ 5( hex4 ":" ) 1*3( ":" hex4 ) /
10
+ 4( hex4 ":" ) 1*4( ":" hex4 ) /
11
+ 3( hex4 ":" ) 1*5( ":" hex4 ) /
12
+ 2( hex4 ":" ) 1*6( ":" hex4 ) /
13
+ ( hex4 ":" ) 1*7( ":" hex4 ) /
14
+ ":" 1*8( ":" hex4 ) /
15
+ 6( hex4 ":" ) IPv4address /
16
+ 6( hex4 ":" ) ":" IPv4address /
17
+ 5( hex4 ":" ) ":" 0*1( hex4 ":" ) IPv4address /
18
+ 4( hex4 ":" ) ":" 0*2( hex4 ":" ) IPv4address /
19
+ 3( hex4 ":" ) ":" 0*3( hex4 ":" ) IPv4address /
20
+ 2( hex4 ":" ) ":" 0*4( hex4 ":" ) IPv4address /
21
+ ( hex4 ":" ) ":" 0*5( hex4 ":" ) IPv4address /
22
+ "::" 0*6( hex4 ":" ) IPv4address
23
+ IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
24
+ hex4 = 1*4HEXDIG
25
+ End
26
+
@@ -0,0 +1,42 @@
1
+ require 'abnf'
2
+ require 'pp'
3
+
4
+ # IPv6 [RFC2373]
5
+ # Note that this ABNF description is wrong: e.g. it doesn't match to "::13.1.68.3".
6
+ wrong = ABNF.regexp_tree(<<-'End')
7
+ IPv6address = hexpart [ ":" IPv4address ]
8
+ IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
9
+ hexpart = hexseq | hexseq "::" [ hexseq ] | "::" [ hexseq ]
10
+ hexseq = hex4 *( ":" hex4)
11
+ hex4 = 1*4HEXDIG
12
+ End
13
+
14
+ corrected = ABNF.regexp_tree(<<-'End')
15
+ IPv6address = "::" /
16
+ 7( hex4 ":" ) hex4 /
17
+ 1*8( hex4 ":" ) ":" /
18
+ 7( hex4 ":" ) ( ":" hex4 ) /
19
+ 6( hex4 ":" ) 1*2( ":" hex4 ) /
20
+ 5( hex4 ":" ) 1*3( ":" hex4 ) /
21
+ 4( hex4 ":" ) 1*4( ":" hex4 ) /
22
+ 3( hex4 ":" ) 1*5( ":" hex4 ) /
23
+ 2( hex4 ":" ) 1*6( ":" hex4 ) /
24
+ ( hex4 ":" ) 1*7( ":" hex4 ) /
25
+ ":" 1*8( ":" hex4 ) /
26
+ 6( hex4 ":" ) IPv4address /
27
+ 6( hex4 ":" ) ":" IPv4address /
28
+ 5( hex4 ":" ) ":" 0*1( hex4 ":" ) IPv4address /
29
+ 4( hex4 ":" ) ":" 0*2( hex4 ":" ) IPv4address /
30
+ 3( hex4 ":" ) ":" 0*3( hex4 ":" ) IPv4address /
31
+ 2( hex4 ":" ) ":" 0*4( hex4 ":" ) IPv4address /
32
+ ( hex4 ":" ) ":" 0*5( hex4 ":" ) IPv4address /
33
+ "::" 0*6( hex4 ":" ) IPv4address
34
+ IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
35
+ hex4 = 1*4HEXDIG
36
+ End
37
+
38
+ pp wrong
39
+ pp corrected
40
+
41
+ p /\A#{wrong}\z/o =~ "::13.1.68.3"
42
+ p /\A#{corrected}\z/o =~ "::13.1.68.3"
@@ -0,0 +1,19 @@
1
+ require 'abnf'
2
+ require 'pp'
3
+
4
+ rt = ABNF.regexp_tree(<<'End')
5
+ s0 = n0 s0 / n1 s2 / n2 s1 / ""
6
+ s1 = n0 s1 / n1 s0 / n2 s2
7
+ s2 = n0 s2 / n1 s1 / n2 s0
8
+ n0 = "0" / "3" / "6" / "9"
9
+ n1 = "1" / "4" / "7"
10
+ n2 = "2" / "5" / "8"
11
+ End
12
+
13
+ pp rt
14
+
15
+ r = rt.regexp(true)
16
+
17
+ 1000.times {|i|
18
+ print "error: #{i}\n" unless (r !~ i.to_s) == (i%3 != 0)
19
+ }
@@ -0,0 +1,75 @@
1
+ require 'pp'
2
+ require 'abnf'
3
+
4
+ # URI-reference [RFC2396]
5
+ pp ABNF.regexp_tree(<<-'End')
6
+ URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
7
+ absoluteURI = scheme ":" ( hier_part | opaque_part )
8
+ relativeURI = ( net_path | abs_path | rel_path ) [ "?" query ]
9
+
10
+ hier_part = ( net_path | abs_path ) [ "?" query ]
11
+ opaque_part = uric_no_slash *uric
12
+
13
+ uric_no_slash = escaped | unreserved | ";" | "?" | ":" | "@" |
14
+ "&" | "=" | "+" | "$" | ","
15
+
16
+ net_path = "//" authority [ abs_path ]
17
+ abs_path = "/" path_segments
18
+ rel_path = rel_segment [ abs_path ]
19
+
20
+ rel_segment = 1*( escaped | unreserved |
21
+ ";" | "@" | "&" | "=" | "+" | "$" | "," )
22
+
23
+ scheme = alpha *( alpha | digit | "+" | "-" | "." )
24
+
25
+ authority = server | reg_name
26
+
27
+ reg_name = 1*( escaped | unreserved | "$" | "," |
28
+ ";" | ":" | "@" | "&" | "=" | "+" )
29
+
30
+ server = [ [ userinfo "@" ] hostport ]
31
+ userinfo = *( escaped | unreserved |
32
+ ";" | ":" | "&" | "=" | "+" | "$" | "," )
33
+
34
+ hostport = host [ ":" port ]
35
+ host = hostname | IPv4address
36
+ hostname = *( domainlabel "." ) toplabel [ "." ]
37
+ domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
38
+ toplabel = alpha | alpha *( alphanum | "-" ) alphanum
39
+ IPv4address = 1*digit "." 1*digit "." 1*digit "." 1*digit
40
+ port = *digit
41
+
42
+ path = [ abs_path | opaque_part ]
43
+ path_segments = segment *( "/" segment )
44
+ segment = *pchar *( ";" param )
45
+ param = *pchar
46
+ pchar = escaped | unreserved |
47
+ ":" | "@" | "&" | "=" | "+" | "$" | ","
48
+
49
+ query = *uric
50
+
51
+ fragment = *uric
52
+
53
+ uric = reserved | unreserved | escaped
54
+ reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
55
+ "$" | ","
56
+ unreserved = alphanum | mark
57
+ mark = "-" | "_" | "." | "!" | "~" | "*" | "'" |
58
+ "(" | ")"
59
+
60
+ escaped = "%" hex hex
61
+ hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
62
+ "a" | "b" | "c" | "d" | "e" | "f"
63
+
64
+ alphanum = alpha | digit
65
+ alpha = lowalpha | upalpha
66
+
67
+ lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |
68
+ "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |
69
+ "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
70
+ upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
71
+ "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
72
+ "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
73
+ digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
74
+ "8" | "9"
75
+ End
@@ -0,0 +1,82 @@
1
+ require 'abnf'
2
+
3
+ class TestABNF < Test::Unit::TestCase
4
+ def test_non_recursion_1
5
+ assert_equal(/a/i, ABNF.regexp(<<-'End'))
6
+ n = "a"
7
+ End
8
+ end
9
+
10
+ def test_left_recursion_1
11
+ assert_equal(/ab*/i, ABNF.regexp(<<-'End'))
12
+ n = "a" | n "b"
13
+ End
14
+ end
15
+
16
+ def test_left_recursion_2
17
+ assert_equal(/ab*/i, ABNF.regexp(<<-'End'))
18
+ n = "a" | n2 "b"
19
+ n2 = n
20
+ End
21
+ end
22
+
23
+ def test_left_recursion_3
24
+ assert_equal(/ac(?:bc)*/i, ABNF.regexp(<<-'End'))
25
+ n = ("a" | n "b") "c"
26
+ End
27
+ end
28
+
29
+ def test_right_recursion_1
30
+ assert_equal(/b*a/i, ABNF.regexp(<<-'End'))
31
+ n = "a" | "b" n
32
+ End
33
+ end
34
+
35
+ def test_both_recursion_1
36
+ assert_equal(/a*bc*/i, ABNF.regexp(<<-'End'))
37
+ n = "a" n | "b" | n "c"
38
+ End
39
+ end
40
+
41
+ def test_both_recursion_2
42
+ assert_equal(/a*bc*/i, ABNF.regexp(<<-'End'))
43
+ n = "a" n | "b" | n "c" | n
44
+ End
45
+ end
46
+
47
+ def test_unreachable_1
48
+ assert_equal([:s, :n], ABNF.parse(<<-'End').delete_unreachable!([:s]).names)
49
+ s = "a" | n
50
+ n = "b"
51
+ m = "c"
52
+ End
53
+ end
54
+
55
+ def test_useless_1
56
+ assert_equal([:s, :n], ABNF.parse(<<-'End').delete_useless!(:s).names)
57
+ s = "a" | n
58
+ n = "b"
59
+ m = "c"
60
+ End
61
+ end
62
+
63
+ def test_useless_2
64
+ assert_equal([:s, :n], ABNF.parse(<<-'End').delete_useless!(:s).names)
65
+ s = "a" | n | x
66
+ n = "b"
67
+ x = y
68
+ y = x
69
+ m = "c"
70
+ End
71
+ end
72
+
73
+ def test_too_complex
74
+ assert_raises(ABNF::TooComplex) { ABNF.regexp_tree(<<-End) }
75
+ s = "" | "a" s "b"
76
+ End
77
+ end
78
+
79
+ def test_case_insensitive_inspect
80
+ assert_equal("%r/a/", ABNF.regexp_tree("A = %d97").inspect)
81
+ end
82
+ end
@@ -0,0 +1,12 @@
1
+ require 'regexptree'
2
+
3
+ class TestRegexpTree < Test::Unit::TestCase
4
+ def test_whitespace
5
+ assert_equal('(?i-m:\x20\t\n\x23)', RegexpTree.str("\s\t\n#").to_s)
6
+ end
7
+
8
+ def test_case_insensitive
9
+ assert_equal(true, (RegexpTree.str("a")|RegexpTree.str("A")).case_insensitive?)
10
+ assert_equal(false, (RegexpTree.str("a")|RegexpTree.str("b")).case_insensitive?)
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ require 'test/unit'
2
+
3
+ require 'pp'
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: abnf
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Steve Klabnik
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: racc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: An Augmented Backus Naur form parser in Ruby.
56
+ email:
57
+ - steve@steveklabnik.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - .travis.yml
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - abnf.gemspec
69
+ - lib/abnf.rb
70
+ - lib/abnf/abnf.rb
71
+ - lib/abnf/corerules.rb
72
+ - lib/abnf/grammar.rb
73
+ - lib/abnf/parser.output
74
+ - lib/abnf/parser.rb
75
+ - lib/abnf/parser.y
76
+ - lib/abnf/regexp.rb
77
+ - lib/abnf/version.rb
78
+ - lib/natset.rb
79
+ - lib/regexptree.rb
80
+ - sample/in-place.rb
81
+ - sample/ipv6.rb
82
+ - sample/multiples-of-3.rb
83
+ - sample/uri.rb
84
+ - test/abnf_test.rb
85
+ - test/regexptree_test.rb
86
+ - test/test_helper.rb
87
+ homepage: https://github.com/steveklabnik/abnf
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.0.0
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: An Augmented Backus Naur form parser in Ruby.
111
+ test_files:
112
+ - test/abnf_test.rb
113
+ - test/regexptree_test.rb
114
+ - test/test_helper.rb
115
+ has_rdoc: