I broke the grammar, my bad. Plus minor fixes. ldpatch
authorAlexandre Bertails <alexandre@bertails.org>
Fri, 21 Nov 2014 15:09:30 -0500
branchldpatch
changeset 907 02e57dda7d72
parent 906 cd9627bc830e
child 908 dd489c00a845
I broke the grammar, my bad. Plus minor fixes.
ldpatch.html
--- a/ldpatch.html	Fri Nov 21 14:44:54 2014 -0500
+++ b/ldpatch.html	Fri Nov 21 15:09:30 2014 -0500
@@ -196,11 +196,6 @@
   padding-right: 1em;
   min-width: 7.5em;
 }
-#updatelist-algo img {
-  width: 70%;
-  display: block;
-  margin:0 auto;
-}
     </style>
   </head>
   <body>
@@ -318,7 +313,7 @@
 } .
           </pre>
           <p>
-              This example introduces most features of the LD Patch format: <code>@prefix</code> and prefixed names, the <a>Add</a>, <a>Delete</a>, <a>Cut</a>, and <a>UpdateList</a> operations, the <a>Bind</a>-ing mechanism and blank node creation. The "text/ldpatch" media type is <a href="#media-registration">prospectively</a> used to identify such LD Patch documents.
+              This example introduces most features of the LD Patch format: <code>@prefix</code> and prefixed names, the <a>Add</a>, <a>Delete</a>, <a>Cut</a>, and <a>UpdateList</a> operations, the node <a>Bind</a>ing mechanism, and blank node creation. The "text/ldpatch" media type is <a href="#media-registration">prospectively</a> used to identify such LD Patch documents.
           </p>
           <p>
               The following is the resulting (patched) document.
@@ -412,7 +407,7 @@
     <section class='normative' id='semantics'>
       <h1>LD Patch Semantics</h1>
       <p>
-An LD Patch document is applied to a Linked Data resource identified by an IRI (the <dfn>target IRI</dfn>) and represented by an RDF graph (the <dfn>target graph</dfn>). It is made of a prologue and a list of statements, where the order <strong>must be respected</strong>. The prologue declares a number of <a href="#grammar-production-prefixID">prefixes</a> used to abbreviate IRIs as <a href="#grammar-production-PrefixedName">PrefixedName</a>s. Then, each statement either binds a variable to a matching node from the <a>target graph</a>, or specifies a modification on the <a>target graph</a>.
+An LD Patch document is applied to a Linked Data resource identified by an IRI (the <dfn>target IRI</dfn>) and represented by an RDF graph (the <dfn>target graph</dfn>). It is made of a prologue followed by a list of statements. The prologue declares a number of <a href="#grammar-production-prefixID">prefixes</a> used to abbreviate IRIs as <a href="#grammar-production-PrefixedName">PrefixedName</a>s. Then, each statement either binds a variable to a matching node from the <a>target graph</a>, or specifies a modification on the <a>target graph</a>.
       </p>
 
 
@@ -428,10 +423,13 @@
         </p>
         <ul>
           <li>
-            The base IRI used to resolve relative IRIs MUST be the <a>target IRI</a>.
+            The base IRI used to resolve relative IRIs is the <a>target IRI</a>.
           </li>
           <li>
-            LD Patch allows <a href="#grammar-production-Var">Var</a>iables in subject or object positions. A variable MUST be <a title="bind">bound</a> prior to its first use in the LD Patch Document, and it must be replaced by the last node to which it has been bound (in case it appears in several <a>Bind</a> statements).
+            LD Patch allows <a class="internalDFN" href="#grammar-production-Var">var</a>iables in <a class="internalDFN" href="#grammar-production-subject">subject</a> and <a class="internalDFN" href="#grammar-production-predicate">predicate</a> positions.
+          </li>
+          <li>
+              A variable MUST be <a title="bind">bound</a> prior to its first use in the LD Patch document, and its value is the last node to which it has been bound (in case it appears in several <a>Bind</a> statements).
           </li>
           <li>
             <dfn id="blank-node-scoping">The scope of <a class="internalDFN" href="#grammar-production-BlankNode">Blank nodes</a> identifiers is the whole LD Patch document.</dfn> Hence several argument graphs can share the same blank nodes across statements.
@@ -649,10 +647,10 @@
                 Here is an illustration of the <a href="#updatelist-algo">previously introduced algorithm</a>.
             </p>
             <p>
-                Consider the graph represented in <a href="#fig-a-graph-containing-a-collection"></a>. The result of applying an <a>UpdateList</a> operation on the collection in that graph can be seen in <a href="#fig-updatelist-result"></a>.
+                Consider the graph represented in <a href="#fig-graph-containing-a-collection"></a>. The result of applying an <a>UpdateList</a> operation on the collection in that graph can be seen in <a href="#fig-updatelist-result"></a>.
             </p>
 
-            <figure id="fig-a-graph-containing-a-collection">
+            <figure id="fig-graph-containing-a-collection">
               <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; )">
               <figcaption>Graph with a collection</figcaption>
             </figure>
@@ -685,8 +683,8 @@
             <li id="cut-non-bnode">If a <a>Cut</a> operation is called on a variable not bound to a blank node, then a HTTP 422 (Unprocessable Entity) error status code MUST be returned.</li>
             <li id="delete-non-existing-triple">If a <a>Delete</a> attempts to remove a non-existing triple, then a HTTP 422 (Unprocessable Entity) error status code MUST be returned.</li>
             <li id="updatelist-non-list-argument">If the <a class="internalDFN" href="#grammar-production-subject">subject</a> and <a class="internalDFN" href="#grammar-production-predicate">predicate</a> provided to an <a>UpdateList</a> do not have a unique object or this object is not a well-formed collection then a HTTP 422 (Unprocessable Entity) error status code MUST be returned.</li>
-            <li id="wrong-order-for-indexes">If the indexes in a <a>slice specification</a> are in the wrong order (e.g. <code>2868..42</code>), then the parsing fails and a 400 (Bad Request) error status code MUST be returned.</li>
-            <li id="wrong-index">If an index in a <a>slice specification</a> is greated than the length of the <code>rdf:List</code>, then a 422 (Unprocessable Entity) error status code MUST be returned.</li>
+            <li id="wrong-order-for-indexes">If the indexes in a <a>slice expression</a> are in the wrong order (e.g. <code>2868..42</code>), then the parsing fails and a 400 (Bad Request) error status code MUST be returned.</li>
+            <li id="wrong-index">If an index in a <a>slice expression</a> is greated than the length of the <code>rdf:List</code>, then a 422 (Unprocessable Entity) error status code MUST be returned.</li>
             <li id="unknown-prefix">If a prefix name (<a class="internalDFN" href="#grammar-production-PNAME_NS">PNAME_NS</a>) is used without being previously declared, then the parsing fails and a 400 (Bad Request) error status code MUST be returned.</li>
             <li id="unknown-variable">If a <a>var</a>iable is used without being previously bound, then the parsing fails and a 400 (Bad Request) error status code MUST be returned.</li>
 
@@ -776,375 +774,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>prologue statement*</td>
-</tr>
-<tr id="grammar-production-// prologue">
-    <td>[2]</td>
-    <td><a href="#grammar-production-// prologue">// prologue</a></td>
-    <td>::=</td>
-    <td>prefixID*</td>
-</tr>
-<tr id="grammar-production-// statement">
-    <td>[3]</td>
-    <td><a href="#grammar-production-// statement">// statement</a></td>
+    <td><a href="#grammar-production-ldpatch">ldpatch</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>
+    <td><a href="#grammar-production-prologue">prologue</a> <a href="#grammar-production-statement">statement</a>*</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>
+<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>'? step | constraint )? ( '<code class="grammar-literal">/</code>' step | constraint )*</td>
+    <td><a href="#grammar-production-prefixID">prefixID</a>*</td>
 </tr>
-<tr id="grammar-production-// step">
+<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>::=</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-varOrIRI">
+    <td>[9]</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-value">
+    <td>[10]</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> | <a href="#grammar-production-VAR1">VAR1</a></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>'? <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>
+</tr>
+<tr id="grammar-production-step">
     <td>[12]</td>
-    <td><a href="#grammar-production-// step">// step</a></td>
+    <td><a href="#grammar-production-step">step</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">^</code>' iri | iri | INDEX</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">
+<tr id="grammar-production-constraint">
     <td>[13]</td>
-    <td><a href="#grammar-production-// constraint">// constraint</a></td>
+    <td><a href="#grammar-production-constraint">constraint</a></td>
     <td>::=</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>
+    <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>
 </tr>
-<tr id="grammar-production-// slice">
+<tr id="grammar-production-slice">
     <td>[14]</td>
-    <td><a href="#grammar-production-// slice">// slice</a></td>
+    <td><a href="#grammar-production-slice">slice</a></td>
     <td>::=</td>
-    <td>INDEX? '<code class="grammar-literal">..</code>' INDEX?</td>
+    <td><a href="#grammar-production-INDEX">INDEX</a>? '<code class="grammar-literal">..</code>' <a href="#grammar-production-INDEX">INDEX</a>?</td>
 </tr>
-<tr id="grammar-production-// INDEX">
+<tr id="grammar-production-INDEX">
     <td>[15]</td>
-    <td><a href="#grammar-production-// INDEX">// INDEX</a></td>
+    <td><a href="#grammar-production-INDEX">INDEX</a></td>
     <td>::=</td>
     <td>[0-9]+</td>
 </tr>
-<tr id="grammar-production-// [143s] VAR1">
-    <td>[16]</td>
-    <td><a href="#grammar-production-// [143s] VAR1">// [143s] VAR1</a></td>
-    <td>::=</td>
-    <td>'<code class="grammar-literal">?</code>' VARNAME</td>
-</tr>
-<tr id="grammar-production-// [166s] VARNAME">
-    <td>[17]</td>
-    <td><a href="#grammar-production-// [166s] VARNAME">// [166s] VARNAME</a></td>
-    <td>::=</td>
-    <td>( PN_CHARS_U | [0-9] ) ( PN_CHARS_U | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] )*</td>
-</tr>
-<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">@prefix</code>" PNAME_NS IRIREF "<code class="grammar-literal">.</code>"</td>
-</tr>
-<tr id="grammar-production-// graph">
-    <td>[19]</td>
-    <td><a href="#grammar-production-// graph">// graph</a></td>
+<tr id="grammar-production-VAR1">
+    <td>[143s]</td>
+    <td><a href="#grammar-production-VAR1">VAR1</a></td>
     <td>::=</td>
-    <td>triples ( '<code class="grammar-literal">.</code>' triples )* '<code class="grammar-literal">.</code>'?</td>
-</tr>
-<tr id="grammar-production-// [6t] triples">
-    <td>[20]</td>
-    <td><a href="#grammar-production-// [6t] triples">// [6t] triples</a></td>
-    <td>::=</td>
-    <td>subject predicateObjectList | blankNodePropertyList predicateObjectList?</td>
-</tr>
-<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>
+    <td>'<code class="grammar-literal">?</code>' <a href="#grammar-production-VARNAME">VARNAME</a></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>
+<tr id="grammar-production-VARNAME">
+    <td>[166s]</td>
+    <td><a href="#grammar-production-VARNAME">VARNAME</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>
+    <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-// [14t] blankNodePropertyList">
-    <td>[28]</td>
-    <td><a href="#grammar-production-// [14t] blankNodePropertyList">// [14t] blankNodePropertyList</a></td>
+<tr id="grammar-production-prefixID">
+    <td>[4t]</td>
+    <td><a href="#grammar-production-prefixID">prefixID</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>
+    <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-// [16t] NumericLiteral">
-    <td>[30]</td>
-    <td><a href="#grammar-production-// [16t] NumericLiteral">// [16t] NumericLiteral</a></td>
+<tr id="grammar-production-graph">
+    <td>[16]</td>
+    <td><a href="#grammar-production-graph">graph</a></td>
     <td>::=</td>
-    <td>INTEGER | DECIMAL | DOUBLE</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-// [128s] RDFLiteral">
-    <td>[31]</td>
-    <td><a href="#grammar-production-// [128s] RDFLiteral">// [128s] RDFLiteral</a></td>
+<tr id="grammar-production-triples">
+    <td>[6t]</td>
+    <td><a href="#grammar-production-triples">triples</a></td>
     <td>::=</td>
-    <td>String (LANGTAG | '<code class="grammar-literal">^^</code>' iri)?</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-// [133s] BooleanLiteral">
-    <td>[32]</td>
-    <td><a href="#grammar-production-// [133s] BooleanLiteral">// [133s] BooleanLiteral</a></td>
+<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>
+</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>
+    <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>
+</tr>
+<tr id="grammar-production-blankNodePropertyList">
+    <td>[14t]</td>
+    <td><a href="#grammar-production-blankNodePropertyList">blankNodePropertyList</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>
+</tr>
+<tr id="grammar-production-NumericLiteral">
+    <td>[16t]</td>
+    <td><a href="#grammar-production-NumericLiteral">NumericLiteral</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>
+</tr>
+<tr id="grammar-production-RDFLiteral">
+    <td>[128s]</td>
+    <td><a href="#grammar-production-RDFLiteral">RDFLiteral</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>
+</tr>
+<tr id="grammar-production-BooleanLiteral">
+    <td>[133s]</td>
+    <td><a href="#grammar-production-BooleanLiteral">BooleanLiteral</a></td>
     <td>::=</td>
     <td>'<code class="grammar-literal">true</code>' | '<code class="grammar-literal">false</code>'</td>
 </tr>
-<tr id="grammar-production-// [17] String">
-    <td>[33]</td>
-    <td><a href="#grammar-production-// [17] String">// [17] String</a></td>
-    <td>::=</td>
-    <td>STRING_LITERAL_QUOTE | STRING_LITERAL_SINGLE_QUOTE | STRING_LITERAL_LONG_SINGLE_QUOTE | STRING_LITERAL_LONG_QUOTE</td>
-</tr>
-<tr id="grammar-production-// [135s] iri">
-    <td>[34]</td>
-    <td><a href="#grammar-production-// [135s] iri">// [135s] iri</a></td>
+<tr id="grammar-production-String">
+    <td>[17]</td>
+    <td><a href="#grammar-production-String">String</a></td>
     <td>::=</td>
-    <td>IRIREF | PrefixedName</td>
-</tr>
-<tr id="grammar-production-// [136s] PrefixedName">
-    <td>[35]</td>
-    <td><a href="#grammar-production-// [136s] PrefixedName">// [136s] PrefixedName</a></td>
-    <td>::=</td>
-    <td>PNAME_LN | PNAME_NS</td>
-</tr>
-<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>
+    <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-// [18] IRIREF">
-    <td>[37]</td>
-    <td><a href="#grammar-production-// [18] IRIREF">// [18] IRIREF</a></td>
+<tr id="grammar-production-iri">
+    <td>[135s]</td>
+    <td><a href="#grammar-production-iri">iri</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>
+    <td><a href="#grammar-production-IRIREF">IRIREF</a> | <a href="#grammar-production-PrefixedName">PrefixedName</a></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>
+<tr id="grammar-production-PrefixedName">
+    <td>[136s]</td>
+    <td><a href="#grammar-production-PrefixedName">PrefixedName</a></td>
     <td>::=</td>
-    <td>PNAME_NS PN_LOCAL</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-// [141s] BLANK_NODE_LABEL">
-    <td>[40]</td>
-    <td><a href="#grammar-production-// [141s] BLANK_NODE_LABEL">// [141s] BLANK_NODE_LABEL</a></td>
+<tr id="grammar-production-BlankNode">
+    <td>[137s]</td>
+    <td><a href="#grammar-production-BlankNode">BlankNode</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>
+    <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-// [144s] LANGTAG">
-    <td>[41]</td>
-    <td><a href="#grammar-production-// [144s] LANGTAG">// [144s] LANGTAG</a></td>
+<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>
+</tr>
+<tr id="grammar-production-PNAME_LN">
+    <td>[140s]</td>
+    <td><a href="#grammar-production-PNAME_LN">PNAME_LN</a></td>
+    <td>::=</td>
+    <td><a href="#grammar-production-PNAME_NS">PNAME_NS</a> <a href="#grammar-production-PN_LOCAL">PN_LOCAL</a></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>
+    <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>
+</tr>
+<tr id="grammar-production-LANGTAG">
+    <td>[144s]</td>
+    <td><a href="#grammar-production-LANGTAG">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-// [19] INTEGER">
-    <td>[42]</td>
-    <td><a href="#grammar-production-// [19] INTEGER">// [19] INTEGER</a></td>
+<tr id="grammar-production-INTEGER">
+    <td>[19]</td>
+    <td><a href="#grammar-production-INTEGER">INTEGER</a></td>
     <td>::=</td>
     <td>[+-]? [0-9]+</td>
 </tr>
-<tr id="grammar-production-// [20] DECIMAL">
-    <td>[43]</td>
-    <td><a href="#grammar-production-// [20] DECIMAL">// [20] DECIMAL</a></td>
+<tr id="grammar-production-DECIMAL">
+    <td>[20]</td>
+    <td><a href="#grammar-production-DECIMAL">DECIMAL</a></td>
     <td>::=</td>
     <td>[+-]? [0-9]* '<code class="grammar-literal">.</code>' [0-9]+</td>
 </tr>
-<tr id="grammar-production-// [21] DOUBLE">
-    <td>[44]</td>
-    <td><a href="#grammar-production-// [21] DOUBLE">// [21] DOUBLE</a></td>
+<tr id="grammar-production-DOUBLE">
+    <td>[21]</td>
+    <td><a href="#grammar-production-DOUBLE">DOUBLE</a></td>
     <td>::=</td>
-    <td>[+-]? ([0-9]+ '<code class="grammar-literal">.</code>' [0-9]* EXPONENT | '<code class="grammar-literal">.</code>' [0-9]+ EXPONENT | [0-9]+ EXPONENT)</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>
 </tr>
-<tr id="grammar-production-// [154s] EXPONENT">
-    <td>[45]</td>
-    <td><a href="#grammar-production-// [154s] EXPONENT">// [154s] EXPONENT</a></td>
+<tr id="grammar-production-EXPONENT">
+    <td>[154s]</td>
+    <td><a href="#grammar-production-EXPONENT">EXPONENT</a></td>
     <td>::=</td>
     <td>[eE] [+-]? [0-9]+</td>
 </tr>
-<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>' ([^#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-// [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">'</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-// [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>
+<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>" (("<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>
+    <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-// [26] UCHAR">
-    <td>[50]</td>
-    <td><a href="#grammar-production-// [26] UCHAR">// [26] UCHAR</a></td>
+<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">\\u</code>' HEX HEX HEX HEX | '<code class="grammar-literal">\\U</code>' HEX HEX HEX HEX HEX HEX HEX HEX</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-// [159s] ECHAR">
-    <td>[51]</td>
-    <td><a href="#grammar-production-// [159s] ECHAR">// [159s] ECHAR</a></td>
+<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>
+    <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>
+</tr>
+<tr id="grammar-production-UCHAR">
+    <td>[26]</td>
+    <td><a href="#grammar-production-UCHAR">UCHAR</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>
+</tr>
+<tr id="grammar-production-ECHAR">
+    <td>[159s]</td>
+    <td><a href="#grammar-production-ECHAR">ECHAR</a></td>
     <td>::=</td>
     <td>'<code class="grammar-literal">\</code>' [tbnrf"'\]</td>
 </tr>
-<tr id="grammar-production-// [161s] WS">
-    <td>[52]</td>
-    <td><a href="#grammar-production-// [161s] WS">// [161s] WS</a></td>
+<tr id="grammar-production-WS">
+    <td>[161s]</td>
+    <td><a href="#grammar-production-WS">WS</a></td>
     <td>::=</td>
     <td>#x20 | #x9 | #xD | #xA</td>
 </tr>
-<tr id="grammar-production-// [162s] ANON">
-    <td>[53]</td>
-    <td><a href="#grammar-production-// [162s] ANON">// [162s] ANON</a></td>
+<tr id="grammar-production-ANON">
+    <td>[162s]</td>
+    <td><a href="#grammar-production-ANON">ANON</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">[</code>' WS* '<code class="grammar-literal">]</code>'</td>
+    <td>'<code class="grammar-literal">[</code>' <a href="#grammar-production-WS">WS</a>* '<code class="grammar-literal">]</code>'</td>
 </tr>
-<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>
+<tr id="grammar-production-PN_CHARS_BASE">
+    <td>[163s]</td>
+    <td><a href="#grammar-production-PN_CHARS_BASE">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-// [164s] PN_CHARS_U">
-    <td>[55]</td>
-    <td><a href="#grammar-production-// [164s] PN_CHARS_U">// [164s] PN_CHARS_U</a></td>
+<tr id="grammar-production-PN_CHARS_U">
+    <td>[164s]</td>
+    <td><a href="#grammar-production-PN_CHARS_U">PN_CHARS_U</a></td>
     <td>::=</td>
-    <td>PN_CHARS_BASE | '<code class="grammar-literal">_</code>'</td>
-</tr>
-<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>PN_CHARS_U | '<code class="grammar-literal">-</code>' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]</td>
-</tr>
-<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>PN_CHARS_BASE ((PN_CHARS | '<code class="grammar-literal">.</code>')* PN_CHARS)?</td>
+    <td><a href="#grammar-production-PN_CHARS_BASE">PN_CHARS_BASE</a> | '<code class="grammar-literal">_</code>'</td>
 </tr>
-<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>
+<tr id="grammar-production-PN_CHARS">
+    <td>[166s]</td>
+    <td><a href="#grammar-production-PN_CHARS">PN_CHARS</a></td>
     <td>::=</td>
-    <td>PERCENT | PN_LOCAL_ESC</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-// [170s] PERCENT">
-    <td>[60]</td>
-    <td><a href="#grammar-production-// [170s] PERCENT">// [170s] PERCENT</a></td>
+<tr id="grammar-production-PN_PREFIX">
+    <td>[167s]</td>
+    <td><a href="#grammar-production-PN_PREFIX">PN_PREFIX</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">%</code>' HEX HEX</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>
 </tr>
-<tr id="grammar-production-// [171s] HEX">
-    <td>[61]</td>
-    <td><a href="#grammar-production-// [171s] HEX">// [171s] HEX</a></td>
+<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>
+    <td>::=</td>
+    <td><a href="#grammar-production-PERCENT">PERCENT</a> | <a href="#grammar-production-PN_LOCAL_ESC">PN_LOCAL_ESC</a></td>
+</tr>
+<tr id="grammar-production-PERCENT">
+    <td>[170s]</td>
+    <td><a href="#grammar-production-PERCENT">PERCENT</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>
+</tr>
+<tr id="grammar-production-HEX">
+    <td>[171s]</td>
+    <td><a href="#grammar-production-HEX">HEX</a></td>
     <td>::=</td>
     <td>[0-9] | [A-F] | [a-f]</td>
 </tr>
-<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>
+<tr id="grammar-production-PN_LOCAL_ESC">
+    <td>[172s]</td>
+    <td><a href="#grammar-production-PN_LOCAL_ESC">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>
@@ -1152,7 +1150,6 @@
 </table>
 
 
-
     </section>
 
     <section class="appendix" id="media-registration">