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
@@ -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
|
data/lib/abnf/parser/rule.rb
DELETED
@@ -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,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
|