Qihong,
There is an ambiguity in the grammar if you make <GRAPH> optional.
See rule 'Quads'
Consider these two cases:
:s :p :o .
:z { :s1 :p1 :o1 } .
:s :p :o .
:z :q :o2 .
when the parser get to end of the triple in the default graph:
:s :p :o .
there are two ways forward: more triples (TriplesTemplate) and end of
the triples part, start of named graph.
It looks ahead one token and see :z and needs to decide whether the next
rule is more triples, the ":z :q :o2 ." case, or the end of the triples
for the default graph and the start of a named graph the ":z { :s1 :p1
:o1 } ." where it exists TriplesTemplate and moves on to QuadsNotTriples
If <GRAPH> then the entry to QuadsNotTriples is marked by a <GRAPH>
which is never in triples.
The grammar is LL(1) - a lookahead of 1 - by default.
There are two solutions (I haven't checked exact deatils):
1/ Use LOOKAHEAD(2) so it sees tokens ':z' and ':q' or ':z' (triples)
and '{' which is the named graphs case. I think this is in "Quads"
somewhere.
2/ Leave <GRAPH> required.
(2) is fine for now - it will not be too unexpected to users because
INSERT DATA requires a GRAPH and it is legal TriG, even if not the short
form in TriG.
You can come back and look at (1) later. I'm keen for you to get
something going as soon as possible, not get lost in details.
------------------------
Background:
There is a third solution but it's not as so simple which is to
introduce an intermediate state of "MaybeTriplesMaybeQuads" but if you
do that, more of the grammar needs rewriting. I'm not sure how
widespread the changes would be.
Jena's TriG parser (which is not JavaCC based see
LangTriG::oneNamedGraphBlock2)
has this comment:
// Either :s :p :o or :g { ... }
and does one look ahead to get the :s or :g (the :z above), keeps that
hanging around, does another lookahead to see '{' or not, then calls
turtle(n) if triples.
In LangTriG:
turtle() is roughly TriplesSameSubject
turtle(n) is roughly PropertyListNotEmpty
Andy
On 15/06/15 11:53, Qihong Lin wrote:
Hi,
I'm trying to play with master.jj. But the grammar script somethings
prints warning messages. The behavior is strange. In order to simplify
my question, I'd like to take the following example:
In QuadsNotTriples(), line 691 in master.jj, in the "master" branch:
----
<GRAPH>
----
If I change it to "optional" (which is required in future
implementations, for the new grammar):
----
(<GRAPH>)?
----
the grammar script goes like this:
$ ./grammar
---- Process grammar -- sparql_11.jj
Java Compiler Compiler Version 5.0 (Parser Generator)
(type "javacc" with no arguments for help)
Reading from file sparql_11.jj . . .
Warning: Choice conflict in [...] construct at line 464, column 4.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <VAR1>
Consider using a lookahead of 2 or more for nested expansion.
Warning: Choice conflict in [...] construct at line 468, column 6.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <VAR1>
Consider using a lookahead of 2 or more for nested expansion.
Warning: Choice conflict in [...] construct at line 484, column 12.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <VAR1>
Consider using a lookahead of 2 or more for nested expansion.
Warning: Choice conflict in [...] construct at line 759, column 3.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <VAR1>
Consider using a lookahead of 2 or more for nested expansion.
Warning: Choice conflict in [...] construct at line 767, column 5.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <VAR1>
Consider using a lookahead of 2 or more for nested expansion.
File "TokenMgrError.java" does not exist. Will create one.
File "ParseException.java" does not exist. Will create one.
File "Token.java" does not exist. Will create one.
File "JavaCharStream.java" does not exist. Will create one.
Parser generated with 0 errors and 5 warnings.
---- Create text form
Java Compiler Compiler Version 5.0 (Documentation Generator Version 0.1.4)
(type "jjdoc" with no arguments for help)
Reading from file sparql_11.jj . . .
Grammar documentation generated successfully in sparql_11.txt
---- Fixing Java warnings in TokenManager ...
---- Fixing Java warnings in Token ...
---- Fixing Java warnings in TokenMgrError ...
---- Fixing Java warnings in SPARQLParser11 ...
---- Done
---- Process grammar -- arq.jj
Java Compiler Compiler Version 5.0 (Parser Generator)
(type "javacc" with no arguments for help)
Reading from file arq.jj . . .
Warning: Choice conflict in [...] construct at line 486, column 4.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <VAR1>
Consider using a lookahead of 2 or more for nested expansion.
Warning: Choice conflict in [...] construct at line 490, column 6.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <VAR1>
Consider using a lookahead of 2 or more for nested expansion.
Warning: Choice conflict in [...] construct at line 811, column 3.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <VAR1>
Consider using a lookahead of 2 or more for nested expansion.
Warning: Choice conflict in [...] construct at line 819, column 5.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <VAR1>
Consider using a lookahead of 2 or more for nested expansion.
File "TokenMgrError.java" does not exist. Will create one.
File "ParseException.java" does not exist. Will create one.
File "Token.java" does not exist. Will create one.
File "JavaCharStream.java" does not exist. Will create one.
Parser generated with 0 errors and 4 warnings.
---- Create text form
Java Compiler Compiler Version 5.0 (Documentation Generator Version 0.1.4)
(type "jjdoc" with no arguments for help)
Reading from file arq.jj . . .
Grammar documentation generated successfully in arq.txt
---- Fixing Java warnings in TokenManager ...
---- Fixing Java warnings in Token ...
---- Fixing Java warnings in TokenMgrError ...
---- Fixing Java warnings in ARQParser ...
---- Done
But I can see "(<WHERE>)?" at line 339 without any trouble. Could you
please tell me why?
regards,
Qihong