--- 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:public-rdf-comments@w3.org">public-rdf-comments@w3.org</a> (<a href="mailto:public-rdf-comments-request@w3.org?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 "<" and ">" 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 "<" and ">" 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="(',', [('[', 'Bb'), ('[', 'Aa'), ('[', 'Ss'), ('[', 'Ee'), ('id', 'IRIREF')])" >
+ <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="(',', [('[', 'Pp'), ('[', 'Rr'), ('[', 'Ee'), ('[', 'Ff'), ('[', 'Ii'), ('[', 'Xx'), ('id', 'PNAME_NS'), ('id', 'IRIREF')])" >
- <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="(',', [('[', 'Bb'), ('[', 'Aa'), ('[', 'Ss'), ('[', 'Ee'), ('id', 'IRIREF')])" >
- <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="('|', [(',', [('id', 'subject'), ('id', 'predicateObjectList')]), (',', [('id', 'blankNodePropertyList'), ('?', ('id', 'predicateObjectList'))])])" >
<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="('id', 'iri')" >
<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="('|', [('id', 'RDFLiteral'), ('id', 'NumericLiteral'), ('id', 'BooleanLiteral')])" >
<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="('|', [('id', 'BlankNode'), ('id', 'collection')])" >
+ <tr id="grammar-production-blankNodePropertyList" data-grammar-original="[15] blankNodePropertyList ::= "[" predicateObjectList "]"" data-grammar-expression="(',', [("'", '['), ('id', 'predicateObjectList'), ("'", ']')])" >
<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 ::= "[" predicateObjectList "]"" data-grammar-expression="(',', [("'", '['), ('id', 'predicateObjectList'), ("'", ']')])" >
- <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 ::= "(" object* ")"" data-grammar-expression="(',', [("'", '('), ('*', ('id', 'object')), ("'", ')')])" >
- <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="('|', [('id', 'INTEGER'), ('id', 'DECIMAL'), ('id', 'DOUBLE')])" >
- <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="('|', [('id', 'STRING_LITERAL_QUOTE'), ('id', 'STRING_LITERAL_SINGLE_QUOTE'), ('id', 'STRING_LITERAL_LONG_SINGLE_QUOTE'), ('id', 'STRING_LITERAL_LONG_QUOTE')])" >
- <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 ::= '<' ([^#x00-#x20<>\"{}|^`\] | UCHAR)* '>'" data-grammar-expression="(',', [("'", '<'), ('*', ('|', [('[', '^#x00-#x20<>\\"{}|^`\\'), ('id', 'UCHAR')])), ("'", '>')])" class='grammar-token'>
- <td>[19]</td>
+ <td>[18]</td>
<td><code>IRIREF</code></td>
<td>::=</td>
<td>'<code class='grammar-literal'><</code>' ([<code class='grammar-chars'>^#x00-#x20<>\"{}|^`\</code>] <code>| </code> <a href='#grammar-production-UCHAR'>UCHAR</a>)<code class='grammar-star'>*</code> '<code class='grammar-literal'>></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="(',', [('?', ('[', '+-')), ('+', ('[', '0-9'))])" 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])* '.' ([0-9])+ )" data-grammar-expression="(',', [('?', ('[', '+-')), (',', [('*', ('[', '0-9')), ("'", '.'), ('+', ('[', '0-9'))])])" 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]+ '.' [0-9]* EXPONENT | '.' ([0-9])+ EXPONENT | ([0-9])+EXPONENT )" data-grammar-expression="(',', [('?', ('[', '+-')), ('|', [(',', [('+', ('[', '0-9')), ("'", '.'), ('*', ('[', '0-9')), ('id', 'EXPONENT')]), (',', [("'", '.'), ('+', ('[', '0-9')), ('id', 'EXPONENT')]), (',', [('+', ('[', '0-9')), ('id', 'EXPONENT')])])])" 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 ::= '"' ( [^#x22#x5C#xA#xD] | ECHAR | UCHAR )* '"'" data-grammar-expression="(',', [("'", '"'), ('*', ('|', [('[', '^#x22#x5C#xA#xD'), ('id', 'ECHAR'), ('id', 'UCHAR')])), ("'", '"')])" class='grammar-token'>
- <td>[23]</td>
+ <td>[22]</td>
<td><code>STRING_LITERAL_QUOTE</code></td>
<td>::=</td>
<td>'<code class='grammar-literal'>"</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'>"</code>'</td>
</tr>
<tr id="grammar-production-STRING_LITERAL_SINGLE_QUOTE" data-grammar-original="[24] STRING_LITERAL_SINGLE_QUOTE ::= "'" ( [^#x27#x5C#xA#xD] | ECHAR | UCHAR )* "'"" data-grammar-expression="(',', [("'", "'"), ('*', ('|', [('[', '^#x27#x5C#xA#xD'), ('id', 'ECHAR'), ('id', 'UCHAR')])), ("'", "'")])" class='grammar-token'>
- <td>[24]</td>
+ <td>[23]</td>
<td><code>STRING_LITERAL_SINGLE_QUOTE</code></td>
<td>::=</td>
<td>"<code class="grammar-literal">'</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">'</code>"</td>
</tr>
<tr id="grammar-production-STRING_LITERAL_LONG_SINGLE_QUOTE" data-grammar-original="[25] STRING_LITERAL_LONG_SINGLE_QUOTE ::= "'''" ( ( "'" | "''" )? ( [^'\] | ECHAR | UCHAR ) )* "'''"" data-grammar-expression="(',', [("'", "'''"), ('*', (',', [('?', ('|', [("'", "'"), ("'", "''")])), ('|', [('[', "^'\\"), ('id', 'ECHAR'), ('id', 'UCHAR')])])), ("'", "'''")])" 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">'''</code>" (("<code class="grammar-literal">'</code>" <code>| </code> "<code class="grammar-literal">''</code>")? [<code class='grammar-chars'>^'\</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">'''</code>"</td>
</tr>
<tr id="grammar-production-STRING_LITERAL_LONG_QUOTE" data-grammar-original="[26] STRING_LITERAL_LONG_QUOTE ::= '"""' ( ( '"' | '""' )? ( [^"\] | ECHAR | UCHAR ) )* '"""'" data-grammar-expression="(',', [("'", '"""'), ('*', (',', [('?', ('|', [("'", '"'), ("'", '""')])), ('|', [('[', '^"\\'), ('id', 'ECHAR'), ('id', 'UCHAR')])])), ("'", '"""')])" class='grammar-token'>
- <td>[26]</td>
+ <td>[25]</td>
<td><code>STRING_LITERAL_LONG_QUOTE</code></td>
<td>::=</td>
<td>'<code class='grammar-literal'>"""</code>' (('<code class='grammar-literal'>"</code>' <code>| </code> '<code class='grammar-literal'>""</code>')? [<code class='grammar-chars'>^"\</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'>"""</code>'</td>
</tr>
<tr id="grammar-production-UCHAR" data-grammar-original="[27] UCHAR ::= ( "\u" HEX HEX HEX HEX )| ( "\U" HEX HEX HEX HEX HEX HEX HEX HEX )" data-grammar-expression="('|', [(',', [("'", '\\u'), ('id', 'HEX'), ('id', 'HEX'), ('id', 'HEX'), ('id', 'HEX')]), (',', [("'", '\\U'), ('id', 'HEX'), ('id', 'HEX'), ('id', 'HEX'), ('id', 'HEX'), ('id', 'HEX'), ('id', 'HEX'), ('id', 'HEX'), ('id', 'HEX')])])" 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\"'</code>]</td>
</tr>
- <tr id="grammar-production-NIL" data-grammar-original="[160s] NIL ::= "(" WS* ")"" data-grammar-expression="(',', [("'", '('), ('*', ('id', 'WS')), ("'", ')')])" 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="('|', [('#', '#x20'), ('#', '#x9'), ('#', '#xD'), ('#', '#xA')])" 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| '_'" data-grammar-expression="('|', [('id', 'PN_CHARS_BASE'), ("'", '_')])" 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 | "." )* PN_CHARS )?" data-grammar-expression="(',', [('id', 'PN_CHARS_BASE'), ('?', (',', [('*', ('|', [('id', 'PN_CHARS'), ("'", '.')])), ('id', 'PN_CHARS')]))])" class='grammar-token'>
<td>[167s]</td>