Finalizing the TriG grammar

Here is a proposal for the final TriG grammar for discussion.

It's taken from the earlier discussions here, cleaned up, converted to 
javacc for checking, and still needs refinement.

Graph labels can be blank nodes, where the blank node is just a blank 
node, not a compound as in (1 2 3) or [:p 123 ]

---------------------------
trigDoc    :=
    ( directive | block )*

block :=
     triplesOrGraph
   | wrappedGraph
   | triples2
   | [Gg][Rr][Aa][Pp][Hh] ( iri | BlankNode ) wrappedGraph

triplesOrGraph :=
   ( iri | BlankNode ) ( wrappedGraph | predicateObjectList '.' )

triples2 :=
   ( blankNodePropertyList | collection ) predicateObjectList? '.'

wrappedGraph :=
   '{' triplesBlock '}'

triplesBlock :=
   triples ( '.' triplesBlock? )?
---------------------------

Notes:

0/ Intelligibility of the grammar matters.

1/ Triples in a bare default graph section must end with a '.' yet 
inside { } the final '.' is optional.

This is due to labelled graphs without GRAPH keyword.

i.e. allowing

:s :p :o
:g { :s1 :p :o1 }

without allowing
:s :p :o
:s1 :p1 :o1

This should be fixable and stay within the single token lookahead 
grammar classes; in the process though, it may create a complicated 
grammar and deviate more from Turtle.

It would mean that a Turtle document can not be simply extracted from a 
TriG document by looking for the bare triples.

Thoughts and comments?

2/ Example below of a document that should parse

3/ (), which is rdf:nil written funny, is not legal as a graph label.

 Andy




----------------------------------
@prefix : <http://example/> .

:s1 :p1 :o .
:s1 :p2 :o .

{ :s3 :p :o .
   :s4 :p :o .}

{ :s5 :p :o .
   :s6 :p :o }

:s1 :p1 :o .
:s1 :p2 :o .

GRAPH :g  { :s :p :o }
GRAPH _:a { :s :p :o }
GRAPH []  { :s :p :o }

:g  { :s :p :o }
_:a { :s :p :o }
[]  { :s :p "THAT'S ALL FOLKS" }

Received on Thursday, 29 August 2013 13:25:50 UTC