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
metadata CHANGED
@@ -1,53 +1,52 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abnf-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Ladd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-13 00:00:00.000000000 Z
11
+ date: 2015-12-19 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: abnf-parser allows you to compile ABNF into rule lists that can be used
14
- to parse text.
13
+ description: abnf-parser allows you to compile ABNF (Augmented Backus-Naur Form) into
14
+ rule lists that can be used to efficiently parse text conforming to ABNF grammar.
15
15
  email: nathanladd+github@gmail.com
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - lib/abnf/parser.rb
21
- - lib/abnf/parser/ast.rb
21
+ - lib/abnf/parser/common.rb
22
22
  - lib/abnf/parser/compiler.rb
23
+ - lib/abnf/parser/compiler/alternation.rb
24
+ - lib/abnf/parser/compiler/concatenation.rb
25
+ - lib/abnf/parser/compiler/element.rb
26
+ - lib/abnf/parser/compiler/group.rb
27
+ - lib/abnf/parser/compiler/option.rb
28
+ - lib/abnf/parser/compiler/repetition.rb
29
+ - lib/abnf/parser/compiler/rule_builder.rb
30
+ - lib/abnf/parser/compiler/rule_list.rb
31
+ - lib/abnf/parser/compiler/token.rb
32
+ - lib/abnf/parser/compiler/tokenizer.rb
23
33
  - lib/abnf/parser/controls.rb
24
- - lib/abnf/parser/controls/ast.rb
25
- - lib/abnf/parser/controls/grammar.rb
34
+ - lib/abnf/parser/controls/abnf.rb
35
+ - lib/abnf/parser/controls/compiler/tokens.rb
36
+ - lib/abnf/parser/controls/nodes.rb
37
+ - lib/abnf/parser/controls/rule_lists.rb
38
+ - lib/abnf/parser/controls/rule_lists/multiples_of_three.rb
26
39
  - lib/abnf/parser/controls/rules.rb
27
- - lib/abnf/parser/controls/text_stream.rb
28
- - lib/abnf/parser/errors.rb
29
- - lib/abnf/parser/grammar.rb
30
- - lib/abnf/parser/grammar/alternative.rb
31
- - lib/abnf/parser/grammar/char_val.rb
32
- - lib/abnf/parser/grammar/concatenation.rb
33
- - lib/abnf/parser/grammar/element.rb
34
- - lib/abnf/parser/grammar/num_val.rb
35
- - lib/abnf/parser/grammar/prose_val.rb
36
- - lib/abnf/parser/grammar/repetition.rb
37
- - lib/abnf/parser/grammar/rule.rb
38
- - lib/abnf/parser/grammar/rulename.rb
39
- - lib/abnf/parser/rule.rb
40
- - lib/abnf/parser/rule/alternative.rb
41
- - lib/abnf/parser/rule/concatenation.rb
42
- - lib/abnf/parser/rule/none.rb
43
- - lib/abnf/parser/rule/optional.rb
44
- - lib/abnf/parser/rule/reference.rb
45
- - lib/abnf/parser/rule/repetition.rb
46
- - lib/abnf/parser/rule/terminal_value.rb
47
- - lib/abnf/parser/rule/value_range.rb
40
+ - lib/abnf/parser/error.rb
41
+ - lib/abnf/parser/node.rb
48
42
  - lib/abnf/parser/rule_list.rb
49
- - lib/abnf/parser/rule_list/entry.rb
50
- - lib/abnf/parser/text_stream.rb
43
+ - lib/abnf/parser/rules/alternation.rb
44
+ - lib/abnf/parser/rules/concatenation.rb
45
+ - lib/abnf/parser/rules/prose_val.rb
46
+ - lib/abnf/parser/rules/reference.rb
47
+ - lib/abnf/parser/rules/regexp_pattern.rb
48
+ - lib/abnf/parser/rules/repetition.rb
49
+ - lib/abnf/parser/rules/terminal.rb
51
50
  homepage: https://github.com/ntl/abnf-parser
52
51
  licenses:
53
52
  - MIT
@@ -71,5 +70,6 @@ rubyforge_project:
71
70
  rubygems_version: 2.4.5.1
72
71
  signing_key:
73
72
  specification_version: 4
74
- summary: ABNF Compiler & Parsing Library
73
+ summary: ABNF (Augmented Backus-Naur Form) Parsing Library
75
74
  test_files: []
75
+ has_rdoc:
@@ -1,67 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module AST
4
- def self.leaf *arguments
5
- Leaf.new *arguments
6
- end
7
-
8
- class Leaf
9
- attr_reader :text
10
-
11
- def initialize text
12
- @text = text
13
- end
14
-
15
- def == other_node
16
- other_node.respond_to? :text and text == other_node.text
17
- end
18
-
19
- def inner_text
20
- text
21
- end
22
- end
23
-
24
- def self.repetition *arguments
25
- Repetition.new *arguments
26
- end
27
-
28
- class Repetition
29
- attr_reader :nodes
30
-
31
- def initialize *nodes
32
- @nodes = nodes
33
- end
34
-
35
- def == other_node
36
- other_node.respond_to? :nodes and nodes == other_node.nodes
37
- end
38
-
39
- def inner_text
40
- strings = nodes.map &:inner_text
41
- strings.join
42
- end
43
- end
44
-
45
- def self.sequence *arguments
46
- Sequence.new *arguments
47
- end
48
-
49
- class Sequence
50
- attr_reader :nodes
51
-
52
- def initialize *nodes
53
- @nodes = nodes
54
- end
55
-
56
- def == other_node
57
- other_node.respond_to? :nodes and nodes == other_node.nodes
58
- end
59
-
60
- def inner_text
61
- strings = nodes.map &:inner_text
62
- strings.join
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,28 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Controls
4
- module AST
5
- extend self
6
-
7
- def leaf text = nil
8
- text ||= 'some-string'
9
- Parser::AST.leaf text
10
- end
11
-
12
- def repetition
13
- Parser::AST.repetition(
14
- leaf('some-string'),
15
- leaf('other-string'),
16
- )
17
- end
18
-
19
- def sequence
20
- Parser::AST.sequence(
21
- leaf('some-string'),
22
- leaf('other-string'),
23
- )
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,32 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Controls
4
- module Grammar
5
- class Example
6
- attr_reader :abnf
7
- attr_reader :type
8
-
9
- def initialize abnf, type
10
- @abnf = abnf
11
- @type = type
12
- end
13
-
14
- def rule
15
- @rule ||= type.compile abnf
16
- end
17
- end
18
-
19
- Alternative = Example.new '1*%x30-39 / *%x30-39 "*" *%x30-39', Parser::Grammar::Alternative
20
- CharVal = Example.new '"some-string"', Parser::Grammar::CharVal
21
- Concatenation = Example.new '"some-string" " " "some-string"', Parser::Grammar::Concatenation
22
- Group = Example.new '( "foo" / "bar" )', Parser::Grammar::Element
23
- NumVal = Example.new '%x41.42.43', Parser::Grammar::NumVal
24
- Option = Example.new '[ "some-string" ]', Parser::Grammar::Element
25
- Repetition = Example.new '1*2"some-element"', Parser::Grammar::Repetition
26
- Rulename = Example.new 'some-rule', Parser::Grammar::Rulename
27
- Rule = Example.new "some-rule = \"some-string\"\r\n", Parser::Grammar::Rule
28
- ProseVal = Example.new '<Some Prose>', Parser::Grammar::ProseVal
29
- end
30
- end
31
- end
32
- end
@@ -1,15 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Controls
4
- module TextStream
5
- def self.example
6
- Parser::TextStream.new 'some-text'
7
- end
8
-
9
- def self.rule
10
- Parser::TextStream.new 'some-rule = "some-string"'
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,17 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- C_NL = %r{;[\t -~]*\r\n|\r\n}n
5
-
6
- C_WSP = %r{\A
7
- (?:
8
- [[:blank:]]
9
- |
10
- #{C_NL}[[:blank:]]
11
- )*
12
- }xn
13
-
14
- CRLF = %r{\r\n}
15
- end
16
- end
17
- end
@@ -1,27 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class Alternative
5
- include Compiler
6
-
7
- DELIMITER = %r{/}
8
-
9
- def call
10
- concatenations = []
11
-
12
- begin
13
- concatenation = Concatenation.compile stream
14
- break unless concatenation
15
- concatenations << concatenation
16
- end while match? stream
17
-
18
- Parser::Rule::Alternative.new *concatenations
19
- end
20
-
21
- def match? stream
22
- stream.match C_WSP and stream.match DELIMITER and stream.match C_WSP
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,15 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class CharVal
5
- include Compiler
6
-
7
- PATTERN = %r{\A"(?<string>[\x20-\x21\x23-\x7E]*)"}
8
-
9
- def call
10
- Parser::Rule::TerminalValue.new match_data['string']
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,21 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class Concatenation
5
- include Compiler
6
-
7
- def call
8
- repetitions = []
9
-
10
- begin
11
- repetition = Repetition.compile stream
12
- break unless repetition
13
- repetitions << repetition
14
- end while stream.match C_WSP
15
-
16
- Parser::Rule::Concatenation.new *repetitions
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,57 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class Element
5
- include Compiler
6
-
7
- GROUP_START = %r{\(}
8
- GROUP_STOP = %r{\)}
9
- OPTION_START = %r{\[}
10
- OPTION_STOP = %r{\]}
11
-
12
- def call
13
- if stream.next_character == '['.freeze
14
- option
15
- elsif stream.next_character == '('.freeze
16
- group
17
- else
18
- terminal
19
- end
20
- end
21
-
22
- def group
23
- stream.match GROUP_START
24
- stream.match C_WSP
25
-
26
- alternative = Alternative.compile stream
27
-
28
- stream.match C_WSP
29
- stream.match GROUP_STOP
30
-
31
- alternative
32
- end
33
-
34
- def option
35
- stream.match OPTION_START
36
- stream.match C_WSP
37
-
38
- alternative = Alternative.compile stream
39
- option = Parser::Rule::Optional.new alternative
40
-
41
- stream.match C_WSP
42
- stream.match OPTION_STOP
43
-
44
- option
45
- end
46
-
47
- def terminal
48
- [Rulename, CharVal, NumVal, ProseVal].each do |type|
49
- output = type.compile stream
50
- return output if output
51
- end
52
- nil
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,72 +0,0 @@
1
- module ABNF
2
- module Parser
3
- module Grammar
4
- class NumVal
5
- include Compiler
6
-
7
- PATTERN = %r{\A%
8
- (?:
9
- (?<base_code>x)(?<first_character>[[:xdigit:]]+)
10
- (?:(?:-(?<range_end>[[:xdigit:]]+))|(?<sequence>(?:\.[[:xdigit:]]+)+))?
11
- |
12
- (?<base_code>d)(?<first_character>[[:digit:]]+)
13
- (?:(?:-(?<range_end>[[:digit:]]+))|(?<sequence>(?:\.[[:digit:]]+)+))?
14
- |
15
- (?<base_code>b)(?<first_character>[01]+)
16
- (?:(?:-(?<range_end>[01]+))|(?<sequence>(?:\.[01]+)+))?
17
- )
18
- }nx
19
-
20
- def base
21
- base_code = match_data['base_code'.freeze]
22
-
23
- {
24
- 'b'.freeze => 2,
25
- 'd'.freeze => 10,
26
- 'x'.freeze => 16,
27
- }[base_code]
28
- end
29
-
30
- def build_string
31
- *characters = sequence.to_s.split '.'
32
-
33
- [first_character, *characters].reduce String.new do |string, character|
34
- octet = convert_hex_character character
35
- string << octet
36
- string
37
- end
38
- end
39
-
40
- def call
41
- if range_end
42
- first_octet = convert_hex_character first_character
43
- last_octet = convert_hex_character range_end
44
- return Parser::Rule::ValueRange.new first_octet, last_octet
45
- end
46
-
47
- Parser::Rule::TerminalValue.new build_string, true
48
- end
49
-
50
- def convert_hex_character hex
51
- character = hex.to_i base
52
- octet = character.chr
53
- octet
54
- end
55
-
56
- def first_character
57
- match_data['first_character'.freeze]
58
- end
59
-
60
- def range_end
61
- match_data['range_end'.freeze]
62
- end
63
-
64
- def sequence
65
- sequence = match_data['sequence'.freeze]
66
- sequence.slice! 0, 1 if sequence
67
- sequence
68
- end
69
- end
70
- end
71
- end
72
- end