Optional leading / for Path. Other improvements in grammar. ldpatch
authorAlexandre Bertails <bertails@gmail.com>
Thu, 20 Nov 2014 23:25:47 -0500
branchldpatch
changeset 894 3794fe350546
parent 893 69d062ab6fc8
child 895 9e83f2d8b056
Optional leading / for Path. Other improvements in grammar.
ldpatch.html
--- a/ldpatch.html	Thu Nov 20 13:42:01 2014 -0500
+++ b/ldpatch.html	Thu Nov 20 23:25:47 2014 -0500
@@ -458,7 +458,10 @@
       <section id="path-expression">
         <h2><dfn>Path Expression</dfn></h2>
         <p>
-LD Patch uses path expressions to describe possible routes through the <a>target graph</a> between two nodes. The main goal is to allow addressing a blank node by “walking” the arcs of the graph from an already identified node. A path is a sequence of <dfn>Step</dfn>s and <dfn>Constraint</dfn>s, which are applied in order to a set of nodes <var>N</var>. <a>Step</a>s can be of three kinds:
+            A path expression can be used to locate RDF nodes within the <a>target graph</a>. A path expression consists of a series of one or more <a>Step</a>s or <a>Constraint</a>s, separated by "<code>/</code>", and optionally beginning with "<code>/</code>". The main goal is to allow addressing a blank node by “walking” the arcs of the graph from an already identified node. 
+        </p>
+        <p>
+            A <dfn>Step</dfn> can be of three kinds:
         </p>
         <ul>
           <li>A <dfn>StepForward</dfn> is defined by an IRI <var>p</var>, and consists in following the corresponding outgoing arcs: <var>N</var> is replaced by the set of the objects of all triples from the <a>target graph</a> with predicate <var>p</a> and their subject in <var>N</var>.</li>
@@ -466,7 +469,7 @@
           <li>A <dfn>StepAt</dfn> is defined by an integer <i>n</i>, and consists in following <var>n</var> <code>rdf:rest</code> arcs and one <code>rdf:first</code> arc in order to reach the corresponding member of an RDF collection. It is equivalent to a sequence of <var>n</var>+1 <a>StepForward</a>s with the corresponding IRIs.</li>
         </ul>
         <p>
-<a>Constraint</a>s can be of two kinds:
+A <dfn>Constraint</dfn> can be of two kinds:
         </p>
         <ul>
           <li>A <dfn>Unicity constraint</dfn>, described by the <em>bang</em> ("<code>!</code>") character, checks that <var>N</var> contains exactly one node. If this is not the case, <var>N</var> is replaced by the empty set (which triggers the Path Expression to fail).</li>
@@ -481,11 +484,6 @@
         </pre>
         </p>
 
-	<div class="ldp-issue">
-	    <div class="ldp-issue-title"><a href="http://www.w3.org/2012/ldp/track/issues/100">ISSUE-100</a></div>
-	    Should ld-patch use a slash like sparql does, instead of as it currently does?
-	</div>
-
       </section>
 
       <section id="patch-operations">
@@ -709,7 +707,7 @@
     <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>") <a href="#grammar-production-Var">Var</a> <a href="#grammar-production-value">value</a> <a href="#grammar-production-path">path</a>? "<code class="grammar-literal">.</code>"</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>
@@ -727,31 +725,31 @@
     <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-iri">iri</a> | <a href="#grammar-production-Var">Var</a>) "<code class="grammar-literal">.</code>"</td>
+    <td>("<code class="grammar-literal">Cut</code>" | "<code class="grammar-literal">C</code>") <a href="#grammar-production-varOrIRI">varOrIRI</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-subject">subject</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>
+    <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> | <a href="#grammar-production-Var">Var</a></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>( <a href="#grammar-production-step">step</a> | <a href="#grammar-production-constraint">constraint</a> )*</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>[11]</td>
     <td><a href="#grammar-production-step">step</a></td>
     <td>::=</td>
-    <td>'<code class="grammar-literal">/</code>' ( '<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>
+    <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>
@@ -771,284 +769,290 @@
     <td>::=</td>
     <td>[0-9]+</td>
 </tr>
-<tr id="grammar-production-Var">
-    <td>[15]</td>
-    <td><a href="#grammar-production-Var">Var</a></td>
+<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>[16]</td>
+    <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>[17]</td>
+    <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>[18]</td>
+    <td>[15]</td>
     <td><a href="#grammar-production-graph">graph</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>[19]</td>
+    <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>[20]</td>
+    <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>[21]</td>
+    <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>[22]</td>
+    <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>[23]</td>
+    <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-Var">Var</a></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>[24]</td>
+    <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>[25]</td>
+    <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></td>
 </tr>
 <tr id="grammar-production-literal">
-    <td>[26]</td>
+    <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>[27]</td>
+    <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>[28]</td>
+    <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>[29]</td>
+    <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>[30]</td>
+    <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>[31]</td>
+    <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-String">
-    <td>[32]</td>
+    <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>[33]</td>
+    <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>[34]</td>
+    <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>[35]</td>
+    <td>[137s]</td>
     <td><a href="#grammar-production-BlankNode">BlankNode</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>[36]</td>
+    <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>[37]</td>
+    <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>[38]</td>
+    <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>[39]</td>
+    <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>[40]</td>
+    <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-INTEGER">
-    <td>[41]</td>
+    <td>[19]</td>
     <td><a href="#grammar-production-INTEGER">INTEGER</a></td>
     <td>::=</td>
     <td>[+-]? [0-9]+</td>
 </tr>
 <tr id="grammar-production-DECIMAL">
-    <td>[42]</td>
+    <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-DOUBLE">
-    <td>[43]</td>
+    <td>[21]</td>
     <td><a href="#grammar-production-DOUBLE">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>
 </tr>
 <tr id="grammar-production-EXPONENT">
-    <td>[44]</td>
+    <td>[154s]</td>
     <td><a href="#grammar-production-EXPONENT">EXPONENT</a></td>
     <td>::=</td>
     <td>[eE] [+-]? [0-9]+</td>
 </tr>
 <tr id="grammar-production-STRING_LITERAL_QUOTE">
-    <td>[45]</td>
+    <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>[46]</td>
+    <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>[47]</td>
+    <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>[48]</td>
+    <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>[49]</td>
+    <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>[50]</td>
+    <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-WS">
-    <td>[51]</td>
+    <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-ANON">
-    <td>[52]</td>
+    <td>[162s]</td>
     <td><a href="#grammar-production-ANON">ANON</a></td>
     <td>::=</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-PN_CHARS_BASE">
-    <td>[53]</td>
+    <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-PN_CHARS_U">
-    <td>[54]</td>
+    <td>[164s]</td>
     <td><a href="#grammar-production-PN_CHARS_U">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>[55]</td>
+    <td>[166s]</td>
     <td><a href="#grammar-production-PN_CHARS">PN_CHARS</a></td>
     <td>::=</td>
-    <td><a href="#grammar-production-PN_CHA_U">PN_CHARS_U</a> | '<code class="grammar-literal">-</code>' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]</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>[56]</td>
+    <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>
 </tr>
 <tr id="grammar-production-PN_LOCAL">
-    <td>[57]</td>
+    <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>[58]</td>
+    <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>[59]</td>
+    <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>[60]</td>
+    <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-PN_LOCAL_ESC">
-    <td>[61]</td>
+    <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>