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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 50f2cf7354e434cc4b8be13b68b87676723d44b8
|
4
|
+
data.tar.gz: 9226accdfda9dc4b4df0d2097bd30c863a070d0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa1836ab811e4fe3c6b2c5ea3d5cd5acaf270a08cd57c25b85b5971a9ee77410c5911bed4ab893a431bd40775039a1bcf5e1fed57ed42f135215df5a4f6e667e
|
7
|
+
data.tar.gz: 90a53156e26123c08dd5d232231403d2061789b49cc848e1681034350ab56192b0c5cdc477901266028b3f9dc4aca6ac0a356c92c218ad1b68f39d5241062899
|
data/lib/abnf/parser.rb
CHANGED
@@ -1,28 +1,26 @@
|
|
1
|
-
require '
|
2
|
-
require 'abnf/parser/compiler'
|
3
|
-
require 'abnf/parser/errors'
|
4
|
-
require 'abnf/parser/text_stream'
|
1
|
+
require 'stringio'
|
5
2
|
|
6
|
-
require 'abnf/parser/
|
7
|
-
require 'abnf/parser/
|
8
|
-
require 'abnf/parser/
|
9
|
-
require 'abnf/parser/
|
10
|
-
require 'abnf/parser/grammar/element'
|
11
|
-
require 'abnf/parser/grammar/num_val'
|
12
|
-
require 'abnf/parser/grammar/prose_val'
|
13
|
-
require 'abnf/parser/grammar/repetition'
|
14
|
-
require 'abnf/parser/grammar/rule'
|
15
|
-
require 'abnf/parser/grammar/rulename'
|
3
|
+
require 'abnf/parser/common'
|
4
|
+
require 'abnf/parser/error'
|
5
|
+
require 'abnf/parser/node'
|
6
|
+
require 'abnf/parser/rule_list'
|
16
7
|
|
17
|
-
require 'abnf/parser/
|
18
|
-
require 'abnf/parser/
|
19
|
-
require 'abnf/parser/
|
20
|
-
require 'abnf/parser/
|
21
|
-
require 'abnf/parser/
|
22
|
-
require 'abnf/parser/
|
23
|
-
require 'abnf/parser/
|
24
|
-
require 'abnf/parser/
|
25
|
-
require 'abnf/parser/
|
8
|
+
require 'abnf/parser/compiler'
|
9
|
+
require 'abnf/parser/compiler/rule_builder'
|
10
|
+
require 'abnf/parser/compiler/alternation'
|
11
|
+
require 'abnf/parser/compiler/concatenation'
|
12
|
+
require 'abnf/parser/compiler/element'
|
13
|
+
require 'abnf/parser/compiler/group'
|
14
|
+
require 'abnf/parser/compiler/option'
|
15
|
+
require 'abnf/parser/compiler/repetition'
|
16
|
+
require 'abnf/parser/compiler/rule_list'
|
17
|
+
require 'abnf/parser/compiler/token'
|
18
|
+
require 'abnf/parser/compiler/tokenizer'
|
26
19
|
|
27
|
-
require 'abnf/parser/
|
28
|
-
require 'abnf/parser/
|
20
|
+
require 'abnf/parser/rules/alternation'
|
21
|
+
require 'abnf/parser/rules/concatenation'
|
22
|
+
require 'abnf/parser/rules/prose_val'
|
23
|
+
require 'abnf/parser/rules/reference'
|
24
|
+
require 'abnf/parser/rules/regexp_pattern'
|
25
|
+
require 'abnf/parser/rules/repetition'
|
26
|
+
require 'abnf/parser/rules/terminal'
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module ABNF
|
2
|
+
module Parser
|
3
|
+
module Common
|
4
|
+
def self.to_s
|
5
|
+
<<-ABNF
|
6
|
+
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z\r
|
7
|
+
\r
|
8
|
+
BIT = "0" / "1"\r
|
9
|
+
\r
|
10
|
+
CHAR = %x01-7F\r
|
11
|
+
; any 7-bit US-ASCII character,\r
|
12
|
+
; excluding NUL\r
|
13
|
+
\r
|
14
|
+
CR = %x0D\r
|
15
|
+
; carriage return\r
|
16
|
+
\r
|
17
|
+
CRLF = CR LF\r
|
18
|
+
; Internet standard newline\r
|
19
|
+
\r
|
20
|
+
CTL = %x00-1F / %x7F\r
|
21
|
+
; controls\r
|
22
|
+
\r
|
23
|
+
DIGIT = %x30-39\r
|
24
|
+
; 0-9\r
|
25
|
+
\r
|
26
|
+
DQUOTE = %x22\r
|
27
|
+
; " (Double Quote)\r
|
28
|
+
\r
|
29
|
+
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"\r
|
30
|
+
\r
|
31
|
+
HTAB = %x09\r
|
32
|
+
; horizontal tab\r
|
33
|
+
\r
|
34
|
+
LF = %x0A\r
|
35
|
+
; linefeed\r
|
36
|
+
\r
|
37
|
+
LWSP = *(WSP / CRLF WSP)\r
|
38
|
+
; Use of this linear-white-space rule\r
|
39
|
+
; permits lines containing only white\r
|
40
|
+
; space that are no longer legal in\r
|
41
|
+
; mail headers and have caused\r
|
42
|
+
; interoperability problems in other\r
|
43
|
+
; contexts.\r
|
44
|
+
; Do not use when defining mail\r
|
45
|
+
; headers and use with caution in\r
|
46
|
+
; other contexts.\r
|
47
|
+
\r
|
48
|
+
OCTET = %x00-FF\r
|
49
|
+
; 8 bits of data\r
|
50
|
+
\r
|
51
|
+
SP = %x20\r
|
52
|
+
\r
|
53
|
+
VCHAR = %x21-7E\r
|
54
|
+
; visible (printing) characters\r
|
55
|
+
\r
|
56
|
+
WSP = SP / HTAB\r
|
57
|
+
; white space\r
|
58
|
+
\r
|
59
|
+
ABNF
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/abnf/parser/compiler.rb
CHANGED
@@ -1,52 +1,92 @@
|
|
1
1
|
module ABNF
|
2
2
|
module Parser
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
class Compiler
|
4
|
+
attr_accessor :output
|
5
|
+
attr_reader :tokens
|
6
|
+
|
7
|
+
def initialize tokens, rule_list=nil
|
8
|
+
@tokens = tokens
|
9
|
+
@rule_list = rule_list
|
8
10
|
end
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
12
|
+
def self.build abnf, include_common: nil
|
13
|
+
include_common ||= false
|
14
|
+
|
15
|
+
if include_common
|
16
|
+
common_rule_list = Parser::RuleList.common
|
13
17
|
end
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
+
tokenizer = Tokenizer.build abnf
|
20
|
+
instance = new tokenizer, common_rule_list
|
21
|
+
instance.push RuleList
|
22
|
+
instance
|
23
|
+
end
|
19
24
|
|
20
|
-
|
25
|
+
def self.call *arguments
|
26
|
+
instance = build *arguments
|
27
|
+
instance.()
|
28
|
+
instance.rule_list
|
29
|
+
end
|
21
30
|
|
22
|
-
|
23
|
-
|
31
|
+
def call
|
32
|
+
tokens.each do |token|
|
33
|
+
handle token
|
24
34
|
end
|
35
|
+
|
36
|
+
output
|
25
37
|
end
|
26
38
|
|
27
|
-
|
28
|
-
|
29
|
-
instance = new stream, match_data
|
30
|
-
instance
|
31
|
-
end
|
39
|
+
def current_frame
|
40
|
+
stack.last
|
32
41
|
end
|
33
42
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
43
|
+
def handle token
|
44
|
+
return unless current_frame
|
45
|
+
current_frame.(token)
|
46
|
+
end
|
47
|
+
|
48
|
+
def pop rule
|
49
|
+
frame = stack.pop
|
50
|
+
|
51
|
+
self.output = rule if stack.empty?
|
52
|
+
|
53
|
+
frame.exited rule
|
54
|
+
end
|
55
|
+
|
56
|
+
def push rule_builder_cls, &block
|
57
|
+
rule_builder = rule_builder_cls.new self
|
58
|
+
frame = Frame.new rule_builder, block
|
59
|
+
stack.push frame
|
60
|
+
end
|
61
|
+
|
62
|
+
def root
|
63
|
+
stack.first
|
64
|
+
end
|
65
|
+
|
66
|
+
def rule_list
|
67
|
+
@rule_list ||= Parser::RuleList.new
|
68
|
+
end
|
69
|
+
|
70
|
+
def stack
|
71
|
+
@stack ||= []
|
42
72
|
end
|
43
73
|
|
44
|
-
|
45
|
-
|
74
|
+
class Frame
|
75
|
+
attr_reader :block
|
76
|
+
attr_reader :rule_builder
|
77
|
+
|
78
|
+
def initialize rule_builder, block
|
79
|
+
@block = block
|
80
|
+
@rule_builder = rule_builder
|
81
|
+
end
|
82
|
+
|
83
|
+
def call token
|
84
|
+
rule_builder.(token)
|
85
|
+
end
|
46
86
|
|
47
|
-
|
48
|
-
|
49
|
-
|
87
|
+
def exited rule
|
88
|
+
block.(rule) if block
|
89
|
+
end
|
50
90
|
end
|
51
91
|
end
|
52
92
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module ABNF
|
2
|
+
module Parser
|
3
|
+
class Compiler
|
4
|
+
class Alternation < RuleBuilder
|
5
|
+
def alternation_slash _
|
6
|
+
end
|
7
|
+
|
8
|
+
def alternative rule
|
9
|
+
alternatives << rule
|
10
|
+
end
|
11
|
+
|
12
|
+
def alternatives
|
13
|
+
@alternatives ||= []
|
14
|
+
end
|
15
|
+
|
16
|
+
def c_nl token
|
17
|
+
finished
|
18
|
+
compiler.handle token
|
19
|
+
end
|
20
|
+
|
21
|
+
def c_wsp _
|
22
|
+
end
|
23
|
+
|
24
|
+
def group_stop token
|
25
|
+
finished
|
26
|
+
compiler.handle token
|
27
|
+
end
|
28
|
+
|
29
|
+
def finished
|
30
|
+
if alternatives.size == 1
|
31
|
+
rule = alternatives[0]
|
32
|
+
else
|
33
|
+
abnf = alternatives.map &:abnf
|
34
|
+
abnf *= ' / '
|
35
|
+
rule = Rules::Alternation.new alternatives, abnf
|
36
|
+
end
|
37
|
+
|
38
|
+
compiler.pop rule
|
39
|
+
end
|
40
|
+
|
41
|
+
def option_stop token
|
42
|
+
finished
|
43
|
+
compiler.handle token
|
44
|
+
end
|
45
|
+
|
46
|
+
def start_rule token
|
47
|
+
compiler.push Concatenation do |rule|
|
48
|
+
alternative rule
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module ABNF
|
2
|
+
module Parser
|
3
|
+
class Compiler
|
4
|
+
class Concatenation < RuleBuilder
|
5
|
+
def alternation_slash _
|
6
|
+
finished
|
7
|
+
end
|
8
|
+
|
9
|
+
def c_nl token
|
10
|
+
finished
|
11
|
+
compiler.handle token
|
12
|
+
end
|
13
|
+
|
14
|
+
def c_wsp _
|
15
|
+
end
|
16
|
+
|
17
|
+
def group_stop token
|
18
|
+
finished
|
19
|
+
compiler.handle token
|
20
|
+
end
|
21
|
+
|
22
|
+
def finished
|
23
|
+
if repetitions.size == 1
|
24
|
+
rule = repetitions.first
|
25
|
+
else
|
26
|
+
abnf = repetitions.map &:abnf
|
27
|
+
abnf *= ' '
|
28
|
+
rule = Rules::Concatenation.new repetitions, abnf
|
29
|
+
end
|
30
|
+
|
31
|
+
compiler.pop rule
|
32
|
+
end
|
33
|
+
|
34
|
+
def option_stop token
|
35
|
+
finished
|
36
|
+
compiler.handle token
|
37
|
+
end
|
38
|
+
|
39
|
+
def repetition repetition
|
40
|
+
repetitions << repetition
|
41
|
+
end
|
42
|
+
|
43
|
+
def repetitions
|
44
|
+
@repetitions ||= []
|
45
|
+
end
|
46
|
+
|
47
|
+
def start_rule token
|
48
|
+
compiler.push Repetition do |element|
|
49
|
+
repetition element
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module ABNF
|
2
|
+
module Parser
|
3
|
+
class Compiler
|
4
|
+
class Element < RuleBuilder
|
5
|
+
attr_accessor :rule
|
6
|
+
|
7
|
+
def bin_val_range token
|
8
|
+
num_val_range token, 2
|
9
|
+
end
|
10
|
+
|
11
|
+
def bin_val_sequence token
|
12
|
+
num_val_sequence token, 2
|
13
|
+
end
|
14
|
+
|
15
|
+
def char_val token
|
16
|
+
string = token.lexeme[1...-1]
|
17
|
+
rule = Rules::Terminal.string string, token.abnf
|
18
|
+
compiler.pop rule
|
19
|
+
end
|
20
|
+
|
21
|
+
def dec_val_range token
|
22
|
+
num_val_range token, 10
|
23
|
+
end
|
24
|
+
|
25
|
+
def dec_val_sequence token
|
26
|
+
num_val_sequence token, 10
|
27
|
+
end
|
28
|
+
|
29
|
+
def group_start _
|
30
|
+
compiler.push Group do |rule|
|
31
|
+
compiler.pop rule
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def hex_val_range token
|
36
|
+
num_val_range token, 16
|
37
|
+
end
|
38
|
+
|
39
|
+
def hex_val_sequence token
|
40
|
+
num_val_sequence token, 16
|
41
|
+
end
|
42
|
+
|
43
|
+
def num_val_range token, base
|
44
|
+
first, last = token.lexeme[2..-1].split '-'
|
45
|
+
|
46
|
+
first = first.to_i base
|
47
|
+
last = last.to_i base
|
48
|
+
|
49
|
+
range = (first.chr..last.chr)
|
50
|
+
|
51
|
+
rule = Rules::Terminal.character_range range, token.abnf
|
52
|
+
compiler.pop rule
|
53
|
+
end
|
54
|
+
|
55
|
+
def num_val_sequence token, base
|
56
|
+
codes = token.lexeme[2..-1].split '.'
|
57
|
+
|
58
|
+
codes.map! do |code|
|
59
|
+
code.to_i base
|
60
|
+
end
|
61
|
+
|
62
|
+
string = codes.pack 'C*'
|
63
|
+
rule = Rules::Terminal.string string, token.abnf
|
64
|
+
compiler.pop rule
|
65
|
+
end
|
66
|
+
|
67
|
+
def option_start _
|
68
|
+
compiler.push Option do |rule|
|
69
|
+
abnf = "[#{rule.abnf}]"
|
70
|
+
rule = Rules::Repetition.new rule, (0..1), abnf
|
71
|
+
compiler.pop rule
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def prose_val token
|
76
|
+
rule = Rules::ProseVal.new token.abnf
|
77
|
+
compiler.pop rule
|
78
|
+
end
|
79
|
+
|
80
|
+
def rulename token
|
81
|
+
rule = Rules::Reference.new token.lexeme
|
82
|
+
compiler.pop rule
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|