}
@Override
protected final Quad parseOne()
{
Token sToken = nextToken() ;
if ( sToken.getType() == TokenType.EOF )
exception(sToken, "Premature end of file: %s", sToken) ;
Token pToken = nextToken() ;
if ( pToken.getType() == TokenType.EOF )
exception(pToken, "Premature end of file: %s", pToken) ;
Token oToken = nextToken() ;
if ( oToken.getType() == TokenType.EOF )
exception(oToken, "Premature end of file: %s", oToken) ;
Token xToken = nextToken() ; // Maybe DOT
if ( xToken.getType() == TokenType.EOF )
exception(xToken, "Premature end of file: Quad not terminated by DOT: %s", xToken) ;
// Process graph node first, before S,P,O
// to set bnode label scope (if not global)
Node c = null ;
if ( xToken.getType() != TokenType.DOT )
{
// Allow bNodes for graph names.
checkIRIOrBNode(xToken) ;
// Allow only IRIs
//checkIRI(xToken) ;
c = tokenAsNode(xToken) ;
xToken = nextToken() ;
currentGraph = c ;
}
else
{
c = Quad.defaultGraphNodeGenerated ;
currentGraph = null ;
}
// createQuad may also check but these checks are cheap and do form syntax errors.
checkIRIOrBNode(sToken) ;
checkIRI(pToken) ;
checkRDFTerm(oToken) ;
// xToken already checked.
Node s = tokenAsNode(sToken) ;
Node p = tokenAsNode(pToken) ;
Node o = tokenAsNode(oToken) ;
// Check end of tuple.
if ( xToken.getType() != TokenType.DOT )
exception(xToken, "Quad not terminated by DOT: %s", xToken) ;
return profile.createQuad(c, s, p, o, sToken.getLine(), sToken.getColumn()) ;
}