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.
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