- From: Arjohn Kampman <arjohn.kampman@aduna.biz>
- Date: Mon, 02 May 2005 16:01:53 +0200
- To: public-rdf-dawg-comments@w3.org
Some comments on the SPARQL grammar as included in "SPARQL Query Language for RDF", rev 1.327 (2005/04/29). Comments on the grammar are based on the assumption that an LALR-grammars [1] are pretty much ideal. [1] http://en.wikipedia.org/wiki/LALR_parser * Rule [1] seems too liberal: it doesn't make clear which clauses are allowed for which query types. For example, it allows a LIMIT-clause without a WHERE-clause and an ORDER BY-clause in combination with an AKS or DESCRIBE query. Also, it no longer allows ASK-queries without WHERE-clauses in the way that they are described in the text. [1] Query ::= Prolog ( SelectClause | ConstructClause | DescribeClause | AskClause ) DatasetClause ( WhereClause )? ( OrderClause )? ( LimitClause )? ( OffsetClause )? It would be clearer to split this single rule into multiple rules, one for each query type, e.g.: Query ::= Prolog ( SelectQuery | ConstructQuery | DescribeQuery | AskQuery ) SelectQuery ::= SelectClause DatasetClause ( WhereClause (OrderClause)? (LimitClause)? (OffsetClause)? )? ConstructQuery ::= ConstructClause DatasetClause ( WhereClause (OrderClause)? (LimitClause)? (OffsetClause)? )? DescribeQuery ::= DescribeClause DatasetClause (WhereClause)? AskQuery ::= AskClause DatasetClause GroupGraphPattern * Rules [5] and [6] have unnecessary large lookaheads. [5] SelectClause ::= 'SELECT' ( 'DISTINCT' )? ( Var )+ | 'SELECT' ( 'DISTINCT' )? '*' [6] DescribeClause ::= 'DESCRIBE' ( VarOrURI )+ | 'DESCRIBE' '*' LALR-alternatives: SelectClause ::= 'SELECT' ('DISTINCT')? ( (Var)+ | '*' ) DescribeClause ::= 'DESCRIBE' ( (VarOrURI)+ | '*' ) * Rules [9] - [11] are not parseable without a lookahead > 1. [9] DatasetClause ::= ( DefaultGraphClause )? ( NamedGraphClause )* [10] DefaultGraphClause ::= 'FROM' SourceSelector [11] NamedGraphClause ::= 'FROM' 'NAMED' SourceSelector So far, I have been unable come up with LALR-compatible alternative for these rules. * I find rules [19] - [27] very hard to read and understand. Also, rule [24] requires an arbitraraly large lookahead for the choice between UnionGraphPattern and GroupGraphPattern. [13] WhereClause ::= 'WHERE' QueryPattern | GroupGraphPattern [19] QueryPattern ::= GraphPatternNotTriples ( '.' )? QueryPatternTail | Triples ( '.' )? ( GraphPatternNotTriples ( '.' )? QueryPatternTail )? [20] QueryPatternTail ::= ( Triples ( '.' )? )? ( GraphPatternNotTriples ( '.' )? QueryPatternTail )? [21] GroupGraphPattern ::= '{' GraphPatternList [22] GraphPatternList ::= ( Triples ( '.' )? )? ( GraphPatternNotTriples ( '.' )? GraphPatternList | '}' ) [23] GraphPattern ::= Triples | GraphPatternNotTriples [24] GraphPatternNotTriples ::= OptionalGraphPattern | UnionGraphPattern | GroupGraphPattern | GraphGraphPattern | Constraint [25] OptionalGraphPattern ::= 'OPTIONAL' GroupGraphPattern [26] GraphGraphPattern ::= 'GRAPH' VarOrBNodeOrURI GroupGraphPattern [27] UnionGraphPattern ::= GroupGraphPattern ( 'UNION' GroupGraphPattern )* I attempted to rewrite these rules and believe the following rules are equivalent (or at least come very close): WhereClause ::= 'WHERE' GraphPattern | GroupGraphPattern GraphPattern ::= GraphPatternElem ('.')? (GraphPattern)? GraphPatternElem ::= Triples | 'OPTIONAL' GroupGraphPattern | 'GRAPH' VarOrBNodeOrURI GroupGraphPattern | GroupGraphPattern ( 'UNION' GroupGraphPattern )* | Constraint GroupGraphPattern ::= '{' GraphPattern '}' * I find the definition of rules [32], [34] and [36] with their completely optional productions a bit awkward. [31] Triples1 ::= VarOrTerm PropertyListNotEmpty | TriplesNode PropertyList [32] PropertyList ::= ( PropertyListNotEmpty )? [33] PropertyListNotEmpty ::= Verb ObjectList PropertyListTail [34] PropertyListTail ::= ( ';' PropertyList )? [35] ObjectList ::= Object ObjectTail [36] ObjectTail ::= ( ',' ObjectList )? [40] BlankNodePropertyList ::= '[' PropertyList ']' IMHO, moving the optionality or even the entire production to the enclosing rules improves the readability of the grammar: Triples1 ::= VarOrTerm PropertyList | TriplesNode PropertyList? PropertyList ::= Verb ObjectList ( ';' PropertyList? )? ObjectList ::= Object ( ',' Object )* BlankNodePropertyList ::= '[' PropertyList? ']' Hope you can include these suggestions in the gramamr, Arjohn -- arjohn.kampman@aduna.biz Aduna BV - http://aduna.biz/ Prinses Julianaplein 14-b, 3817 CS Amersfoort, The Netherlands tel. +31-(0)33-4659987
Received on Monday, 2 May 2005 14:01:56 UTC