abnf-parser 0.8.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|