~ reflected proposals in <a href="http://www.w3.org/2012/12/Turtle-ericP">Turtle-ericP</a> after <a href="[email protected]om">Gavin's review</a>
authorEric Prud'hommeaux <eric@w3.org>
Sat, 05 Jan 2013 12:08:51 -0500
changeset 570 d3e8ccd67c9c
parent 569 c04bd3720f38
child 571 53c8e57a67c4
~ reflected proposals in <a href="http://www.w3.org/2012/12/Turtle-ericP">Turtle-ericP</a> after <a href="[email protected]om">Gavin's review</a>
rdf-turtle/index.html
rdf-turtle/turtle-bnf.html
--- a/rdf-turtle/index.html	Sat Jan 05 10:41:58 2013 -0500
+++ b/rdf-turtle/index.html	Sat Jan 05 12:08:51 2013 -0500
@@ -138,6 +138,10 @@
     padding:    3px 1em;
 }
 
+.add {
+   background-color: #dfd;
+   color:green;
+}
     </style> 
 	
     </head>
@@ -835,13 +839,55 @@
             <div class="atrisk">
             	<p>The RDF Working Group proposes to make the following changes to align Turtle with SPARQL.</p>
             	<ul>
-            	<li>The addition of <a href="#grammar-production-sparqlPrefix">sparqlPrefix</a> and <a href="#grammar-production-sparqlBase">sparqlBase</a> which allow for using SPARQL style <code>BASE</code> and <code>PREFIX</code> directives in a Turtle document.
+            	<li>The addition of <a href="#grammar-production-sparqlPrefix">sparqlPrefix</a> and <a href="#grammar-production-sparqlBase">sparqlBase</a> which allow for using SPARQL style <code>BASE</code> and <code>PREFIX</code> directives in a Turtle document.</li>
             	</ul>
             	<p>Feedback, both positive and negative, is invited by sending email to mailing list <a href="mailto:[email protected]">[email protected]</a> (<a href="mailto:[email protected]?subject=subscribe">subscribe</a>, <a href="http://lists.w3.org/Archives/Public/public-rdf-comments/">archives</a>).</p>
             </div>
             <p>The <abbr title="Extended Backus–Naur Form">EBNF</abbr> used here is defined in XML 1.0
-            [[!EBNF-NOTATION]]. Production labels consisting of a number and a final 's', e.g. [<a href="http://www.w3.org/TR/sparql11-query/#rRDFLiteral"><span class="prodNo">60s</span></a>], reference the production with that number in the <a href="http://www.w3.org/TR/sparql11-query/#sparqlGrammar">SPARQL Query Language for RDF grammar</a> [[RDF-SPARQL-QUERY]]. When tokenizing the input and choosing grammar rules, the longest match is chosen. The strings <a href="#grammar-production-prefixID"><code>@prefix</code></a> and <a href="#grammar-production-base"><code>@base</code></a> match the pattern for <a href="#grammar-production-LANGTAG">LANGTAG</a>, though neither "prefix" nor "base" are <a href="http://www.iana.org/assignments/language-subtag-registry">registered language subtags</a>. This specification does not define whether a quoted literal followed by either of these tokens (e.g. <code>"A"@base</code>) is in the Turtle language.
+            [[!EBNF-NOTATION]]. Production labels consisting of a number and a final 's', e.g. [<a href="http://www.w3.org/TR/sparql11-query/#rRDFLiteral"><span class="prodNo">60s</span></a>], reference the production with that number in the <a href="http://www.w3.org/TR/sparql11-query/#sparqlGrammar">SPARQL Query Language for RDF grammar</a> [[RDF-SPARQL-QUERY]].
             </p>
+
+	    <div class="add">
+	    <p>Notes:</p>
+	    <ol>
+	      <li>
+		Keywords in single quotes ('<code class="grammar-literal">@base</code>', '<code class="grammar-literal">@prefix</code>', '<code class="grammar-literal">a</code>', '<code class="grammar-literal">true</code>', '<code class="grammar-literal">false</code>') are case-sensitive.
+		Keywords in double quotes ("<code class="grammar-literal">BASE</code>", "<code class="grammar-literal">PREFIX</code>") are case-insensitive.
+	      </li>
+	      <li>
+		Escape sequences <code><a href="#grammar-production-UCHAR">UCHAR</a></code> and <code><a href="#grammar-production-ECHAR">ECHAR</a></code> are case sensitive.
+	      </li>
+	      <li>
+		When tokenizing the input and choosing grammar rules, the longest match is chosen.
+	      </li>
+	      <li>
+		The Turtle grammar is LL(1) and LALR(1) when the rules with uppercased names are used as terminals.
+	      </li>
+	      <li>
+		The entry point into the grammar is <code>turtleDoc</code>.
+	      </li>
+	      <li>
+		In signed numbers, no white space is allowed between the sign and the number.
+	      </li>
+	      <li>
+		The
+		<span style="font-size: smaller;">
+    <span>[162s]</span>
+    <span><code>ANON</code></span>
+    <span>::=</span>
+    <span>'<code class="grammar-literal">[</code>' <a href="#grammar-production-WS">WS</a><code class="grammar-star">*</code> '<code class="grammar-literal">]</code>'</span>
+		</span>
+		token allows any amount of white space and comments between <code class="grammar-literal">[]</code>s.
+		The single space version is used in the grammar for clarity.		
+	      </li>
+	      <li>
+		The strings '<a href="#grammar-production-prefixID"><code class="grammar-literal">@prefix</code></a>' and '<a href="#grammar-production-base"><code class="grammar-literal">@base</code></a>' match the pattern for <a href="#grammar-production-LANGTAG">LANGTAG</a>, though neither "<code class="grammar-literal">prefix</code>" nor "<code class="grammar-literal">base</code>" are <a href="http://www.iana.org/assignments/language-subtag-registry">registered language subtags</a>.
+		This specification does not define whether a quoted literal followed by either of these tokens (e.g. <code>"A"@base</code>) is in the Turtle language.
+	      </li>
+	    </ol>
+	    </div>
+
+
             <div data-include="turtle-bnf.html">
             </div>
           </section>
@@ -885,48 +931,56 @@
               <tr>                                  <th>                                                                       production               </th><th>                                                                                       type            </th><th>procedure</th></tr>
                 </thead>
                 <tbody>
-              <tr id="handle-IRIREF"              ><td><a class="type IRI"         href="#grammar-production-IRIREF"              >IRIREF              </a></td><td><a href="../rdf-concepts/index.html#dfn-iri">      IRI         </a></td><td>The characters between "&lt;" and "&gt;" are <a href="#unescape">unescaped¹</a> to form the unicode string of the IRI. Relative IRI resolution is performed per <a href="#sec-iri-references" class="sectionRef"></a>.</td></tr>
-              <tr id="handle-PNAME_NS"             ><td><a class="type string"      href="#grammar-production-PNAME_NS"             >PNAME_NS             </a></td><td><a href="#prefix">                                                                     prefix      </a></td><td>The potentially empty unicode string matching the first argument of the rule is a key into the <a href="#namespaces">namespaces map</a>.</td></tr>
-              <tr id="handle-PNAME_LN"             ><td><a class="type IRI"         href="#grammar-production-PNAME_LN"             >PNAME_LN             </a></td><td><a href="../rdf-concepts/index.html#dfn-iri">      IRI         </a></td><td>A <a href="#prefix">prefix</a> is identified by the first argument, <code>PNAME_NS</code>. The <a href="#namespaces">namespaces map</a> has a corresponding <code>namespace</code>. The unicode string of the IRI is formed by concatenating this <code>namespace</code> and the second argument, <code>PN_LOCAL</code>.</td></tr>
-              <tr id="handle-STRING_LITERAL1"      ><td><a class="type lexicalForm" href="#grammar-production-STRING_LITERAL1"      >STRING_LITERAL1      </a></td><td><a href="../rdf-concepts/index.html#dfn-lexical-form">                         lexical form</a></td><td>The characters between the outermost "'"s are <a href="#unescape">unescaped¹</a> to form the unicode string of a lexical form.</td></tr>
-              <tr id="handle-STRING_LITERAL2"      ><td><a class="type lexicalForm" href="#grammar-production-STRING_LITERAL2"      >STRING_LITERAL2      </a></td><td><a href="../rdf-concepts/index.html#dfn-lexical-form">                         lexical form</a></td><td>The characters between the outermost '"'s are <a href="#unescape">unescaped¹</a> to form the unicode string of a lexical form.</td></tr>
-              <tr id="handle-STRING_LITERAL_LONG1" ><td><a class="type lexicalForm" href="#grammar-production-STRING_LITERAL_LONG1" >STRING_LITERAL_LONG1 </a></td><td><a href="../rdf-concepts/index.html#dfn-lexical-form">                         lexical form</a></td><td>The characters between the outermost "'''"s are <a href="#unescape">unescaped¹</a> to form the unicode string of a lexical form.</td></tr>
-              <tr id="handle-STRING_LITERAL_LONG2" ><td><a class="type lexicalForm" href="#grammar-production-STRING_LITERAL_LONG2" >STRING_LITERAL_LONG2 </a></td><td><a href="../rdf-concepts/index.html#dfn-lexical-form">                         lexical form</a></td><td>The characters between the outermost '"""'s are <a href="#unescape">unescaped¹</a> to form the unicode string of a lexical form.</td></tr>
-              <tr id="handle-LANGTAG"              ><td><a class="type langTag"     href="#grammar-production-LANGTAG"              >LANGTAG              </a></td><td><a href="../rdf-concepts/index.html#dfn-language-tag">language tag</a></td><td>The characters following the "@" form the unicode string of the language tag.</td></tr>
-              <tr id="handle-RDFLiteral"           ><td><a class="type literal"     href="#grammar-production-RDFLiteral"           >RDFLiteral           </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the first rule argument (<code>String</code>) and either a language tag of <code>LANGTAG</code> or a datatype IRI of <code>iri</code>, depending on which rule matched the input. if neither a language tag nor a datatype IRI is provided, the literal has a datatype of xsd:string.</td></tr>
-              <tr id="handle-INTEGER"              ><td><a class="type integer"     href="#grammar-production-INTEGER"              >INTEGER              </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the input string, and a datatype of xsd:integer.</td></tr>
-              <tr id="handle-DECIMAL"              ><td><a class="type decimal"     href="#grammar-production-DECIMAL"              >DECIMAL              </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the input string, and a datatype of xsd:decimal.</td></tr>
-              <tr id="handle-DOUBLE"               ><td><a class="type double"      href="#grammar-production-DOUBLE"               >DOUBLE               </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the input string, and a datatype of xsd:double.</td></tr>
-              <tr id="handle-BooleanLiteral"       ><td><a class="type boolean"     href="#grammar-production-BooleanLiteral"       >BooleanLiteral       </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the "true" or "false", depending on which matched the input, and a datatype of xsd:boolean.</td></tr>
-              <tr id="handle-BLANK_NODE_LABEL"     ><td><a class="type bNode"       href="#grammar-production-BLANK_NODE_LABEL"     >BLANK_NODE_LABEL     </a></td><td><a href="../rdf-concepts/index.html#dfn-blank-node">         blank node  </a></td><td>The string matching the second argument, <code>PN_LOCAL</code>, is a key in <a href="#bnodeLabels">bnodeLabels</a>. If there is no corresponding blank node in the map, one is allocated.</td></tr>
-              <tr id="handle-ANON"                 ><td><a class="type bNode"       href="#grammar-production-ANON"                 >ANON                 </a></td><td><a href="../rdf-concepts/index.html#dfn-blank-node">         blank node  </a></td><td>A blank node is generated.</td></tr>
-              <tr id="handle-blankNodePropertyList"><td><a class="type bNode"       href="#grammar-production-blankNodePropertyList">blankNodePropertyList</a></td><td><a href="../rdf-concepts/index.html#dfn-blank-node">         blank node  </a></td><td>A blank node is generated. Note the rules for <code>blankNodePropertyList</code> in the next section.</td></tr>
-              <tr id="handle-collection"           ><td><a class="type bNode"       href="#grammar-production-collection"           >collection           </a></td><td><a href="../rdf-concepts/index.html#dfn-blank-node">         blank node  </a></td><td>A blank node is generated. Note the rules for <code>collection</code> in the next section.</td></tr>
+              <tr id="handle-IRIREF"   class="add"    ><td style="text-align:left;"><a class="type IRI"         href="#grammar-production-IRIREF"               >IRIREF               </a></td><td><a href="../rdf-concepts/index.html#dfn-iri">      IRI         </a></td><td>The characters between "&lt;" and "&gt;" are taken, with the <a href="#numeric">numeric escape sequences</a> unescaped, to form the unicode string of the IRI. Relative IRI resolution is performed per <a href="#sec-iri-references" class="sectionRef">Section 6.3</a>.</td></tr>
+              <tr id="handle-PNAME_NS" class="add"    ><td style="text-align:left;" rowspan="2"><a class="type string" href="#grammar-production-PNAME_NS"      >PNAME_NS             </a></td><td><a href="#prefix">                                 prefix      </a></td><td>When used in a <a href="#grammar-production-prefixID">prefixID</a> or <a href="#grammar-production-sparqlPrefix">sparqlPrefix</a> production, the <code>prefix</code> is the potentially empty unicode string matching the first argument of the rule is a key into the <a href="#namespaces">namespaces map</a>.</td></tr>
+              <tr id="handle-PNAME_NS" class="add"    >                                                                                                                                        <td><a href="../rdf-concepts/index.html#dfn-iri">      IRI         </a></td><td>When used in a <a href="#grammar-production-PrefixedName">PrefixedName</a> production, the <code>iri</code> is the value in the <a href="#namespaces">namespaces map</a> corresponding to the first argument of the rule.</td></tr>
+              <tr id="handle-PNAME_LN" class="add"    ><td style="text-align:left;"><a class="type IRI"         href="#grammar-production-PNAME_LN"             >PNAME_LN             </a></td><td><a href="../rdf-concepts/index.html#dfn-iri">      IRI         </a></td><td>A potentially empty <a href="#prefix">prefix</a> is identified by the first sequence, <code>PNAME_NS</code>. The <a href="#namespaces">namespaces map</a> <em class="rfc2119">MUST</em> have a corresponding <code>namespace</code>. The unicode string of the IRI is formed by unescaping the <a href="#reserved">reserved characters</a> in the second argument, <code>PN_LOCAL</code>, and concatenating this onto the <code>namespace</code>.</td></tr>
+              <!-- tr id="handle-PrefixedName" class="add"><td style="text-align:left;"><a class="type IRI"         href="#grammar-production-PrefixedName"         >PrefixedName         </a></td><td><a href="../rdf-concepts/index.html#dfn-iri">      IRI         </a></td><td>.</td></tr -->
+              <tr id="handle-STRING_LITERAL_SINGLE_QUOTE"      class="add"    ><td style="text-align:left;"><a class="type lexicalForm" href="#grammar-production-STRING_LITERAL_SINGLE_QUOTE"      >STRING_LITERAL_SINGLE_QUOTE      </a></td><td><a href="../rdf-concepts/index.html#dfn-lexical-form">                         lexical form</a></td><td>The characters between the outermost "'"s   are taken, with <a href="#numeric">numeric</a> and <a href="#string">string</a> escape sequences unescaped, to form the unicode string of a lexical form.</td></tr>
+              <tr id="handle-STRING_LITERAL_QUOTE"      class="add"    ><td style="text-align:left;"><a class="type lexicalForm" href="#grammar-production-STRING_LITERAL_QUOTE"      >STRING_LITERAL_QUOTE      </a></td><td><a href="../rdf-concepts/index.html#dfn-lexical-form">                         lexical form</a></td><td>The characters between the outermost '"'s   are taken, with <a href="#numeric">numeric</a> and <a href="#string">string</a> escape sequences unescaped, to form the unicode string of a lexical form.</td></tr>
+              <tr id="handle-STRING_LITERAL_LONG_SINGLE_QUOTE" class="add"    ><td style="text-align:left;"><a class="type lexicalForm" href="#grammar-production-STRING_LITERAL_LONG_SINGLE_QUOTE" >STRING_LITERAL_LONG_SINGLE_QUOTE </a></td><td><a href="../rdf-concepts/index.html#dfn-lexical-form">                         lexical form</a></td><td>The characters between the outermost "'''"s are taken, with <a href="#numeric">numeric</a> and <a href="#string">string</a> escape sequences unescaped, to form the unicode string of a lexical form.</td></tr>
+              <tr id="handle-STRING_LITERAL_LONG_QUOTE" class="add"    ><td style="text-align:left;"><a class="type lexicalForm" href="#grammar-production-STRING_LITERAL_LONG_QUOTE" >STRING_LITERAL_LONG_QUOTE </a></td><td><a href="../rdf-concepts/index.html#dfn-lexical-form">                         lexical form</a></td><td>The characters between the outermost '"""'s are taken, with <a href="#numeric">numeric</a> and <a href="#string">string</a> escape sequences unescaped, to form the unicode string of a lexical form.</td></tr>
+              <tr id="handle-LANGTAG"                 ><td style="text-align:left;"><a class="type langTag"     href="#grammar-production-LANGTAG"              >LANGTAG              </a></td><td><a href="../rdf-concepts/index.html#dfn-language-tag">language tag</a></td><td>The characters following the <code>@</code> form the unicode string of the language tag.</td></tr>
+              <tr id="handle-RDFLiteral"              ><td style="text-align:left;"><a class="type literal"     href="#grammar-production-RDFLiteral"           >RDFLiteral           </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the first rule argument, <code>String</code>, and either a language tag of <code>LANGTAG</code> or a datatype IRI of <code>iri</code>, depending on which rule matched the input. if neither a language tag nor a datatype IRI is provided, the literal has a datatype of <code>xsd:string</code>.</td></tr>
+              <tr id="handle-INTEGER"                 ><td style="text-align:left;"><a class="type integer"     href="#grammar-production-INTEGER"              >INTEGER              </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the input string, and a datatype of <code>xsd:integer</code>.</td></tr>
+              <tr id="handle-DECIMAL"                 ><td style="text-align:left;"><a class="type decimal"     href="#grammar-production-DECIMAL"              >DECIMAL              </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the input string, and a datatype of <code>xsd:decimal</code>.</td></tr>
+              <tr id="handle-DOUBLE"                  ><td style="text-align:left;"><a class="type double"      href="#grammar-production-DOUBLE"               >DOUBLE               </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the input string, and a datatype of <code>xsd:double</code>.</td></tr>
+              <tr id="handle-BooleanLiteral"          ><td style="text-align:left;"><a class="type boolean"     href="#grammar-production-BooleanLiteral"       >BooleanLiteral       </a></td><td><a href="../rdf-concepts/index.html#dfn-literal">            literal     </a></td><td>The literal has a lexical form of the <code>true</code> or <code>false</code>, depending on which matched the input, and a datatype of <code>xsd:boolean</code>.</td></tr>
+              <tr id="handle-BLANK_NODE_LABEL"        ><td style="text-align:left;"><a class="type bNode"       href="#grammar-production-BLANK_NODE_LABEL"     >BLANK_NODE_LABEL     </a></td><td><a href="../rdf-concepts/index.html#dfn-blank-node">         blank node  </a></td><td>The string matching the second argument, <code>PN_LOCAL</code>, is a key in <a href="#bnodeLabels">bnodeLabels</a>. If there is no corresponding blank node in the map, one is allocated.</td></tr>
+              <tr id="handle-ANON"                    ><td style="text-align:left;"><a class="type bNode"       href="#grammar-production-ANON"                 >ANON                 </a></td><td><a href="../rdf-concepts/index.html#dfn-blank-node">         blank node  </a></td><td>A blank node is generated.</td></tr>
+              <tr id="handle-blankNodePropertyList"   ><td style="text-align:left;"><a class="type bNode"       href="#grammar-production-blankNodePropertyList">blankNodePropertyList</a></td><td><a href="../rdf-concepts/index.html#dfn-blank-node">         blank node  </a></td><td>A blank node is generated. Note the rules for <code>blankNodePropertyList</code> in the next section.</td></tr>
+              <tr id="handle-collection" class="add"    ><td style="text-align:left;" rowspan="2"><a class="type bNode"       href="#grammar-production-collection"           >collection           </a></td><td><a href="../rdf-concepts/index.html#dfn-blank-node">         blank node  </a></td><td>For non-empty lists, a blank node is generated. Note the rules for <code>collection</code> in the next section.</td></tr>
+              <tr id="handle-collection" class="add"    >                                                                                                                                                    <td><a href="../rdf-concepts/index.html#dfn-iri"       >         IRI         </a></td><td>For empty lists, the resulting IRI is <code>rdf:nil</code>. Note the rules for <code>collection</code> in the next section.</td></tr>
                 </tbody>
               </table>
 
-              <p><a id="unescape">¹</a> <a href="#sec-escapes" class="sectionRef">Escape Sequences</a> defines a mapping from <code>escaped unicode strings</code> to <code>unicode strings</code>. The following lexical tokens are unescaped to produce <code>unicode strings</code>: <a class="type IRI" href="#grammar-production-IRIREF">IRIREF</a>, <!-- <a class="type PNAME_NS" href="#grammar-production-PNAME_NS">PNAME_NS</a>, --><!-- <a class="type IRI"          href="#grammar-production-PNAME_LN">PNAME_LN</a>, --><a class="type lexicalForm"  href="#grammar-production-STRING_LITERAL1">STRING_LITERAL1</a>, <a class="type lexicalForm"  href="#grammar-production-STRING_LITERAL2">STRING_LITERAL2</a>, <a class="type lexicalForm"  href="#grammar-production-STRING_LITERAL_LONG1">STRING_LITERAL_LONG1</a> and <a class="type lexicalForm"  href="#grammar-production-STRING_LITERAL_LONG2">STRING_LITERAL_LONG2</a><!-- and <a class="type langTag"      href="#grammar-production-LANGTAG">LANGTAG</a> --><!-- and <a class="type bNode"        href="#grammar-production-BLANK_NODE_LABEL">BLANK_NODE_LABEL</a> -->.</p>
           </section>
           <section id="sec-parsing-triples">
           <h3>RDF Triples Constructors</h3>
-              <p>A Turtle document defines an <a href="../rdf-concepts/index.html#dfn-rdf-graph">RDF graph</a> composed of set of <a href="../rdf-concepts/index.html#dfn-rdf-triple">RDF triple</a>s.
-          Each <a tabindex="30" class="grammarRef" href="#grammar-production-object">object</a> <code>N</code> in the document produces an RDF triple: <span class="ntriple"><code class="curSubject">curSubject</code> <code class="curPredicate">curPredicate</code> <code>N</code> .</span>
-
+              <p>
+		A Turtle document defines an <a href="../rdf-concepts/index.html#dfn-rdf-graph">RDF graph</a> composed of set of <a href="../rdf-concepts/index.html#dfn-rdf-triple">RDF triple</a>s.
+		<span class="add">
+		  The <code><a href="#grammar-production-subject">subject</a></code> production sets the <code class="curSubject">curSubject</code>.
+		  The <code><a href="#grammar-production-verb">verb</a></code> production sets the <code class="curPredicate">curPredicate</code>.
+		</span>
+		Each <a tabindex="30" class="grammarRef" href="#grammar-production-object">object</a> <code>N</code> in the document produces an RDF triple: <span class="ntriple"><code class="curSubject">curSubject</code> <code class="curPredicate">curPredicate</code> <code>N</code> .</span>
           </p>
 
-          <p>
+	  <h4 id="propertyList" style="padding-bottom:0; margin-bottom:0;"><span class="add">Property Lists:</span></h4>
+          <p style="padding-top:0; margin-top:0;">
           Beginning the <code><a href="#grammar-production-blankNodePropertyList">blankNodePropertyList</a></code> production records the <code class="curSubject">curSubject</code> and <code class="curPredicate">curPredicate</code>, and sets <code class="curSubject">curSubject</code> to a novel <code>blank node</code> <code>B</code>.
           Finishing the <code><a href="#grammar-production-blankNodePropertyList">blankNodePropertyList</a></code> production restores <code class="curSubject">curSubject</code> and <code class="curPredicate">curPredicate</code>.
           The node produced by matching <code><a href="#grammar-production-blankNodePropertyList">blankNodePropertyList</a></code> is the blank node <code>B</code>.
 
           </p>
 
-          <p>
-          Beginning the <code><a href="#grammar-production-collection">collection</a></code> production records the <code class="curSubject">curSubject</code> and <code class="curPredicate">curPredicate</code>, sets <code class="curSubject">curSubject</code> to a novel <code>blank node</code> <code>B<sub>head</sub></code> and sets <code class="curSubject">curSubject</code> and <code class="curPredicate">curPredicate</code> to <code>B<sub>head</sub></code> and <code>rdf:first</code> respectively.
-          Each object <code>object</code> in <code><a href="#grammar-production-collection">collection</a></code> allocates a novel <code>blank node</code> <code>B<sub>n</sub></code>, creates an additional triple <span class="ntriple"><code>curSubject rdf:rest B<sub>n</sub></code> .</span> and sets <code>curSubject</code> to <code>B<sub>n</sub></code>.
+	  <h4 id="collection" style="padding-bottom:0; margin-bottom:0;"><span class="add">Collections:</span></h4>
+          <p class="add" style="padding-top:0; margin-top:0;">
+          Beginning the <code><a href="#grammar-production-collection">collection</a></code> production records the <code class="curSubject">curSubject</code> and <code class="curPredicate">curPredicate</code>.
+	  Each <code>object</code> in the <code><a href="#grammar-production-collection">collection</a></code> production has a <code class="curSubject">curSubject</code> set to a novel <code>blank node</code> <code>B</code> and a <code class="curPredicate">curPredicate</code> set to <code>rdf:first</code>.
+          For each object <code>object<sub>n</sub></code> after the first produces a triple:<span class="ntriple"><code>object<sub>n-1</sub></code> <code>rdf:rest</code> <code>object<sub>n</sub></code> .</span>
           Finishing the <code><a href="#grammar-production-collection">collection</a></code> production creates an additional triple <span class="ntriple"><code>curSubject rdf:rest rdf:nil</code> .</span> and restores <code class="curSubject">curSubject</code> and <code class="curPredicate">curPredicate</code>
-
-          The node produced by matching <code><a href="#grammar-production-collection">collection</a></code> is the blank node <code>B<sub>head</sub></code>.
+          The node produced by matching <code><a href="#grammar-production-collection">collection</a></code> is the first blank node <code>B</code> for non-empty lists and <code>rdf:nil</code> for empty lists.
           </p>
           </section>
           <section id="sec-parsing-example" class="informative">
--- a/rdf-turtle/turtle-bnf.html	Sat Jan 05 10:41:58 2013 -0500
+++ b/rdf-turtle/turtle-bnf.html	Sat Jan 05 12:08:51 2013 -0500
@@ -30,17 +30,17 @@
     <td>::=</td>
     <td>'<code class='grammar-literal'>@base</code>' <a href='#grammar-production-IRIREF'>IRIREF</a> '<code class='grammar-literal'>.</code>'</td>
 </tr>
+            <tr id="grammar-production-sparqlBase" data-grammar-original="[29*] sparqlBase ::= [Bb][Aa][Ss][Ee] IRIREF" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;[&#x27;, &#x27;Bb&#x27;), (&#x27;[&#x27;, &#x27;Aa&#x27;), (&#x27;[&#x27;, &#x27;Ss&#x27;), (&#x27;[&#x27;, &#x27;Ee&#x27;), (&#x27;id&#x27;, &#x27;IRIREF&#x27;)])" >
+    <td>[5s]</td>
+    <td><code>sparqlBase</code></td>
+    <td>::=</td>
+    <td><span class="add">"<code class="grammar-literal">BASE</code>"</span> <a href="#grammar-production-IRIREF">IRIREF</a></td>
+</tr>
             <tr id="grammar-production-sparqlPrefix" data-grammar-original="[28*] sparqlPrefix ::= [Pp][Rr][Ee][Ff][Ii][Xx] PNAME_NS IRIREF" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;[&#x27;, &#x27;Pp&#x27;), (&#x27;[&#x27;, &#x27;Rr&#x27;), (&#x27;[&#x27;, &#x27;Ee&#x27;), (&#x27;[&#x27;, &#x27;Ff&#x27;), (&#x27;[&#x27;, &#x27;Ii&#x27;), (&#x27;[&#x27;, &#x27;Xx&#x27;), (&#x27;id&#x27;, &#x27;PNAME_NS&#x27;), (&#x27;id&#x27;, &#x27;IRIREF&#x27;)])" >
-    <td>[28*]</td>
+    <td>[6s]</td>
     <td><code>sparqlPrefix</code></td>
     <td>::=</td>
-    <td>[<code class='grammar-chars'>Pp</code>] [<code class='grammar-chars'>Rr</code>] [<code class='grammar-chars'>Ee</code>] [<code class='grammar-chars'>Ff</code>] [<code class='grammar-chars'>Ii</code>] [<code class='grammar-chars'>Xx</code>] <a href='#grammar-production-PNAME_NS'>PNAME_NS</a> <a href='#grammar-production-IRIREF'>IRIREF</a></td>
-</tr>
-            <tr id="grammar-production-sparqlBase" data-grammar-original="[29*] sparqlBase ::= [Bb][Aa][Ss][Ee] IRIREF" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;[&#x27;, &#x27;Bb&#x27;), (&#x27;[&#x27;, &#x27;Aa&#x27;), (&#x27;[&#x27;, &#x27;Ss&#x27;), (&#x27;[&#x27;, &#x27;Ee&#x27;), (&#x27;id&#x27;, &#x27;IRIREF&#x27;)])" >
-    <td>[29*]</td>
-    <td><code>sparqlBase</code></td>
-    <td>::=</td>
-    <td>[<code class='grammar-chars'>Bb</code>] [<code class='grammar-chars'>Aa</code>] [<code class='grammar-chars'>Ss</code>] [<code class='grammar-chars'>Ee</code>] <a href='#grammar-production-IRIREF'>IRIREF</a></td>
+    <td><span class="add">"<code class="grammar-literal">PREFIX</code>"</span> <a href="#grammar-production-PNAME_NS">PNAME_NS</a> <a href="#grammar-production-IRIREF">IRIREF</a></td>
 </tr>
             <tr id="grammar-production-triples" data-grammar-original="[6] triples ::= subject predicateObjectList |blankNodePropertyList predicateObjectList?" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;subject&#x27;), (&#x27;id&#x27;, &#x27;predicateObjectList&#x27;)]), (&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;blankNodePropertyList&#x27;), (&#x27;?&#x27;, (&#x27;id&#x27;, &#x27;predicateObjectList&#x27;))])])" >
     <td>[6]</td>
@@ -70,7 +70,7 @@
     <td>[10]</td>
     <td><code>subject</code></td>
     <td>::=</td>
-    <td><a href='#grammar-production-iri'>iri</a> <code>| </code> <a href='#grammar-production-blank'>blank</a></td>
+    <td><a href="#grammar-production-iri">iri</a> <code>| </code> <a href="#grammar-production-BlankNode" class="add">BlankNode</a> <code class="add">| </code> <a href="#grammar-production-collection" class="add">collection</a></td>
 </tr>
             <tr id="grammar-production-predicate" data-grammar-original="[11] predicate ::= iri" data-grammar-expression="(&#x27;id&#x27;, &#x27;iri&#x27;)" >
     <td>[11]</td>
@@ -82,7 +82,7 @@
     <td>[12]</td>
     <td><code>object</code></td>
     <td>::=</td>
-    <td><a href='#grammar-production-iri'>iri</a> <code>| </code> <a href='#grammar-production-blank'>blank</a> <code>| </code> <a href='#grammar-production-blankNodePropertyList'>blankNodePropertyList</a> <code>| </code> <a href='#grammar-production-literal'>literal</a></td>
+    <td><a href="#grammar-production-iri">iri</a> <code>| </code> <a href="#grammar-production-BlankNode" class="add">BlankNode</a> <code class="add">| </code> <a href="#grammar-production-collection" class="add">collection</a> <code>| </code> <a href="#grammar-production-blankNodePropertyList">blankNodePropertyList</a> <code>| </code> <a href="#grammar-production-literal">literal</a></td>
 </tr>
             <tr id="grammar-production-literal" data-grammar-original="[13] literal ::= RDFLiteral| NumericLiteral| BooleanLiteral" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;RDFLiteral&#x27;), (&#x27;id&#x27;, &#x27;NumericLiteral&#x27;), (&#x27;id&#x27;, &#x27;BooleanLiteral&#x27;)])" >
     <td>[13]</td>
@@ -90,26 +90,20 @@
     <td>::=</td>
     <td><a href='#grammar-production-RDFLiteral'>RDFLiteral</a> <code>| </code> <a href='#grammar-production-NumericLiteral'>NumericLiteral</a> <code>| </code> <a href='#grammar-production-BooleanLiteral'>BooleanLiteral</a></td>
 </tr>
-            <tr id="grammar-production-blank" data-grammar-original="[14] blank ::= BlankNode| collection" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;BlankNode&#x27;), (&#x27;id&#x27;, &#x27;collection&#x27;)])" >
+            <tr id="grammar-production-blankNodePropertyList" data-grammar-original="[15] blankNodePropertyList ::= &quot;[&quot; predicateObjectList &quot;]&quot;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;[&#x27;), (&#x27;id&#x27;, &#x27;predicateObjectList&#x27;), (&quot;&#x27;&quot;, &#x27;]&#x27;)])" >
     <td>[14]</td>
-    <td><code>blank</code></td>
-    <td>::=</td>
-    <td><a href='#grammar-production-BlankNode'>BlankNode</a> <code>| </code> <a href='#grammar-production-collection'>collection</a></td>
-</tr>
-            <tr id="grammar-production-blankNodePropertyList" data-grammar-original="[15] blankNodePropertyList ::= &quot;[&quot; predicateObjectList &quot;]&quot;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;[&#x27;), (&#x27;id&#x27;, &#x27;predicateObjectList&#x27;), (&quot;&#x27;&quot;, &#x27;]&#x27;)])" >
-    <td>[15]</td>
     <td><code>blankNodePropertyList</code></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" data-grammar-original="[16] collection ::= &quot;(&quot; object* &quot;)&quot;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;(&#x27;), (&#x27;*&#x27;, (&#x27;id&#x27;, &#x27;object&#x27;)), (&quot;&#x27;&quot;, &#x27;)&#x27;)])" >
-    <td>[16]</td>
+    <td>[15]</td>
     <td><code>collection</code></td>
     <td>::=</td>
     <td>'<code class='grammar-literal'>(</code>' <a href='#grammar-production-object'>object</a><code class='grammar-star'>*</code> '<code class='grammar-literal'>)</code>'</td>
 </tr>
             <tr id="grammar-production-NumericLiteral" data-grammar-original="[17] NumericLiteral ::= INTEGER | DECIMAL | DOUBLE" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;INTEGER&#x27;), (&#x27;id&#x27;, &#x27;DECIMAL&#x27;), (&#x27;id&#x27;, &#x27;DOUBLE&#x27;)])" >
-    <td>[17]</td>
+    <td>[16]</td>
     <td><code>NumericLiteral</code></td>
     <td>::=</td>
     <td><a href='#grammar-production-INTEGER'>INTEGER</a> <code>| </code> <a href='#grammar-production-DECIMAL'>DECIMAL</a> <code>| </code> <a href='#grammar-production-DOUBLE'>DOUBLE</a></td>
@@ -127,7 +121,7 @@
     <td>'<code class='grammar-literal'>true</code>' <code>| </code> '<code class='grammar-literal'>false</code>'</td>
 </tr>
             <tr id="grammar-production-String" data-grammar-original="[18] String ::= STRING_LITERAL_QUOTE| STRING_LITERAL_SINGLE_QUOTE| STRING_LITERAL_LONG_SINGLE_QUOTE| STRING_LITERAL_LONG_QUOTE" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;STRING_LITERAL_QUOTE&#x27;), (&#x27;id&#x27;, &#x27;STRING_LITERAL_SINGLE_QUOTE&#x27;), (&#x27;id&#x27;, &#x27;STRING_LITERAL_LONG_SINGLE_QUOTE&#x27;), (&#x27;id&#x27;, &#x27;STRING_LITERAL_LONG_QUOTE&#x27;)])" >
-    <td>[18]</td>
+    <td>[17]</td>
     <td><code>String</code></td>
     <td>::=</td>
     <td><a href='#grammar-production-STRING_LITERAL_QUOTE'>STRING_LITERAL_QUOTE</a> <code>| </code> <a href='#grammar-production-STRING_LITERAL_SINGLE_QUOTE'>STRING_LITERAL_SINGLE_QUOTE</a> <code>| </code> <a href='#grammar-production-STRING_LITERAL_LONG_SINGLE_QUOTE'>STRING_LITERAL_LONG_SINGLE_QUOTE</a> <code>| </code> <a href='#grammar-production-STRING_LITERAL_LONG_QUOTE'>STRING_LITERAL_LONG_QUOTE</a></td>
@@ -152,7 +146,7 @@
 </tr>
 <tr><td colspan="5"><h4 id="terminals">Productions for terminals</h4></td></tr>
             <tr id="grammar-production-IRIREF" data-grammar-original="[19] IRIREF ::=  &#x27;&lt;&#x27; ([^#x00-#x20&lt;&gt;\&quot;{}|^`\] | UCHAR)* &#x27;&gt;&#x27;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;&lt;&#x27;), (&#x27;*&#x27;, (&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;^#x00-#x20&lt;&gt;\\&quot;{}|^`\\&#x27;), (&#x27;id&#x27;, &#x27;UCHAR&#x27;)])), (&quot;&#x27;&quot;, &#x27;&gt;&#x27;)])" class='grammar-token'>
-    <td>[19]</td>
+    <td>[18]</td>
     <td><code>IRIREF</code></td>
     <td>::=</td>
     <td>'<code class='grammar-literal'>&lt;</code>' ([<code class='grammar-chars'>^#x00-#x20&lt;&gt;\&quot;{}|^`\</code>] <code>| </code> <a href='#grammar-production-UCHAR'>UCHAR</a>)<code class='grammar-star'>*</code> '<code class='grammar-literal'>&gt;</code>'</td>
@@ -182,19 +176,19 @@
     <td>'<code class='grammar-literal'>@</code>' [<code class='grammar-chars'>a-zA-Z</code>]<code class='grammar-plus'>+</code> ('<code class='grammar-literal'>-</code>' [<code class='grammar-chars'>a-zA-Z0-9</code>]<code class='grammar-plus'>+</code>)<code class='grammar-star'>*</code></td>
 </tr>
             <tr id="grammar-production-INTEGER" data-grammar-original="[20] INTEGER ::= [+-]? [0-9]+" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;?&#x27;, (&#x27;[&#x27;, &#x27;+-&#x27;)), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;0-9&#x27;))])" class='grammar-token'>
-    <td>[20]</td>
+    <td>[19]</td>
     <td><code>INTEGER</code></td>
     <td>::=</td>
     <td>[<code class='grammar-chars'>+-</code>]? [<code class='grammar-chars'>0-9</code>]<code class='grammar-plus'>+</code></td>
 </tr>
             <tr id="grammar-production-DECIMAL" data-grammar-original="[21] DECIMAL ::= [+-]?  ( ([0-9])* &#x27;.&#x27; ([0-9])+  )" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;?&#x27;, (&#x27;[&#x27;, &#x27;+-&#x27;)), (&#x27;,&#x27;, [(&#x27;*&#x27;, (&#x27;[&#x27;, &#x27;0-9&#x27;)), (&quot;&#x27;&quot;, &#x27;.&#x27;), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;0-9&#x27;))])])" class='grammar-token'>
-    <td>[21]</td>
+    <td>[20]</td>
     <td><code>DECIMAL</code></td>
     <td>::=</td>
     <td>[<code class='grammar-chars'>+-</code>]? ([<code class='grammar-chars'>0-9</code>]<code class='grammar-star'>*</code> '<code class='grammar-literal'>.</code>' [<code class='grammar-chars'>0-9</code>]<code class='grammar-plus'>+</code>)</td>
 </tr>
             <tr id="grammar-production-DOUBLE" data-grammar-original="[22] DOUBLE ::= [+-]? ( [0-9]+ &#x27;.&#x27; [0-9]* EXPONENT | &#x27;.&#x27; ([0-9])+ EXPONENT | ([0-9])+EXPONENT )" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;?&#x27;, (&#x27;[&#x27;, &#x27;+-&#x27;)), (&#x27;|&#x27;, [(&#x27;,&#x27;, [(&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;0-9&#x27;)), (&quot;&#x27;&quot;, &#x27;.&#x27;), (&#x27;*&#x27;, (&#x27;[&#x27;, &#x27;0-9&#x27;)), (&#x27;id&#x27;, &#x27;EXPONENT&#x27;)]), (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;.&#x27;), (&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;0-9&#x27;)), (&#x27;id&#x27;, &#x27;EXPONENT&#x27;)]), (&#x27;,&#x27;, [(&#x27;+&#x27;, (&#x27;[&#x27;, &#x27;0-9&#x27;)), (&#x27;id&#x27;, &#x27;EXPONENT&#x27;)])])])" class='grammar-token'>
-    <td>[22]</td>
+    <td>[21]</td>
     <td><code>DOUBLE</code></td>
     <td>::=</td>
     <td>[<code class='grammar-chars'>+-</code>]? ([<code class='grammar-chars'>0-9</code>]<code class='grammar-plus'>+</code> '<code class='grammar-literal'>.</code>' [<code class='grammar-chars'>0-9</code>]<code class='grammar-star'>*</code> <a href='#grammar-production-EXPONENT'>EXPONENT</a> <code>| </code> '<code class='grammar-literal'>.</code>' [<code class='grammar-chars'>0-9</code>]<code class='grammar-plus'>+</code> <a href='#grammar-production-EXPONENT'>EXPONENT</a> <code>| </code> [<code class='grammar-chars'>0-9</code>]<code class='grammar-plus'>+</code> <a href='#grammar-production-EXPONENT'>EXPONENT</a>)</td>
@@ -206,31 +200,31 @@
     <td>[<code class='grammar-chars'>eE</code>] [<code class='grammar-chars'>+-</code>]? [<code class='grammar-chars'>0-9</code>]<code class='grammar-plus'>+</code></td>
 </tr>
             <tr id="grammar-production-STRING_LITERAL_QUOTE" data-grammar-original="[23] STRING_LITERAL_QUOTE ::= &#x27;&quot;&#x27; ( [^#x22#x5C#xA#xD] | ECHAR | UCHAR )* &#x27;&quot;&#x27;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;&quot;&#x27;), (&#x27;*&#x27;, (&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;^#x22#x5C#xA#xD&#x27;), (&#x27;id&#x27;, &#x27;ECHAR&#x27;), (&#x27;id&#x27;, &#x27;UCHAR&#x27;)])), (&quot;&#x27;&quot;, &#x27;&quot;&#x27;)])" class='grammar-token'>
-    <td>[23]</td>
+    <td>[22]</td>
     <td><code>STRING_LITERAL_QUOTE</code></td>
     <td>::=</td>
     <td>'<code class='grammar-literal'>&quot;</code>' ([<code class='grammar-chars'>^#x22#x5C#xA#xD</code>] <code>| </code> <a href='#grammar-production-ECHAR'>ECHAR</a> <code>| </code> <a href='#grammar-production-UCHAR'>UCHAR</a>)<code class='grammar-star'>*</code> '<code class='grammar-literal'>&quot;</code>'</td>
 </tr>
             <tr id="grammar-production-STRING_LITERAL_SINGLE_QUOTE" data-grammar-original="[24] STRING_LITERAL_SINGLE_QUOTE ::= &quot;&#x27;&quot; ( [^#x27#x5C#xA#xD] | ECHAR | UCHAR )* &quot;&#x27;&quot;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &quot;&#x27;&quot;), (&#x27;*&#x27;, (&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;^#x27#x5C#xA#xD&#x27;), (&#x27;id&#x27;, &#x27;ECHAR&#x27;), (&#x27;id&#x27;, &#x27;UCHAR&#x27;)])), (&quot;&#x27;&quot;, &quot;&#x27;&quot;)])" class='grammar-token'>
-    <td>[24]</td>
+    <td>[23]</td>
     <td><code>STRING_LITERAL_SINGLE_QUOTE</code></td>
     <td>::=</td>
     <td>"<code class="grammar-literal">&#x27;</code>" ([<code class='grammar-chars'>^#x27#x5C#xA#xD</code>] <code>| </code> <a href='#grammar-production-ECHAR'>ECHAR</a> <code>| </code> <a href='#grammar-production-UCHAR'>UCHAR</a>)<code class='grammar-star'>*</code> "<code class="grammar-literal">&#x27;</code>"</td>
 </tr>
             <tr id="grammar-production-STRING_LITERAL_LONG_SINGLE_QUOTE" data-grammar-original="[25] STRING_LITERAL_LONG_SINGLE_QUOTE ::= &quot;&#x27;&#x27;&#x27;&quot; ( ( &quot;&#x27;&quot; | &quot;&#x27;&#x27;&quot; )? ( [^&#x27;\] | ECHAR | UCHAR ) )* &quot;&#x27;&#x27;&#x27;&quot;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &quot;&#x27;&#x27;&#x27;&quot;), (&#x27;*&#x27;, (&#x27;,&#x27;, [(&#x27;?&#x27;, (&#x27;|&#x27;, [(&quot;&#x27;&quot;, &quot;&#x27;&quot;), (&quot;&#x27;&quot;, &quot;&#x27;&#x27;&quot;)])), (&#x27;|&#x27;, [(&#x27;[&#x27;, &quot;^&#x27;\\&quot;), (&#x27;id&#x27;, &#x27;ECHAR&#x27;), (&#x27;id&#x27;, &#x27;UCHAR&#x27;)])])), (&quot;&#x27;&quot;, &quot;&#x27;&#x27;&#x27;&quot;)])" class='grammar-token'>
-    <td>[25]</td>
+    <td>[24]</td>
     <td><code>STRING_LITERAL_LONG_SINGLE_QUOTE</code></td>
     <td>::=</td>
     <td>"<code class="grammar-literal">&#x27;&#x27;&#x27;</code>" (("<code class="grammar-literal">&#x27;</code>" <code>| </code> "<code class="grammar-literal">&#x27;&#x27;</code>")? [<code class='grammar-chars'>^&#x27;\</code>] <code>| </code> <a href='#grammar-production-ECHAR'>ECHAR</a> <code>| </code> <a href='#grammar-production-UCHAR'>UCHAR</a>)<code class='grammar-star'>*</code> "<code class="grammar-literal">&#x27;&#x27;&#x27;</code>"</td>
 </tr>
             <tr id="grammar-production-STRING_LITERAL_LONG_QUOTE" data-grammar-original="[26] STRING_LITERAL_LONG_QUOTE ::= &#x27;&quot;&quot;&quot;&#x27; ( ( &#x27;&quot;&#x27; | &#x27;&quot;&quot;&#x27; )? ( [^&quot;\] | ECHAR | UCHAR ) )* &#x27;&quot;&quot;&quot;&#x27;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;&quot;&quot;&quot;&#x27;), (&#x27;*&#x27;, (&#x27;,&#x27;, [(&#x27;?&#x27;, (&#x27;|&#x27;, [(&quot;&#x27;&quot;, &#x27;&quot;&#x27;), (&quot;&#x27;&quot;, &#x27;&quot;&quot;&#x27;)])), (&#x27;|&#x27;, [(&#x27;[&#x27;, &#x27;^&quot;\\&#x27;), (&#x27;id&#x27;, &#x27;ECHAR&#x27;), (&#x27;id&#x27;, &#x27;UCHAR&#x27;)])])), (&quot;&#x27;&quot;, &#x27;&quot;&quot;&quot;&#x27;)])" class='grammar-token'>
-    <td>[26]</td>
+    <td>[25]</td>
     <td><code>STRING_LITERAL_LONG_QUOTE</code></td>
     <td>::=</td>
     <td>'<code class='grammar-literal'>&quot;&quot;&quot;</code>' (('<code class='grammar-literal'>&quot;</code>' <code>| </code> '<code class='grammar-literal'>&quot;&quot;</code>')? [<code class='grammar-chars'>^&quot;\</code>] <code>| </code> <a href='#grammar-production-ECHAR'>ECHAR</a> <code>| </code> <a href='#grammar-production-UCHAR'>UCHAR</a>)<code class='grammar-star'>*</code> '<code class='grammar-literal'>&quot;&quot;&quot;</code>'</td>
 </tr>
             <tr id="grammar-production-UCHAR" data-grammar-original="[27] UCHAR ::= ( &quot;\u&quot; HEX HEX HEX HEX )| ( &quot;\U&quot; HEX HEX HEX HEX HEX HEX HEX HEX )" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;\\u&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;)]), (&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;\\U&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;), (&#x27;id&#x27;, &#x27;HEX&#x27;)])])" class='grammar-token'>
-    <td>[27]</td>
+    <td>[26]</td>
     <td><code>UCHAR</code></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>| </code> '<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>
@@ -241,12 +235,6 @@
     <td>::=</td>
     <td>'<code class='grammar-literal'>\</code>' [<code class='grammar-chars'>tbnrf\&quot;&#x27;</code>]</td>
 </tr>
-            <tr id="grammar-production-NIL" data-grammar-original="[160s] NIL ::= &quot;(&quot; WS* &quot;)&quot;" data-grammar-expression="(&#x27;,&#x27;, [(&quot;&#x27;&quot;, &#x27;(&#x27;), (&#x27;*&#x27;, (&#x27;id&#x27;, &#x27;WS&#x27;)), (&quot;&#x27;&quot;, &#x27;)&#x27;)])" class='grammar-token'>
-    <td>[160s]</td>
-    <td><code>NIL</code></td>
-    <td>::=</td>
-    <td>'<code class='grammar-literal'>(</code>' <a href='#grammar-production-WS'>WS</a><code class='grammar-star'>*</code> '<code class='grammar-literal'>)</code>'</td>
-</tr>
             <tr id="grammar-production-WS" data-grammar-original="[161s] WS ::= #x20 | #x9 | #xD | #xA" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;#&#x27;, &#x27;#x20&#x27;), (&#x27;#&#x27;, &#x27;#x9&#x27;), (&#x27;#&#x27;, &#x27;#xD&#x27;), (&#x27;#&#x27;, &#x27;#xA&#x27;)])" class='grammar-token'>
     <td>[161s]</td>
     <td><code>WS</code></td>
@@ -263,7 +251,7 @@
     <td>[163s]</td>
     <td><code>PN_CHARS_BASE</code></td>
     <td>::=</td>
-    <td>[<code class='grammar-chars'>A-Z</code>] <code>| </code> [<code class='grammar-chars'>a-z</code>] <code>| </code> [<code class='grammar-chars'>#00C0-#00D6</code>] <code>| </code> [<code class='grammar-chars'>#00D8-#00F6</code>] <code>| </code> [<code class='grammar-chars'>#00F8-#02FF</code>] <code>| </code> [<code class='grammar-chars'>#0370-#037D</code>] <code>| </code> [<code class='grammar-chars'>#037F-#1FFF</code>] <code>| </code> [<code class='grammar-chars'>#200C-#200D</code>] <code>| </code> [<code class='grammar-chars'>#2070-#218F</code>] <code>| </code> [<code class='grammar-chars'>#2C00-#2FEF</code>] <code>| </code> [<code class='grammar-chars'>#3001-#D7FF</code>] <code>| </code> [<code class='grammar-chars'>#F900-#FDCF</code>] <code>| </code> [<code class='grammar-chars'>#FDF0-#FFFD</code>] <code>| </code> [<code class='grammar-chars'>#10000-#EFFFF</code>]</td>
+    <td>[<code class="grammar-chars">A-Z</code>] <code>| </code> [<code class="grammar-chars">a-z</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>00C0-#<span class="add">x</span>00D6</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>00D8-#<span class="add">x</span>00F6</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>00F8-#<span class="add">x</span>02FF</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>0370-#<span class="add">x</span>037D</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>037F-#<span class="add">x</span>1FFF</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>200C-#<span class="add">x</span>200D</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>2070-#<span class="add">x</span>218F</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>2C00-#<span class="add">x</span>2FEF</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>3001-#<span class="add">x</span>D7FF</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>F900-#<span class="add">x</span>FDCF</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>FDF0-#<span class="add">x</span>FFFD</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>10000-#<span class="add">x</span>EFFFF</code>]</td>
 </tr>
             <tr id="grammar-production-PN_CHARS_U" data-grammar-original="[164s] PN_CHARS_U  ::=  PN_CHARS_BASE| &#x27;_&#x27;" data-grammar-expression="(&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS_BASE&#x27;), (&quot;&#x27;&quot;, &#x27;_&#x27;)])" class='grammar-token'>
     <td>[164s]</td>
@@ -275,7 +263,7 @@
     <td>[166s]</td>
     <td><code>PN_CHARS</code></td>
     <td>::=</td>
-    <td><a href='#grammar-production-PN_CHARS_U'>PN_CHARS_U</a> <code>| </code> '<code class='grammar-literal'>-</code>' <code>| </code> [<code class='grammar-chars'>0-9</code>] <code>| </code> <code class='grammar-char-escape'>#00B7</code> <code>| </code> [<code class='grammar-chars'>#0300-#036F</code>] <code>| </code> [<code class='grammar-chars'>#203F-#2040</code>]</td>
+    <td><a href="#grammar-production-PN_CHARS_U">PN_CHARS_U</a> <code>| </code> '<code class="grammar-literal">-</code>' <code>| </code> [<code class="grammar-chars">0-9</code>] <code>| </code> <code class="grammar-char-escape">#<span class="add">x</span>00B7</code> <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>0300-#<span class="add">x</span>036F</code>] <code>| </code> [<code class="grammar-chars">#<span class="add">x</span>203F-#<span class="add">x</span>2040</code>]</td>
 </tr>
             <tr id="grammar-production-PN_PREFIX" data-grammar-original="[167s] PN_PREFIX ::= PN_CHARS_BASE ( ( PN_CHARS | &quot;.&quot; )* PN_CHARS )?" data-grammar-expression="(&#x27;,&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS_BASE&#x27;), (&#x27;?&#x27;, (&#x27;,&#x27;, [(&#x27;*&#x27;, (&#x27;|&#x27;, [(&#x27;id&#x27;, &#x27;PN_CHARS&#x27;), (&quot;&#x27;&quot;, &#x27;.&#x27;)])), (&#x27;id&#x27;, &#x27;PN_CHARS&#x27;)]))])" class='grammar-token'>
     <td>[167s]</td>