/* ---- This file is part of SECONDO. Copyright (C) 2016, University in Hagen, Faculty of Mathematocs and Computer Science, Database Systems for New Applications. SECONDO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. SECONDO 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 General Public License for more details. You should have received a copy of the GNU General Public License along with SECONDO; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---- */ %skeleton "lalr1.cc" /* -*- C++ -*- */ %require "3.0.4" %define parser_class_name {cypher_parser} %output "CypherParser.cpp" %defines "CypherParser.h" %define api.token.constructor %define api.value.type variant %define parse.assert %code requires { #include using namespace std; class CypherLanguage; } // The parsing context. %param { CypherLanguage& driver } %locations %initial-action { // Initialize the initial location. @$.begin.filename = @$.end.filename = &driver.text; }; %define parse.trace %define parse.error verbose %code { #include "CypherLang.h" } %define api.token.prefix {TOK_} %token END 0 "end of file" LNPAREN "(" RNPAREN ")" LEPAREN "[" REPAREN "]" LPPAREN "{" RPPAREN "}" COMMA "," DOT "." OPEQUAL "=" OPNOTEQUALTHAN "<>" OPLESSERTHAN "<" OPBIGGERTHAN ">" MATCH "match" AND STARTS WITH CONTAINS WHERE AS RETURN DASH LEFTDASH RIGHTDASH COLON ; %token IDENTIFIER "identifier" %token STRINGLITERAL %token NUMBER "number" %printer { yyoutput << $$; } <*>; %% %start cypherexpr; cypherexpr: MATCH matchpart RETURN returnpart | MATCH matchpart WHERE wherepart RETURN returnpart ; //------------------------------------- // MATCH PART //------------------------------------- matchpart: matchsinglepath | matchpart COMMA matchsinglepath ; matchsinglepath: matchsinglepath2 { driver.pushMatchPath(); } ; matchsinglepath2: nodepart | nodepart connpart matchsinglepath2 ; nodepart: LNPAREN nodepartinner { driver.pushMatchNode(); } RNPAREN ; nodepartinner: %empty | alias proplist | alias COLON typename proplist | COLON typename proplist ; connpart: DASH edgeinner DASH { driver.matchEdgeDirection=""; driver.pushMatchEdge(); } | LEFTDASH edgeinner DASH { driver.matchEdgeDirection="left"; driver.pushMatchEdge(); } | DASH edgeinner RIGHTDASH { driver.matchEdgeDirection="right"; driver.pushMatchEdge(); } ; edgeinner: %empty | LEPAREN edgealiasname proplist REPAREN ; edgealiasname: alias | alias COLON typename | COLON typename ; alias: IDENTIFIER { driver.matchAlias=$1; } ; typename: IDENTIFIER { driver.matchTypename=$1; } ; proplist: %empty | LPPAREN proplistinner RPPAREN ; proplistinner: proplistinneritem | proplistinneritem COMMA proplistinner; ; proplistinneritem: IDENTIFIER COLON STRINGLITERAL { driver.addMatchProperty($1,"\""+$3+"\""); } | IDENTIFIER COLON NUMBER { driver.addMatchProperty($1,to_string($3)); } ; //------------------------------------- // WHERE PART //------------------------------------- wherepart: wherepartlist ; wherepartlist: wherepartclause { driver.pushWherePart(); } | wherepartlist AND wherepartclause { driver.pushWherePart(); } ; wherepartclause: whereidentifier whereoperator wherevalue ; whereidentifier: IDENTIFIER "." IDENTIFIER { driver.whereFieldAlias=$1; driver.whereFieldName=$3; } ; whereoperator: OPEQUAL { driver.whereOperator="=";} | OPNOTEQUALTHAN { driver.whereOperator="<>";} | OPLESSERTHAN { driver.whereOperator="<";} | OPBIGGERTHAN { driver.whereOperator=">";} | STARTS WITH { driver.whereOperator="startswith";} | CONTAINS { driver.whereOperator="contains";} ; wherevalue: NUMBER { driver.whereValue=to_string($1);} | STRINGLITERAL { driver.whereValue="\""+$1+"\"";} ; //------------------------------------- // RETURN PART //------------------------------------- returnpart: returnclauselist ; returnclauselist: returnclausepart { driver.pushReturnPart(); } | returnclauselist "," returnclausepart { driver.pushReturnPart(); } ; returnclausepart: returnidentifiername | returnidentifiername AS returnasname ; returnasname: IDENTIFIER { driver.returnOutputName=$1; } ; returnidentifiername: IDENTIFIER "." IDENTIFIER { driver.returnNodeAlias=$1; driver.returnNodePropertyName=$3; } ; %% void yy::cypher_parser::error (const location_type& l,const string& m) { driver.error (l, m); }