<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.11 (Ruby 3.3.1) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-update-8610-grammar-05" category="std" consensus="true" submissionType="IETF" updates="8610" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title abbrev="CDDL grammar updates">Updates to the CDDL grammar of RFC 8610</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-update-8610-grammar-05"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2024" month="May" day="17"/>
    <area>ART</area>
    <workgroup>CBOR</workgroup>
    <keyword>Concise Data Definition Language</keyword>
    <abstract>
      <?line 82?>

<t>The Concise Data Definition Language (CDDL), as defined in
RFC 8610 and RFC 9165,
provides an easy and unambiguous way to express structures for
protocol messages and data formats that are represented in CBOR or
JSON.</t>
      <t>The present document updates RFC 8610 by addressing errata and making
other small fixes for the ABNF grammar defined for CDDL there.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://cbor-wg.github.io/update-8610-grammar/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-cbor-update-8610-grammar/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        CBOR Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cbor-wg/update-8610-grammar"/>.</t>
    </note>
  </front>
  <middle>
    <?line 93?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Concise Data Definition Language (CDDL), as defined in
<xref target="RFC8610"/> and <xref target="RFC9165"/>,
provides an easy and unambiguous way to express structures for
protocol messages and data formats that are represented in CBOR or
JSON.</t>
      <t>The present document updates <xref target="RFC8610"/> by addressing errata and making
other small fixes for the ABNF grammar defined for CDDL there.</t>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The Terminology from <xref target="RFC8610"/> applies.
The grammar in <xref target="RFC8610"/> is based on ABNF, which is defined in <xref target="STD68"/>
and <xref target="RFC7405"/>.</t>
      </section>
    </section>
    <section anchor="clari">
      <name>Clarifications and Changes based on Errata Reports</name>
      <t>A number of errata reports have been made around some details of text
string and byte string literal syntax: <xref target="Err6527"/> and <xref target="Err6543"/>.
These are being addressed in this section, updating details of the
ABNF for these literal syntaxes.
Also, <xref target="Err6526"/> needs to be applied (backslashes have been lost during
RFC processing in some text explaining backslash escaping).</t>
      <t>These changes are intended to mirror the way existing implementations
have dealt with the errata.  They also use the opportunity presented
by the necessary cleanup of the grammar of string literals for a
backward compatible addition to the syntax for hexadecimal escapes.
The latter change is not automatically forward compatible (i.e., CDDL
specifications that make use of this syntax do not necessarily work
with existing implementations until these are updated, which this
specification recommends).</t>
      <section anchor="e6527">
        <name>Err6527 (text string literals)</name>
        <t>The ABNF used in <xref target="RFC8610"/> for the content of text string literals
is rather permissive:</t>
        <figure anchor="e6527-old1">
          <name>Old ABNF for strings with permissive ABNF for SESC, but not allowing hex escapes</name>
          <sourcecode type="abnf"><![CDATA[
; RFC 8610 ABNF:
text = %x22 *SCHAR %x22
SCHAR = %x20-21 / %x23-5B / %x5D-7E / %x80-10FFFD / SESC
SESC = "\" (%x20-7E / %x80-10FFFD)
]]></sourcecode>
        </figure>
        <t>This allows almost any non-C0 character to be escaped by a backslash,
but critically misses out on the <tt>\uXXXX</tt> and <tt>\uHHHH\uLLLL</tt> forms
that JSON allows to specify characters in hex (which should be
applying here according to Bullet 6 of <xref section="3.1" sectionFormat="of" target="RFC8610"/>).
(Note that we import from JSON the unwieldy <tt>\uHHHH\uLLLL</tt> syntax,
which represents Unicode code points beyond U+FFFF by making them look
like UTF-16 surrogate pairs; CDDL text strings are not using UTF-16 or
surrogates.)</t>
        <t>Both can be solved by updating the SESC production.
We use the opportunity to add a popular form of directly specifying
characters in strings using hexadecimal escape sequences of the form
<tt>\u{hex}</tt>, where <tt>hex</tt> is the hexadecimal representation of the
Unicode scalar value.
The result is the new set of rules defining SESC in <xref target="e6527-new1"/>:</t>
        <figure anchor="e6527-new1">
          <name>Updated string ABNF to allow hex escapes</name>
          <sourcecode type="abnf" name="cddl-new-sesc.abnf"><![CDATA[
; new rules collectively defining SESC:
SESC = "\" ( %x22 / "/" / "\" /                 ; \" \/ \\
             %x62 / %x66 / %x6E / %x72 / %x74 / ; \b \f \n \r \t
             (%x75 hexchar) )                   ; \uXXXX
hexchar = "{" (1*"0" [ hexscalar ] / hexscalar) "}" /
          non-surrogate / (high-surrogate "\" %x75 low-surrogate)
non-surrogate = ((DIGIT / "A"/"B"/"C" / "E"/"F") 3HEXDIG) /
                ("D" %x30-37 2HEXDIG )
high-surrogate = "D" ("8"/"9"/"A"/"B") 2HEXDIG
low-surrogate = "D" ("C"/"D"/"E"/"F") 2HEXDIG
hexscalar = "10" 4HEXDIG / HEXDIG1 4HEXDIG
          / non-surrogate / 1*3HEXDIG
HEXDIG1 = DIGIT1 / "A" / "B" / "C" / "D" / "E" / "F"
]]></sourcecode>
        </figure>
        <t>(Notes:
In ABNF, strings such as <tt>"A"</tt>, <tt>"B"</tt> etc. are case-insensitive, as is
intended here.
We could have written <tt>%x62</tt> as <tt>%s"b"</tt>, but didn't, in order to
maximize ABNF tool compatibility.)</t>
        <t>Now that SESC is more restrictively formulated, this also requires an
update to the BCHAR production used in the ABNF syntax for byte string
literals:</t>
        <figure anchor="e6527-old2">
          <name>Old ABNF for BCHAR</name>
          <sourcecode type="abnf"><![CDATA[
; RFC 8610 ABNF:
bytes = [bsqual] %x27 *BCHAR %x27
BCHAR = %x20-26 / %x28-5B / %x5D-10FFFD / SESC / CRLF
bsqual = "h" / "b64"
]]></sourcecode>
        </figure>
        <t>With the SESC updated as above, <tt>\'</tt> is no longer allowed in BCHAR;
this now needs to be explicitly included.</t>
        <t>Updating BCHAR also provides an opportunity to address <xref target="Err6278"/>,
which points to an inconsistency in treating U+007F (DEL) between SCHAR and
BCHAR.
As U+007F is not printable, including it in a byte string literal is
as confusing as for a text string literal, and it should therefore be
excluded from BCHAR as it is from SCHAR.
The same reasoning also applies to the C1 control characters,
so we actually exclude the entire range from U+007F to U+009F.
The same reasoning then also applies to text in comments (PCHAR).
For completeness, all these should also explicitly exclude the code
points that have been set aside for UTF-16's surrogates.</t>
        <figure anchor="e6527-new2">
          <name>Updated ABNF for BCHAR, SCHAR, and PCHAR</name>
          <sourcecode type="abnf" name="cddl-new-bchar.abnf"><![CDATA[
; new rules for BCHAR and SCHAR:
SCHAR = %x20-21 / %x23-5B / %x5D-7E / NONASCII / SESC
BCHAR = %x20-26 / %x28-5B / %x5D-7E / NONASCII / SESC / "\'" / CRLF
PCHAR = %x20-7E / NONASCII
NONASCII = %xA0-D7FF / %xE000-10FFFD
]]></sourcecode>
        </figure>
        <t>(Note that, apart from addressing the inconsistencies, there is no
attempt to further exclude non-printable characters from the ABNF;
doing this properly would draw in complexity from the ongoing
evolution of the Unicode standard that is not needed here.)</t>
      </section>
      <section anchor="err6543-byte-string-literals">
        <name>Err6543 (byte string literals)</name>
        <t>The ABNF used in <xref target="RFC8610"/> for the content of byte string literals
lumps together byte strings notated as text with byte strings notated
in base16 (hex) or base64 (but see also updated BCHAR production above):</t>
        <figure anchor="e6527-old2a">
          <name>Old ABNF for BCHAR</name>
          <sourcecode type="abnf"><![CDATA[
; RFC 8610 ABNF:
bytes = [bsqual] %x27 *BCHAR %x27
BCHAR = %x20-26 / %x28-5B / %x5D-10FFFD / SESC / CRLF
]]></sourcecode>
        </figure>
        <section numbered="false" anchor="change-proposed-by-errata-report-6543">
          <name>Change proposed by Errata Report 6543</name>
          <t>Errata report 6543 proposes to handle the two cases in separate
productions (where, with an updated SESC, BCHAR obviously needs to be
updated as above):</t>
          <figure anchor="e6543-1">
            <name>Errata Report 8653 Proposal to Split the Byte String Rules</name>
            <sourcecode type="abnf"><![CDATA[
; Err6543 proposal:
bytes = %x27 *BCHAR %x27
      / bsqual %x27 *QCHAR %x27
BCHAR = %x20-26 / %x28-5B / %x5D-10FFFD / SESC / CRLF
QCHAR = DIGIT / ALPHA / "+" / "/" / "-" / "_" / "=" / WS
]]></sourcecode>
          </figure>
          <t>This potentially causes a subtle change, which is hidden in the WS production:</t>
          <figure anchor="e6543-2">
            <name>ABNF definition of WS from RFC 8610</name>
            <sourcecode type="abnf"><![CDATA[
; RFC 8610 ABNF:
WS = SP / NL
SP = %x20
NL = COMMENT / CRLF
COMMENT = ";" *PCHAR CRLF
PCHAR = %x20-7E / %x80-10FFFD
CRLF = %x0A / %x0D.0A
]]></sourcecode>
          </figure>
          <t>This allows any non-C0 character in a comment, so this fragment
becomes possible:</t>
          <sourcecode type="cddl"><![CDATA[
foo = h'
   43424F52 ; 'CBOR'
   0A       ; LF, but don't use CR!
'
]]></sourcecode>
          <t>The current text is not unambiguously saying whether the three apostrophes
need to be escaped with a <tt>\</tt> or not, as in:</t>
          <sourcecode type="cddl"><![CDATA[
foo = h'
   43424F52 ; \'CBOR\'
   0A       ; LF, but don\'t use CR!
'
]]></sourcecode>
          <t>... which would be supported by the existing ABNF in <xref target="RFC8610"/>.</t>
        </section>
        <section numbered="false" anchor="no-change-needed-after-addressing-e6527-section-e6527">
          <name>No change needed after addressing <xref format="title" target="e6527"/> (Section <xref format="counter" target="e6527"/>)</name>
          <t>This document takes the simpler approach of leaving the processing of
the content of the byte string literal to a semantic step after
processing the syntax of the <tt>bytes</tt>/<tt>BCHAR</tt> rules as updated by
<xref target="e6527-new1"/> and <xref target="e6527-new2"/>.</t>
          <t>The rules in <xref target="e6543-2"/> are therefore applied to the result of this
processing where <tt>bsqual</tt> is given as <tt>h</tt> or <tt>b64</tt>.</t>
          <t>Note that this approach also works well with the use of byte strings
in <xref section="3" sectionFormat="of" target="RFC9165"/>.
It does require some care when copy-pasting into CDDL models from ABNF
that contains single quotes (which may also hide as apostrophes
in comments); these need to be escaped or possibly replaced by <tt>%x27</tt>.</t>
          <t>Finally, our approach lends support to extending <tt>bsqual</tt> in CDDL
similar to the way this is done for CBOR diagnostic notation in <xref target="I-D.ietf-cbor-edn-literals"/>.
(Note that the processing of string literals now is quite similar between
CDDL and EDN, except that CDDL has "<tt>;</tt>"-based end-of-line comments, while EDN has
two comment syntaxes, in-line "<tt>/</tt>"-based and end-of-line "<tt>#</tt>"-based.)</t>
          <t>The CDDL example in <xref target="string-examples"/> demonstrates various escaping
techniques.
Obviously in the literals for <tt>a</tt> and <tt>x</tt>, there is no need to escape
the second character, an <tt>o</tt>, as <tt>\u{6f}</tt>; this is just for demonstration.
Similarly, as shown in <tt>c</tt> and <tt>z</tt> there also is no need to escape the
<tt>🁳</tt> or <tt>⌘</tt>, but escaping them may be convenient in order to limit the character
repertoire of a CDDL file itself to ASCII <xref target="STD80"/>.</t>
          <figure anchor="string-examples">
            <name>Example text and byte string literals with various escaping techniques</name>
            <sourcecode type="cddl"><![CDATA[
start = [a, b, c, x, y, z]

; "🁳", DOMINO TILE VERTICAL-02-02, and
; "⌘", PLACE OF INTEREST SIGN, in a text string:
a = "D\u{6f}mino's \u{1F073} + \u{2318}"      ; \u{}-escape 3 chars
b = "Domino's \uD83C\uDC73 + \u2318"          ; escape JSON-like
c = "Domino's 🁳 + ⌘"                          ; unescaped

; in a byte string given as text, the ' needs to be escaped:
x = 'D\u{6f}mino\u{27}s \u{1F073} + \u{2318}' ; \u{}-escape 4 chars
y = 'Domino\'s \uD83C\uDC73 + \u2318'         ; escape JSON-like
z = 'Domino\'s 🁳 + ⌘'                         ; escape ' only
]]></sourcecode>
          </figure>
          <t>In this example, the rules a to c and x to z all produce strings with
byte-wise identical content, where a to c are text strings, and x to z
are byte strings.
<xref target="string-examples-pretty"/> illustrates this by showing the output generated from
the <tt>start</tt> rule in <xref target="string-examples"/>, using pretty-printed hexadecimal.</t>
          <figure anchor="string-examples-pretty">
            <name>Generated CBOR from CDDL example</name>
            <sourcecode type="cbor-pretty"><![CDATA[
86                                      # array(6)
   73                                   # text(19)
      446f6d696e6f277320f09f81b3202b20e28c98 # "Domino's 🁳 + ⌘"
   73                                   # text(19)
      446f6d696e6f277320f09f81b3202b20e28c98 # "Domino's 🁳 + ⌘"
   73                                   # text(19)
      446f6d696e6f277320f09f81b3202b20e28c98 # "Domino's 🁳 + ⌘"
   53                                   # bytes(19)
      446f6d696e6f277320f09f81b3202b20e28c98 # "Domino's 🁳 + ⌘"
   53                                   # bytes(19)
      446f6d696e6f277320f09f81b3202b20e28c98 # "Domino's 🁳 + ⌘"
   53                                   # bytes(19)
      446f6d696e6f277320f09f81b3202b20e28c98 # "Domino's 🁳 + ⌘"
]]></sourcecode>
          </figure>
          <!-- cddl sourcecode/cddl/no-change-needed-after-addr.cddl g | diag2pretty.rb | diff - sourcecode/cbor-pretty/no-change-needed-after-addr.cbor-pretty  -->

</section>
      </section>
    </section>
    <section anchor="small-enabling-grammar-changes">
      <name>Small Enabling Grammar Changes</name>
      <t>The two subsections in this section specify two small changes to the
grammar that are intended to enable certain kinds of specifications.
These changes are backward compatible, i.e., CDDL files that
comply to <xref target="RFC8610"/> continue to match the updated grammar, but not
necessarily forward compatible, i.e., CDDL specifications that make
use of these changes cannot necessarily be processed by existing <xref target="RFC8610"/>
implementations.</t>
      <section anchor="empty">
        <name>Empty data models</name>
        <t><xref target="RFC8610"/> requires a CDDL file to have at least one rule.</t>
        <figure anchor="empty-old">
          <name>Old ABNF for top-level rule cddl</name>
          <sourcecode type="abnf"><![CDATA[
; RFC 8610 ABNF:
cddl = S 1*(rule S)
]]></sourcecode>
        </figure>
        <t>This makes sense when the file has to stand alone, as a CDDL data
model needs to have at least one rule to provide an entry point (start
rule).</t>
        <t>With CDDL modules <xref target="I-D.ietf-cbor-cddl-modules"/>, CDDL files can also include directives,
and these might be the source of all the rules that
ultimately make up the module created by the file.
Any other rule content in the file has to be available for directive
processing, making the requirement for at least one rule cumbersome.</t>
        <t>Therefore, we extend the grammar as in <xref target="empty-new"/>
and make the existence of at least one rule a semantic constraint, to
be fulfilled after processing of all directives.</t>
        <figure anchor="empty-new">
          <name>Updated ABNF for top-level rule cddl</name>
          <sourcecode type="abnf" name="cddl-new-cddl.abnf"><![CDATA[
; new top-level rule:
cddl = S *(rule S)
]]></sourcecode>
        </figure>
      </section>
      <section anchor="tagnum">
        <name>Non-literal Tag Numbers, Simple Values</name>
        <t>The existing ABNF syntax for expressing tags in CDDL is:</t>
        <figure anchor="tag-old">
          <name>Old ABNF for tag syntax</name>
          <sourcecode type="abnf"><![CDATA[
; extracted from RFC 8610 ABNF:
type2 =/ "#" "6" ["." uint] "(" S type S ")"
]]></sourcecode>
        </figure>
        <t>This means tag numbers can only be given as literal numbers (uints).
Some specifications operate on ranges of tag numbers, e.g., <xref target="RFC9277"/>
has a range of tag numbers 1668546817 (0x63740101) to 1668612095
(0x6374FFFF) to tag specific content formats.
This can currently not be expressed in CDDL.
Similar considerations apply to simple values (<tt>#7.</tt>xx).</t>
        <t>This update extends the syntax to:</t>
        <figure anchor="tag-new">
          <name>Updated ABNF for tag and simple value syntaxes</name>
          <sourcecode type="abnf" name="cddl-new-tag.abnf"><![CDATA[
; new rules collectively defining the tagged case:
type2 =/ "#" "6" ["." head-number] "(" S type S ")"
       / "#" "7" ["." head-number]
head-number = uint / ("<" type ">")
]]></sourcecode>
        </figure>
        <t>For <tt>#6</tt>, the <tt>head-number</tt> stands for the tag number.
For <tt>#7</tt>, the <tt>head-number</tt> stands for the simple value if it is in
the ranges 0..23 or 32..255 (as per Section <xref target="RFC8949" section="3.3" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>
the simple values 24..31 are not used).
For 24..31, the <tt>head-number</tt> stands for the "additional
information", e.g., <tt>#7.25</tt> or <tt>#7.&lt;25&gt;</tt> is a float16, etc.
(All ranges mentioned here are inclusive.)</t>
        <t>So the above range can be expressed in a CDDL fragment such as:</t>
        <sourcecode type="cddl"><![CDATA[
ct-tag<content> = #6.<ct-tag-number>(content)
ct-tag-number = 1668546817..1668612095
; or use 0x63740101..0x6374FFFF
]]></sourcecode>
        <t>Notes:</t>
        <ol spacing="normal" type="1"><li>
            <t>This syntax reuses the angle bracket syntax for generics;
this reuse is innocuous as a generic parameter/argument only ever
occurs after a rule name (<tt>id</tt>), while it occurs after <tt>.</tt> here.
(Whether there is potential for human confusion can be debated; the
above example deliberately uses generics as well.)</t>
          </li>
          <li>
            <t>The updated ABNF grammar makes it a bit more explicit that the
number given after the optional dot is special, not giving the CBOR
"additional information" for tags and simple values as it is with
other uses of <tt>#</tt> in CDDL.
(Adding this observation to <xref section="2.2.3" sectionFormat="of" target="RFC8610"/> is the subject
of <xref target="Err6575"/>; it is correctly noted in <xref section="3.6" sectionFormat="of" target="RFC8610"/>.)
In hindsight, maybe a different character than the dot should have
been chosen for this special case, however changing the grammar
now would have been too disruptive.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The grammar fixes and updates in this document are not believed to
create additional security considerations.
The security considerations in <xref section="5" sectionFormat="of" target="RFC8610"/> do apply, and
specifically the potential for confusion is increased in an
environment that uses a combination of CDDL tools some of which have
been updated and some of which have not been, in particular based on
<xref target="clari"/>.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <referencegroup anchor="STD68" target="https://www.rfc-editor.org/info/std68">
          <reference anchor="RFC5234" target="https://www.rfc-editor.org/info/rfc5234">
            <front>
              <title>Augmented BNF for Syntax Specifications: ABNF</title>
              <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
              <author fullname="P. Overell" initials="P." surname="Overell"/>
              <date month="January" year="2008"/>
              <abstract>
                <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="68"/>
            <seriesInfo name="RFC" value="5234"/>
            <seriesInfo name="DOI" value="10.17487/RFC5234"/>
          </reference>
        </referencegroup>
        <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94">
          <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
            <front>
              <title>Concise Binary Object Representation (CBOR)</title>
              <author fullname="C. Bormann" initials="C." surname="Bormann"/>
              <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
              <date month="December" year="2020"/>
              <abstract>
                <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
                <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="94"/>
            <seriesInfo name="RFC" value="8949"/>
            <seriesInfo name="DOI" value="10.17487/RFC8949"/>
          </reference>
        </referencegroup>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <referencegroup anchor="STD80" target="https://www.rfc-editor.org/info/std80">
          <reference anchor="RFC0020" target="https://www.rfc-editor.org/info/rfc20">
            <front>
              <title>ASCII format for network interchange</title>
              <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/>
              <date month="October" year="1969"/>
            </front>
            <seriesInfo name="STD" value="80"/>
            <seriesInfo name="RFC" value="20"/>
            <seriesInfo name="DOI" value="10.17487/RFC0020"/>
          </reference>
        </referencegroup>
        <reference anchor="RFC7405">
          <front>
            <title>Case-Sensitive String Support in ABNF</title>
            <author fullname="P. Kyzivat" initials="P." surname="Kyzivat"/>
            <date month="December" year="2014"/>
            <abstract>
              <t>This document extends the base definition of ABNF (Augmented Backus-Naur Form) to include a way to specify US-ASCII string literals that are matched in a case-sensitive manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7405"/>
          <seriesInfo name="DOI" value="10.17487/RFC7405"/>
        </reference>
        <reference anchor="RFC9165">
          <front>
            <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="December" year="2021"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point.</t>
              <t>The present document defines a number of control operators that were not yet ready at the time RFC 8610 was completed:,, and for the construction of constants; / for including ABNF (RFC 5234 and RFC 7405) in CDDL specifications; and for indicating the use of a non-basic feature in an instance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9165"/>
          <seriesInfo name="DOI" value="10.17487/RFC9165"/>
        </reference>
        <reference anchor="I-D.ietf-cbor-cddl-modules">
          <front>
            <title>CDDL Module Structure</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Brendan Moran" initials="B." surname="Moran">
              <organization>Arm Limited</organization>
            </author>
            <date day="4" month="March" year="2024"/>
            <abstract>
              <t>   At the time of writing, the Concise Data Definition Language (CDDL)
   is defined by RFC 8610 and RFC 9165.  The latter has used the
   extension point provided in RFC 8610, the _control operator_.

   As CDDL is being used in larger projects, the need for features has
   become known that cannot be easily mapped into this single extension
   point.

   The present document defines a backward- and forward-compatible way
   to add a module structure to CDDL.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cddl-modules-02"/>
        </reference>
        <reference anchor="I-D.ietf-cbor-edn-literals">
          <front>
            <title>CBOR Extended Diagnostic Notation (EDN): Application-Oriented Literals, ABNF, and Media Type</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="1" month="February" year="2024"/>
            <abstract>
              <t>   The Concise Binary Object Representation, CBOR (STD 94, RFC 8949),
   defines a "diagnostic notation" in order to be able to converse about
   CBOR data items without having to resort to binary data.

   This document specifies how to add application-oriented extensions to
   the diagnostic notation.  It then defines two such extensions for
   text representations of epoch-based date/times and of IP addresses
   and prefixes (RFC 9164).

   A few further additions close some gaps in usability.  To facilitate
   tool interoperation, this document specifies a formal ABNF definition
   for extended diagnostic notation (EDN) that accommodates application-
   oriented literals.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-edn-literals-08"/>
        </reference>
        <reference anchor="Err6278" target="https://www.rfc-editor.org/errata/eid6278">
          <front>
            <title>Errata Report 6278</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="RFC" value="8610"/>
        </reference>
        <reference anchor="Err6526" target="https://www.rfc-editor.org/errata/eid6526">
          <front>
            <title>Errata Report 6526</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="RFC" value="8610"/>
        </reference>
        <reference anchor="Err6527" target="https://www.rfc-editor.org/errata/eid6527">
          <front>
            <title>Errata Report 6527</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="RFC" value="8610"/>
        </reference>
        <reference anchor="Err6543" target="https://www.rfc-editor.org/errata/eid6543">
          <front>
            <title>Errata Report 6543</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="RFC" value="8610"/>
        </reference>
        <reference anchor="Err6575" target="https://www.rfc-editor.org/errata/eid6575">
          <front>
            <title>Errata Report 6575</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
          <seriesInfo name="RFC" value="8610"/>
        </reference>
        <reference anchor="RFC9277">
          <front>
            <title>On Stable Storage for Items in Concise Binary Object Representation (CBOR)</title>
            <author fullname="M. Richardson" initials="M." surname="Richardson"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document defines a stored ("file") format for Concise Binary Object Representation (CBOR) data items that is friendly to common systems that recognize file types, such as the Unix file(1) command.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9277"/>
          <seriesInfo name="DOI" value="10.17487/RFC9277"/>
        </reference>
      </references>
    </references>
    <?line 488?>

<section anchor="updated-collected-abnf-for-cddl">
      <name>Updated Collected ABNF for CDDL</name>
      <t>This appendix is normative.</t>
      <t>It provides the full ABNF from <xref target="RFC8610"/> with the updates
applied in the present document.</t>
      <figure anchor="collected-abnf">
        <name>ABNF for CDDL as updated</name>
        <sourcecode type="abnf" name="cddl-updated-complete.abnf"><![CDATA[
cddl = S *(rule S)
rule = typename [genericparm] S assignt S type
     / groupname [genericparm] S assigng S grpent

typename = id
groupname = id

assignt = "=" / "/="
assigng = "=" / "//="

genericparm = "<" S id S *("," S id S ) ">"
genericarg = "<" S type1 S *("," S type1 S ) ">"

type = type1 *(S "/" S type1)

type1 = type2 [S (rangeop / ctlop) S type2]
; space may be needed before the operator if type2 ends in a name

type2 = value
      / typename [genericarg]
      / "(" S type S ")"
      / "{" S group S "}"
      / "[" S group S "]"
      / "~" S typename [genericarg]
      / "&" S "(" S group S ")"
      / "&" S groupname [genericarg]
      / "#" "6" ["." head-number] "(" S type S ")"
      / "#" "7" ["." head-number]
      / "#" DIGIT ["." uint]                ; major/ai
      / "#"                                 ; any
head-number = uint / ("<" type ">")

rangeop = "..." / ".."

ctlop = "." id

group = grpchoice *(S "//" S grpchoice)

grpchoice = *(grpent optcom)

grpent = [occur S] [memberkey S] type
       / [occur S] groupname [genericarg]  ; preempted by above
       / [occur S] "(" S group S ")"

memberkey = type1 S ["^" S] "=>"
          / bareword S ":"
          / value S ":"

bareword = id

optcom = S ["," S]

occur = [uint] "*" [uint]
      / "+"
      / "?"

uint = DIGIT1 *DIGIT
     / "0x" 1*HEXDIG
     / "0b" 1*BINDIG
     / "0"

value = number
      / text
      / bytes

int = ["-"] uint

; This is a float if it has fraction or exponent; int otherwise
number = hexfloat / (int ["." fraction] ["e" exponent ])
hexfloat = ["-"] "0x" 1*HEXDIG ["." 1*HEXDIG] "p" exponent
fraction = 1*DIGIT
exponent = ["+"/"-"] 1*DIGIT

text = %x22 *SCHAR %x22
SCHAR = %x20-21 / %x23-5B / %x5D-7E / NONASCII / SESC

SESC = "\" ( %x22 / "/" / "\" /                 ; \" \/ \\
             %x62 / %x66 / %x6E / %x72 / %x74 / ; \b \f \n \r \t
             (%x75 hexchar) )                   ; \uXXXX

hexchar = "{" (1*"0" [ hexscalar ] / hexscalar) "}" /
          non-surrogate / (high-surrogate "\" %x75 low-surrogate)
non-surrogate = ((DIGIT / "A"/"B"/"C" / "E"/"F") 3HEXDIG) /
                ("D" %x30-37 2HEXDIG )
high-surrogate = "D" ("8"/"9"/"A"/"B") 2HEXDIG
low-surrogate = "D" ("C"/"D"/"E"/"F") 2HEXDIG
hexscalar = "10" 4HEXDIG / HEXDIG1 4HEXDIG
          / non-surrogate / 1*3HEXDIG

bytes = [bsqual] %x27 *BCHAR %x27
BCHAR = %x20-26 / %x28-5B / %x5D-7E / NONASCII / SESC / "\'" / CRLF
bsqual = "h" / "b64"

id = EALPHA *(*("-" / ".") (EALPHA / DIGIT))
ALPHA = %x41-5A / %x61-7A
EALPHA = ALPHA / "@" / "_" / "$"
DIGIT = %x30-39
DIGIT1 = %x31-39
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
HEXDIG1 = DIGIT1 / "A" / "B" / "C" / "D" / "E" / "F"
BINDIG = %x30-31

S = *WS
WS = SP / NL
SP = %x20
NL = COMMENT / CRLF
COMMENT = ";" *PCHAR CRLF
PCHAR = %x20-7E / NONASCII
NONASCII = %xA0-D7FF / %xE000-10FFFD
CRLF = %x0A / %x0D.0A
]]></sourcecode>
      </figure>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Many thanks go to the submitters of the errata reports addressed in
this document.
In one of the ensuing discussions, <contact fullname="Doug Ewell"/> proposed to define an
ABNF rule NONASCII, of which we have included the essence.
Special thanks to the reviewers <contact fullname="Marco Tiloca"/>, <contact fullname="Christian Amsüss"/> (shepherd review), and <contact fullname="Orie Steele"/> (AD review).</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
LV2Pe/s6CbBYX6lQUcejE9PFEf8Np33ECVFQAAA=

-->

</rfc>
