/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2007.
*
* Licensed under the Aduna BSD-style license.
*/
/*
* SPARQL+ JJTree input file for JavaCC, a Java Compiler Compiler. JavaCC can be
* downloaded from https://javacc.dev.java.net/
*
* author: Arjohn Kampman
*/
options {
MULTI=true;
VISITOR=true;
VISITOR_EXCEPTION="VisitorException";
STATIC=false;
UNICODE_INPUT=true;
JAVA_UNICODE_ESCAPE=true; // pre-process unicode escapes, see section A.2 of spec
}
PARSER_BEGIN(SyntaxTreeBuilder)
package org.openrdf.query.parser.sparqlplus.ast;
import java.io.StringReader;
import org.openrdf.model.URI;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.model.vocabulary.XMLSchema;
import org.openrdf.query.algebra.Compare.CompareOp;
import org.openrdf.query.algebra.MathExpr.MathOp;
public class SyntaxTreeBuilder {
/**
* Parses the supplied SPARQL+ query and builds a syntax tree from it.
*
* @param query A SPARQL query string.
* @return The root of the syntax tree.
* @throws TokenMgrError If the query was syntactically incorrect.
* @throws ParseException If the query was syntactically incorrect.
*/
public static ASTQueryContainer parseQuery(String query)
throws TokenMgrError, ParseException
{
SyntaxTreeBuilder stb = new SyntaxTreeBuilder( new StringReader(query) );
return stb.QueryContainer();
}
/**
* Trims n character from the start and end of the supplied string.
*/
private static String _trimString(String s, int n) {
if (s.length() >= 2) {
s = s.substring(n, s.length() - n);
}
return s;
}
}
PARSER_END(SyntaxTreeBuilder)
//
// tokens
//
TOKEN :
{
// Whitespace characters
<#WS_CHAR: " " | "\t" | "\n" | "\r" | "\f">
}
SKIP :
{
>
}
SPECIAL_TOKEN :
{
}
// Special characters
TOKEN :
{
|
|
|
|
|
|
|
|
|
|
| ">
|
|
| =">
|
|
|
|
|
|
|
|
| ()* >
| ()* >
}
TOKEN :
{
// Note: case-sensitive!
}
TOKEN [IGNORE_CASE] :
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
TOKEN:
{
", "\"", "{", "}", "|", "^", "`", "\\", "\u0000"-"\u0020"])* ">">
| )? ":">
| )? ":" > // Note: PN_LOCAL not optional, case handled by PNAME_NS
| >
| >
| >
| )+ ("-" (|)+)*>
| )+>
| >
| >
| |)>
| <#DECIMAL1: ()+ "." ()*>
| <#DECIMAL2: "." ()+>
| >
| >
| ||)>
| <#DOUBLE1: ()+ "." ()* >
| <#DOUBLE2: "." ()+ >
| <#DOUBLE3: ()+ >
| <#EXPONENT: ["e","E"] (["+","-"])? ()+>
| >
| >
| |)* "'">
| |)* "\"">
| |) )* "'''">
| |) )* "\"\"\"">
| <#SAFE_CHAR1: (~["'", "\\", "\r", "\n"])>
| <#SAFE_CHAR2: (~["\"", "\\", "\r", "\n"])>
| <#SAFE_CHAR_LONG1: (~["'","\\"])>
| <#SAFE_CHAR_LONG2: (~["\"","\\"])>
| <#ECHAR: "\\" ["t", "b", "n", "r", "f", "\\", "\"", "'"]>
| <#HEX: ["0"-"9"] | ["A"-"F"] | ["a"-"f"]>
| <#ALPHA: ["a"-"z","A"-"Z"]>
| <#NUM: ["0"-"9"]>
}
TOKEN:
{
<#PN_CHARS_BASE:
| ["\u00C0"-"\u00D6"] | ["\u00D8"-"\u00F6"] | ["\u00F8"-"\u02FF"] | ["\u0370"-"\u037D"]
| ["\u037F"-"\u1FFF"] | ["\u200C"-"\u200D"] | ["\u2070"-"\u218F"] | ["\u2C00"-"\u2FEF"]
| ["\u3001"-"\uD7FF"] | ["\uF900"-"\uFDCF"] | ["\uFDF0"-"\uFFFD"]
// | ["\u10000"-"\uEFFFF"] FIXME: JavaCC/Java can't handle this?
>
| <#PN_CHARS_U: | "_">
| <#PN_START_CHAR: | >
| <#VAR_CHAR: | "\u00B7" | ["\u0300"-"\u036F"] | ["\u203F"-"\u2040"]>
| <#PN_END_CHAR: | "-">
| <#PN_CHAR: | ".">
| <#PN_PREFIX: ( ()* )?>
| <#PN_LOCAL: ( ()* )?>
| <#VARNAME: ()*>
}
//
// grammar
//
ASTQueryContainer QueryContainer():
{}
{
Prolog() Query()
{ return jjtThis; }
}
void Prolog() #void :
{}
{
[ BaseDecl() ] ( PrefixDecl() )*
}
void BaseDecl() :
{ Token t; }
{
t = {jjtThis.setIRI(_trimString(t.image, 1));}
}
void PrefixDecl() :
{ Token prefix; }
{
prefix = IRI()
{
// Remove trailing colon from prefix
String prefixStr = prefix.image;
prefixStr = prefixStr.substring(0, prefixStr.length() - 1);
jjtThis.setPrefix(prefixStr);
}
}
void Query() #void :
{}
{
SelectQuery()
| ConstructQuery()
| DescribeQuery()
| AskQuery()
}
void SelectQuery() :
{}
{
Select()
( DatasetClause() )*
WhereClause()
[ OrderClause() ]
[ LimitOffsetClauses() ]
}
void Select() :
{}
{