Simple way to do BGPs // ---- Works. // Treats Constraint like any other not triple pattern // which it syntactically is. But it forms part of the BGP. void GraphPattern(ElementGroup elg) : { Element el = null ; } { BasicGraphPatternTP(elg) ( If anything, loop and try for more. ( Extends the BasicGraphPattern el = Constraint() { elg.addElement(el) ; } | el = GraphPatternNotTriples() { elg.addElement(el) ; } ) ()? GraphPattern(elg) )? } // Swallow trailing DOT. May be empty void BasicGraphPatternTP(ElementGroup elg) : { } { ( TriplesSameSubject(elg) ( (TriplesSameSubject(elg))?)* )? } -------------- With trailing dots // | // // #NCCHAR // <#NCCHAR: ( | "_" | "-" | "." | ["0"-"9"] | "\u00B7" | // ["\u0300"-"\u036F"] | ["\u203F"-"\u2040"] ) > // | // // NCNAME but no leading "_" // <#NCNAME_PREFIX: ()* > // | // // With a leading "_" // <#NCNAME: ("_"|) ()*> --------------------------- // June 28 DAWG grammar // Notes for the tail form: // javacc will not know that RBRACE is always the terminating token. // This confuses GroupOrUnionPattern Element GroupGraphPattern() : {} { { ElementGroup elg = new ElementGroup() ; } GraphPattern(elg) {return elg ; } } void GraphPattern(ElementGroup elg) : { Element el = null ; } { (Triples(elg) ()? )? ( el = GraphPatternNotTriples() { elg.addElement(el) ; } ()? GraphPattern(elg) )? } // ----------------------------------------------- // Version in which DOT is NOT optional after a triples, // if anything else occurs. Element GroupGraphPattern() : {} { { ElementGroup elg = new ElementGroup() ; } GroupGraphPatternTail(elg) { return elg ; } } // Does not end in a DOT void GroupGraphPatternTail(ElementGroup elg) : { Element el = null ;} { ( Triples1(elg) // ( el = GraphPatternNotTriples() { elg.addElement(el) ; } // GroupGraphPatternTail(elg) // | GroupGraphPatternTail(elg) // )? // Fixed DOT after triples if there is more ( GroupGraphPatternTail(elg) )? | el = GraphPatternNotTriples() { elg.addElement(el) ; } GroupGraphPatternTail(elg) )? } // Bare patterns // ----------------------------------------------- void WhereClause() : { Element el ; } { LOOKAHEAD(2) el = QueryPattern() { getQuery().setQueryElement(el) ; } | el = GroupGraphPattern() { getQuery().setQueryElement(el) ; } } . . . . Element QueryPattern() : { Element el ; } { // el = GroupGraphPattern() { return el ; } { ElementGroup elg = new ElementGroup() ; } ( el = GraphPatternNotTriples() { elg.addElement(el) ; } ()? QueryPatternTail(elg) | Triples(elg) ()? ( el = GraphPatternNotTriples() { elg.addElement(el) ; } ()? QueryPatternTail(elg) )? ) { return compressGroupOfOneGroup(elg) ; } }