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.
- checksums.yaml +4 -4
- data/lib/abnf/parser.rb +23 -25
- data/lib/abnf/parser/common.rb +63 -0
- data/lib/abnf/parser/compiler.rb +73 -33
- data/lib/abnf/parser/compiler/alternation.rb +54 -0
- data/lib/abnf/parser/compiler/concatenation.rb +55 -0
- data/lib/abnf/parser/compiler/element.rb +87 -0
- data/lib/abnf/parser/compiler/group.rb +19 -0
- data/lib/abnf/parser/compiler/option.rb +19 -0
- data/lib/abnf/parser/compiler/repetition.rb +50 -0
- data/lib/abnf/parser/compiler/rule_builder.rb +32 -0
- data/lib/abnf/parser/compiler/rule_list.rb +67 -0
- data/lib/abnf/parser/compiler/token.rb +34 -0
- data/lib/abnf/parser/compiler/tokenizer.rb +95 -0
- data/lib/abnf/parser/controls.rb +5 -3
- data/lib/abnf/parser/controls/abnf.rb +237 -0
- data/lib/abnf/parser/controls/compiler/tokens.rb +97 -0
- data/lib/abnf/parser/controls/nodes.rb +113 -0
- data/lib/abnf/parser/controls/rule_lists.rb +63 -0
- data/lib/abnf/parser/controls/rule_lists/multiples_of_three.rb +146 -0
- data/lib/abnf/parser/controls/rules.rb +40 -17
- data/lib/abnf/parser/{errors.rb → error.rb} +0 -2
- data/lib/abnf/parser/node.rb +138 -0
- data/lib/abnf/parser/rule_list.rb +50 -11
- data/lib/abnf/parser/rules/alternation.rb +38 -0
- data/lib/abnf/parser/rules/concatenation.rb +36 -0
- data/lib/abnf/parser/rules/prose_val.rb +18 -0
- data/lib/abnf/parser/rules/reference.rb +22 -0
- data/lib/abnf/parser/rules/regexp_pattern.rb +35 -0
- data/lib/abnf/parser/rules/repetition.rb +46 -0
- data/lib/abnf/parser/rules/terminal.rb +63 -0
- metadata +31 -31
- data/lib/abnf/parser/ast.rb +0 -67
- data/lib/abnf/parser/controls/ast.rb +0 -28
- data/lib/abnf/parser/controls/grammar.rb +0 -32
- data/lib/abnf/parser/controls/text_stream.rb +0 -15
- data/lib/abnf/parser/grammar.rb +0 -17
- data/lib/abnf/parser/grammar/alternative.rb +0 -27
- data/lib/abnf/parser/grammar/char_val.rb +0 -15
- data/lib/abnf/parser/grammar/concatenation.rb +0 -21
- data/lib/abnf/parser/grammar/element.rb +0 -57
- data/lib/abnf/parser/grammar/num_val.rb +0 -72
- data/lib/abnf/parser/grammar/prose_val.rb +0 -15
- data/lib/abnf/parser/grammar/repetition.rb +0 -58
- data/lib/abnf/parser/grammar/rule.rb +0 -31
- data/lib/abnf/parser/grammar/rulename.rb +0 -15
- data/lib/abnf/parser/rule.rb +0 -10
- data/lib/abnf/parser/rule/alternative.rb +0 -43
- data/lib/abnf/parser/rule/concatenation.rb +0 -29
- data/lib/abnf/parser/rule/none.rb +0 -17
- data/lib/abnf/parser/rule/optional.rb +0 -24
- data/lib/abnf/parser/rule/reference.rb +0 -19
- data/lib/abnf/parser/rule/repetition.rb +0 -41
- data/lib/abnf/parser/rule/terminal_value.rb +0 -32
- data/lib/abnf/parser/rule/value_range.rb +0 -33
- data/lib/abnf/parser/rule_list/entry.rb +0 -21
- 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
|
8
|
-
Parser::
|
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::
|
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
|
16
|
-
|
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
|
20
|
-
Parser::
|
35
|
+
def prose_val
|
36
|
+
Parser::Rules::ProseVal.new '<Some Prose>'
|
21
37
|
end
|
22
38
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
39
|
+
def reference
|
40
|
+
Parser::Rules::Reference.new 'some-rule'
|
41
|
+
end
|
26
42
|
|
27
|
-
|
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
|
31
|
-
|
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
|
35
|
-
Parser::
|
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
|
39
|
-
Parser::
|
61
|
+
def terminal_range
|
62
|
+
Parser::Rules::Terminal.character_range (' '..'!'), ABNF.foo
|
40
63
|
end
|
41
64
|
end
|
42
65
|
end
|