abnf-parser 0.8.1 → 0.9.0

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/lib/abnf/parser.rb +23 -25
  3. data/lib/abnf/parser/common.rb +63 -0
  4. data/lib/abnf/parser/compiler.rb +73 -33
  5. data/lib/abnf/parser/compiler/alternation.rb +54 -0
  6. data/lib/abnf/parser/compiler/concatenation.rb +55 -0
  7. data/lib/abnf/parser/compiler/element.rb +87 -0
  8. data/lib/abnf/parser/compiler/group.rb +19 -0
  9. data/lib/abnf/parser/compiler/option.rb +19 -0
  10. data/lib/abnf/parser/compiler/repetition.rb +50 -0
  11. data/lib/abnf/parser/compiler/rule_builder.rb +32 -0
  12. data/lib/abnf/parser/compiler/rule_list.rb +67 -0
  13. data/lib/abnf/parser/compiler/token.rb +34 -0
  14. data/lib/abnf/parser/compiler/tokenizer.rb +95 -0
  15. data/lib/abnf/parser/controls.rb +5 -3
  16. data/lib/abnf/parser/controls/abnf.rb +237 -0
  17. data/lib/abnf/parser/controls/compiler/tokens.rb +97 -0
  18. data/lib/abnf/parser/controls/nodes.rb +113 -0
  19. data/lib/abnf/parser/controls/rule_lists.rb +63 -0
  20. data/lib/abnf/parser/controls/rule_lists/multiples_of_three.rb +146 -0
  21. data/lib/abnf/parser/controls/rules.rb +40 -17
  22. data/lib/abnf/parser/{errors.rb → error.rb} +0 -2
  23. data/lib/abnf/parser/node.rb +138 -0
  24. data/lib/abnf/parser/rule_list.rb +50 -11
  25. data/lib/abnf/parser/rules/alternation.rb +38 -0
  26. data/lib/abnf/parser/rules/concatenation.rb +36 -0
  27. data/lib/abnf/parser/rules/prose_val.rb +18 -0
  28. data/lib/abnf/parser/rules/reference.rb +22 -0
  29. data/lib/abnf/parser/rules/regexp_pattern.rb +35 -0
  30. data/lib/abnf/parser/rules/repetition.rb +46 -0
  31. data/lib/abnf/parser/rules/terminal.rb +63 -0
  32. metadata +31 -31
  33. data/lib/abnf/parser/ast.rb +0 -67
  34. data/lib/abnf/parser/controls/ast.rb +0 -28
  35. data/lib/abnf/parser/controls/grammar.rb +0 -32
  36. data/lib/abnf/parser/controls/text_stream.rb +0 -15
  37. data/lib/abnf/parser/grammar.rb +0 -17
  38. data/lib/abnf/parser/grammar/alternative.rb +0 -27
  39. data/lib/abnf/parser/grammar/char_val.rb +0 -15
  40. data/lib/abnf/parser/grammar/concatenation.rb +0 -21
  41. data/lib/abnf/parser/grammar/element.rb +0 -57
  42. data/lib/abnf/parser/grammar/num_val.rb +0 -72
  43. data/lib/abnf/parser/grammar/prose_val.rb +0 -15
  44. data/lib/abnf/parser/grammar/repetition.rb +0 -58
  45. data/lib/abnf/parser/grammar/rule.rb +0 -31
  46. data/lib/abnf/parser/grammar/rulename.rb +0 -15
  47. data/lib/abnf/parser/rule.rb +0 -10
  48. data/lib/abnf/parser/rule/alternative.rb +0 -43
  49. data/lib/abnf/parser/rule/concatenation.rb +0 -29
  50. data/lib/abnf/parser/rule/none.rb +0 -17
  51. data/lib/abnf/parser/rule/optional.rb +0 -24
  52. data/lib/abnf/parser/rule/reference.rb +0 -19
  53. data/lib/abnf/parser/rule/repetition.rb +0 -41
  54. data/lib/abnf/parser/rule/terminal_value.rb +0 -32
  55. data/lib/abnf/parser/rule/value_range.rb +0 -33
  56. data/lib/abnf/parser/rule_list/entry.rb +0 -21
  57. data/lib/abnf/parser/text_stream.rb +0 -67
metadata CHANGED
@@ -1,53 +1,52 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abnf-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Ladd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-13 00:00:00.000000000 Z
11
+ date: 2015-12-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: abnf-parser allows you to compile ABNF into rule lists that can be used
14
- to parse text.
13
+ description: abnf-parser allows you to compile ABNF (Augmented Backus-Naur Form) into
14
+ rule lists that can be used to efficiently parse text conforming to ABNF grammar.
15
15
  email: nathanladd+github@gmail.com
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - lib/abnf/parser.rb
21
- - lib/abnf/parser/ast.rb
21
+ - lib/abnf/parser/common.rb
22
22
  - lib/abnf/parser/compiler.rb
23
+ - lib/abnf/parser/compiler/alternation.rb
24
+ - lib/abnf/parser/compiler/concatenation.rb
25
+ - lib/abnf/parser/compiler/element.rb
26
+ - lib/abnf/parser/compiler/group.rb
27
+ - lib/abnf/parser/compiler/option.rb
28
+ - lib/abnf/parser/compiler/repetition.rb
29
+ - lib/abnf/parser/compiler/rule_builder.rb
30
+ - lib/abnf/parser/compiler/rule_list.rb
31
+ - lib/abnf/parser/compiler/token.rb
32
+ - lib/abnf/parser/compiler/tokenizer.rb
23
33
  - lib/abnf/parser/controls.rb
24
- - lib/abnf/parser/controls/ast.rb
25
- - lib/abnf/parser/controls/grammar.rb
34
+ - lib/abnf/parser/controls/abnf.rb
35
+ - lib/abnf/parser/controls/compiler/tokens.rb
36
+ - lib/abnf/parser/controls/nodes.rb
37
+ - lib/abnf/parser/controls/rule_lists.rb
38
+ - lib/abnf/parser/controls/rule_lists/multiples_of_three.rb
26
39
  - lib/abnf/parser/controls/rules.rb
27
- - lib/abnf/parser/controls/text_stream.rb
28
- - lib/abnf/parser/errors.rb
29
- - lib/abnf/parser/grammar.rb
30
- - lib/abnf/parser/grammar/alternative.rb
31
- - lib/abnf/parser/grammar/char_val.rb
32
- - lib/abnf/parser/grammar/concatenation.rb
33
- - lib/abnf/parser/grammar/element.rb
34
- - lib/abnf/parser/grammar/num_val.rb
35
- - lib/abnf/parser/grammar/prose_val.rb
36
- - lib/abnf/parser/grammar/repetition.rb
37
- - lib/abnf/parser/grammar/rule.rb
38
- - lib/abnf/parser/grammar/rulename.rb
39
- - lib/abnf/parser/rule.rb
40
- - lib/abnf/parser/rule/alternative.rb
41
- - lib/abnf/parser/rule/concatenation.rb
42
- - lib/abnf/parser/rule/none.rb
43
- - lib/abnf/parser/rule/optional.rb
44
- - lib/abnf/parser/rule/reference.rb
45
- - lib/abnf/parser/rule/repetition.rb
46
- - lib/abnf/parser/rule/terminal_value.rb
47
- - lib/abnf/parser/rule/value_range.rb
40
+ - lib/abnf/parser/error.rb
41
+ - lib/abnf/parser/node.rb
48
42
  - lib/abnf/parser/rule_list.rb
49
- - lib/abnf/parser/rule_list/entry.rb
50
- - lib/abnf/parser/text_stream.rb
43
+ - lib/abnf/parser/rules/alternation.rb
44
+ - lib/abnf/parser/rules/concatenation.rb
45
+ - lib/abnf/parser/rules/prose_val.rb
46
+ - lib/abnf/parser/rules/reference.rb
47
+ - lib/abnf/parser/rules/regexp_pattern.rb
48
+ - lib/abnf/parser/rules/repetition.rb
49
+ - lib/abnf/parser/rules/terminal.rb
51
50
  homepage: https://github.com/ntl/abnf-parser
52
51
  licenses:
53
52
  - MIT
@@ -71,5 +70,6 @@ rubyforge_project:
71
70
  rubygems_version: 2.4.5.1
72
71
  signing_key:
73
72
  specification_version: 4
74
- summary: ABNF Compiler & Parsing Library
73
+ summary: ABNF (Augmented Backus-Naur Form) Parsing Library
75
74
  test_files: []
75
+ has_rdoc:
@@ -1,67 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module AST
4
- def self.leaf *arguments
5
- Leaf.new *arguments
6
- end
7
-
8
- class Leaf
9
- attr_reader :text
10
-
11
- def initialize text
12
- @text = text
13
- end
14
-
15
- def == other_node
16
- other_node.respond_to? :text and text == other_node.text
17
- end
18
-
19
- def inner_text
20
- text
21
- end
22
- end
23
-
24
- def self.repetition *arguments
25
- Repetition.new *arguments
26
- end
27
-
28
- class Repetition
29
- attr_reader :nodes
30
-
31
- def initialize *nodes
32
- @nodes = nodes
33
- end
34
-
35
- def == other_node
36
- other_node.respond_to? :nodes and nodes == other_node.nodes
37
- end
38
-
39
- def inner_text
40
- strings = nodes.map &:inner_text
41
- strings.join
42
- end
43
- end
44
-
45
- def self.sequence *arguments
46
- Sequence.new *arguments
47
- end
48
-
49
- class Sequence
50
- attr_reader :nodes
51
-
52
- def initialize *nodes
53
- @nodes = nodes
54
- end
55
-
56
- def == other_node
57
- other_node.respond_to? :nodes and nodes == other_node.nodes
58
- end
59
-
60
- def inner_text
61
- strings = nodes.map &:inner_text
62
- strings.join
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,28 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Controls
4
- module AST
5
- extend self
6
-
7
- def leaf text = nil
8
- text ||= 'some-string'
9
- Parser::AST.leaf text
10
- end
11
-
12
- def repetition
13
- Parser::AST.repetition(
14
- leaf('some-string'),
15
- leaf('other-string'),
16
- )
17
- end
18
-
19
- def sequence
20
- Parser::AST.sequence(
21
- leaf('some-string'),
22
- leaf('other-string'),
23
- )
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,32 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Controls
4
- module Grammar
5
- class Example
6
- attr_reader :abnf
7
- attr_reader :type
8
-
9
- def initialize abnf, type
10
- @abnf = abnf
11
- @type = type
12
- end
13
-
14
- def rule
15
- @rule ||= type.compile abnf
16
- end
17
- end
18
-
19
- Alternative = Example.new '1*%x30-39 / *%x30-39 "*" *%x30-39', Parser::Grammar::Alternative
20
- CharVal = Example.new '"some-string"', Parser::Grammar::CharVal
21
- Concatenation = Example.new '"some-string" " " "some-string"', Parser::Grammar::Concatenation
22
- Group = Example.new '( "foo" / "bar" )', Parser::Grammar::Element
23
- NumVal = Example.new '%x41.42.43', Parser::Grammar::NumVal
24
- Option = Example.new '[ "some-string" ]', Parser::Grammar::Element
25
- Repetition = Example.new '1*2"some-element"', Parser::Grammar::Repetition
26
- Rulename = Example.new 'some-rule', Parser::Grammar::Rulename
27
- Rule = Example.new "some-rule = \"some-string\"\r\n", Parser::Grammar::Rule
28
- ProseVal = Example.new '<Some Prose>', Parser::Grammar::ProseVal
29
- end
30
- end
31
- end
32
- end
@@ -1,15 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Controls
4
- module TextStream
5
- def self.example
6
- Parser::TextStream.new 'some-text'
7
- end
8
-
9
- def self.rule
10
- Parser::TextStream.new 'some-rule = "some-string"'
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,17 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- C_NL = %r{;[\t -~]*\r\n|\r\n}n
5
-
6
- C_WSP = %r{\A
7
- (?:
8
- [[:blank:]]
9
- |
10
- #{C_NL}[[:blank:]]
11
- )*
12
- }xn
13
-
14
- CRLF = %r{\r\n}
15
- end
16
- end
17
- end
@@ -1,27 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class Alternative
5
- include Compiler
6
-
7
- DELIMITER = %r{/}
8
-
9
- def call
10
- concatenations = []
11
-
12
- begin
13
- concatenation = Concatenation.compile stream
14
- break unless concatenation
15
- concatenations << concatenation
16
- end while match? stream
17
-
18
- Parser::Rule::Alternative.new *concatenations
19
- end
20
-
21
- def match? stream
22
- stream.match C_WSP and stream.match DELIMITER and stream.match C_WSP
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,15 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class CharVal
5
- include Compiler
6
-
7
- PATTERN = %r{\A"(?<string>[\x20-\x21\x23-\x7E]*)"}
8
-
9
- def call
10
- Parser::Rule::TerminalValue.new match_data['string']
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,21 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class Concatenation
5
- include Compiler
6
-
7
- def call
8
- repetitions = []
9
-
10
- begin
11
- repetition = Repetition.compile stream
12
- break unless repetition
13
- repetitions << repetition
14
- end while stream.match C_WSP
15
-
16
- Parser::Rule::Concatenation.new *repetitions
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,57 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class Element
5
- include Compiler
6
-
7
- GROUP_START = %r{\(}
8
- GROUP_STOP = %r{\)}
9
- OPTION_START = %r{\[}
10
- OPTION_STOP = %r{\]}
11
-
12
- def call
13
- if stream.next_character == '['.freeze
14
- option
15
- elsif stream.next_character == '('.freeze
16
- group
17
- else
18
- terminal
19
- end
20
- end
21
-
22
- def group
23
- stream.match GROUP_START
24
- stream.match C_WSP
25
-
26
- alternative = Alternative.compile stream
27
-
28
- stream.match C_WSP
29
- stream.match GROUP_STOP
30
-
31
- alternative
32
- end
33
-
34
- def option
35
- stream.match OPTION_START
36
- stream.match C_WSP
37
-
38
- alternative = Alternative.compile stream
39
- option = Parser::Rule::Optional.new alternative
40
-
41
- stream.match C_WSP
42
- stream.match OPTION_STOP
43
-
44
- option
45
- end
46
-
47
- def terminal
48
- [Rulename, CharVal, NumVal, ProseVal].each do |type|
49
- output = type.compile stream
50
- return output if output
51
- end
52
- nil
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,72 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class NumVal
5
- include Compiler
6
-
7
- PATTERN = %r{\A%
8
- (?:
9
- (?<base_code>x)(?<first_character>[[:xdigit:]]+)
10
- (?:(?:-(?<range_end>[[:xdigit:]]+))|(?<sequence>(?:\.[[:xdigit:]]+)+))?
11
- |
12
- (?<base_code>d)(?<first_character>[[:digit:]]+)
13
- (?:(?:-(?<range_end>[[:digit:]]+))|(?<sequence>(?:\.[[:digit:]]+)+))?
14
- |
15
- (?<base_code>b)(?<first_character>[01]+)
16
- (?:(?:-(?<range_end>[01]+))|(?<sequence>(?:\.[01]+)+))?
17
- )
18
- }nx
19
-
20
- def base
21
- base_code = match_data['base_code'.freeze]
22
-
23
- {
24
- 'b'.freeze => 2,
25
- 'd'.freeze => 10,
26
- 'x'.freeze => 16,
27
- }[base_code]
28
- end
29
-
30
- def build_string
31
- *characters = sequence.to_s.split '.'
32
-
33
- [first_character, *characters].reduce String.new do |string, character|
34
- octet = convert_hex_character character
35
- string << octet
36
- string
37
- end
38
- end
39
-
40
- def call
41
- if range_end
42
- first_octet = convert_hex_character first_character
43
- last_octet = convert_hex_character range_end
44
- return Parser::Rule::ValueRange.new first_octet, last_octet
45
- end
46
-
47
- Parser::Rule::TerminalValue.new build_string, true
48
- end
49
-
50
- def convert_hex_character hex
51
- character = hex.to_i base
52
- octet = character.chr
53
- octet
54
- end
55
-
56
- def first_character
57
- match_data['first_character'.freeze]
58
- end
59
-
60
- def range_end
61
- match_data['range_end'.freeze]
62
- end
63
-
64
- def sequence
65
- sequence = match_data['sequence'.freeze]
66
- sequence.slice! 0, 1 if sequence
67
- sequence
68
- end
69
- end
70
- end
71
- end
72
- end