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
@@ -1,15 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class ProseVal
5
- include Compiler
6
-
7
- PATTERN = %r{\A<[\x20-\x3D\x3F-\x7E]*>\z}n
8
-
9
- def call
10
- Parser::Rule::None.instance
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,58 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class Repetition
5
- include Compiler
6
-
7
- PATTERN = %r{\A
8
- (?:
9
- (?<range>(?<minimum>[[:digit:]]*)\*(?<maximum>[[:digit:]]*))
10
- |
11
- (?<fixed_number>[[:digit:]]+)
12
- )?
13
- }nx
14
-
15
- def call
16
- element = Element.compile stream
17
- return unless element
18
-
19
- if no_repeat?
20
- min = 1
21
- max = 1
22
- elsif fixed_number
23
- min = fixed_number.to_i
24
- max = min
25
- else
26
- min = minimum.to_i
27
- max = if maximum.empty? then Float::INFINITY else maximum.to_i end
28
- end
29
-
30
- return element if min == 1 and max == 1
31
- return if min > max
32
-
33
- Parser::Rule::Repetition.new min..max, element
34
- end
35
-
36
- def fixed_number
37
- match_data['fixed_number'.freeze]
38
- end
39
-
40
- def maximum
41
- match_data['maximum'.freeze]
42
- end
43
-
44
- def minimum
45
- match_data['minimum'.freeze]
46
- end
47
-
48
- def no_repeat?
49
- not fixed_number and not range?
50
- end
51
-
52
- def range?
53
- match_data['range'.freeze]
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,31 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class Rule
5
- include Compiler
6
-
7
- DELIMITER = %r{=/?}n
8
-
9
- def call
10
- reference = Rulename.compile stream
11
- return unless reference
12
-
13
- rulename = reference.rulename
14
- stream.match C_WSP
15
- alternative_form = extract_delimiter
16
- stream.match C_WSP
17
- alternative = Alternative.compile stream
18
- stream.match C_NL
19
-
20
- RuleList::Entry.new rulename, alternative, alternative_form
21
- end
22
-
23
- def extract_delimiter
24
- match_data = stream.match DELIMITER
25
- return unless match_data
26
- match_data.to_s == '=/'.freeze
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,15 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class Rulename
5
- include Compiler
6
-
7
- PATTERN = %r{\A(?<string>[[:alpha:]][-[:alpha:][:digit:]]*)}n
8
-
9
- def call
10
- Parser::Rule::Reference.new match_data['string']
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,10 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Rule
4
- def parse? text
5
- stream = Parser::TextStream(text)
6
- if parse stream then true else false end
7
- end
8
- end
9
- end
10
- end
@@ -1,43 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Rule
4
- class Alternative
5
- include Rule
6
-
7
- attr_reader :rules
8
-
9
- def initialize *rules
10
- @rules = rules
11
- end
12
-
13
- def find_match stream
14
- matches = []
15
-
16
- rules.each do |rule|
17
- stream.branch do
18
- node = rule.parse stream
19
- matches.<< Match.new node, stream.position if node
20
- false
21
- end
22
- end
23
-
24
- matches.sort!
25
- matches.pop
26
- end
27
-
28
- def parse stream
29
- match = find_match stream
30
- return unless match
31
- stream.seek match.stream_position
32
- match.node
33
- end
34
-
35
- Match = Struct.new :node, :stream_position do
36
- def <=> match
37
- stream_position <=> match.stream_position
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,29 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Rule
4
- class Concatenation
5
- include Rule
6
-
7
- attr_reader :rules
8
-
9
- def initialize *rules
10
- @rules = rules
11
- end
12
-
13
- def parse stream
14
- nodes = []
15
-
16
- stream.branch do
17
- rules.all? do |rule|
18
- node = rule.parse stream
19
- nodes << node if node
20
- end
21
- end
22
-
23
- return unless nodes.size == rules.size
24
- AST.sequence *nodes
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,17 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Rule
4
- class None
5
- include Rule
6
-
7
- def self.instance
8
- @instance ||= new
9
- end
10
-
11
- def parse *;
12
- raise ParsingError, 'Prose in ABNF source material must be overridden'
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,24 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Rule
4
- class Optional
5
- include Rule
6
-
7
- attr_reader :rule
8
-
9
- def initialize rule
10
- @rule = rule
11
- end
12
-
13
- def parse stream
14
- node = nil
15
- stream.branch do
16
- node = rule.parse stream
17
- end
18
- node ||= AST.leaf ''
19
- node
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,19 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Rule
4
- class Reference
5
- include Rule
6
-
7
- attr_reader :rulename
8
-
9
- def initialize rulename
10
- @rulename = rulename
11
- end
12
-
13
- def parse *;
14
- raise ParsingError, "Rule not found: #{rulename.inspect}"
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,41 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Rule
4
- class Repetition
5
- include Rule
6
-
7
- attr_reader :element
8
- attr_reader :range
9
-
10
- def initialize range, element
11
- @element = element
12
- @range = range
13
- end
14
-
15
- def maximum
16
- range.last
17
- end
18
-
19
- def minimum
20
- range.first
21
- end
22
-
23
- def parse stream
24
- matches = false
25
- nodes = []
26
-
27
- stream.branch do
28
- until nodes.size == maximum
29
- node = element.parse stream
30
- break unless node
31
- nodes << node
32
- end
33
- matches = true if nodes.size >= minimum
34
- end
35
-
36
- AST.repetition *nodes if matches
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,32 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Rule
4
- class TerminalValue
5
- include Rule
6
-
7
- attr_reader :case_sensitive
8
- attr_reader :string
9
-
10
- def initialize string, case_sensitive = false
11
- @string = string
12
- @case_sensitive = case_sensitive
13
- end
14
-
15
- def parse stream
16
- match_data = stream.match regexp
17
- return unless match_data
18
- AST.leaf match_data.to_s
19
- end
20
-
21
- def regexp
22
- @regexp ||=
23
- begin
24
- escaped_string = Regexp.escape string
25
- case_insensitive = !case_sensitive
26
- Regexp.new escaped_string, case_insensitive, 'n'.freeze
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,33 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Rule
4
- class ValueRange
5
- include Rule
6
-
7
- attr_reader :start_character
8
- attr_reader :end_character
9
-
10
- def initialize start_character, end_character
11
- @start_character = start_character
12
- @end_character = end_character
13
- end
14
-
15
- def parse stream
16
- match_data = stream.match regexp
17
- return unless match_data
18
- AST.leaf match_data.to_s
19
- end
20
-
21
- def regexp
22
- @regexp ||=
23
- begin
24
- start_char = Regexp.escape start_character
25
- end_char = Regexp.escape end_character
26
-
27
- Regexp.new "[#{start_char}-#{end_char}]", false, 'n'.freeze
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,21 +0,0 @@
1
- module ABNF
2
- module Parser
3
- class RuleList
4
- class Entry
5
- attr_reader :alternative_form
6
- attr_reader :name
7
- attr_reader :rule
8
-
9
- def initialize name, rule, alternative_form
10
- @alternative_form = alternative_form
11
- @name = name
12
- @rule = rule
13
- end
14
-
15
- def alternative_form?
16
- alternative_form
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,67 +0,0 @@
1
- module ABNF
2
- module Parser
3
- class TextStream
4
- attr_reader :stack
5
- attr_reader :text
6
-
7
- def initialize text
8
- @text = text
9
- @stack = [0]
10
- end
11
-
12
- def == other_stream
13
- return unless other_stream.is_a? self.class
14
- text == other_stream.text and stack == other_stream.stack
15
- end
16
-
17
- def branch &block
18
- next_position = position
19
-
20
- stack << position
21
- if block.()
22
- next_position = position
23
- end
24
- stack.pop
25
-
26
- self.position = next_position
27
- end
28
-
29
- def eof?
30
- position == text.size
31
- end
32
-
33
- def match regexp
34
- match_data = regexp.match rest
35
- return unless match_data
36
- return unless match_data.pre_match.empty?
37
- self.position += match_data.to_s.size
38
- match_data
39
- end
40
-
41
- def next_character
42
- text[position]
43
- end
44
-
45
- def position= new_position
46
- stack[-1] = new_position
47
- end
48
- alias_method :seek, :position=
49
-
50
- def position
51
- stack[-1]
52
- end
53
-
54
- def rest
55
- text[position..-1]
56
- end
57
- end
58
-
59
- def self.TextStream string_or_stream
60
- case string_or_stream
61
- when String then TextStream.new string_or_stream
62
- when TextStream then string_or_stream
63
- else raise TypeError, "Invalid value for TextStream(): #{string_or_stream.inspect}"
64
- end
65
- end
66
- end
67
- end