cddlc 0.3.1 → 0.3.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ac6c49d6e3aae903f307b8ca75486ec8a0654bbf9bcb8ce77cfbc32d58b97a2
4
- data.tar.gz: 04c26c80b59ca309c68d0a1ff7e1236f50ddcc10f2aab7d6eddc0c09d5a3f698
3
+ metadata.gz: 87f4f966e5f0937e393d3157c80d345295bd672d088ccc4587c04223c7ec5f94
4
+ data.tar.gz: 5be056668436fff6ab9835487326956461a98f748107fd7e0b8c4c7c6cd2dc7b
5
5
  SHA512:
6
- metadata.gz: e99d700012b8c6211ee051e20399271ee9e765f92c835eb0c567880b3cf05f343f26c8ab4b28535641f98020916a2ea6b4ccb73f55c61375771f7fc68cbd69f9
7
- data.tar.gz: fd110edebea03f2ebd07e3e670e2861c24caeff9758ecf40edefc4a73034933f22c17b183eff86babb2421472fe9fa10938710ac6965e36a9a1efa36dd7f30a9
6
+ metadata.gz: 46d27fe85391c66e58d9006391993eb44d14b828fe1254a1d9911d015a1ed0cd7675e5239cde4f9c90a11adfef78b97ca331d2b50eb1e53ba35808bc5f034164
7
+ data.tar.gz: 27be4a4c43b65d7a6e764fc9c66eff853b3b4d37a99dff56c3fc8a5fbe975c341d2709704d82ec03cf4525b1c5a8621ea5e082e412e2d5d432cbf7a8b50e090a
data/bin/cddlc CHANGED
@@ -10,7 +10,7 @@ def named_keys(tree)
10
10
  # warn [:T, tree].inspect
11
11
  fail unless Array === tree
12
12
  case tree[0]
13
- when "seq", "gcho", "tcho"
13
+ when "seq", "gcho", "gadd", "tcho", "tadd"
14
14
  tree[1..-1].flat_map {|x| named_keys(x)}
15
15
  when "rep"
16
16
  named_keys(tree[3])
@@ -44,7 +44,7 @@ require 'ostruct'
44
44
  $options = OpenStruct.new
45
45
  begin
46
46
  op = OptionParser.new do |opts|
47
- opts.banner = "Usage: cddlc.rb [options] [file.cddl... | -]"
47
+ opts.banner = "Usage: cddlc.rb [options] [-e cddl | file.cddl... | -]"
48
48
 
49
49
  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
50
50
  $options.verbose = v
@@ -70,6 +70,9 @@ begin
70
70
  opts.on("-sRULE", "--start=RULE", String, "Start rule name") do |v|
71
71
  $options.start = v
72
72
  end
73
+ opts.on("-eCDDL", "CDDL model on command line") do |v|
74
+ $options.model = v
75
+ end
73
76
  opts.on("-iIMPORT", "--import=IMPORT", String, "Import [namespace=]reference") do |v|
74
77
  $options.import ||= []
75
78
  $options.import << v
@@ -92,7 +95,10 @@ end
92
95
 
93
96
  cddl_file = ""
94
97
  if $options.start
95
- cddl_file << "$.start.$ = #{$options.start}\n"
98
+ cddl_file << "@.start.@ = #{$options.start}\n"
99
+ end
100
+ if m = $options.model
101
+ cddl_file << m << "\n"
96
102
  end
97
103
 
98
104
  [[$options.include, "include"], [$options.import, "import"]].each do |arr, directive|
data/cddlc.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cddlc"
3
- s.version = "0.3.1"
3
+ s.version = "0.3.3"
4
4
  s.summary = "CDDL (Concise Data Definition Language) converters and miscellaneous tools"
5
5
  s.description = %q{cddlc implements converters and miscellaneous tools for CDDL, RFC 8610}
6
6
  s.author = "Carsten Bormann"
data/lib/cddlc.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require_relative "parser/cddl-util.rb"
2
2
  require_relative "processor/cddl-visitor.rb"
3
3
  require_relative 'processor/cddl-undefined.rb'
4
+ require_relative 'writer/cddl-writer.rb'
4
5
 
5
6
  class CDDL
6
7
  @@parser = CDDLGRAMMARParser.new
@@ -197,10 +198,18 @@ class CDDL
197
198
  end
198
199
  end
199
200
 
201
+ RULE_OP_TO_CHOICE = {"/=" => ["tcho", "tadd"], "//=" => ["gcho", "gadd"]}
202
+ CHOICERULES = RULE_OP_TO_CHOICE.values.flatten
203
+ RULE_OUTER_TO_CHOICE = {"tadd" => ["tcho", "tadd"], "gadd" => ["gcho", "gadd"]}
204
+
200
205
  def store_rule(k, v)
201
206
  if old = rules[k]
202
207
  if old != v
203
- return old # error
208
+ if cho = RULE_OUTER_TO_CHOICE[v[0]]
209
+ merge_to_rule(k, v, cho)
210
+ else
211
+ return old # error
212
+ end
204
213
  end
205
214
  else
206
215
  rules[k] = v
@@ -225,8 +234,38 @@ class CDDL
225
234
  Marshal.load(Marshal.dump(self))
226
235
  end
227
236
 
228
-
229
- RULE_OP_TO_CHOICE = {"/=" => "tcho", "//=" => "gcho"}
237
+ def merge_to_rule(name, val, cho)
238
+ @rules[name] = nv =
239
+ if (old = @rules[name]) && old != val
240
+ fail "overwriting #{write_rule(name, old)} ...with... #{write_rule(name, val)}" unless cho
241
+ if Array === old && cho.include?(old[0])
242
+ if cho.include?(val[0])
243
+ old.dup.append(*val[1..-1])
244
+ else
245
+ old.dup << val
246
+ end
247
+ else
248
+ # can't put an old "g/tadd" into a new "t/gcho"
249
+ fail "can't add #{write_rule(name, [cho[1], val])} ...to... #{write_rule(name, old)}" if CHOICERULES.include?(old[0])
250
+ [cho[0], old, val] # old might need to be packaged for gcho
251
+ end
252
+ else
253
+ if cho
254
+ if val[0] == cho[0]
255
+ [cho[1], *val[1..-1]]
256
+ else
257
+ [cho[1], val]
258
+ end
259
+ else
260
+ val
261
+ end
262
+ end
263
+ if name[0..1] == "$$"
264
+ check_socket(name, nv, "gadd", "tadd", "tcho", "type", "group")
265
+ elsif name[0] == "$"
266
+ check_socket(name, nv, "tadd", "gadd", "gcho", "group", "type")
267
+ end
268
+ end
230
269
 
231
270
  def rules
232
271
  if @rules.nil? # memoize
@@ -258,27 +297,27 @@ class CDDL
258
297
  else
259
298
  fail name
260
299
  end
261
- @rules[name] =
262
- if (old = @rules[name]) && old != val
263
- fail "duplicate rule for name #{name} #{old.inspect} #{val.inspect}" unless cho
264
- if Array === old && old[0] == cho
265
- old.dup << val
266
- else
267
- [cho, old, val]
268
- end
269
- else
270
- val
271
- end
300
+ merge_to_rule(name, val, cho)
272
301
  end
273
302
  # warn "** rules #{rules.inspect}"
274
303
  end
275
304
  @rules
276
305
  end
277
306
 
307
+ def check_socket(name, nv, right, wrong, wrong_plain, wrong_kind, kind)
308
+ unless nv[0] == right
309
+ if nv[0] == wrong
310
+ flaw = "#{wrong_kind} choice #{write_rhs([wrong_plain, *nv[1..-1]], 2.1)} in"
311
+ else
312
+ flaw = "plain assignment of #{write_rhs(nv, 2.1)} to"
313
+ end
314
+ warn "** warning: #{flaw} #{kind} socket #{name}"
315
+ end
316
+ end
317
+
278
318
  def prelude
279
319
  if @prelude.nil?
280
320
  @prelude = CDDL.from_cddl(File.read(DATA_DIR + "prelude.cddl"))
281
-
282
321
  end
283
322
  @prelude
284
323
  end
@@ -25,6 +25,10 @@ class CDDL
25
25
  ["gcho", *visit_all(prods, &block)]
26
26
  in ["tcho", *prods]
27
27
  ["tcho", *visit_all(prods, &block)]
28
+ in ["gadd", *prods]
29
+ ["gadd", *visit_all(prods, &block)]
30
+ in ["tadd", *prods]
31
+ ["tadd", *visit_all(prods, &block)]
28
32
  in ["seq", *prods]
29
33
  ["seq", *visit_all(prods, &block)]
30
34
  in ["enum", prod]
@@ -41,9 +41,9 @@ class CDDL
41
41
  [4, id]
42
42
  in ["gen", id, *parms] # oops -- namep vs. namea; ouch
43
43
  [4, "#{id}<#{parms.map{write_rhs(_1, 2, indent, pn)}.join(", ")}>"]
44
- in ["tcho", *types]
44
+ in ["tcho" | "tadd", *types]
45
45
  [2.1, types.map{write_rhs(_1, 3, indent, pn)}.join(" / ")]
46
- in ["gcho", *groups]
46
+ in ["gcho" | "gadd", *groups]
47
47
  [0, groups.map{write_rhs(_1, 2, indent, pn)}.join(" // ")]
48
48
  in ["op", op, l, r]
49
49
  [3, "#{write_rhs(l, 4, indent, pn)} #{op} #{write_rhs(r, 4, indent, pn)}"]
@@ -111,15 +111,22 @@ class CDDL
111
111
  prec_check(ret, targetprec, prec, indent_s)
112
112
  end
113
113
 
114
- def to_s
115
- rules.map {|k, v|
114
+ def write_rule(k, v)
116
115
  parmnames = false
116
+ assign = "="
117
117
  case v
118
+ in ["tadd", *rest]
119
+ assign = "/="
120
+ in ["gadd", *rest]
121
+ assign = "//="
118
122
  in ["parm", parmnames, _type]
119
123
  else
120
124
  end
121
- "#{write_lhs(k, parmnames)} = #{write_rhs(v, 2.1)}" # 2: parenthesize groups
122
- }.join("\n")
125
+ "#{write_lhs(k, parmnames)} #{assign} #{write_rhs(v, 2.1)}" # 2: parenthesize groups
126
+ end
127
+
128
+ def to_s
129
+ rules.map {|k, v| write_rule(k, v) }.join("\n")
123
130
  end
124
131
 
125
132
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cddlc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-02 00:00:00.000000000 Z
11
+ date: 2024-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler