cddlc 0.2.7 → 0.3.2

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: f9b2369e311571fc7dd58410f31098071ff75e8d53c144d3a478bc957945d7ae
4
- data.tar.gz: 326423811614449c38fb1af24e5a2fae1fa1cb4e467084f024e62c9cd514ac62
3
+ metadata.gz: a38ea6117afabc57b950af7598c2d497bb00f587ec937cbe41b45b33f3775dfe
4
+ data.tar.gz: f726477776dee7586f5f85909473cfb22acc38630cf45995c732d2df7a842ebf
5
5
  SHA512:
6
- metadata.gz: 0eac4ccf86acb957e9abf0eba253a61e07de25a84aea3f6a34e547a9e77b80e8d22f9ecbf106404d272920be114dea28074e65aa59eb2081e72dde942b28a8b3
7
- data.tar.gz: 03f7f303c48ae86ab3d99ecff74f9ddf7c07d23ec60660611aec0b734f62790f7f1a26f1b8f758950f7ae2414d5b734f30bd97352df4f1b6782b046f3117a0de
6
+ metadata.gz: 332fcf064ebfc558cc82908832575a3fd4f77219f6f1ceb46ffab2270ee4f9273ecc7d83edcc5dc6dc574ef4ccefdbf9fd7c25d10a9f88466dc4e0ca7ae3dc32
7
+ data.tar.gz: 3bbb56ffb6853eaab2792e5518914128ecf734bff0db4651861227bd77eaf4241e29b11306e04937855e46d67c05f3dd55cdde91e86da5ef2d5cc9f7fd4edb96
data/bin/cddlc CHANGED
@@ -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
@@ -94,6 +97,9 @@ cddl_file = ""
94
97
  if $options.start
95
98
  cddl_file << "$.start.$ = #{$options.start}\n"
96
99
  end
100
+ if m = $options.model
101
+ cddl_file << m << "\n"
102
+ end
97
103
 
98
104
  [[$options.include, "include"], [$options.import, "import"]].each do |arr, directive|
99
105
  if arr
data/cddlc.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cddlc"
3
- s.version = "0.2.7"
3
+ s.version = "0.3.2"
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
@@ -226,7 +227,8 @@ class CDDL
226
227
  end
227
228
 
228
229
 
229
- RULE_OP_TO_CHOICE = {"/=" => "tcho", "//=" => "gcho"}
230
+ RULE_OP_TO_CHOICE = {"/=" => ["tcho", "tadd"], "//=" => ["gcho", "gadd"]}
231
+ CHOICERULES = RULE_OP_TO_CHOICE.values.flatten
230
232
 
231
233
  def rules
232
234
  if @rules.nil? # memoize
@@ -258,27 +260,56 @@ class CDDL
258
260
  else
259
261
  fail name
260
262
  end
261
- @rules[name] =
263
+ @rules[name] = nv =
262
264
  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
265
+ fail "overwriting #{write_rule(name, old)} ...with... #{write_rule(name, val)}" unless cho
266
+ if Array === old && cho.include?(old[0])
267
+ if cho.include?(val[0])
268
+ old.dup.append(*val[1..-1])
269
+ else
270
+ old.dup << val
271
+ end
266
272
  else
267
- [cho, old, val]
273
+ # can't put an old "g/tadd" into a new "t/gcho"
274
+ fail "can't add #{write_rule(name, [cho[1], val])} ...to... #{write_rule(name, old)}" if CHOICERULES.include?(old[0])
275
+ [cho[0], old, val] # old might need to be packaged for gcho
268
276
  end
269
277
  else
270
- val
278
+ if cho
279
+ if val[0] == cho[0]
280
+ [cho[1], *val[1..-1]]
281
+ else
282
+ [cho[1], val]
283
+ end
284
+ else
285
+ val
286
+ end
271
287
  end
288
+ if name[0..1] == "$$"
289
+ check_socket(name, nv, "gadd", "tadd", "tcho", "type", "group")
290
+ elsif name[0] == "$"
291
+ check_socket(name, nv, "tadd", "gadd", "gcho", "group", "type")
292
+ end
272
293
  end
273
294
  # warn "** rules #{rules.inspect}"
274
295
  end
275
296
  @rules
276
297
  end
277
298
 
299
+ def check_socket(name, nv, right, wrong, wrong_plain, wrong_kind, kind)
300
+ unless nv[0] == right
301
+ if nv[0] == wrong
302
+ flaw = "#{wrong_kind} choice #{write_rhs([wrong_plain, *nv[1..-1]], 2.1)} in"
303
+ else
304
+ flaw = "plain assignment of #{write_rhs(nv, 2.1)} to"
305
+ end
306
+ warn "** warning: #{flaw} #{kind} socket #{name}"
307
+ end
308
+ end
309
+
278
310
  def prelude
279
311
  if @prelude.nil?
280
312
  @prelude = CDDL.from_cddl(File.read(DATA_DIR + "prelude.cddl"))
281
-
282
313
  end
283
314
  @prelude
284
315
  end
@@ -947,7 +947,7 @@ module CDDLGRAMMAR
947
947
  end
948
948
 
949
949
  module Type214
950
- def tag_number
950
+ def head_number
951
951
  elements[1]
952
952
  end
953
953
  end
@@ -975,26 +975,42 @@ module CDDLGRAMMAR
975
975
  end
976
976
 
977
977
  module Type217
978
- def uint
978
+ def head_number
979
979
  elements[1]
980
980
  end
981
981
  end
982
982
 
983
983
  module Type218
984
+ end
985
+
986
+ module Type219
987
+ def ast
988
+ el = elements[2].elements
989
+ ["prim", 7, *el && [el[1].ast]]
990
+ end
991
+ end
992
+
993
+ module Type220
994
+ def uint
995
+ elements[1]
996
+ end
997
+ end
998
+
999
+ module Type221
984
1000
  def DIGIT
985
1001
  elements[1]
986
1002
  end
987
1003
 
988
1004
  end
989
1005
 
990
- module Type219
1006
+ module Type222
991
1007
  def ast
992
1008
  ["prim", elements[1].text_value.to_i,
993
1009
  *(el = elements[2].elements) ? [el[1].text_value.to_i] : []]
994
1010
  end
995
1011
  end
996
1012
 
997
- module Type220
1013
+ module Type223
998
1014
  def ast() ["prim"] end
999
1015
  end
1000
1016
 
@@ -1330,7 +1346,7 @@ module CDDLGRAMMAR
1330
1346
  end
1331
1347
  s48 << r49
1332
1348
  if r49
1333
- r50 = _nt_tag_number
1349
+ r50 = _nt_head_number
1334
1350
  s48 << r50
1335
1351
  end
1336
1352
  if s48.last
@@ -1402,7 +1418,13 @@ module CDDLGRAMMAR
1402
1418
  end
1403
1419
  s56 << r57
1404
1420
  if r57
1405
- r58 = _nt_DIGIT
1421
+ if (match_len = has_terminal?("7", false, index))
1422
+ r58 = true
1423
+ @index += match_len
1424
+ else
1425
+ terminal_parse_failure('"7"')
1426
+ r58 = nil
1427
+ end
1406
1428
  s56 << r58
1407
1429
  if r58
1408
1430
  i60, s60 = index, []
@@ -1415,7 +1437,7 @@ module CDDLGRAMMAR
1415
1437
  end
1416
1438
  s60 << r61
1417
1439
  if r61
1418
- r62 = _nt_uint
1440
+ r62 = _nt_head_number
1419
1441
  s60 << r62
1420
1442
  end
1421
1443
  if s60.last
@@ -1445,20 +1467,74 @@ module CDDLGRAMMAR
1445
1467
  r56 = SyntaxNode.new(input, (index-1)...index) if r56 == true
1446
1468
  r0 = r56
1447
1469
  else
1470
+ i63, s63 = index, []
1448
1471
  if (match_len = has_terminal?("#", false, index))
1449
- r63 = instantiate_node(SyntaxNode,input, index...(index + match_len))
1450
- r63.extend(Type220)
1472
+ r64 = true
1451
1473
  @index += match_len
1452
1474
  else
1453
1475
  terminal_parse_failure('"#"')
1476
+ r64 = nil
1477
+ end
1478
+ s63 << r64
1479
+ if r64
1480
+ r65 = _nt_DIGIT
1481
+ s63 << r65
1482
+ if r65
1483
+ i67, s67 = index, []
1484
+ if (match_len = has_terminal?(".", false, index))
1485
+ r68 = true
1486
+ @index += match_len
1487
+ else
1488
+ terminal_parse_failure('"."')
1489
+ r68 = nil
1490
+ end
1491
+ s67 << r68
1492
+ if r68
1493
+ r69 = _nt_uint
1494
+ s67 << r69
1495
+ end
1496
+ if s67.last
1497
+ r67 = instantiate_node(SyntaxNode,input, i67...index, s67)
1498
+ r67.extend(Type220)
1499
+ else
1500
+ @index = i67
1501
+ r67 = nil
1502
+ end
1503
+ if r67
1504
+ r66 = r67
1505
+ else
1506
+ r66 = instantiate_node(SyntaxNode,input, index...index)
1507
+ end
1508
+ s63 << r66
1509
+ end
1510
+ end
1511
+ if s63.last
1512
+ r63 = instantiate_node(SyntaxNode,input, i63...index, s63)
1513
+ r63.extend(Type221)
1514
+ r63.extend(Type222)
1515
+ else
1516
+ @index = i63
1454
1517
  r63 = nil
1455
1518
  end
1456
1519
  if r63
1457
1520
  r63 = SyntaxNode.new(input, (index-1)...index) if r63 == true
1458
1521
  r0 = r63
1459
1522
  else
1460
- @index = i0
1461
- r0 = nil
1523
+ if (match_len = has_terminal?("#", false, index))
1524
+ r70 = instantiate_node(SyntaxNode,input, index...(index + match_len))
1525
+ r70.extend(Type223)
1526
+ @index += match_len
1527
+ else
1528
+ terminal_parse_failure('"#"')
1529
+ r70 = nil
1530
+ end
1531
+ if r70
1532
+ r70 = SyntaxNode.new(input, (index-1)...index) if r70 == true
1533
+ r0 = r70
1534
+ else
1535
+ @index = i0
1536
+ r0 = nil
1537
+ end
1462
1538
  end
1463
1539
  end
1464
1540
  end
@@ -1476,27 +1552,27 @@ module CDDLGRAMMAR
1476
1552
  r0
1477
1553
  end
1478
1554
 
1479
- module TagNumber0
1555
+ module HeadNumber0
1480
1556
  def ast() text_value.to_i end
1481
1557
  end
1482
1558
 
1483
- module TagNumber1
1559
+ module HeadNumber1
1484
1560
  def type
1485
1561
  elements[1]
1486
1562
  end
1487
1563
 
1488
1564
  end
1489
1565
 
1490
- module TagNumber2
1566
+ module HeadNumber2
1491
1567
  def ast() elements[1].ast end
1492
1568
  end
1493
1569
 
1494
- def _nt_tag_number
1570
+ def _nt_head_number
1495
1571
  start_index = index
1496
- if node_cache[:tag_number].has_key?(index)
1497
- cached = node_cache[:tag_number][index]
1572
+ if node_cache[:head_number].has_key?(index)
1573
+ cached = node_cache[:head_number][index]
1498
1574
  if cached
1499
- node_cache[:tag_number][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1575
+ node_cache[:head_number][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
1500
1576
  @index = cached.interval.end
1501
1577
  end
1502
1578
  return cached
@@ -1504,8 +1580,8 @@ module CDDLGRAMMAR
1504
1580
 
1505
1581
  i0 = index
1506
1582
  r1 = _nt_uint
1507
- r1.extend(TagNumber0)
1508
- r1.extend(TagNumber0)
1583
+ r1.extend(HeadNumber0)
1584
+ r1.extend(HeadNumber0)
1509
1585
  if r1
1510
1586
  r1 = SyntaxNode.new(input, (index-1)...index) if r1 == true
1511
1587
  r0 = r1
@@ -1535,8 +1611,8 @@ module CDDLGRAMMAR
1535
1611
  end
1536
1612
  if s2.last
1537
1613
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1538
- r2.extend(TagNumber1)
1539
- r2.extend(TagNumber2)
1614
+ r2.extend(HeadNumber1)
1615
+ r2.extend(HeadNumber2)
1540
1616
  else
1541
1617
  @index = i2
1542
1618
  r2 = nil
@@ -1550,7 +1626,7 @@ module CDDLGRAMMAR
1550
1626
  end
1551
1627
  end
1552
1628
 
1553
- node_cache[:tag_number][start_index] = r0
1629
+ node_cache[:head_number][start_index] = r0
1554
1630
 
1555
1631
  r0
1556
1632
  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 ["tcho", *prods]
31
+ ["tcho", *visit_all(prods, &block)]
28
32
  in ["seq", *prods]
29
33
  ["seq", *visit_all(prods, &block)]
30
34
  in ["enum", prod]
@@ -64,8 +64,10 @@ class CDDL
64
64
  [4, "#"]
65
65
  in ["prim", maj]
66
66
  [4, "##{maj}"]
67
- in ["prim", maj, min]
67
+ in ["prim", maj, Integer => min]
68
68
  [4, "##{maj}.#{min}"]
69
+ in ["prim", 7, Array => min]
70
+ [4, "##{maj}.<#{write_rhs(min, 0, indent, pn)}>"]
69
71
  in ["prim", 6, Integer => tag, type]
70
72
  [4, "#6.#{tag}(#{write_rhs(type, 0, indent, pn)})"]
71
73
  in ["prim", 6, Array => tag, type]
@@ -109,15 +111,24 @@ class CDDL
109
111
  prec_check(ret, targetprec, prec, indent_s)
110
112
  end
111
113
 
112
- def to_s
113
- rules.map {|k, v|
114
+ def write_rule(k, v)
114
115
  parmnames = false
116
+ assign = "="
115
117
  case v
118
+ in ["tadd", *rest]
119
+ assign = "/="
120
+ v = ["tcho", *rest]
121
+ in ["gadd", *rest]
122
+ assign = "//="
123
+ v = ["gcho", *rest]
116
124
  in ["parm", parmnames, _type]
117
125
  else
118
126
  end
119
- "#{write_lhs(k, parmnames)} = #{write_rhs(v, 2.1)}" # 2: parenthesize groups
120
- }.join("\n")
127
+ "#{write_lhs(k, parmnames)} #{assign} #{write_rhs(v, 2.1)}" # 2: parenthesize groups
128
+ end
129
+
130
+ def to_s
131
+ rules.map {|k, v| write_rule(k, v) }.join("\n")
121
132
  end
122
133
 
123
134
  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.2.7
4
+ version: 0.3.2
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-02-26 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