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
@@ -0,0 +1,97 @@
1
+ module ABNF
2
+ module Parser
3
+ module Controls
4
+ module Compiler
5
+ module Tokens
6
+ extend self
7
+
8
+ def alternation_slash
9
+ Parser::Compiler::Token.new 'alternation-SLASH', ' / '
10
+ end
11
+
12
+ def bin_val_range
13
+ Parser::Compiler::Token.new 'bin-val-RANGE', '%b100000-100001'
14
+ end
15
+
16
+ def bin_val_sequence
17
+ Parser::Compiler::Token.new 'bin-val-SEQUENCE', '%b1100110.1101111.1101111'
18
+ end
19
+
20
+ def c_nl comment=nil
21
+ abnf = "#{comment}\r\n"
22
+ Parser::Compiler::Token.new 'c-nl', abnf
23
+ end
24
+
25
+ def c_wsp abnf=nil
26
+ abnf ||= ' '
27
+ Parser::Compiler::Token.new 'c-wsp', abnf
28
+ end
29
+
30
+ def char_val string=nil
31
+ string ||= 'foo'
32
+ Parser::Compiler::Token.new 'char-val', string.inspect
33
+ end
34
+
35
+ def dec_val_range
36
+ Parser::Compiler::Token.new 'dec-val-RANGE', '%d32-33'
37
+ end
38
+
39
+ def dec_val_sequence
40
+ Parser::Compiler::Token.new 'dec-val-SEQUENCE', '%d102.111.111'
41
+ end
42
+
43
+ def defined_as operator=nil
44
+ operator ||= '='
45
+ Parser::Compiler::Token.new 'defined-as', operator
46
+ end
47
+
48
+ def group_start
49
+ Parser::Compiler::Token.new 'group-START', '( '
50
+ end
51
+
52
+ def group_stop
53
+ Parser::Compiler::Token.new 'group-STOP', ' )'
54
+ end
55
+
56
+ def hex_val_range
57
+ Parser::Compiler::Token.new 'hex-val-RANGE', '%x20-21'
58
+ end
59
+
60
+ def hex_val_sequence sequence=nil
61
+ sequence ||= ABNF.foo
62
+ Parser::Compiler::Token.new 'hex-val-SEQUENCE', sequence
63
+ end
64
+ alias_method :example, :hex_val_sequence
65
+ alias_method :foo, :hex_val_sequence
66
+ alias_method :num_val, :hex_val_sequence
67
+ alias_method :terminal, :hex_val_sequence
68
+
69
+ def option_start
70
+ Parser::Compiler::Token.new 'option-START', '[ '
71
+ end
72
+
73
+ def option_stop
74
+ Parser::Compiler::Token.new 'option-STOP', ' ]'
75
+ end
76
+
77
+ def prose_val
78
+ Parser::Compiler::Token.new 'prose-val', '<Some Prose>'
79
+ end
80
+
81
+ def repeat_exact
82
+ Parser::Compiler::Token.new 'repeat-EXACT', '1'
83
+ end
84
+
85
+ def repeat_range abnf=nil
86
+ abnf ||= '*'
87
+ Parser::Compiler::Token.new 'repeat-RANGE', abnf
88
+ end
89
+
90
+ def rulename
91
+ Parser::Compiler::Token.new 'rulename', 'some-rule'
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,113 @@
1
+ module ABNF
2
+ module Parser
3
+ module Controls
4
+ module Nodes
5
+ extend self
6
+
7
+ def alternation
8
+ Node.alternation(
9
+ Node.terminal('foo', ABNF.foo),
10
+ ABNF.alternation,
11
+ )
12
+ end
13
+
14
+ def concatenation
15
+ Node.concatenation(
16
+ [
17
+ Node.terminal('[', '"["'),
18
+ Node.terminal('foo', ABNF.foo),
19
+ Node.terminal(']', '"]"'),
20
+ ],
21
+ ABNF.concatenation,
22
+ )
23
+ end
24
+
25
+ def repetition
26
+ abnf = %{#{ABNF.foo} / #{ABNF.bar} / #{ABNF.baz}}
27
+ regexp = %r{foo|bar|baz}
28
+
29
+ Node.repetition(
30
+ [
31
+ Node.alternation(Node.terminal('foo', ABNF.foo), abnf),
32
+ Node.alternation(Node.terminal('bar', ABNF.foo), abnf),
33
+ Node.alternation(Node.terminal('baz', ABNF.foo), abnf),
34
+ ],
35
+ "1*( #{abnf} )",
36
+ )
37
+ end
38
+
39
+ def terminal
40
+ Node.terminal 'foo', ABNF.foo
41
+ end
42
+
43
+ def unfactored abnf: nil, text: nil
44
+ abnf ||= ABNF.example
45
+ text ||= 'some-text'
46
+
47
+ pattern = Rules.regexp_pattern.regexp
48
+ match_data = pattern.match text
49
+
50
+ Node.pattern_match match_data, abnf
51
+ end
52
+ alias_method :example, :unfactored
53
+ alias_method :string, :unfactored
54
+
55
+ def factored
56
+ Node.alternation(
57
+ Node.concatenation(
58
+ [
59
+ Node.repetition(
60
+ [
61
+ Node.alternation(
62
+ Node.terminal('s', '%x61-7A'),
63
+ 'ALPHA',
64
+ ),
65
+ Node.alternation(
66
+ Node.terminal('o', '%x61-7A'),
67
+ 'ALPHA',
68
+ ),
69
+ Node.alternation(
70
+ Node.terminal('m', '%x61-7A'),
71
+ 'ALPHA',
72
+ ),
73
+ Node.alternation(
74
+ Node.terminal('e', '%x61-7A'),
75
+ 'ALPHA',
76
+ ),
77
+ ],
78
+ '1*ALPHA',
79
+ ),
80
+
81
+ Node.terminal('-', '"-"'),
82
+
83
+ Node.repetition(
84
+ [
85
+ Node.alternation(
86
+ Node.terminal('t', '%x61-7A'),
87
+ 'ALPHA',
88
+ ),
89
+ Node.alternation(
90
+ Node.terminal('e', '%x61-7A'),
91
+ 'ALPHA',
92
+ ),
93
+ Node.alternation(
94
+ Node.terminal('x', '%x61-7A'),
95
+ 'ALPHA',
96
+ ),
97
+ Node.alternation(
98
+ Node.terminal('t', '%x61-7A'),
99
+ 'ALPHA',
100
+ ),
101
+ ],
102
+ '1*ALPHA',
103
+ ),
104
+ ],
105
+ '1*ALPHA "-" 1*ALPHA',
106
+ ),
107
+ '(1*ALPHA "-" 1*ALPHA) / "~"',
108
+ )
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,63 @@
1
+ module ABNF
2
+ module Parser
3
+ module Controls
4
+ module RuleLists
5
+ extend self
6
+
7
+ def deep_reference
8
+ rule_list = reference Rules.regexp_pattern
9
+ referenced_rule = rule_list['references-some-rule']
10
+
11
+ alternation = Parser::Rules::Alternation.new(
12
+ [
13
+ referenced_rule,
14
+ Rules.concatenation,
15
+ ],
16
+ "( #{referenced_rule.abnf} / #{ABNF.concatenation} )",
17
+ )
18
+
19
+ repetition = Parser::Rules::Repetition.new(
20
+ alternation,
21
+ (1...Float::INFINITY),
22
+ "1*#{alternation.abnf}",
23
+ )
24
+
25
+ rule_list.update 'deep-reference' => repetition
26
+ rule_list
27
+ end
28
+
29
+ def example
30
+ rule = Rules.example
31
+
32
+ rule_list = RuleList.new
33
+ rule_list.update 'some-rule' => rule
34
+ rule_list
35
+ end
36
+
37
+ def recursive
38
+ MultiplesOfThree.rule_list
39
+ end
40
+
41
+ def reference referenced_rule=nil
42
+ referenced_rule ||= Rules.example
43
+
44
+ rule = Parser::Rules::Concatenation.new(
45
+ [
46
+ Parser::Rules::Terminal.string('[', '"["'),
47
+ Parser::Rules::Reference.new('some-rule'),
48
+ Parser::Rules::Terminal.string(']', '"]"'),
49
+ ],
50
+ %{"[" #{referenced_rule.abnf} "]"},
51
+ )
52
+
53
+ rule_list = RuleList.new
54
+ rule_list.update(
55
+ 'references-some-rule' => rule,
56
+ 'some-rule' => referenced_rule,
57
+ )
58
+ rule_list
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,146 @@
1
+ module ABNF
2
+ module Parser
3
+ module Controls
4
+ module RuleLists
5
+ module MultiplesOfThree
6
+ extend self
7
+
8
+ def n0
9
+ Parser::Rules::Alternation.new(
10
+ [
11
+ Parser::Rules::Terminal.string('0', '"0"'),
12
+ Parser::Rules::Terminal.string('3', '"3"'),
13
+ Parser::Rules::Terminal.string('6', '"6"'),
14
+ Parser::Rules::Terminal.string('9', '"9"'),
15
+ ],
16
+ '"0" / "3" / "6" / "9"',
17
+ )
18
+ end
19
+
20
+ def n1
21
+ Parser::Rules::Alternation.new(
22
+ [
23
+ Parser::Rules::Terminal.string('1', '"1"'),
24
+ Parser::Rules::Terminal.string('4', '"4"'),
25
+ Parser::Rules::Terminal.string('7', '"7"'),
26
+ ],
27
+ '"1" / "4" / "7"',
28
+ )
29
+ end
30
+
31
+ def n2
32
+ Parser::Rules::Alternation.new(
33
+ [
34
+ Parser::Rules::Terminal.string('2', '"2"'),
35
+ Parser::Rules::Terminal.string('5', '"5"'),
36
+ Parser::Rules::Terminal.string('8', '"8"'),
37
+ ],
38
+ '"2" / "5" / "8"',
39
+ )
40
+ end
41
+
42
+ def s0
43
+ Parser::Rules::Alternation.new(
44
+ [
45
+ Parser::Rules::Concatenation.new(
46
+ [
47
+ Parser::Rules::Reference.new('n0'),
48
+ Parser::Rules::Reference.new('s0'),
49
+ ],
50
+ 'n0 s0',
51
+ ),
52
+ Parser::Rules::Concatenation.new(
53
+ [
54
+ Parser::Rules::Reference.new('n1'),
55
+ Parser::Rules::Reference.new('s2'),
56
+ ],
57
+ 'n1 s2',
58
+ ),
59
+ Parser::Rules::Concatenation.new(
60
+ [
61
+ Parser::Rules::Reference.new('n2'),
62
+ Parser::Rules::Reference.new('s1'),
63
+ ],
64
+ 'n2 s1',
65
+ ),
66
+ Parser::Rules::Terminal.string('', '""'),
67
+ ],
68
+ 'n0 s0 / n1 n2 / n2 s1 / ""',
69
+ )
70
+ end
71
+
72
+ def s1
73
+ Parser::Rules::Alternation.new(
74
+ [
75
+ Parser::Rules::Concatenation.new(
76
+ [
77
+ Parser::Rules::Reference.new('n0'),
78
+ Parser::Rules::Reference.new('s1'),
79
+ ],
80
+ 'n0 s1',
81
+ ),
82
+ Parser::Rules::Concatenation.new(
83
+ [
84
+ Parser::Rules::Reference.new('n1'),
85
+ Parser::Rules::Reference.new('s0'),
86
+ ],
87
+ 'n1 s0',
88
+ ),
89
+ Parser::Rules::Concatenation.new(
90
+ [
91
+ Parser::Rules::Reference.new('n2'),
92
+ Parser::Rules::Reference.new('s2'),
93
+ ],
94
+ 'n2 s2',
95
+ ),
96
+ ],
97
+ 'n0 s1 / n1 s0 / n2 s2',
98
+ )
99
+ end
100
+
101
+ def s2
102
+ Parser::Rules::Alternation.new(
103
+ [
104
+ Parser::Rules::Concatenation.new(
105
+ [
106
+ Parser::Rules::Reference.new('n0'),
107
+ Parser::Rules::Reference.new('s2'),
108
+ ],
109
+ 'n0 s2',
110
+ ),
111
+ Parser::Rules::Concatenation.new(
112
+ [
113
+ Parser::Rules::Reference.new('n1'),
114
+ Parser::Rules::Reference.new('s1'),
115
+ ],
116
+ 'n1 s1',
117
+ ),
118
+ Parser::Rules::Concatenation.new(
119
+ [
120
+ Parser::Rules::Reference.new('n2'),
121
+ Parser::Rules::Reference.new('s0'),
122
+ ],
123
+ 'n2 s0',
124
+ ),
125
+ ],
126
+ 'n0 s2 / n1 s1 / n2 s0',
127
+ )
128
+ end
129
+
130
+ def rule_list
131
+ rule_list = RuleList.new
132
+ rule_list.update(
133
+ 's0' => s0,
134
+ 's1' => s1,
135
+ 's2' => s2,
136
+ 'n0' => n0,
137
+ 'n1' => n1,
138
+ 'n2' => n2,
139
+ )
140
+ rule_list
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -4,39 +4,62 @@ module ABNF
4
4
  module Rules
5
5
  extend self
6
6
 
7
- def alternative
8
- Parser::Rule::Alternative.new terminal_value, value_range
7
+ def alternation
8
+ Parser::Rules::Alternation.new(
9
+ [
10
+ Parser::Rules::Terminal.string('foo', ABNF.foo),
11
+ Parser::Rules::Terminal.string('bar', ABNF.bar),
12
+ Parser::Rules::Terminal.string('baz', ABNF.baz),
13
+ ],
14
+ ABNF.alternation,
15
+ )
9
16
  end
10
17
 
11
18
  def concatenation
12
- Parser::Rule::Concatenation.new terminal_value, reference
19
+ Parser::Rules::Concatenation.new(
20
+ [
21
+ Parser::Rules::Terminal.string('[', '"["'),
22
+ Parser::Rules::Terminal.string('foo', ABNF.foo),
23
+ Parser::Rules::Terminal.string(']', '"]"'),
24
+ ],
25
+ ABNF.concatenation,
26
+ )
13
27
  end
14
28
 
15
- def optional
16
- Parser::Rule::Optional.new terminal_value
29
+ def option rule=nil
30
+ rule ||= example
31
+ abnf = "[#{rule.abnf}]"
32
+ Parser::Rules::Repetition.new rule, (0..1), abnf
17
33
  end
18
34
 
19
- def reference
20
- Parser::Rule::Reference.new 'some-rule'
35
+ def prose_val
36
+ Parser::Rules::ProseVal.new '<Some Prose>'
21
37
  end
22
38
 
23
- def repetition range = nil
24
- range ||= (1..2)
25
- element = Rules.terminal_value
39
+ def reference
40
+ Parser::Rules::Reference.new 'some-rule'
41
+ end
26
42
 
27
- Parser::Rule::Repetition.new range, element
43
+ def regexp_pattern
44
+ regexp = %r{(?<word1>[[:alpha:]]+)-(?<word2>[[:alpha:]]+)|~}
45
+ Parser::Rules::RegexpPattern.new regexp, ABNF.regexp_pattern, 9
28
46
  end
29
47
 
30
- def space
31
- Parser::Rule::TerminalValue.new ' '
48
+ def repetition abnf: nil, range: nil
49
+ range ||= (0..Float::INFINITY)
50
+ abnf ||= '*"foo"'
51
+
52
+ Parser::Rules::Repetition.new terminal, range, abnf
32
53
  end
33
54
 
34
- def terminal_value case_sensitive = false
35
- Parser::Rule::TerminalValue.new 'some-string', case_sensitive
55
+ def terminal
56
+ Parser::Rules::Terminal.string 'foo', ABNF.foo
36
57
  end
58
+ alias_method :example, :terminal
59
+ alias_method :foo, :terminal
37
60
 
38
- def value_range
39
- Parser::Rule::ValueRange.new 'A', 'Z'
61
+ def terminal_range
62
+ Parser::Rules::Terminal.character_range (' '..'!'), ABNF.foo
40
63
  end
41
64
  end
42
65
  end