ebnf 1.1.2 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +218 -196
  3. data/UNLICENSE +1 -1
  4. data/VERSION +1 -1
  5. data/bin/ebnf +40 -21
  6. data/etc/abnf-core.ebnf +52 -0
  7. data/etc/abnf.abnf +121 -0
  8. data/etc/abnf.ebnf +124 -0
  9. data/etc/abnf.sxp +45 -0
  10. data/etc/doap.ttl +23 -15
  11. data/etc/ebnf.ebnf +21 -33
  12. data/etc/ebnf.html +171 -160
  13. data/etc/{ebnf.rb → ebnf.ll1.rb} +30 -107
  14. data/etc/ebnf.ll1.sxp +182 -183
  15. data/etc/ebnf.peg.rb +90 -0
  16. data/etc/ebnf.peg.sxp +84 -0
  17. data/etc/ebnf.sxp +40 -41
  18. data/etc/iso-ebnf.ebnf +140 -0
  19. data/etc/iso-ebnf.isoebnf +138 -0
  20. data/etc/iso-ebnf.sxp +65 -0
  21. data/etc/sparql.ebnf +4 -4
  22. data/etc/sparql.html +1603 -1751
  23. data/etc/sparql.ll1.sxp +7372 -7372
  24. data/etc/sparql.peg.rb +532 -0
  25. data/etc/sparql.peg.sxp +597 -0
  26. data/etc/sparql.sxp +363 -362
  27. data/etc/turtle.ebnf +3 -3
  28. data/etc/turtle.html +465 -517
  29. data/etc/{turtle.rb → turtle.ll1.rb} +3 -4
  30. data/etc/turtle.ll1.sxp +425 -425
  31. data/etc/turtle.peg.rb +182 -0
  32. data/etc/turtle.peg.sxp +199 -0
  33. data/etc/turtle.sxp +103 -101
  34. data/lib/ebnf.rb +7 -2
  35. data/lib/ebnf/abnf.rb +301 -0
  36. data/lib/ebnf/abnf/core.rb +23 -0
  37. data/lib/ebnf/abnf/meta.rb +111 -0
  38. data/lib/ebnf/base.rb +128 -87
  39. data/lib/ebnf/bnf.rb +1 -26
  40. data/lib/ebnf/ebnf/meta.rb +90 -0
  41. data/lib/ebnf/isoebnf.rb +229 -0
  42. data/lib/ebnf/isoebnf/meta.rb +75 -0
  43. data/lib/ebnf/ll1.rb +140 -8
  44. data/lib/ebnf/ll1/lexer.rb +37 -32
  45. data/lib/ebnf/ll1/parser.rb +113 -73
  46. data/lib/ebnf/ll1/scanner.rb +83 -51
  47. data/lib/ebnf/native.rb +320 -0
  48. data/lib/ebnf/parser.rb +285 -302
  49. data/lib/ebnf/peg.rb +39 -0
  50. data/lib/ebnf/peg/parser.rb +561 -0
  51. data/lib/ebnf/peg/rule.rb +241 -0
  52. data/lib/ebnf/rule.rb +453 -163
  53. data/lib/ebnf/terminals.rb +21 -0
  54. data/lib/ebnf/writer.rb +561 -88
  55. metadata +114 -28
  56. data/etc/sparql.rb +0 -45773
@@ -1,9 +1,14 @@
1
1
  module EBNF
2
+ autoload :ABNF, "ebnf/abnf"
2
3
  autoload :Base, "ebnf/base"
3
4
  autoload :BNF, "ebnf/bnf"
5
+ autoload :ISOEBNF, "ebnf/isoebnf"
4
6
  autoload :LL1, "ebnf/ll1"
7
+ autoload :Native, "ebnf/native"
5
8
  autoload :Parser, "ebnf/parser"
9
+ autoload :PEG, "ebnf/peg"
6
10
  autoload :Rule, "ebnf/rule"
11
+ autoload :Terminals,"ebnf/terminals"
7
12
  autoload :Writer, "ebnf/writer"
8
13
  autoload :VERSION, "ebnf/version"
9
14
 
@@ -17,7 +22,7 @@ module EBNF
17
22
  # @param [Hash{Symbol => Object}] options
18
23
  # @return [EBNF::Base]
19
24
  # @raise [Exception] on invalid input
20
- def self.parse(input, options = {})
21
- query = ::EBNF::Base.new(input, options)
25
+ def self.parse(input, **options)
26
+ ::EBNF::Base.new(input, **options)
22
27
  end
23
28
  end
@@ -0,0 +1,301 @@
1
+ require_relative 'abnf/core'
2
+ require_relative 'abnf/meta'
3
+ require 'logger'
4
+
5
+ # ABNF parser
6
+ # Parses ABNF into an array of {EBNF::Rule}.
7
+ module EBNF
8
+ class ABNF
9
+ include EBNF::PEG::Parser
10
+
11
+ # Regular expressions for both "Core" and ABNF-specific terminals.
12
+ ALPHA = %r{[\x41-\x5A\x61-\x7A]}
13
+ VCHAR = %r{[\x20-\x7E]}
14
+ WSP = %r{[\x20\x09]}
15
+ CRLF = %r{\x0D?\x0A}
16
+ COMMENT = %r{;(?:#{WSP}|#{VCHAR})*#{CRLF}}
17
+ C_NL = %r{#{COMMENT}|#{CRLF}}
18
+ C_WSP = %r{#{WSP}|(?:#{C_NL}#{WSP})}
19
+
20
+ ##
21
+ # Hash of generated {EBNF::Rule} objects by symbol
22
+ #
23
+ # @return [Hash{Symbol => EBNF::Rule}]
24
+ attr_reader :parsed_rules
25
+
26
+ ##
27
+ # The following ABNF grammar rules are treated as terminals.
28
+
29
+ # `rulename ::= ALPHA (ALPHA | DIGIT | "-")*`
30
+ terminal(:rulename, /#{ALPHA}(?:#{ALPHA}|[0-9-])*/) do |value|
31
+ value.to_sym
32
+ end
33
+
34
+ # `defined_as ::= c_wsp* ("=" | "=/") c_wsp*`
35
+ terminal(:defined_as, /#{C_WSP}*=\/?#{C_WSP}*/) {|value| value.strip}
36
+
37
+ # `quoted_string::= DQUOTE [#x20-#x21#x23-#x7E]* DQUOTE`
38
+ terminal(:quoted_string, /"[\x20-\x21\x23-\x7E]*"/) do |value|
39
+ value[1..-2]
40
+ end
41
+
42
+ # `bin_val ::= "b" BIT+ (("." BIT+)+ | ("-" BIT+))?`
43
+ terminal(:bin_val, /b[01]+(?:(?:(?:\.[01]+)+)|(?:-[01]+))?/) do |value|
44
+ if value.include?('.')
45
+ # Interpret segments in binary creating a sequence of hex characters or a string
46
+ hex_or_string(value[1..-1].split('.').map {|b| b.to_i(base=2).chr(Encoding::UTF_8)})
47
+ elsif value.include?('-')
48
+ # Interpret as a range
49
+ [:range, value[1..-1].split('-').map {|b| "#x%x" % b.to_i(base=2)}.join("-")]
50
+ else
51
+ # Interpret as a single HEX character
52
+ [:hex, "#x%x" % value[1..-1].to_i(base=2)]
53
+ end
54
+ end
55
+
56
+ # `dec_val ::= "d" DIGIT+ (("." DIGIT+)+ | ("-" DIGIT+))?`
57
+ terminal(:dec_val, /d[0-9]+(?:(?:(?:\.[0-9]+)+)|(?:-[0-9]+))?/) do |value|
58
+ if value.include?('.')
59
+ # Interpret segments in decimal creating a sequence of hex characters or a string
60
+ hex_or_string(value[1..-1].split('.').map {|b| b.to_i.chr(Encoding::UTF_8)})
61
+ elsif value.include?('-')
62
+ # Interpret as a range
63
+ [:range, value[1..-1].split('-').map {|d| "#x%x" % d.to_i}.join("-")]
64
+ else
65
+ # Interpret as a single HEX character
66
+ [:hex, "#x%x" % value[1..-1].to_i]
67
+ end
68
+ end
69
+
70
+ # `hex_val ::= "x" HEXDIG+ (("." HEXDIG+)+ | ("-" HEXDIG+))?`
71
+ terminal(:hex_val, /x[0-9A-F]+(?:(?:(?:\.[0-9A-F]+)+)|(?:-[0-9A-F]+))?/i) do |value|
72
+ if value.include?('.')
73
+ # Interpret segments in hexadecimal creating a sequence of hex characters or a string
74
+ hex_or_string(value[1..-1].split('.').map {|b| b.to_i(base=16).chr(Encoding::UTF_8)})
75
+ elsif value.include?('-')
76
+ # Interpret as a range
77
+ [:range, value[1..-1].split('-').map {|h| "#x%x" % h.to_i(base=16)}.join("-")]
78
+ else
79
+ # Interpret as a single HEX character
80
+ [:hex, "#x#{value[1..-1]}"]
81
+ end
82
+ end
83
+
84
+ # `c_wsp ::= WSP | (c_nl WSP)`
85
+ terminal(:c_wsp, C_WSP)
86
+
87
+ # `c_nl ::= comment | CRLF`
88
+ terminal(:c_nl, C_NL)
89
+
90
+ # `DIGIT ::= [#x30-#x39]`
91
+ terminal(:DIGIT, /\d/)
92
+
93
+ # ## Non-terminal productions
94
+
95
+ # The `start_production` on `:rule` allows the parser to present the value as a single Hash, rather than an array of individual hashes.
96
+ start_production(:rule, as_hash: true)
97
+
98
+ # `rule ::= rulename defined_as elements c_nl`
99
+ production(:rule) do |value|
100
+ # value contains an expression.
101
+ # Invoke callback
102
+ sym = value[:rulename]
103
+ elements = value[:elements]
104
+
105
+ if value[:defined_as] == "=/"
106
+ # append to rule alternate
107
+ rule = parsed_rules.fetch(sym) {raise "No existing rule found for #{sym}"}
108
+ rule.expr = [:alt, rule.expr] unless rule.alt?
109
+ if elements.is_a?(Array) && elements.first == :alt
110
+ # append alternatives to rule
111
+ rule.expr.concat(elements[1..-1])
112
+ else
113
+ # add elements as last alternative
114
+ rule.expr.push(elements)
115
+ end
116
+ else
117
+ # There shouldn't be an existing rule
118
+ raise "Redefining rule #{sym}" if parsed_rules.has_key?(sym)
119
+ parsed_rules[sym] = EBNF::Rule.new(sym.to_sym, nil, elements)
120
+ end
121
+ progress(:rule, level: 2) {parsed_rules[sym].to_sxp}
122
+ sym
123
+ end
124
+
125
+ # `elements ::= alternation c_wsp*`
126
+ production(:elements) do |value|
127
+ value.first[:alternation]
128
+ end
129
+
130
+ # `alternation ::= concatenation (c_wsp* "/" c_wsp* concatenation)*`
131
+ production(:alternation) do |value|
132
+ unless value.last[:_alternation_1].empty?
133
+ [:alt, value.first[:concatenation]] + value.last[:_alternation_1]
134
+ else
135
+ value.first[:concatenation]
136
+ end
137
+ end
138
+
139
+ # The `_aleteration_2` rule comes from the expanded PEG grammar and serves as an opportunity to custommize the values presented to the `aleteration` rule.
140
+ production(:_alternation_2) do |value|
141
+ if Array(value.last[:concatenation]).first == :alt
142
+ value.last[:concatenation][1..-1]
143
+ else
144
+ [value.last[:concatenation]]
145
+ end
146
+ value.last[:concatenation]
147
+ end
148
+
149
+ # `concatenation::= repetition (c_wsp+ repetition)*`
150
+ production(:concatenation) do |value|
151
+ unless value.last[:_concatenation_1].empty?
152
+ [:seq, value.first[:repetition]] + value.last[:_concatenation_1]
153
+ else
154
+ value.first[:repetition]
155
+ end
156
+ end
157
+ start_production(:_concatenation_2, as_hash: true)
158
+ production(:_concatenation_2) do |value|
159
+ value[:repetition]
160
+ end
161
+
162
+ # `repetition ::= repeat? element`
163
+ production(:repetition) do |value|
164
+ rept = value.first[:_repetition_1]
165
+ elt = value.last[:element]
166
+ case rept
167
+ when [0, '*'] then [:star, elt]
168
+ when [1, '*'] then [:plus, elt]
169
+ when nil then elt
170
+ else
171
+ [:rept, rept.first, rept.last, elt]
172
+ end
173
+ end
174
+
175
+ # `repeat ::= DIGIT+ | (DIGIT* "*" DIGIT*)`
176
+ production(:repeat) do |value|
177
+ if value.is_a?(Integer)
178
+ [value, value]
179
+ else
180
+ [value.first, value.last]
181
+ end
182
+ end
183
+ start_production(:_repeat_1, as_hash: true)
184
+ production(:_repeat_1) {|value| value.values}
185
+ production(:_repeat_2) {|value| value.join("").to_i}
186
+ production(:_repeat_3) {|value| value.join("").to_i}
187
+ production(:_repeat_4) {|value| value.length > 0 ? value.join("").to_i : '*'}
188
+
189
+ # `element ::= rulename | group | option | char_val | num_val | prose_val`
190
+ production(:element) do |value|
191
+ value
192
+ end
193
+
194
+ # `group ::= "(" c_wsp* alternation c_wsp* ")"`
195
+ start_production(:group, as_hash: true)
196
+ production(:group) do |value|
197
+ value[:alternation]
198
+ end
199
+
200
+ # `option ::= "[" c_wsp* alternation c_wsp* "]"`
201
+ start_production(:option, as_hash: true)
202
+ production(:option) do |value|
203
+ [:opt, value[:alternation]]
204
+ end
205
+
206
+ # `case_insensitive_string ::= "%i"? quoted_string`
207
+ production(:case_insensitive_string) do |value|
208
+ str = value.last[:quoted_string]
209
+ if str.match?(/[[:alpha:]]/)
210
+ # Only need to use case-insensitive if there are alphabetic characters in the string.
211
+ [:istr, value.last[:quoted_string]]
212
+ else
213
+ value.last[:quoted_string]
214
+ end
215
+ end
216
+
217
+ # `case_sensitive_string ::= "%s" quoted_string`
218
+ production(:case_sensitive_string) do |value|
219
+ value.last[:quoted_string]
220
+ end
221
+
222
+ # `num_val ::= "%" (bin_val | dec_val | hex_val)`
223
+ production(:num_val) do |value|
224
+ value.last[:_num_val_1]
225
+ end
226
+
227
+ # ## Parser invocation.
228
+ # On start, yield ourselves if a block is given, otherwise, return this parser instance
229
+ #
230
+ # @param [#read, #to_s] input
231
+ # @param [Hash{Symbol => Object}] options
232
+ # @option options [Boolean] :level
233
+ # Trace level. 0(debug), 1(info), 2(warn), 3(error).
234
+ # @return [EBNFParser]
235
+ def initialize(input, **options)
236
+ # If the `level` option is set, instantiate a logger for collecting trace information.
237
+ if options.has_key?(:level)
238
+ options[:logger] = Logger.new(STDERR)
239
+ options[:logger].level = options[:level]
240
+ options[:logger].formatter = lambda {|severity, datetime, progname, msg| "#{severity} #{msg}\n"}
241
+ end
242
+
243
+ # Read input, if necessary, which will be used in a Scanner.
244
+ @input = input.respond_to?(:read) ? input.read : input.to_s
245
+
246
+ @parsed_rules = {}
247
+
248
+ # Parses into `@parsed_rules`
249
+ parse(@input,
250
+ :rulelist, # Starting rule
251
+ ABNFMeta::RULES, # PEG rules
252
+ whitespace: '', # No implicit whitespace
253
+ **options)
254
+ rescue EBNF::PEG::Parser::Error => e
255
+ raise SyntaxError, e.message
256
+ end
257
+
258
+ ##
259
+ # The AST includes the parsed rules along with built-in rules for ABNF used within the parsed grammar.
260
+ #
261
+ # @return [Array<EBNF::Rule>]
262
+ def ast
263
+ # Add built-in rules for standard ABNF rules not
264
+ parsed_rules.values.map(&:symbols).flatten.uniq.each do |sym|
265
+ rule = ABNFCore::RULES.detect {|r| r.sym == sym}
266
+ parsed_rules[sym] ||= rule if rule
267
+ end
268
+
269
+ parsed_rules.values
270
+ end
271
+
272
+ private
273
+ # Generate a combination of seq and string to represent a sequence of characters
274
+ #
275
+ # @param [Array<String>] characters
276
+ # @return [String,Array]
277
+ def hex_or_string(characters)
278
+ seq = [:seq]
279
+ str_result = ""
280
+ characters.each do |c|
281
+ if VCHAR.match?(c)
282
+ str_result << c
283
+ else
284
+ if str_result.length > 0
285
+ seq << str_result
286
+ str_result = ""
287
+ end
288
+ seq << [:hex, "#x%x" % c.codepoints.first]
289
+ end
290
+ end
291
+ seq << str_result if str_result.length > 0
292
+
293
+ # Either return the sequence, or a string
294
+ if seq.length == 2 && seq.last.is_a?(String)
295
+ seq.last
296
+ else
297
+ seq
298
+ end
299
+ end
300
+ end
301
+ end
@@ -0,0 +1,23 @@
1
+ # This file is automatically generated by ebnf version 2.0.0
2
+ # Derived from etc/abnf-core.ebnf
3
+ module ABNFCore
4
+ RULES = [
5
+ EBNF::Rule.new(:ALPHA, nil, [:range, "#x41-#x5A#x61-#x7A"], kind: :terminal),
6
+ EBNF::Rule.new(:BIT, nil, [:alt, "0", "1"], kind: :terminal),
7
+ EBNF::Rule.new(:CHAR, nil, [:range, "#x01-#x7F"], kind: :terminal),
8
+ EBNF::Rule.new(:CR, nil, [:hex, "#x0D"], kind: :terminal),
9
+ EBNF::Rule.new(:CRLF, nil, [:seq, [:opt, :CR], :LF], kind: :terminal),
10
+ EBNF::Rule.new(:CTL, nil, [:alt, [:range, "#x00-#x1F"], [:hex, "#x7F"]], kind: :terminal),
11
+ EBNF::Rule.new(:DIGIT, nil, [:range, "#x30-#x39"], kind: :terminal),
12
+ EBNF::Rule.new(:DQUOTE, nil, [:hex, "#x22"], kind: :terminal),
13
+ EBNF::Rule.new(:HEXDIG, nil, [:alt, :DIGIT, [:range, "A-F"]], kind: :terminal),
14
+ EBNF::Rule.new(:HTAB, nil, [:hex, "#x09"], kind: :terminal),
15
+ EBNF::Rule.new(:LF, nil, [:hex, "#x0A"], kind: :terminal),
16
+ EBNF::Rule.new(:LWSP, nil, [:star, [:alt, :WSP, [:seq, :CRLF, :WSP]]], kind: :terminal),
17
+ EBNF::Rule.new(:OCTET, nil, [:range, "#x00-#xFF"], kind: :terminal),
18
+ EBNF::Rule.new(:SP, nil, [:hex, "#x20"], kind: :terminal),
19
+ EBNF::Rule.new(:VCHAR, nil, [:range, "#x21-#x7E"], kind: :terminal),
20
+ EBNF::Rule.new(:WSP, nil, [:alt, :SP, :HTAB], kind: :terminal),
21
+ ]
22
+ end
23
+
@@ -0,0 +1,111 @@
1
+ # This file is automatically generated by ebnf version 2.0.0
2
+ # Derived from abnf.ebnf
3
+ module ABNFMeta
4
+ RULES = [
5
+ EBNF::Rule.new(:rulelist, nil, [:plus, :_rulelist_1]).extend(EBNF::PEG::Rule),
6
+ EBNF::Rule.new(:_rulelist_1, nil, [:alt, :rule, :_rulelist_2]).extend(EBNF::PEG::Rule),
7
+ EBNF::Rule.new(:_rulelist_2, nil, [:seq, :_rulelist_3, :c_nl]).extend(EBNF::PEG::Rule),
8
+ EBNF::Rule.new(:_rulelist_3, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
9
+ EBNF::Rule.new(:rule, nil, [:seq, :rulename, :defined_as, :elements, :c_nl]).extend(EBNF::PEG::Rule),
10
+ EBNF::Rule.new(:elements, nil, [:seq, :alternation, :_elements_1]).extend(EBNF::PEG::Rule),
11
+ EBNF::Rule.new(:_elements_1, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
12
+ EBNF::Rule.new(:alternation, nil, [:seq, :concatenation, :_alternation_1]).extend(EBNF::PEG::Rule),
13
+ EBNF::Rule.new(:_alternation_1, nil, [:star, :_alternation_2]).extend(EBNF::PEG::Rule),
14
+ EBNF::Rule.new(:_alternation_2, nil, [:seq, :_alternation_3, "/", :_alternation_4, :concatenation]).extend(EBNF::PEG::Rule),
15
+ EBNF::Rule.new(:_alternation_3, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
16
+ EBNF::Rule.new(:_alternation_4, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
17
+ EBNF::Rule.new(:concatenation, nil, [:seq, :repetition, :_concatenation_1]).extend(EBNF::PEG::Rule),
18
+ EBNF::Rule.new(:_concatenation_1, nil, [:star, :_concatenation_2]).extend(EBNF::PEG::Rule),
19
+ EBNF::Rule.new(:_concatenation_2, nil, [:seq, :_concatenation_3, :repetition]).extend(EBNF::PEG::Rule),
20
+ EBNF::Rule.new(:_concatenation_3, nil, [:plus, :c_wsp]).extend(EBNF::PEG::Rule),
21
+ EBNF::Rule.new(:repetition, nil, [:seq, :_repetition_1, :element]).extend(EBNF::PEG::Rule),
22
+ EBNF::Rule.new(:_repetition_1, nil, [:opt, :repeat]).extend(EBNF::PEG::Rule),
23
+ EBNF::Rule.new(:repeat, nil, [:alt, :_repeat_1, :_repeat_2]).extend(EBNF::PEG::Rule),
24
+ EBNF::Rule.new(:_repeat_1, nil, [:seq, :_repeat_3, "*", :_repeat_4]).extend(EBNF::PEG::Rule),
25
+ EBNF::Rule.new(:_repeat_3, nil, [:star, :DIGIT]).extend(EBNF::PEG::Rule),
26
+ EBNF::Rule.new(:_repeat_4, nil, [:star, :DIGIT]).extend(EBNF::PEG::Rule),
27
+ EBNF::Rule.new(:_repeat_2, nil, [:plus, :DIGIT]).extend(EBNF::PEG::Rule),
28
+ EBNF::Rule.new(:element, nil, [:alt, :rulename, :group, :option, :char_val, :num_val, :prose_val]).extend(EBNF::PEG::Rule),
29
+ EBNF::Rule.new(:group, nil, [:seq, "(", :_group_1, :alternation, :_group_2, ")"]).extend(EBNF::PEG::Rule),
30
+ EBNF::Rule.new(:_group_1, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
31
+ EBNF::Rule.new(:_group_2, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
32
+ EBNF::Rule.new(:option, nil, [:seq, "[", :_option_1, :alternation, :_option_2, "]"]).extend(EBNF::PEG::Rule),
33
+ EBNF::Rule.new(:_option_1, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
34
+ EBNF::Rule.new(:_option_2, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
35
+ EBNF::Rule.new(:char_val, nil, [:alt, :case_insensitive_string, :case_sensitive_string]).extend(EBNF::PEG::Rule),
36
+ EBNF::Rule.new(:case_insensitive_string, nil, [:seq, :_case_insensitive_string_1, :quoted_string]).extend(EBNF::PEG::Rule),
37
+ EBNF::Rule.new(:_case_insensitive_string_1, nil, [:opt, "%i"]).extend(EBNF::PEG::Rule),
38
+ EBNF::Rule.new(:case_sensitive_string, nil, [:seq, "%s", :quoted_string]).extend(EBNF::PEG::Rule),
39
+ EBNF::Rule.new(:num_val, nil, [:seq, "%", :_num_val_1]).extend(EBNF::PEG::Rule),
40
+ EBNF::Rule.new(:_num_val_1, nil, [:alt, :bin_val, :dec_val, :hex_val]).extend(EBNF::PEG::Rule),
41
+ EBNF::Rule.new(:rulename, nil, [:seq, :ALPHA, :_rulename_1], kind: :terminal).extend(EBNF::PEG::Rule),
42
+ EBNF::Rule.new(:_rulename_1, nil, [:star, :_rulename_2]).extend(EBNF::PEG::Rule),
43
+ EBNF::Rule.new(:_rulename_2, nil, [:alt, :ALPHA, :DIGIT, "-"]).extend(EBNF::PEG::Rule),
44
+ EBNF::Rule.new(:defined_as, nil, [:seq, :_defined_as_1, :_defined_as_2, :_defined_as_3], kind: :terminal).extend(EBNF::PEG::Rule),
45
+ EBNF::Rule.new(:_defined_as_1, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
46
+ EBNF::Rule.new(:_defined_as_2, nil, [:alt, "=", "=/"]).extend(EBNF::PEG::Rule),
47
+ EBNF::Rule.new(:_defined_as_3, nil, [:star, :c_wsp]).extend(EBNF::PEG::Rule),
48
+ EBNF::Rule.new(:c_wsp, nil, [:alt, :WSP, :_c_wsp_1], kind: :terminal).extend(EBNF::PEG::Rule),
49
+ EBNF::Rule.new(:_c_wsp_1, nil, [:seq, :c_nl, :WSP]).extend(EBNF::PEG::Rule),
50
+ EBNF::Rule.new(:c_nl, nil, [:alt, :COMMENT, :CRLF], kind: :terminal).extend(EBNF::PEG::Rule),
51
+ EBNF::Rule.new(:comment, nil, [:seq, ";", :_comment_1, :CRLF], kind: :terminal).extend(EBNF::PEG::Rule),
52
+ EBNF::Rule.new(:_comment_1, nil, [:star, :_comment_2]).extend(EBNF::PEG::Rule),
53
+ EBNF::Rule.new(:_comment_2, nil, [:alt, :WSP, :VCHAR]).extend(EBNF::PEG::Rule),
54
+ EBNF::Rule.new(:quoted_string, nil, [:seq, :DQUOTE, :_quoted_string_1, :DQUOTE], kind: :terminal).extend(EBNF::PEG::Rule),
55
+ EBNF::Rule.new(:_quoted_string_1, nil, [:star, :_quoted_string_2]).extend(EBNF::PEG::Rule),
56
+ EBNF::Rule.new(:_quoted_string_2, nil, [:range, "#x20-#x21#x23-#x7E"], kind: :terminal).extend(EBNF::PEG::Rule),
57
+ EBNF::Rule.new(:bin_val, nil, [:seq, "b", :_bin_val_1, :_bin_val_2], kind: :terminal).extend(EBNF::PEG::Rule),
58
+ EBNF::Rule.new(:_bin_val_1, nil, [:plus, :BIT]).extend(EBNF::PEG::Rule),
59
+ EBNF::Rule.new(:_bin_val_2, nil, [:opt, :_bin_val_3]).extend(EBNF::PEG::Rule),
60
+ EBNF::Rule.new(:_bin_val_3, nil, [:alt, :_bin_val_4, :_bin_val_5]).extend(EBNF::PEG::Rule),
61
+ EBNF::Rule.new(:_bin_val_4, nil, [:plus, :_bin_val_6]).extend(EBNF::PEG::Rule),
62
+ EBNF::Rule.new(:_bin_val_6, nil, [:seq, ".", :_bin_val_7]).extend(EBNF::PEG::Rule),
63
+ EBNF::Rule.new(:_bin_val_7, nil, [:plus, :BIT]).extend(EBNF::PEG::Rule),
64
+ EBNF::Rule.new(:_bin_val_5, nil, [:seq, "-", :_bin_val_8]).extend(EBNF::PEG::Rule),
65
+ EBNF::Rule.new(:_bin_val_8, nil, [:plus, :BIT]).extend(EBNF::PEG::Rule),
66
+ EBNF::Rule.new(:dec_val, nil, [:seq, "d", :_dec_val_1, :_dec_val_2], kind: :terminal).extend(EBNF::PEG::Rule),
67
+ EBNF::Rule.new(:_dec_val_1, nil, [:plus, :DIGIT]).extend(EBNF::PEG::Rule),
68
+ EBNF::Rule.new(:_dec_val_2, nil, [:opt, :_dec_val_3]).extend(EBNF::PEG::Rule),
69
+ EBNF::Rule.new(:_dec_val_3, nil, [:alt, :_dec_val_4, :_dec_val_5]).extend(EBNF::PEG::Rule),
70
+ EBNF::Rule.new(:_dec_val_4, nil, [:plus, :_dec_val_6]).extend(EBNF::PEG::Rule),
71
+ EBNF::Rule.new(:_dec_val_6, nil, [:seq, ".", :_dec_val_7]).extend(EBNF::PEG::Rule),
72
+ EBNF::Rule.new(:_dec_val_7, nil, [:plus, :DIGIT]).extend(EBNF::PEG::Rule),
73
+ EBNF::Rule.new(:_dec_val_5, nil, [:seq, "-", :_dec_val_8]).extend(EBNF::PEG::Rule),
74
+ EBNF::Rule.new(:_dec_val_8, nil, [:plus, :DIGIT]).extend(EBNF::PEG::Rule),
75
+ EBNF::Rule.new(:hex_val, nil, [:seq, "x", :_hex_val_1, :_hex_val_2], kind: :terminal).extend(EBNF::PEG::Rule),
76
+ EBNF::Rule.new(:_hex_val_1, nil, [:plus, :HEXDIG]).extend(EBNF::PEG::Rule),
77
+ EBNF::Rule.new(:_hex_val_2, nil, [:opt, :_hex_val_3]).extend(EBNF::PEG::Rule),
78
+ EBNF::Rule.new(:_hex_val_3, nil, [:alt, :_hex_val_4, :_hex_val_5]).extend(EBNF::PEG::Rule),
79
+ EBNF::Rule.new(:_hex_val_4, nil, [:plus, :_hex_val_6]).extend(EBNF::PEG::Rule),
80
+ EBNF::Rule.new(:_hex_val_6, nil, [:seq, ".", :_hex_val_7]).extend(EBNF::PEG::Rule),
81
+ EBNF::Rule.new(:_hex_val_7, nil, [:plus, :HEXDIG]).extend(EBNF::PEG::Rule),
82
+ EBNF::Rule.new(:_hex_val_5, nil, [:seq, "-", :_hex_val_8]).extend(EBNF::PEG::Rule),
83
+ EBNF::Rule.new(:_hex_val_8, nil, [:plus, :HEXDIG]).extend(EBNF::PEG::Rule),
84
+ EBNF::Rule.new(:prose_val, nil, [:seq, "<", :_prose_val_1, ">"], kind: :terminal).extend(EBNF::PEG::Rule),
85
+ EBNF::Rule.new(:_prose_val_1, nil, [:star, :_prose_val_2]).extend(EBNF::PEG::Rule),
86
+ EBNF::Rule.new(:_prose_val_2, nil, [:range, "#x20-#x3D#x3F-#x7E"], kind: :terminal).extend(EBNF::PEG::Rule),
87
+ EBNF::Rule.new(:ALPHA, nil, [:range, "#x41-#x5A#x61-#x7A"], kind: :terminal).extend(EBNF::PEG::Rule),
88
+ EBNF::Rule.new(:BIT, nil, [:alt, "0", "1"], kind: :terminal).extend(EBNF::PEG::Rule),
89
+ EBNF::Rule.new(:CHAR, nil, [:range, "#x01-#x7F"], kind: :terminal).extend(EBNF::PEG::Rule),
90
+ EBNF::Rule.new(:CR, nil, [:hex, "#x0D"], kind: :terminal).extend(EBNF::PEG::Rule),
91
+ EBNF::Rule.new(:CRLF, nil, [:seq, :_CRLF_1, :LF], kind: :terminal).extend(EBNF::PEG::Rule),
92
+ EBNF::Rule.new(:_CRLF_1, nil, [:opt, :CR], kind: :terminal).extend(EBNF::PEG::Rule),
93
+ EBNF::Rule.new(:CTL, nil, [:alt, :_CTL_1, :_CTL_2], kind: :terminal).extend(EBNF::PEG::Rule),
94
+ EBNF::Rule.new(:_CTL_1, nil, [:range, "#x00-#x1F"], kind: :terminal).extend(EBNF::PEG::Rule),
95
+ EBNF::Rule.new(:_CTL_2, nil, [:hex, "#x7F"], kind: :terminal).extend(EBNF::PEG::Rule),
96
+ EBNF::Rule.new(:DIGIT, nil, [:range, "#x30-#x39"], kind: :terminal).extend(EBNF::PEG::Rule),
97
+ EBNF::Rule.new(:DQUOTE, nil, [:hex, "#x22"], kind: :terminal).extend(EBNF::PEG::Rule),
98
+ EBNF::Rule.new(:HEXDIG, nil, [:alt, :DIGIT, :_HEXDIG_1], kind: :terminal).extend(EBNF::PEG::Rule),
99
+ EBNF::Rule.new(:_HEXDIG_1, nil, [:range, "A-F"], kind: :terminal).extend(EBNF::PEG::Rule),
100
+ EBNF::Rule.new(:HTAB, nil, [:hex, "#x09"], kind: :terminal).extend(EBNF::PEG::Rule),
101
+ EBNF::Rule.new(:LF, nil, [:hex, "#x0A"], kind: :terminal).extend(EBNF::PEG::Rule),
102
+ EBNF::Rule.new(:LWSP, nil, [:star, :_LWSP_1], kind: :terminal).extend(EBNF::PEG::Rule),
103
+ EBNF::Rule.new(:_LWSP_1, nil, [:alt, :WSP, :_LWSP_2], kind: :terminal).extend(EBNF::PEG::Rule),
104
+ EBNF::Rule.new(:_LWSP_2, nil, [:seq, :CRLF, :WSP], kind: :terminal).extend(EBNF::PEG::Rule),
105
+ EBNF::Rule.new(:OCTET, nil, [:range, "#x00-#xFF"], kind: :terminal).extend(EBNF::PEG::Rule),
106
+ EBNF::Rule.new(:SP, nil, [:hex, "#x20"], kind: :terminal).extend(EBNF::PEG::Rule),
107
+ EBNF::Rule.new(:VCHAR, nil, [:range, "#x21-#x7E"], kind: :terminal).extend(EBNF::PEG::Rule),
108
+ EBNF::Rule.new(:WSP, nil, [:alt, :SP, :HTAB], kind: :terminal).extend(EBNF::PEG::Rule),
109
+ ]
110
+ end
111
+