/* * 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() : {} {