Fixed grammar. Improved UpdateList (not finished). ldpatch
authorAlexandre Bertails <alexandre@bertails.org>
Fri, 21 Nov 2014 14:31:23 -0500
branchldpatch
changeset 905 6ae283919a8a
parent 904 0c0ad179ff96
child 906 cd9627bc830e
Fixed grammar. Improved UpdateList (not finished).
ldpatch.html
--- a/ldpatch.html	Fri Nov 21 18:17:47 2014 +0100
+++ b/ldpatch.html	Fri Nov 21 14:31:23 2014 -0500
@@ -555,31 +555,37 @@
         <section id="update-list-statement">
           <h2><dfn>UpdateList</dfn></h2>
           <p>
-The UpdateList operation is used to update some members of an <a href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF collection</a>. It works in a similar way to <a href="https://docs.python.org/3/reference/expressions.html#slicings">slicing in Python</a> or similar languages: it replaces a slice of a list by another list.
-          </p>
-
-          <p>
-The <a>UpdateList</a> operation is defined by four components: a <a href="#grammar-production-varOrIRI">variable or IRI</a> <var>s</var>, an <a href="#grammar-production-predicate">predicate</a> <var>p</var>, a <a>slice specification</a> and an argument graph <var>g</var> containing an RDF collection. It MUST fail if the <a>target graph</a> contains no more more than one triple with subject <var>s</var> and object <var>p</var>, or if the object of that triple is not a collection.
+              The <a>UpdateList</a> operation is used to update some members of an <a href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF collection</a>. It works in a similar way to <a href="https://docs.python.org/3/reference/expressions.html#slicings">slicing in Python</a> or similar languages: it replaces a slice of a list by another list.
           </p>
 
           <p>
-The <dfn>slice specification</dfn> is composed of two positive integers <var>imin</var> and <var>imax</var> separated by "<code>..</code>". An omitted value is interpreted as the length of the collection. The first value <var>imin</var> MUST be less than or equal to <var>imax</var>, which MUST be less than or equal to the lenth of the collection. The slice specification represents the slice of the list being preceded by <var>imin</var> elements and spanning over (<var>imax</var>-<var>imin</var>) elements.
+The <a>UpdateList</a> operation is defined by four components: a <a class="internalDFN" href="#grammar-production-varOrIRI">variable or IRI</a> <var>s</var>, a <a class="internalDFN" href="#grammar-production-predicate">predicate</a> <var>p</var>, a <a>Slice expression</a> and an argument graph <var>g</var> containing an RDF collection.
+          </p>
+
+          <p>
+              The <dfn>Slice expression</dfn> is composed of two optional positive integers <var>i<sub>min</sub></var> and <var>i<sub>max</sub></var> separated by "<code>..</code>". An omitted value is interpreted as the length of the collection. The <a>Slice expression</a> will denote the slice of the list being preceded by <var>i<sub>min</sub></var> elements, and spanning over (<var>i<sub>max</sub></var>-<var>i<sub>min</sub></var>) elements.
          </p>
          <p>
-For example, in the list <code>( "lorem" "ipsum" "dolor" "sit" "amet" )</code>, the <a>slice specification</a> <code>2..4</code> denotes the slice <code>("dolor" "sit")</code>, <code>3..</code> denotes the slice <code>("sit" "amet")</code>, <code>2..2</code> denotes the empty slice located between <code>"ipsum"</code> and <code>"dolor"</code>, and <code>..</code> denotes the empty slice located at the end of the list.
+             For example, here are some <a>Slice expression</a>s for the list <code>( "lorem" "ipsum" "dolor" "sit" "amet" )</code>:
           </p>
+          <ul>
+              <li><code>2..4</code> denotes the slice <code>( "dolor" "sit" )</code></li>
+              <li><code>3..</code> denotes the slice <code>( "sit" "amet" )</code></li>
+              <li><code>2..2</code> denotes the empty slice located between <code>"ipsum"</code> and <code>"dolor"</code></li>
+              <li><code>..</code> denotes the empty slice located at the end of the list</li>
+          </ul>
 
-         <section>
+         <section id="updatelist-algo">
            <h3>Algorithm</h3>
            <p>
-Below is an algorithm explaining how <a>UpdateList</a> can be processed. The result of this algorithm is illustrated in <a href="#fig-updatelist-result"></a>.
+Below is an algorithm explaining how <a>UpdateList</a> can be processed.
            </p>
            <ul>
              <li>
                <b class="algo">Let</b> <var>s<sub>pre</sub></var> be <var>s</var>, <var>p<sub>pre</sub></var> be <var>p</var> and <var>o<sub>pre</sub></var> the object of the triple (<var>s</var>, <var>p</var>, ?) from the <a>target graph</a>.
              </li>
              <li>
-               <b class="algo">Repeat</b> <var>imin</var> times:
+               <b class="algo">Repeat</b> <var>i<sub>min</sub></var> times:
                <ul>
                  <li>
                    <b class="algo">Set</b> <var>s<sub>pre</sub></var> to <var>o<sub>pre</sub></var>, <var>p<sub>pre</sub></var> to <code>rdf:rest</code> and <var>o<sub>pre</sub></var> to the object of the triple (<var>o<sub>pre</sub></var>, <code>rdf:rest</code>, ?) from the <a>target graph</a>.
@@ -590,13 +596,13 @@
                <b class="algo">Let</b> <var>s<sub>post</sub></var> be <var>s<sub>pre</sub></var>, <var>p<sub>post</sub></var> be <var>p<sub>pre</sub></var> and <var>o<sub>post</sub></var> be <var>o<sub>pre</sub></var>.
              </li>
              <li>
-               <b class="algo">Repeat</b> (<var>imax</var>-<var>imin</var>) times:
+               <b class="algo">Repeat</b> (<var>i<sub>max</sub></var>-<var>i<sub>min</sub></var>) times:
                <ul>
                  <li>
                    Remove from the <a>target graph</a> the arcs (<var>s<sub>post</sub></var>, <var>p<sub>post</sub></var>, <var>o<sub>post</sub></var>).
                  </li>
                  <li>
-                   <b class="algo">Let</b> <var>elt</var> be the object of the triple (<var>o<sub>post</sub></var>, <code>rdf:first</code>, ?). Remove from the <a>target graph</a> the arc (<var>o<sub>post</sub></var>, <code>rdf:first</code>, <var>elt</var>). <b class="algo">If</b> <var>elt</var> is a blank node, <b class="algo">then</b> apply the <a>Cut</a> operation to <var>elt</var>.
+                   <b class="algo">Let</b> <var>elt</var> be the object of the triple (<var>o<sub>post</sub></var>, <code>rdf:first</code>, ?). Remove from the <a>target graph</a> the arc (<var>o<sub>post</sub></var>, <code>rdf:first</code>, <var>elt</var>). <b class="algo">If</b> <var>elt</var> is a blank node, <b class="algo">Then</b> apply the <a>Cut</a> operation to <var>elt</var>.
                  </li>
                  <li>
                    <b class="algo">Set</b> <var>s<sub>post</sub></var> to <var>o<sub>post</sub></var>, <var>p<sub>post</sub></var> to <code>rdf:rest</code> and <var>o<sub>post</sub></var> to the object of the triple (<var>o<sub>post</sub></var>, <code>rdf:rest</code>, ?) from the <a>target graph</a>.
@@ -639,7 +645,9 @@
           <section>
             <h3>Example</h3>
 
-Consider the graph represented in <a href="#fig-a-graph-containing-a-collection"></a>. <a href="#fig-updatelist-result"></a> shows the result of applying an <a>UpdateList</a> operation on that list.
+            <p>
+                Here is an illustration of the <a href="#updatelist-algo">previously introduced algorithm</a>. Consider the graph represented in <a href="#fig-a-graph-containing-a-collection"></a>. <a href="#fig-updatelist-result"></a> shows the result of applying an <a>UpdateList</a> operation on that list.
+            </p>
 
             <figure>
               <img src="fig-alt-update-list.svg" alt="( &quote;lorem&quote; &quote;ipsum&quote; &quote;dolor&quote; &quote;sit&quote; &quote;amet&quote; ) ( &quote;foo&quote; &quote;bar&quote; &quote;baz&quote; )">
@@ -765,375 +773,375 @@
       <!-- do not edit manually, this is automatically generated -->
 <table class="grammar">
   <tbody class="grammar-productions">
-<tr id="grammar-production-ldpatch">
+<tr id="grammar-production-// ldpatch">
     <td>[1]</td>
-    <td><a href="#grammar-production-ldpatch">ldpatch</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-prologue">prologue</a> <a href="#grammar-production-statement">statement</a>*</td>
-</tr>
-<tr id="grammar-production-prologue">
-    <td>[2]</td>
-    <td><a href="#grammar-production-prologue">prologue</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-prefixID">prefixID</a>*</td>
-</tr>
-<tr id="grammar-production-statement">
-    <td>[3]</td>
-    <td><a href="#grammar-production-statement">statement</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-bind">bind</a> | <a href="#grammar-production-add">add</a> | <a href="#grammar-production-delete">delete</a> | <a href="#grammar-production-updateList">updateList</a></td>
-</tr>
-<tr id="grammar-production-bind">
-    <td>[4]</td>
-    <td><a href="#grammar-production-bind">bind</a></td>
-    <td>::=</td>
-    <td>("<code class="grammar-literal">Bind</code>" | "<code class="grammar-literal">B</code>") Var <a href="#grammar-production-value">value</a> <a href="#grammar-production-path">path</a>? "<code class="grammar-literal">.</code>"</td>
-</tr>
-<tr id="grammar-production-add">
-    <td>[5]</td>
-    <td><a href="#grammar-production-add">add</a></td>
-    <td>::=</td>
-    <td>("<code class="grammar-literal">Add</code>" | "<code class="grammar-literal">A</code>") "<code class="grammar-literal">{</code>" <a href="#grammar-production-graph">graph</a> "<code class="grammar-literal">}</code>" "<code class="grammar-literal">.</code>"</td>
-</tr>
-<tr id="grammar-production-delete">
-    <td>[6]</td>
-    <td><a href="#grammar-production-delete">delete</a></td>
-    <td>::=</td>
-    <td>("<code class="grammar-literal">Delete</code>" | "<code class="grammar-literal">D</code>") "<code class="grammar-literal">{</code>" <a href="#grammar-production-graph">graph</a> "<code class="grammar-literal">}</code>" "<code class="grammar-literal">.</code>"</td>
-</tr>
-<tr id="grammar-production-cut">
-    <td>[7]</td>
-    <td><a href="#grammar-production-cut">cut</a></td>
+    <td><a href="#grammar-production-// ldpatch">// ldpatch</a></td>
     <td>::=</td>
-    <td>("<code class="grammar-literal">Cut</code>" | "<code class="grammar-literal">C</code>") <a href="#grammar-production-VAR1">VAR1</a> "<code class="grammar-literal">.</code>"</td>
-</tr>
-<tr id="grammar-production-updateList">
-    <td>[8]</td>
-    <td><a href="#grammar-production-updateList">updateList</a></td>
-    <td>::=</td>
-    <td>("<code class="grammar-literal">UpdateList</code>" | "<code class="grammar-literal">UL</code>") <a href="#grammar-production-varOrIRI">varOrIRI</a> <a href="#grammar-production-predicate">predicate</a> <a href="#grammar-production-slice">slice</a> <a href="#grammar-production-collection">collection</a> "<code class="grammar-literal">.</code>"</td>
-</tr>
-<tr id="grammar-production-value">
-    <td>[9]</td>
-    <td><a href="#grammar-production-value">value</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-iri">iri</a> | <a href="#grammar-production-literal">literal</a> | Var</td>
-</tr>
-<tr id="grammar-production-path">
-    <td>[10]</td>
-    <td><a href="#grammar-production-path">path</a></td>
-    <td>::=</td>
-    <td>('<code class="grammar-literal">/</code>'? <a href="#grammar-production-step">step</a> | <a href="#grammar-production-constraint">constraint</a> )? ( '<code class="grammar-literal">/</code>' <a href="#grammar-production-step">step</a> | <a href="#grammar-production-constraint">constraint</a> )*</td>
+    <td>prologue statement*</td>
 </tr>
-<tr id="grammar-production-step">
-    <td>[11]</td>
-    <td><a href="#grammar-production-step">step</a></td>
-    <td>::=</td>
-    <td>'<code class="grammar-literal">^</code>' <a href="#grammar-production-iri">iri</a> | <a href="#grammar-production-iri">iri</a> | <a href="#grammar-production-INDEX">INDEX</a></td>
-</tr>
-<tr id="grammar-production-constraint">
-    <td>[12]</td>
-    <td><a href="#grammar-production-constraint">constraint</a></td>
+<tr id="grammar-production-// prologue">
+    <td>[2]</td>
+    <td><a href="#grammar-production-// prologue">// prologue</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">[</code>' <a href="#grammar-production-path">path</a> ( '<code class="grammar-literal">=</code>' <a href="#grammar-production-value">value</a> )? '<code class="grammar-literal">]</code>' | '<code class="grammar-literal">!</code>'</td>
+    <td>prefixID*</td>
 </tr>
-<tr id="grammar-production-slice">
+<tr id="grammar-production-// statement">
+    <td>[3]</td>
+    <td><a href="#grammar-production-// statement">// statement</a></td>
+    <td>::=</td>
+    <td>bind | add | delete | updateList</td>
+</tr>
+<tr id="grammar-production-// bind">
+    <td>[4]</td>
+    <td><a href="#grammar-production-// bind">// bind</a></td>
+    <td>::=</td>
+    <td>("<code class="grammar-literal">Bind</code>" | "<code class="grammar-literal">B</code>") Var value path? "<code class="grammar-literal">.</code>"</td>
+</tr>
+<tr id="grammar-production-// add">
+    <td>[5]</td>
+    <td><a href="#grammar-production-// add">// add</a></td>
+    <td>::=</td>
+    <td>("<code class="grammar-literal">Add</code>" | "<code class="grammar-literal">A</code>") "<code class="grammar-literal">{</code>" graph "<code class="grammar-literal">}</code>" "<code class="grammar-literal">.</code>"</td>
+</tr>
+<tr id="grammar-production-// delete">
+    <td>[6]</td>
+    <td><a href="#grammar-production-// delete">// delete</a></td>
+    <td>::=</td>
+    <td>("<code class="grammar-literal">Delete</code>" | "<code class="grammar-literal">D</code>") "<code class="grammar-literal">{</code>" graph "<code class="grammar-literal">}</code>" "<code class="grammar-literal">.</code>"</td>
+</tr>
+<tr id="grammar-production-// cut">
+    <td>[7]</td>
+    <td><a href="#grammar-production-// cut">// cut</a></td>
+    <td>::=</td>
+    <td>("<code class="grammar-literal">Cut</code>" | "<code class="grammar-literal">C</code>") VAR1 "<code class="grammar-literal">.</code>"</td>
+</tr>
+<tr id="grammar-production-// updateList">
+    <td>[8]</td>
+    <td><a href="#grammar-production-// updateList">// updateList</a></td>
+    <td>::=</td>
+    <td>("<code class="grammar-literal">UpdateList</code>" | "<code class="grammar-literal">UL</code>") varOrIRI predicate slice collection "<code class="grammar-literal">.</code>"</td>
+</tr>
+<tr id="grammar-production-// varOrIRI">
+    <td>[9]</td>
+    <td><a href="#grammar-production-// varOrIRI">// varOrIRI</a></td>
+    <td>::=</td>
+    <td>iri | VAR1</td>
+</tr>
+<tr id="grammar-production-// value">
+    <td>[10]</td>
+    <td><a href="#grammar-production-// value">// value</a></td>
+    <td>::=</td>
+    <td>iri | literal | VAR1</td>
+</tr>
+<tr id="grammar-production-// path">
+    <td>[11]</td>
+    <td><a href="#grammar-production-// path">// path</a></td>
+    <td>::=</td>
+    <td>('<code class="grammar-literal">/</code>'? step | constraint )? ( '<code class="grammar-literal">/</code>' step | constraint )*</td>
+</tr>
+<tr id="grammar-production-// step">
+    <td>[12]</td>
+    <td><a href="#grammar-production-// step">// step</a></td>
+    <td>::=</td>
+    <td>'<code class="grammar-literal">^</code>' iri | iri | INDEX</td>
+</tr>
+<tr id="grammar-production-// constraint">
     <td>[13]</td>
-    <td><a href="#grammar-production-slice">slice</a></td>
+    <td><a href="#grammar-production-// constraint">// constraint</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-INDEX">INDEX</a>? '<code class="grammar-literal">..</code>' <a href="#grammar-production-INDEX">INDEX</a>?</td>
+    <td>'<code class="grammar-literal">[</code>' path ( '<code class="grammar-literal">=</code>' value )? '<code class="grammar-literal">]</code>' | '<code class="grammar-literal">!</code>'</td>
 </tr>
-<tr id="grammar-production-INDEX">
+<tr id="grammar-production-// slice">
     <td>[14]</td>
-    <td><a href="#grammar-production-INDEX">INDEX</a></td>
+    <td><a href="#grammar-production-// slice">// slice</a></td>
+    <td>::=</td>
+    <td>INDEX? '<code class="grammar-literal">..</code>' INDEX?</td>
+</tr>
+<tr id="grammar-production-// INDEX">
+    <td>[15]</td>
+    <td><a href="#grammar-production-// INDEX">// INDEX</a></td>
     <td>::=</td>
     <td>[0-9]+</td>
 </tr>
-<tr id="grammar-production-VAR1">
-    <td>[143s]</td>
-    <td><a href="#grammar-production-VAR1">VAR1</a></td>
-    <td>::=</td>
-    <td>'<code class="grammar-literal">?</code>' <a href="#grammar-production-VARNAME">VARNAME</a></td>
-</tr>
-<tr id="grammar-production-VARNAME">
-    <td>[166s]</td>
-    <td><a href="#grammar-production-VARNAME">VARNAME</a></td>
-    <td>::=</td>
-    <td>( <a href="#grammar-production-PN_CHARS_U">PN_CHARS_U</a> | [0-9] ) ( <a href="#grammar-production-PN_CHARS_U">PN_CHARS_U</a> | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] )*</td>
-</tr>
-<tr id="grammar-production-prefixID">
-    <td>[4t]</td>
-    <td><a href="#grammar-production-prefixID">prefixID</a></td>
-    <td>::=</td>
-    <td>"<code class="grammar-literal">@prefix</code>" <a href="#grammar-production-PNAME_NS">PNAME_NS</a> <a href="#grammar-production-IRIREF">IRIREF</a> "<code class="grammar-literal">.</code>"</td>
-</tr>
-<tr id="grammar-production-graph">
-    <td>[15]</td>
-    <td><a href="#grammar-production-graph">graph</a></td>
+<tr id="grammar-production-// [143s] VAR1">
+    <td>[16]</td>
+    <td><a href="#grammar-production-// [143s] VAR1">// [143s] VAR1</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-triples">triples</a> ( '<code class="grammar-literal">.</code>' <a href="#grammar-production-triples">triples</a> )* '<code class="grammar-literal">.</code>'?</td>
-</tr>
-<tr id="grammar-production-triples">
-    <td>[6t]</td>
-    <td><a href="#grammar-production-triples">triples</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-subject">subject</a> <a href="#grammar-production-predicateObjectList">predicateObjectList</a> | <a href="#grammar-production-blankNodePropertyList">blankNodePropertyList</a> <a href="#grammar-production-predicateObjectList">predicateObjectList</a>?</td>
-</tr>
-<tr id="grammar-production-predicateObjectList">
-    <td>[7t]</td>
-    <td><a href="#grammar-production-predicateObjectList">predicateObjectList</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-verb">verb</a> <a href="#grammar-production-objectList">objectList</a> ('<code class="grammar-literal">;</code>' (<a href="#grammar-production-verb">verb</a> <a href="#grammar-production-objectList">objectList</a>)?)*</td>
-</tr>
-<tr id="grammar-production-objectList">
-    <td>[8t]</td>
-    <td><a href="#grammar-production-objectList">objectList</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-object">object</a> ('<code class="grammar-literal">,</code>' <a href="#grammar-production-object">object</a>)*</td>
-</tr>
-<tr id="grammar-production-verb">
-    <td>[9t]</td>
-    <td><a href="#grammar-production-verb">verb</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-predicate">predicate</a> | '<code class="grammar-literal">a</code>'</td>
+    <td>'<code class="grammar-literal">?</code>' VARNAME</td>
 </tr>
-<tr id="grammar-production-subject">
-    <td>[10t*]</td>
-    <td><a href="#grammar-production-subject">subject</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-iri">iri</a> | <a href="#grammar-production-BlankNode">BlankNode</a> | <a href="#grammar-production-collection">collection</a> | <a href="#grammar-production-VAR1">VAR1</a></td>
-</tr>
-<tr id="grammar-production-predicate">
-    <td>[11t]</td>
-    <td><a href="#grammar-production-predicate">predicate</a></td>
+<tr id="grammar-production-// [166s] VARNAME">
+    <td>[17]</td>
+    <td><a href="#grammar-production-// [166s] VARNAME">// [166s] VARNAME</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-iri">iri</a></td>
-</tr>
-<tr id="grammar-production-object">
-    <td>[12t*]</td>
-    <td><a href="#grammar-production-object">object</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-iri">iri</a> | <a href="#grammar-production-BlankNode">BlankNode</a> | <a href="#grammar-production-collection">collection</a> | <a href="#grammar-production-blankNodePropertyList">blankNodePropertyList</a> | <a href="#grammar-production-literal">literal</a> | <a href="#grammar-production-VAR1">VAR1</a></td>
-</tr>
-<tr id="grammar-production-literal">
-    <td>[13t]</td>
-    <td><a href="#grammar-production-literal">literal</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-RDFLiteral">RDFLiteral</a> | <a href="#grammar-production-NumericLiteral">NumericLiteral</a> | <a href="#grammar-production-BooleanLiteral">BooleanLiteral</a></td>
+    <td>( PN_CHARS_U | [0-9] ) ( PN_CHARS_U | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] )*</td>
 </tr>
-<tr id="grammar-production-blankNodePropertyList">
-    <td>[14t]</td>
-    <td><a href="#grammar-production-blankNodePropertyList">blankNodePropertyList</a></td>
+<tr id="grammar-production-// [4t] prefixID">
+    <td>[18]</td>
+    <td><a href="#grammar-production-// [4t] prefixID">// [4t] prefixID</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">[</code>' <a href="#grammar-production-predicateObjectList">predicateObjectList</a> '<code class="grammar-literal">]</code>'</td>
-</tr>
-<tr id="grammar-production-collection">
-    <td>[15t]</td>
-    <td><a href="#grammar-production-collection">collection</a></td>
-    <td>::=</td>
-    <td>'<code class="grammar-literal">(</code>' <a href="#grammar-production-object">object</a>* '<code class="grammar-literal">)</code>'</td>
+    <td>"<code class="grammar-literal">@prefix</code>" PNAME_NS IRIREF "<code class="grammar-literal">.</code>"</td>
 </tr>
-<tr id="grammar-production-NumericLiteral">
-    <td>[16t]</td>
-    <td><a href="#grammar-production-NumericLiteral">NumericLiteral</a></td>
+<tr id="grammar-production-// graph">
+    <td>[19]</td>
+    <td><a href="#grammar-production-// graph">// graph</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-INTEGER">INTEGER</a> | <a href="#grammar-production-DECIMAL">DECIMAL</a> | <a href="#grammar-production-DOUBLE">DOUBLE</a></td>
+    <td>triples ( '<code class="grammar-literal">.</code>' triples )* '<code class="grammar-literal">.</code>'?</td>
 </tr>
-<tr id="grammar-production-RDFLiteral">
-    <td>[128s]</td>
-    <td><a href="#grammar-production-RDFLiteral">RDFLiteral</a></td>
+<tr id="grammar-production-// [6t] triples">
+    <td>[20]</td>
+    <td><a href="#grammar-production-// [6t] triples">// [6t] triples</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-String">String</a> (<a href="#grammar-production-LANGTAG">LANGTAG</a> | '<code class="grammar-literal">^^</code>' <a href="#grammar-production-iri">iri</a>)?</td>
+    <td>subject predicateObjectList | blankNodePropertyList predicateObjectList?</td>
 </tr>
-<tr id="grammar-production-BooleanLiteral">
-    <td>[133s]</td>
-    <td><a href="#grammar-production-BooleanLiteral">BooleanLiteral</a></td>
+<tr id="grammar-production-// [7t] predicateObjectList">
+    <td>[21]</td>
+    <td><a href="#grammar-production-// [7t] predicateObjectList">// [7t] predicateObjectList</a></td>
+    <td>::=</td>
+    <td>verb objectList ('<code class="grammar-literal">;</code>' (verb objectList)?)*</td>
+</tr>
+<tr id="grammar-production-// [8t] objectList">
+    <td>[22]</td>
+    <td><a href="#grammar-production-// [8t] objectList">// [8t] objectList</a></td>
+    <td>::=</td>
+    <td>object ('<code class="grammar-literal">,</code>' object)*</td>
+</tr>
+<tr id="grammar-production-// [9t] verb">
+    <td>[23]</td>
+    <td><a href="#grammar-production-// [9t] verb">// [9t] verb</a></td>
+    <td>::=</td>
+    <td>predicate | '<code class="grammar-literal">a</code>'</td>
+</tr>
+<tr id="grammar-production-// [10t*] subject">
+    <td>[24]</td>
+    <td><a href="#grammar-production-// [10t*] subject">// [10t*] subject</a></td>
+    <td>::=</td>
+    <td>iri | BlankNode | collection | VAR1</td>
+</tr>
+<tr id="grammar-production-// [11t] predicate">
+    <td>[25]</td>
+    <td><a href="#grammar-production-// [11t] predicate">// [11t] predicate</a></td>
+    <td>::=</td>
+    <td>iri</td>
+</tr>
+<tr id="grammar-production-// [12t*] object">
+    <td>[26]</td>
+    <td><a href="#grammar-production-// [12t*] object">// [12t*] object</a></td>
+    <td>::=</td>
+    <td>iri | BlankNode | collection | blankNodePropertyList | literal | VAR1</td>
+</tr>
+<tr id="grammar-production-// [13t] literal">
+    <td>[27]</td>
+    <td><a href="#grammar-production-// [13t] literal">// [13t] literal</a></td>
+    <td>::=</td>
+    <td>RDFLiteral | NumericLiteral | BooleanLiteral</td>
+</tr>
+<tr id="grammar-production-// [14t] blankNodePropertyList">
+    <td>[28]</td>
+    <td><a href="#grammar-production-// [14t] blankNodePropertyList">// [14t] blankNodePropertyList</a></td>
+    <td>::=</td>
+    <td>'<code class="grammar-literal">[</code>' predicateObjectList '<code class="grammar-literal">]</code>'</td>
+</tr>
+<tr id="grammar-production-// [15t] collection">
+    <td>[29]</td>
+    <td><a href="#grammar-production-// [15t] collection">// [15t] collection</a></td>
+    <td>::=</td>
+    <td>'<code class="grammar-literal">(</code>' object* '<code class="grammar-literal">)</code>'</td>
+</tr>
+<tr id="grammar-production-// [16t] NumericLiteral">
+    <td>[30]</td>
+    <td><a href="#grammar-production-// [16t] NumericLiteral">// [16t] NumericLiteral</a></td>
+    <td>::=</td>
+    <td>INTEGER | DECIMAL | DOUBLE</td>
+</tr>
+<tr id="grammar-production-// [128s] RDFLiteral">
+    <td>[31]</td>
+    <td><a href="#grammar-production-// [128s] RDFLiteral">// [128s] RDFLiteral</a></td>
+    <td>::=</td>
+    <td>String (LANGTAG | '<code class="grammar-literal">^^</code>' iri)?</td>
+</tr>
+<tr id="grammar-production-// [133s] BooleanLiteral">
+    <td>[32]</td>
+    <td><a href="#grammar-production-// [133s] BooleanLiteral">// [133s] BooleanLiteral</a></td>
     <td>::=</td>
     <td>'<code class="grammar-literal">true</code>' | '<code class="grammar-literal">false</code>'</td>
 </tr>
-<tr id="grammar-production-String">
-    <td>[17]</td>
-    <td><a href="#grammar-production-String">String</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-STRING_LITERAL_QUOTE">STRING_LITERAL_QUOTE</a> | <a href="#grammar-production-STRING_LITERAL_SINGLE_QUOTE">STRING_LITERAL_SINGLE_QUOTE</a> | <a href="#grammar-production-STRING_LITERAL_LONG_SINGLE_QUOTE">STRING_LITERAL_LONG_SINGLE_QUOTE</a> | <a href="#grammar-production-STRING_LITERAL_LONG_QUOTE">STRING_LITERAL_LONG_QUOTE</a></td>
-</tr>
-<tr id="grammar-production-iri">
-    <td>[135s]</td>
-    <td><a href="#grammar-production-iri">iri</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-IRIREF">IRIREF</a> | <a href="#grammar-production-PrefixedName">PrefixedName</a></td>
-</tr>
-<tr id="grammar-production-varOrIRI">
-    <td>[143s]</td>
-    <td><a href="#grammar-production-varOrIRI">varOrIRI</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-iri">iri</a> | <a href="#grammar-production-VAR1">VAR1</a></td>
-</tr>
-<tr id="grammar-production-PrefixedName">
-    <td>[136s]</td>
-    <td><a href="#grammar-production-PrefixedName">PrefixedName</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-PNAME_LN">PNAME_LN</a> | <a href="#grammar-production-PNAME_NS">PNAME_NS</a></td>
-</tr>
-<tr id="grammar-production-BlankNode">
-    <td>[137s]</td>
-    <td><a href="#grammar-production-BlankNode">BlankNode</a></td>
+<tr id="grammar-production-// [17] String">
+    <td>[33]</td>
+    <td><a href="#grammar-production-// [17] String">// [17] String</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-BLANK_NODE_LABEL">BLANK_NODE_LABEL</a> | <a href="#grammar-production-ANON">ANON</a></td>
-</tr>
-<tr id="grammar-production-IRIREF">
-    <td>[18]</td>
-    <td><a href="#grammar-production-IRIREF">IRIREF</a></td>
-    <td>::=</td>
-    <td>'<code class="grammar-literal"><</code>' ([^#x00-#x20<>"{}|^`\] | <a href="#grammar-production-UCHAR">UCHAR</a>)* '<code class="grammar-literal">></code>' /* #x00=NULL #01-#x1F=control codes #x20=space */</td>
-</tr>
-<tr id="grammar-production-PNAME_NS">
-    <td>[139s]</td>
-    <td><a href="#grammar-production-PNAME_NS">PNAME_NS</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-PN_PREFIX">PN_PREFIX</a>? '<code class="grammar-literal">:</code>'</td>
+    <td>STRING_LITERAL_QUOTE | STRING_LITERAL_SINGLE_QUOTE | STRING_LITERAL_LONG_SINGLE_QUOTE | STRING_LITERAL_LONG_QUOTE</td>
 </tr>
-<tr id="grammar-production-PNAME_LN">
-    <td>[140s]</td>
-    <td><a href="#grammar-production-PNAME_LN">PNAME_LN</a></td>
+<tr id="grammar-production-// [135s] iri">
+    <td>[34]</td>
+    <td><a href="#grammar-production-// [135s] iri">// [135s] iri</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-PNAME_NS">PNAME_NS</a> <a href="#grammar-production-PN_LOCAL">PN_LOCAL</a></td>
+    <td>IRIREF | PrefixedName</td>
 </tr>
-<tr id="grammar-production-BLANK_NODE_LABEL">
-    <td>[141s]</td>
-    <td><a href="#grammar-production-BLANK_NODE_LABEL">BLANK_NODE_LABEL</a></td>
+<tr id="grammar-production-// [136s] PrefixedName">
+    <td>[35]</td>
+    <td><a href="#grammar-production-// [136s] PrefixedName">// [136s] PrefixedName</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">_:</code>' (<a href="#grammar-production-PN_CHARS_U">PN_CHARS_U</a> | [0-9]) ((<a href="#grammar-production-PN_CHARS">PN_CHARS</a> | '<code class="grammar-literal">.</code>')* <a href="#grammar-production-PN_CHARS">PN_CHARS</a>)?</td>
+    <td>PNAME_LN | PNAME_NS</td>
 </tr>
-<tr id="grammar-production-LANGTAG">
-    <td>[144s]</td>
-    <td><a href="#grammar-production-LANGTAG">LANGTAG</a></td>
+<tr id="grammar-production-// [137s] BlankNode">
+    <td>[36]</td>
+    <td><a href="#grammar-production-// [137s] BlankNode">// [137s] BlankNode</a></td>
+    <td>::=</td>
+    <td>BLANK_NODE_LABEL | ANON</td>
+</tr>
+<tr id="grammar-production-// [18] IRIREF">
+    <td>[37]</td>
+    <td><a href="#grammar-production-// [18] IRIREF">// [18] IRIREF</a></td>
+    <td>::=</td>
+    <td>'<code class="grammar-literal"><</code>' ([^#x00-#x20<>"{}|^`\] | UCHAR)* '<code class="grammar-literal">></code>' /* #x00=NULL #01-#x1F=control codes #x20=space */</td>
+</tr>
+<tr id="grammar-production-// [139s] PNAME_NS">
+    <td>[38]</td>
+    <td><a href="#grammar-production-// [139s] PNAME_NS">// [139s] PNAME_NS</a></td>
+    <td>::=</td>
+    <td>PN_PREFIX? '<code class="grammar-literal">:</code>'</td>
+</tr>
+<tr id="grammar-production-// [140s] PNAME_LN">
+    <td>[39]</td>
+    <td><a href="#grammar-production-// [140s] PNAME_LN">// [140s] PNAME_LN</a></td>
+    <td>::=</td>
+    <td>PNAME_NS PN_LOCAL</td>
+</tr>
+<tr id="grammar-production-// [141s] BLANK_NODE_LABEL">
+    <td>[40]</td>
+    <td><a href="#grammar-production-// [141s] BLANK_NODE_LABEL">// [141s] BLANK_NODE_LABEL</a></td>
+    <td>::=</td>
+    <td>'<code class="grammar-literal">_:</code>' (PN_CHARS_U | [0-9]) ((PN_CHARS | '<code class="grammar-literal">.</code>')* PN_CHARS)?</td>
+</tr>
+<tr id="grammar-production-// [144s] LANGTAG">
+    <td>[41]</td>
+    <td><a href="#grammar-production-// [144s] LANGTAG">// [144s] LANGTAG</a></td>
     <td>::=</td>
     <td>'<code class="grammar-literal">@</code>' [a-zA-Z]+ ('<code class="grammar-literal">-</code>' [a-zA-Z0-9]+)*</td>
 </tr>
-<tr id="grammar-production-INTEGER">
-    <td>[19]</td>
-    <td><a href="#grammar-production-INTEGER">INTEGER</a></td>
+<tr id="grammar-production-// [19] INTEGER">
+    <td>[42]</td>
+    <td><a href="#grammar-production-// [19] INTEGER">// [19] INTEGER</a></td>
     <td>::=</td>
     <td>[+-]? [0-9]+</td>
 </tr>
-<tr id="grammar-production-DECIMAL">
-    <td>[20]</td>
-    <td><a href="#grammar-production-DECIMAL">DECIMAL</a></td>
+<tr id="grammar-production-// [20] DECIMAL">
+    <td>[43]</td>
+    <td><a href="#grammar-production-// [20] DECIMAL">// [20] DECIMAL</a></td>
     <td>::=</td>
     <td>[+-]? [0-9]* '<code class="grammar-literal">.</code>' [0-9]+</td>
 </tr>
-<tr id="grammar-production-DOUBLE">
-    <td>[21]</td>
-    <td><a href="#grammar-production-DOUBLE">DOUBLE</a></td>
+<tr id="grammar-production-// [21] DOUBLE">
+    <td>[44]</td>
+    <td><a href="#grammar-production-// [21] DOUBLE">// [21] DOUBLE</a></td>
     <td>::=</td>
-    <td>[+-]? ([0-9]+ '<code class="grammar-literal">.</code>' [0-9]* <a href="#grammar-production-EXPONENT">EXPONENT</a> | '<code class="grammar-literal">.</code>' [0-9]+ <a href="#grammar-production-EXPONENT">EXPONENT</a> | [0-9]+ <a href="#grammar-production-EXPONENT">EXPONENT</a>)</td>
+    <td>[+-]? ([0-9]+ '<code class="grammar-literal">.</code>' [0-9]* EXPONENT | '<code class="grammar-literal">.</code>' [0-9]+ EXPONENT | [0-9]+ EXPONENT)</td>
 </tr>
-<tr id="grammar-production-EXPONENT">
-    <td>[154s]</td>
-    <td><a href="#grammar-production-EXPONENT">EXPONENT</a></td>
+<tr id="grammar-production-// [154s] EXPONENT">
+    <td>[45]</td>
+    <td><a href="#grammar-production-// [154s] EXPONENT">// [154s] EXPONENT</a></td>
     <td>::=</td>
     <td>[eE] [+-]? [0-9]+</td>
 </tr>
-<tr id="grammar-production-STRING_LITERAL_QUOTE">
-    <td>[22]</td>
-    <td><a href="#grammar-production-STRING_LITERAL_QUOTE">STRING_LITERAL_QUOTE</a></td>
-    <td>::=</td>
-    <td>'<code class="grammar-literal">"</code>' ([^#x22#x5C#xA#xD] | <a href="#grammar-production-ECHAR">ECHAR</a> | <a href="#grammar-production-UCHAR">UCHAR</a>)* '<code class="grammar-literal">"</code>'      /* #x22=" #x5C=\ #xA=new line #xD=carriage return */</td>
-</tr>
-<tr id="grammar-production-STRING_LITERAL_SINGLE_QUOTE">
-    <td>[23]</td>
-    <td><a href="#grammar-production-STRING_LITERAL_SINGLE_QUOTE">STRING_LITERAL_SINGLE_QUOTE</a></td>
-    <td>::=</td>
-    <td>"<code class="grammar-literal">'</code>" ([^#x27#x5C#xA#xD] | <a href="#grammar-production-ECHAR">ECHAR</a> | <a href="#grammar-production-UCHAR">UCHAR</a>)* "<code class="grammar-literal">'</code>"      /* #x27=' #x5C=\ #xA=new line #xD=carriage return */</td>
-</tr>
-<tr id="grammar-production-STRING_LITERAL_LONG_SINGLE_QUOTE">
-    <td>[24]</td>
-    <td><a href="#grammar-production-STRING_LITERAL_LONG_SINGLE_QUOTE">STRING_LITERAL_LONG_SINGLE_QUOTE</a></td>
+<tr id="grammar-production-// [22] STRING_LITERAL_QUOTE">
+    <td>[46]</td>
+    <td><a href="#grammar-production-// [22] STRING_LITERAL_QUOTE">// [22] STRING_LITERAL_QUOTE</a></td>
     <td>::=</td>
-    <td>"<code class="grammar-literal">'''</code>" (("<code class="grammar-literal">'</code>" | "<code class="grammar-literal">''</code>")? ([^'\] | <a href="#grammar-production-ECHAR">ECHAR</a> | <a href="#grammar-production-UCHAR">UCHAR</a>))* "<code class="grammar-literal">'''</code>"</td>
-</tr>
-<tr id="grammar-production-STRING_LITERAL_LONG_QUOTE">
-    <td>[25]</td>
-    <td><a href="#grammar-production-STRING_LITERAL_LONG_QUOTE">STRING_LITERAL_LONG_QUOTE</a></td>
-    <td>::=</td>
-    <td>'<code class="grammar-literal">"""</code>' (('<code class="grammar-literal">"</code>' | '<code class="grammar-literal">""</code>')? ([^"\] | <a href="#grammar-production-ECHAR">ECHAR</a> | <a href="#grammar-production-UCHAR">UCHAR</a>))* '<code class="grammar-literal">"""</code>'</td>
+    <td>'<code class="grammar-literal">"</code>' ([^#x22#x5C#xA#xD] | ECHAR | UCHAR)* '<code class="grammar-literal">"</code>'      /* #x22=" #x5C=\ #xA=new line #xD=carriage return */</td>
 </tr>
-<tr id="grammar-production-UCHAR">
-    <td>[26]</td>
-    <td><a href="#grammar-production-UCHAR">UCHAR</a></td>
+<tr id="grammar-production-// [23] STRING_LITERAL_SINGLE_QUOTE">
+    <td>[47]</td>
+    <td><a href="#grammar-production-// [23] STRING_LITERAL_SINGLE_QUOTE">// [23] STRING_LITERAL_SINGLE_QUOTE</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">\\u</code>' <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a> | '<code class="grammar-literal">\\U</code>' <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a></td>
+    <td>"<code class="grammar-literal">'</code>" ([^#x27#x5C#xA#xD] | ECHAR | UCHAR)* "<code class="grammar-literal">'</code>"      /* #x27=' #x5C=\ #xA=new line #xD=carriage return */</td>
 </tr>
-<tr id="grammar-production-ECHAR">
-    <td>[159s]</td>
-    <td><a href="#grammar-production-ECHAR">ECHAR</a></td>
+<tr id="grammar-production-// [24] STRING_LITERAL_LONG_SINGLE_QUOTE">
+    <td>[48]</td>
+    <td><a href="#grammar-production-// [24] STRING_LITERAL_LONG_SINGLE_QUOTE">// [24] STRING_LITERAL_LONG_SINGLE_QUOTE</a></td>
+    <td>::=</td>
+    <td>"<code class="grammar-literal">'''</code>" (("<code class="grammar-literal">'</code>" | "<code class="grammar-literal">''</code>")? ([^'\] | ECHAR | UCHAR))* "<code class="grammar-literal">'''</code>"</td>
+</tr>
+<tr id="grammar-production-// [25] STRING_LITERAL_LONG_QUOTE">
+    <td>[49]</td>
+    <td><a href="#grammar-production-// [25] STRING_LITERAL_LONG_QUOTE">// [25] STRING_LITERAL_LONG_QUOTE</a></td>
+    <td>::=</td>
+    <td>'<code class="grammar-literal">"""</code>' (('<code class="grammar-literal">"</code>' | '<code class="grammar-literal">""</code>')? ([^"\] | ECHAR | UCHAR))* '<code class="grammar-literal">"""</code>'</td>
+</tr>
+<tr id="grammar-production-// [26] UCHAR">
+    <td>[50]</td>
+    <td><a href="#grammar-production-// [26] UCHAR">// [26] UCHAR</a></td>
+    <td>::=</td>
+    <td>'<code class="grammar-literal">\\u</code>' HEX HEX HEX HEX | '<code class="grammar-literal">\\U</code>' HEX HEX HEX HEX HEX HEX HEX HEX</td>
+</tr>
+<tr id="grammar-production-// [159s] ECHAR">
+    <td>[51]</td>
+    <td><a href="#grammar-production-// [159s] ECHAR">// [159s] ECHAR</a></td>
     <td>::=</td>
     <td>'<code class="grammar-literal">\</code>' [tbnrf"'\]</td>
 </tr>
-<tr id="grammar-production-WS">
-    <td>[161s]</td>
-    <td><a href="#grammar-production-WS">WS</a></td>
+<tr id="grammar-production-// [161s] WS">
+    <td>[52]</td>
+    <td><a href="#grammar-production-// [161s] WS">// [161s] WS</a></td>
     <td>::=</td>
     <td>#x20 | #x9 | #xD | #xA</td>
 </tr>
-<tr id="grammar-production-ANON">
-    <td>[162s]</td>
-    <td><a href="#grammar-production-ANON">ANON</a></td>
+<tr id="grammar-production-// [162s] ANON">
+    <td>[53]</td>
+    <td><a href="#grammar-production-// [162s] ANON">// [162s] ANON</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">[</code>' <a href="#grammar-production-WS">WS</a>* '<code class="grammar-literal">]</code>'</td>
+    <td>'<code class="grammar-literal">[</code>' WS* '<code class="grammar-literal">]</code>'</td>
 </tr>
-<tr id="grammar-production-PN_CHARS_BASE">
-    <td>[163s]</td>
-    <td><a href="#grammar-production-PN_CHARS_BASE">PN_CHARS_BASE</a></td>
+<tr id="grammar-production-// [163s] PN_CHARS_BASE">
+    <td>[54]</td>
+    <td><a href="#grammar-production-// [163s] PN_CHARS_BASE">// [163s] PN_CHARS_BASE</a></td>
     <td>::=</td>
     <td>[A-Z] | [a-z] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]</td>
 </tr>
-<tr id="grammar-production-PN_CHARS_U">
-    <td>[164s]</td>
-    <td><a href="#grammar-production-PN_CHARS_U">PN_CHARS_U</a></td>
+<tr id="grammar-production-// [164s] PN_CHARS_U">
+    <td>[55]</td>
+    <td><a href="#grammar-production-// [164s] PN_CHARS_U">// [164s] PN_CHARS_U</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-PN_CHARS_BASE">PN_CHARS_BASE</a> | '<code class="grammar-literal">_</code>'</td>
-</tr>
-<tr id="grammar-production-PN_CHARS">
-    <td>[166s]</td>
-    <td><a href="#grammar-production-PN_CHARS">PN_CHARS</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-PN_CHARS_U">PN_CHARS_U</a> | '<code class="grammar-literal">-</code>' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]</td>
-</tr>
-<tr id="grammar-production-PN_PREFIX">
-    <td>[167s]</td>
-    <td><a href="#grammar-production-PN_PREFIX">PN_PREFIX</a></td>
-    <td>::=</td>
-    <td><a href="#grammar-production-PN_CHARS_BASE">PN_CHARS_BASE</a> ((<a href="#grammar-production-PN_CHARS">PN_CHARS</a> | '<code class="grammar-literal">.</code>')* <a href="#grammar-production-PN_CHARS">PN_CHARS</a>)?</td>
+    <td>PN_CHARS_BASE | '<code class="grammar-literal">_</code>'</td>
 </tr>
-<tr id="grammar-production-PN_LOCAL">
-    <td>[168s]</td>
-    <td><a href="#grammar-production-PN_LOCAL">PN_LOCAL</a></td>
-    <td>::=</td>
-    <td>(<a href="#grammar-production-PN_CHARS_U">PN_CHARS_U</a> | '<code class="grammar-literal">:</code>' | [0-9] | <a href="#grammar-production-PLX">PLX</a>) ((<a href="#grammar-production-PN_CHARS">PN_CHARS</a> | '<code class="grammar-literal">.</code>' | '<code class="grammar-literal">:</code>' | <a href="#grammar-production-PLX">PLX</a>)* (<a href="#grammar-production-PN_CHARS">PN_CHARS</a> | '<code class="grammar-literal">:</code>' | <a href="#grammar-production-PLX">PLX</a>))?</td>
-</tr>
-<tr id="grammar-production-PLX">
-    <td>[169s]</td>
-    <td><a href="#grammar-production-PLX">PLX</a></td>
+<tr id="grammar-production-// [166s] PN_CHARS">
+    <td>[56]</td>
+    <td><a href="#grammar-production-// [166s] PN_CHARS">// [166s] PN_CHARS</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-PERCENT">PERCENT</a> | <a href="#grammar-production-PN_LOCAL_ESC">PN_LOCAL_ESC</a></td>
+    <td>PN_CHARS_U | '<code class="grammar-literal">-</code>' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]</td>
 </tr>
-<tr id="grammar-production-PERCENT">
-    <td>[170s]</td>
-    <td><a href="#grammar-production-PERCENT">PERCENT</a></td>
+<tr id="grammar-production-// [167s] PN_PREFIX">
+    <td>[57]</td>
+    <td><a href="#grammar-production-// [167s] PN_PREFIX">// [167s] PN_PREFIX</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">%</code>' <a href="#grammar-production-HEX">HEX</a> <a href="#grammar-production-HEX">HEX</a></td>
+    <td>PN_CHARS_BASE ((PN_CHARS | '<code class="grammar-literal">.</code>')* PN_CHARS)?</td>
 </tr>
-<tr id="grammar-production-HEX">
-    <td>[171s]</td>
-    <td><a href="#grammar-production-HEX">HEX</a></td>
+<tr id="grammar-production-// [168s] PN_LOCAL">
+    <td>[58]</td>
+    <td><a href="#grammar-production-// [168s] PN_LOCAL">// [168s] PN_LOCAL</a></td>
+    <td>::=</td>
+    <td>(PN_CHARS_U | '<code class="grammar-literal">:</code>' | [0-9] | PLX) ((PN_CHARS | '<code class="grammar-literal">.</code>' | '<code class="grammar-literal">:</code>' | PLX)* (PN_CHARS | '<code class="grammar-literal">:</code>' | PLX))?</td>
+</tr>
+<tr id="grammar-production-// [169s] PLX">
+    <td>[59]</td>
+    <td><a href="#grammar-production-// [169s] PLX">// [169s] PLX</a></td>
+    <td>::=</td>
+    <td>PERCENT | PN_LOCAL_ESC</td>
+</tr>
+<tr id="grammar-production-// [170s] PERCENT">
+    <td>[60]</td>
+    <td><a href="#grammar-production-// [170s] PERCENT">// [170s] PERCENT</a></td>
+    <td>::=</td>
+    <td>'<code class="grammar-literal">%</code>' HEX HEX</td>
+</tr>
+<tr id="grammar-production-// [171s] HEX">
+    <td>[61]</td>
+    <td><a href="#grammar-production-// [171s] HEX">// [171s] HEX</a></td>
     <td>::=</td>
     <td>[0-9] | [A-F] | [a-f]</td>
 </tr>
-<tr id="grammar-production-PN_LOCAL_ESC">
-    <td>[172s]</td>
-    <td><a href="#grammar-production-PN_LOCAL_ESC">PN_LOCAL_ESC</a></td>
+<tr id="grammar-production-// [172s] PN_LOCAL_ESC">
+    <td>[62]</td>
+    <td><a href="#grammar-production-// [172s] PN_LOCAL_ESC">// [172s] PN_LOCAL_ESC</a></td>
     <td>::=</td>
     <td>'<code class="grammar-literal">\</code>' ('<code class="grammar-literal">_</code>' | '<code class="grammar-literal">~</code>' | '<code class="grammar-literal">.</code>' | '<code class="grammar-literal">-</code>' | '<code class="grammar-literal">!</code>' | '<code class="grammar-literal">$</code>' | '<code class="grammar-literal">&</code>' | "<code class="grammar-literal">'</code>" | '<code class="grammar-literal">(</code>' | '<code class="grammar-literal">)</code>' | '<code class="grammar-literal">*</code>' | '<code class="grammar-literal">+</code>' | '<code class="grammar-literal">,</code>' | '<code class="grammar-literal">;</code>' | '<code class="grammar-literal">=</code>' | '<code class="grammar-literal">/</code>' | '<code class="grammar-literal">?</code>' | '<code class="grammar-literal">#</code>' | '<code class="grammar-literal">@</code>' | '<code class="grammar-literal">%</code>')</td>
 </tr>
@@ -1142,7 +1150,6 @@
 
 
 
-
     </section>
 
     <section class="appendix" id="media-registration">