W3C home > Mailing lists > Public > public-rdf-wg@w3.org > July 2013

Re: ACTION-278: grammar for TriG

From: Gregg Kellogg <gregg@greggkellogg.net>
Date: Sun, 7 Jul 2013 22:33:04 -0600
Cc: Andy Seaborne <andy@apache.org>, RDF WG <public-rdf-wg@w3.org>
Message-Id: <2E5E96B4-5EB8-4CD5-8AA1-62F981542ADF@greggkellogg.net>
To: Eric Prud'hommeaux <eric@w3.org>
On Jul 7, 2013, at 10:27 PM, Eric Prud'hommeaux <eric@w3.org> wrote:

> * Gregg Kellogg <gregg@greggkellogg.net> [2013-07-07 15:22-0600]
>> 
>> Gregg Kellogg
>> gregg@greggkellogg.net
>> 
>> On Jul 6, 2013, at 4:49 PM, Eric Prud'hommeaux <eric@w3.org> wrote:
>> 
>>> https://www.w3.org/2011/rdf-wg/track/actions/278 says
>>> [[
>>> Create new grammar for TriG that includes optional graph keywords and
>>> make {} optional around the default graph
>>> ]]
>>> 
>>> I followed Sandro's lead and replaced
>>> [[
>>> [1] 	turtleDoc 	::= 	statement*
>>> [2] 	statement 	::= 	directive | triples '.'
>>> ]]
>>> with:
>>> [[
>>> trigDoc           ::= statement*
>>> statement         ::= directive | tripleOrBareGraph | graphword | wrappedDefault
>>> tripleOrBareGraph ::= (iri | BlankNode | collection | BlankNodePropertyList) ('{' TriplesTemplate '}' | PropertyListNotEmpty '.')
>>> graphword         ::= "GRAPH" (iri | BlankNode) '{' TriplesTemplate '}'
>>> wrappedDefault    ::= '{' TriplesTemplate '}'
>>> ]].
>>> This permits docs like:
>>> [[
>>> PREFIX p: <ns>
>>> @prefix p: <ns> .
>>> <s> <p> <o> .
>>> { <s> <p> <o> }
>>> <g> { <s> <p> <o> }
>>> GRAPH <g> { <s> <p> <o> }
>>> _:g { <s> <p> <o> }
>>> GRAPH _:g { <s> <p> <o> }
>>> ]].
>>> 
>>> 
>>> We can be conservative or liberal about what can go the the graph name
>>> position:
>>> [[
>>> tripleOrBareGraph ::= (iri | BlankNode) ('{' TriplesTemplate '}' | PropertyListNotEmpty '.')
>>>                   | collection PropertyListNotEmpty '.'
>>>                   | BlankNodePropertyList PropertyListNotEmpty? '.'
>>> [[
>>> or more liberal:
>>> [[
>>> tripleOrBareGraph ::= (iri | BlankNode | collection | BlankNodePropertyList) ('{' TriplesTemplate '}' | PropertyListNotEmpty '.')
>>> ]]
>>> which permits bnodes from collections and property lists like:
>>> [[
>>> (1 2 3) { <s> <p> <o> }
>>> [ <p> <o> ] { <s> <p> <o> }
>>> ]].
>>> I prefer the latter as it encourages the good practice of making
>>> assertions about labeled graphs, e.g.
>>> [[
>>> [ :utteredBy "Bob" ] { <moon> <madeOf> <greenCheese> }
>>> ]]
>> 
>> A problem with this grammar is that it doesn't allow Andy's test trig-turtle-05.trig [1]:
>> 
>> [[
>> # Turtle is TriG
>> prefix : <http://example/> 
>> 
>> [ :p :o ] .
>> ]]
>> 
>> This is because the BlankNodePropertyList matches the first element of tripleOrBarGraph, and it expects to see a PropertyListNotEmpty '.'
>> 
>> SPARQL doesn't suffer from this problem, as a graph name can't be a collection of BlankNodePropertyList.
>> 
>> I find the following version of tripleOrBareGraph works:
>> 
>> [[
>> [3g]   tripleOrBareGraph     ::= (iri | BlankNode) (wrappedDefault | PropertyListNotEmpty '.')
>>                               | (collection | BlankNodePropertyList) (wrappedDefault | PropertyListNotEmpty? '.')
>> 
>> ]]
> 
> agreed. I pass all of Andy's tests with this grammar.

Strictly Speaking, collection should be in the first part, and not the second, as a collection is not legal stand-alone in Turtle, neither should it be in TriG.

Gregg

>> Gregg
>> 
>> [1] https://dvcs.w3.org/hg/rdf/file/1f470c4ebbc0/trig/tests2/trig-turtle-05.trig
>> 
>> 
>>> Following is <http://www.w3.org/2005/01/yacker/uploads/trigS_new>:
>>> 
>>> trigDoc           ::= statement*
>>> statement         ::= directive | tripleOrBareGraph | graphword | wrappedDefault
>>> #tripleOrBareGraph ::= (iri | BlankNode) ('{' TriplesTemplate '}' | PropertyListNotEmpty '.')
>>> #                    | collection PropertyListNotEmpty '.'
>>> #                    | BlankNodePropertyList PropertyListNotEmpty? '.'
>>> tripleOrBareGraph ::= (iri | BlankNode | collection | BlankNodePropertyList) ('{' TriplesTemplate '}' | PropertyListNotEmpty '.')
>>> graphword         ::= "GRAPH" (iri | BlankNode) '{' TriplesTemplate '}'
>>> wrappedDefault    ::= '{' TriplesTemplate '}'
>>> 
>>> [3]     directive                  ::= prefixID | base | sparqlPrefix | sparqlBase
>>> [4]     prefixID                   ::= PREFIX PNAME_NS IRIREF '.'
>>> [5]     base                       ::= BASE IRIREF '.'
>>> [5s]    sparqlBase                 ::= SPARQL_BASE IRIREF
>>> [6s]    sparqlPrefix               ::= SPARQL_PREFIX PNAME_NS IRIREF
>>> [52s]   TriplesTemplate            ::= TriplesSameSubject ( '.' TriplesTemplate? )?
>>> [6]     TriplesSameSubject         ::= subject PropertyListNotEmpty | BlankNodePropertyList PropertyList
>>> [76s]   PropertyList               ::= PropertyListNotEmpty?
>>> [77s]   PropertyListNotEmpty       ::= Verb ObjectList (';' (Verb ObjectList)?)*
>>> [8]     ObjectList                 ::= object (',' object)*
>>> [9]     Verb                       ::= predicate | 'a'
>>> [10]    subject                    ::= iri | BlankNode | collection
>>> [11]    predicate                  ::= iri
>>> [12]    object                     ::= iri | BlankNode | collection | BlankNodePropertyList | literal
>>> [13]    literal                    ::= RDFLiteral | NumericLiteral | BooleanLiteral
>>> [14]    BlankNodePropertyList      ::= '[' PropertyListNotEmpty ']'
>>> [15]    collection                 ::= '(' object* ')'
>>> [16]    NumericLiteral             ::= INTEGER | DECIMAL | DOUBLE
>>> [128s]  RDFLiteral                 ::= String (LANGTAG | '^^' iri)?
>>> [133s]  BooleanLiteral             ::= 'true' | 'false'
>>> [17]    String                     ::= STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2
>>> [135s]  iri                        ::= IRIREF | PrefixedName
>>> [136s]  PrefixedName               ::= PNAME_LN | PNAME_NS
>>> [137s]  BlankNode                  ::= BLANK_NODE_LABEL | ANON
>>> 
>>> @terminals
>>> 
>>> [18]    IRIREF                     ::= '<' ([^#x00-#x20<>\"{}|^`\\] | UCHAR)* '>'
>>> [139s]  PNAME_NS                   ::= PN_PREFIX? ':'
>>> [140s]  PNAME_LN                   ::= PNAME_NS PN_LOCAL
>>> [141s]  BLANK_NODE_LABEL           ::= '_:' (PN_CHARS_U | [0-9]) ((PN_CHARS | '.')* PN_CHARS)?
>>> [0]     GRAPH1                      ::= [Gg][Rr][Aa][Pp][Hh]
>>> [0]     SPARQL_PREFIX              ::= [Pp][Rr][Ee][Ff][Ii][Xx]
>>> [0]     SPARQL_BASE                ::= [Bb][Aa][Ss][Ee]
>>> [0]     BASE                       ::= '@base'
>>> [0]     PREFIX                     ::= '@prefix'
>>> [144s]  LANGTAG                    ::= BASE | PREFIX | '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)*
>>> [19]    INTEGER                    ::= [+-]? [0-9]+
>>> [20]    DECIMAL                    ::= [+-]? [0-9]* '.' [0-9]+
>>> [21]    DOUBLE                     ::= [+-]? ([0-9]+ '.' [0-9]* EXPONENT | '.' [0-9]+ EXPONENT | [0-9]+ EXPONENT)
>>> [154s]  EXPONENT                   ::= [eE] [+-]? [0-9]+
>>> [155s]  STRING_LITERAL1            ::= "'" ([^#x27#x5C#xA#xD] | ECHAR | UCHAR)* "'"
>>> [156s]  STRING_LITERAL2            ::= '"' ([^#x22#x5C#xA#xD] | ECHAR | UCHAR)* '"'
>>> [157s]  STRING_LITERAL_LONG1       ::= "'''" (("'" | "''")? [^'\\] | ECHAR | UCHAR)* "'''"
>>> [158s]  STRING_LITERAL_LONG2       ::= '"""' (('"' | '""')? [^"\\] | ECHAR | UCHAR)* '"""'
>>> [26]    UCHAR                      ::= '\\u' HEX HEX HEX HEX | '\\U' HEX HEX HEX HEX HEX HEX HEX HEX
>>> [159s]  ECHAR                      ::= '\\' [tbnrf\\"']
>>> [161s]  WS                         ::= #x20 | #x9 | #xD | #xA
>>> [162s]  ANON                       ::= '[' WS* ']'
>>> [163s]  PN_CHARS_BASE              ::= [A-Z] | [a-z] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
>>> [164s]  PN_CHARS_U                 ::= PN_CHARS_BASE | '_'
>>> [166s]  PN_CHARS                   ::= PN_CHARS_U | '-' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]
>>> [167s]  PN_PREFIX                  ::= PN_CHARS_BASE ((PN_CHARS | '.')* PN_CHARS)?
>>> [168s]  PN_LOCAL                   ::= (PN_CHARS_U | ':' | [0-9] | PLX) ((PN_CHARS | '.' | ':' | PLX)* (PN_CHARS | ':' | PLX))?
>>> [169s]  PLX                        ::= PERCENT | PN_LOCAL_ESC
>>> [170s]  PERCENT                    ::= '%' HEX HEX
>>> [171s]  HEX                        ::= [0-9] | [A-F] | [a-f]
>>> [172s]  PN_LOCAL_ESC               ::= '\\' ('_' | '~' | '.' | '-' | '!' | '$' | '&' | "'" | '(' | ')' | '*' | '+' | ',' | ';' | '=' | '/' | '?' | '#' | '@' | '%')
>>> 
>>> @pass: [ \t\r\n]+ | '#' [^\r\n]*
>>> 
>>> 
>>> -- 
>>> -ericP
>>> 
>> 
> 
> -- 
> -ericP
Received on Monday, 8 July 2013 04:33:31 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 17:04:30 UTC