rql-parser.jj
来自「这是外国一个开源推理机」· JJ 代码 · 共 1,312 行 · 第 1/3 页
JJ
1,312 行
/* Sesame - Storage and Querying architecture for RDF and RDF Schema * Copyright (C) 2001-2004 Aduna * * Contact: * Aduna * Prinses Julianaplein 14 b * 3817 CS Amersfoort * The Netherlands * tel. +33 (0)33 465 99 87 * fax. +33 (0)33 465 99 87 * * http://aduna.biz/ * http://www.openrdf.org/ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *//* * RQL parser file for JavaCC, a Java Compiler Compiler. JavaCC can be * downloaded from https://javacc.dev.java.net/ */options { STATIC=false; IGNORE_CASE=true;}PARSER_BEGIN(RqlParser)package org.openrdf.sesame.query.rql.parser;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.openrdf.sesame.query.rql.model.And;import org.openrdf.sesame.query.rql.model.ArraySelection;import org.openrdf.sesame.query.rql.model.BooleanConstant;import org.openrdf.sesame.query.rql.model.BooleanQuery;import org.openrdf.sesame.query.rql.model.ClassQuery;import org.openrdf.sesame.query.rql.model.ClassSelector;import org.openrdf.sesame.query.rql.model.ClassVar;import org.openrdf.sesame.query.rql.model.CompareTo;import org.openrdf.sesame.query.rql.model.Constant;import org.openrdf.sesame.query.rql.model.DataPathSelector;import org.openrdf.sesame.query.rql.model.DataQuery;import org.openrdf.sesame.query.rql.model.DataVar;import org.openrdf.sesame.query.rql.model.Domain;import org.openrdf.sesame.query.rql.model.DomainSelector;import org.openrdf.sesame.query.rql.model.Exists;import org.openrdf.sesame.query.rql.model.Forall;import org.openrdf.sesame.query.rql.model.In;import org.openrdf.sesame.query.rql.model.InstanceOf;import org.openrdf.sesame.query.rql.model.InstanceSelector;import org.openrdf.sesame.query.rql.model.IntegerConstant;import org.openrdf.sesame.query.rql.model.Intersect;import org.openrdf.sesame.query.rql.model.Like;import org.openrdf.sesame.query.rql.model.Minus;import org.openrdf.sesame.query.rql.model.Not;import org.openrdf.sesame.query.rql.model.Or;import org.openrdf.sesame.query.rql.model.PropertyQuery;import org.openrdf.sesame.query.rql.model.PropertySelector;import org.openrdf.sesame.query.rql.model.PropertyVar;import org.openrdf.sesame.query.rql.model.Query;import org.openrdf.sesame.query.rql.model.Range;import org.openrdf.sesame.query.rql.model.RangeSelector;import org.openrdf.sesame.query.rql.model.RdfProperty;import org.openrdf.sesame.query.rql.model.RdfsClass;import org.openrdf.sesame.query.rql.model.RealConstant;import org.openrdf.sesame.query.rql.model.ResourceQuery;import org.openrdf.sesame.query.rql.model.SetQuery;import org.openrdf.sesame.query.rql.model.SfwQuery;import org.openrdf.sesame.query.rql.model.StringConstant;import org.openrdf.sesame.query.rql.model.SubClassOf;import org.openrdf.sesame.query.rql.model.SubPropertyOf;import org.openrdf.sesame.query.rql.model.SuperClassOf;import org.openrdf.sesame.query.rql.model.SuperPropertyOf;import org.openrdf.sesame.query.rql.model.TypeOf;import org.openrdf.sesame.query.rql.model.URI;import org.openrdf.sesame.query.rql.model.Union;import org.openrdf.sesame.query.rql.model.UnknownSelector;import org.openrdf.sesame.query.rql.model.Var;public class RqlParser { protected Map _varMap = new HashMap(); protected List _varList = new ArrayList(); protected List _unboundVarList = new ArrayList(); public Var getSharedVar(String name) { Var result = (Var)_varMap.get(name); if (result == null) { // Create a new Var if (name.startsWith("$")) {//System.out.println("Creating new ClassVar: " + name); result = new ClassVar(name); } else if (name.startsWith("@")) {//System.out.println("Creating new PropertyVar: " + name); result = new PropertyVar(name); } else {//System.out.println("Creating new DataVar: " + name); result = new DataVar(name); } _varMap.put(name, result); _varList.add(result); _unboundVarList.add(result); } return result; } public List getVarList() { return _varList; } public void clearVars() { _varMap.clear(); _varList = new ArrayList(); } private int _varNo = 1; public String getAnonymousVarName() { return "_" + _varNo++; } /** namespaces **/ protected Map _nsMap = new HashMap(); public void addNamespace(String prefix, String namespace) { _nsMap.put(prefix, namespace); } public String getNamespace(String prefix) { return (String)_nsMap.get(prefix); } // non-public "struct" static class FromTo { DataVar dataVar; ClassQuery classQ; }} // end class RqlParserPARSER_END(RqlParser)SKIP :{ " "| "\t"| "\n"| "\r"}TOKEN : /* OPERATOR */{ <LT: "<">| <LE: "<=">| <EQ: "=">| <GE: ">=">| <GT: ">">| <NE: "!=">}TOKEN : /* SPECIAL CHARS */{ <AMP: "&">| <LPAREN: "(">| <RPAREN: ")">| <LBRACE: "{">| <RBRACE: "}">| <LBRACKET: "[">| <RBRACKET: "]">| <ASTERISK: "*">| <COMMA: ",">| <DOT: ".">| <COLON: ":">| <QUOTE: "'">| <DOUBLEQUOTE: "\"">| <CIRCUMFLEX: "^">}TOKEN : // keywords{ <SELECT: "select">| <FROM: "from">| <WHERE: "where">| <USING: "using">| <NAMESPACE: "namespace">| <CLASS: "Class">| <PROPERTY: "Property">| <TYPEOF: "typeOf">| <SUBCLASSOF: "subClassOf">| <SUPERCLASSOF: "superClassOf">| <SUBPROPERTYOF: "subPropertyOf">| <SUPERPROPERTYOF: "superPropertyOf">| <DOMAIN: "domain">| <RANGE: "range">| <TRUE: "true">| <FALSE: "false">| <AND: "and">| <OR: "or">| <NOT: "not">| <LIKE: "like">| <EXISTS: "exists">| <FORALL: "forall">| <IN: "in">| <UNION: "union">| <INTERSECT: "intersect">| <MINUS: "minus">| <NULL: "null">}TOKEN:{ <IDENTIFIER: (<ALPHA>|"_") (<ALPHA>|<DIGIT>|"-"|"_"|".")*>| <CLASSVAR: "$" <IDENTIFIER>>| <PROPERTYVAR: "@" <IDENTIFIER>>| <INTEGER_LITERAL: (<DIGIT>)+>| <REAL_LITERAL: (<DIGIT>)* "." (<DIGIT>)+>| <QUOTED_STRING: "\"" (~["\""])* "\"">| <QUOTED_CHAR: "'" (~["'"]) "'">| <#ALPHA: ["a"-"z", "A"-"Z"]>| <#DIGIT: ["0"-"9"]>}// See RFC2396 : http://www.ietf.org/rfc/rfc2396.txt// FIXME: non-ascii chars not supported yetTOKEN : // URI{ <URI: <SCHEME> ":" (<UCHAR>|<RESERVED>)* ("#" (<FRAGMENT>)?)?>| <#SCHEME: (<ALPHA>|<DIGIT>|"+"|"-"|".")+>| <#FRAGMENT: (<UCHAR>|<RESERVED>)+>| <#UCHAR: (<UNRESERVED>|<ESCAPE>)>| <#UNRESERVED: (<ALPHA>|<DIGIT>|<SAFE>|<EXTRA>)>| <#ESCAPE: "%" <HEX> <HEX>>| <#RESERVED: (";"|"/"|"?"|":"|"@"|"&"|"="|"+")>| <#EXTRA: ("!"|"*"|<QUOTE>|"("|")"|",")>| <#SAFE: ("$"|"-"|"_"|"."|"~")>| <#HEX: (["A"-"F", "a"-"f"] | <DIGIT>)>}Query parse() :{ Query q; // (re)set _varNo to '1'. _varNo = 1;}{ { clearVars(); } ( <USING> <NAMESPACE> namespace() ("," namespace())* )? q = query() <EOF> { if (_unboundVarList.size() > 0) { String msg = "Unbound variable(s): "; for (int i = 0; i < _unboundVarList.size(); i++) { Var var = (Var)_unboundVarList.get(i); if (i > 0) { msg += ", "; } msg += var.getName(); } throw new ParseException(msg); } return q; }}/*-------------------------------------------------+| NAMESPACE DECLARATIONS |+-------------------------------------------------*/void namespace() :{ Token prefixToken, nsToken;}{ prefixToken = <IDENTIFIER> "=" nsToken = <URI> { String prefix = prefixToken.image; String ns = nsToken.image; //FIXME: check if prefix isn't used twice? addNamespace(prefix, ns); }}/*-------------------------------------------------+| QUERY |+-------------------------------------------------*/Query query() :{ Query q;}{ q = sfw_query() { return q; }| q = uri() { return q; }| q = data_query() { return q; }| q = class_query() { return q; }| q = property_query() { return q; }| q = set_query() { return q; }/*| constant()*/}/*-------------------------------------------------+| VARIABLES |+-------------------------------------------------*/Var var() :{ Var v;}{ v = datavar() {return v;}| v = classvar() {return v;}| v = propertyvar() {return v;}}DataVar datavar() :{ Token t;}{ t = <IDENTIFIER> {return (DataVar)getSharedVar(t.image);}}ClassVar classvar() :{ Token t;}{ t = <CLASSVAR> {return (ClassVar)getSharedVar(t.image);}}PropertyVar propertyvar() :{ Token t;}{ t = <PROPERTYVAR> {return (PropertyVar)getSharedVar(t.image);}}/*-------------------------------------------------+| URI's |+-------------------------------------------------*/URI uri() :{ Token t;}{ t = <URI> { String uriString = t.image; int colonIdx = uriString.indexOf(':'); if (colonIdx != -1) { String prefix = uriString.substring(0, colonIdx); String namespace = getNamespace(prefix); if (namespace != null) { uriString = namespace + uriString.substring(colonIdx + 1); } } return new URI(uriString); }}/*-------------------------------------------------+| SFW QUERY |+-------------------------------------------------*/ResourceQuery sfw_query() :{ List projsList = new ArrayList(); List rangesList = new ArrayList(); BooleanQuery where = null;}{ <SELECT> projslist(projsList) <FROM> rangeslist(rangesList) ( <WHERE> where = boolean_query() )? { if (projsList.isEmpty()) { // select * projsList = getVarList(); } return new SfwQuery(projsList, rangesList, where); }}void projslist(List projsList) :{ ResourceQuery q;}{ <ASTERISK>| q = projs_elem() { projsList.add(q); } ( <COMMA> q = projs_elem() { projsList.add(q); } )*}ResourceQuery projs_elem() :{ ResourceQuery q;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?