Hi Qihong,

In addition to Andy's explanation, You might take look at this
tutorial for more details on javacc lookahead:
https://javacc.java.net/doc/lookahead.html


Best regards,
Ying Jiang

On Mon, Jun 15, 2015 at 10:42 PM, Andy Seaborne <a...@apache.org> wrote:
> 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
>>
>

Reply via email to