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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 290cf1be0e24f0bc64e51280c1cff38a11520bfc
4
- data.tar.gz: 61f5f4ae1bae589af2a80839dc8be01ad642f3e8
3
+ metadata.gz: 50f2cf7354e434cc4b8be13b68b87676723d44b8
4
+ data.tar.gz: 9226accdfda9dc4b4df0d2097bd30c863a070d0a
5
5
  SHA512:
6
- metadata.gz: 0c06a722202c3e87b6a895b0206ee6a2674a88f90875405319de1ae4f61a33c995a7f096af29311333833aa2efa14d893987ad1f29532aa436ef05fdc5adc5c4
7
- data.tar.gz: 4b51e5881e2cafe761e6db107894ae5af457e6308f95ec7deaabc4fd06ba849670e964899da3e77f0235068c082c90288da613395fd23460e46da218f6e79521
6
+ metadata.gz: fa1836ab811e4fe3c6b2c5ea3d5cd5acaf270a08cd57c25b85b5971a9ee77410c5911bed4ab893a431bd40775039a1bcf5e1fed57ed42f135215df5a4f6e667e
7
+ data.tar.gz: 90a53156e26123c08dd5d232231403d2061789b49cc848e1681034350ab56192b0c5cdc477901266028b3f9dc4aca6ac0a356c92c218ad1b68f39d5241062899
@@ -1,28 +1,26 @@
1
- require 'abnf/parser/ast'
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/grammar'
7
- require 'abnf/parser/grammar/alternative'
8
- require 'abnf/parser/grammar/char_val'
9
- require 'abnf/parser/grammar/concatenation'
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/rule'
18
- require 'abnf/parser/rule/alternative'
19
- require 'abnf/parser/rule/concatenation'
20
- require 'abnf/parser/rule/none'
21
- require 'abnf/parser/rule/optional'
22
- require 'abnf/parser/rule/reference'
23
- require 'abnf/parser/rule/repetition'
24
- require 'abnf/parser/rule/terminal_value'
25
- require 'abnf/parser/rule/value_range'
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/rule_list'
28
- require 'abnf/parser/rule_list/entry'
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
@@ -1,52 +1,92 @@
1
1
  module ABNF
2
2
  module Parser
3
- module Compiler
4
- def self.included cls
5
- cls.extend BuildMethod
6
- cls.extend CompileMethod
7
- cls.extend PatternMethod
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
- module CompileMethod
11
- def compile? stream
12
- if compile stream then true else false end
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
- def compile stream
16
- stream = ABNF::Parser::TextStream(stream)
17
- pattern = self.pattern
18
- match_data = stream.match pattern
19
+ tokenizer = Tokenizer.build abnf
20
+ instance = new tokenizer, common_rule_list
21
+ instance.push RuleList
22
+ instance
23
+ end
19
24
 
20
- return unless match_data
25
+ def self.call *arguments
26
+ instance = build *arguments
27
+ instance.()
28
+ instance.rule_list
29
+ end
21
30
 
22
- instance = build stream, match_data
23
- instance.()
31
+ def call
32
+ tokens.each do |token|
33
+ handle token
24
34
  end
35
+
36
+ output
25
37
  end
26
38
 
27
- module BuildMethod
28
- def build stream, match_data
29
- instance = new stream, match_data
30
- instance
31
- end
39
+ def current_frame
40
+ stack.last
32
41
  end
33
42
 
34
- module PatternMethod
35
- def pattern
36
- if const_defined? :PATTERN
37
- const_get :PATTERN
38
- else
39
- @null_pattern ||= %r{}
40
- end
41
- end
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
- attr_reader :match_data
45
- attr_reader :stream
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
- def initialize stream, match_data = nil
48
- @match_data = match_data
49
- @stream = stream
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