Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.neo4j.cypher.internal.parser.javacc.cypher.jj Maven / Gradle / Ivy
options {
LOOKAHEAD = 1;
CHOICE_AMBIGUITY_CHECK = 2;
OTHER_AMBIGUITY_CHECK = 1;
DEBUG_PARSER = false;
DEBUG_LOOKAHEAD = false;
DEBUG_TOKEN_MANAGER = false;
ERROR_REPORTING = true;
JAVA_UNICODE_ESCAPE = true;
UNICODE_INPUT = false;
IGNORE_CASE = false;
USER_TOKEN_MANAGER = false;
USER_CHAR_STREAM = true;
BUILD_PARSER = true;
BUILD_TOKEN_MANAGER = true;
SANITY_CHECK = true;
FORCE_LA_CHECK = false;
TOKEN_EXTENDS = "WithOffset";
COMMON_TOKEN_ACTION = true;
}
PARSER_BEGIN(Cypher)
/*
* Copyright (c) 2002-2019 "Neo4j,"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j 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 3 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see .
*/
package org.neo4j.cypher.internal.parser.javacc;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import org.neo4j.cypher.internal.ast.factory.AccessType;
import org.neo4j.cypher.internal.ast.factory.ASTExceptionFactory;
import org.neo4j.cypher.internal.ast.factory.ASTFactory;
import org.neo4j.cypher.internal.ast.factory.ASTFactory.StringPos;
import org.neo4j.cypher.internal.ast.factory.ActionType;
import org.neo4j.cypher.internal.ast.factory.ConstraintType;
import org.neo4j.cypher.internal.ast.factory.ConstraintVersion;
import org.neo4j.cypher.internal.ast.factory.CreateIndexTypes;
import org.neo4j.cypher.internal.ast.factory.HintIndexType;
import org.neo4j.cypher.internal.ast.factory.ParameterType;
import org.neo4j.cypher.internal.ast.factory.ScopeType;
import org.neo4j.cypher.internal.ast.factory.ShowCommandFilterTypes;
import org.neo4j.cypher.internal.ast.factory.SimpleEither;
/** Simple brace matcher. */
public class Cypher {
ASTExceptionFactory exceptionFactory;
ASTFactory astFactory;
public Cypher(ASTFactory astFactory,
ASTExceptionFactory exceptionFactory,
CharStream stream) {
this(stream);
this.astFactory = astFactory;
this.exceptionFactory = exceptionFactory;
}
private POS pos( Token t )
{
return t != null ? astFactory.inputPosition( t.beginOffset, t.beginLine, t.beginColumn ) : null;
}
private void assertValidType( Token t, String expected, String actual ) throws Exception
{
if ( expected != null && !expected.equals(actual) )
{
throw exceptionFactory.syntaxException( new ParseException(
String.format("Invalid input '%s': expected \"%s\"", t.image, expected ) ), t.beginOffset, t.beginLine, t.beginColumn );
}
}
private void assertNotAlreadySet( Object object, Token token, String errorMessage ) throws Exception
{
if ( object != null )
{
throw exceptionFactory.syntaxException( new ParseException( errorMessage ), token.beginOffset, token.beginLine, token.beginColumn );
}
}
}
PARSER_END(Cypher)
TOKEN_MGR_DECLS :
{
public void CommonTokenAction( Token t )
{
CypherCharStream ccStream = (CypherCharStream) input_stream;
t.beginOffset = ccStream.getBeginOffset();
t.endOffset = ccStream.getEndOffset();
}
}
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
}
/* COMMENTS */
SPECIAL_TOKEN :
{
< SINGLE_LINE_COMMENT: "//"(~["\n","\r"])* ("\n"|"\r"|"\r\n")? >
}
MORE :
{
< "/**" ~["/"] > { input_stream.backup( 1 ); } : IN_FORMAL_COMMENT
| "/*" : IN_MULTI_LINE_COMMENT
}
SPECIAL_TOKEN :
{
< FORMAL_COMMENT: "*/" > : DEFAULT
}
SPECIAL_TOKEN :
{
< MULTI_LINE_COMMENT: "*/" > : DEFAULT
}
MORE :
{
< ~[] >
}
/* LITERALS */
TOKEN :
{
< DECIMAL_DOUBLE: ( ["0"-"9"] )+ "." ( ["0"-"9"] )+ ( )? ( )?
| "." ( ["0"-"9"] )+ ( )? ( )?
| ( ["0"-"9"] )+ ( )? >
| < UNSIGNED_DECIMAL_INTEGER: ( ( ["1"-"9"] ( ["0"-"9"] )* ( )* ) | "0" ) > //0 with part letter -> Octal integer?
| < #DECIMAL_EXPONENT: ["e","E"] ( ["+","-"] )? ( ["0"-"9"] )+ ( )* >
| < UNSIGNED_HEX_INTEGER: "0" ["x","X"] ( )* >
| < UNSIGNED_OCTAL_INTEGER: "0" ( "o" )? ( )* >
}
MORE : { < STRING1_OPEN: "'" > : STRING1 }
MORE: { "\\\\" { image.delete( image.length() - 2, image.length() ); image.append( "\\" ); } }
MORE: { "\\\'" { image.delete( image.length() - 2, image.length() ); image.append( "'" ); } }
MORE: { "\\\"" { image.delete( image.length() - 2, image.length() ); image.append( "\"" ); } }
MORE: { "\\b" { image.delete( image.length() - 2, image.length() ); image.append( "\b" ); } }
MORE: { "\\f" { image.delete( image.length() - 2, image.length() ); image.append( "\f" ); } }
MORE: { "\\n" { image.delete( image.length() - 2, image.length() ); image.append( "\n" ); } }
MORE: { "\\r" { image.delete( image.length() - 2, image.length() ); image.append( "\r" ); } }
MORE: { "\\t" { image.delete( image.length() - 2, image.length() ); image.append( "\t" ); } }
MORE: { "\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]" }
MORE: { < ~["'"] > }
TOKEN: { { matchedToken.image = image.substring( 1, image.length() - 1 ); } : DEFAULT }
MORE : { < STRING2_OPEN: "\"" > : STRING2 }
MORE: { "\\\\" { image.delete( image.length() - 2, image.length() ); image.append( "\\" ); } }
MORE: { "\\\'" { image.delete( image.length() - 2, image.length() ); image.append( "'" ); } }
MORE: { "\\\"" { image.delete( image.length() - 2, image.length() ); image.append( "\"" ); } }
MORE: { "\\b" { image.delete( image.length() - 2, image.length() ); image.append( "\b" ); } }
MORE: { "\\f" { image.delete( image.length() - 2, image.length() ); image.append( "\f" ); } }
MORE: { "\\n" { image.delete( image.length() - 2, image.length() ); image.append( "\n" ); } }
MORE: { "\\r" { image.delete( image.length() - 2, image.length() ); image.append( "\r" ); } }
MORE: { "\\t" { image.delete( image.length() - 2, image.length() ); image.append( "\t" ); } }
MORE: { "\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]" }
MORE: { < ~["\""] > }
TOKEN: { { matchedToken.image = image.substring( 1, image.length() - 1 ); } : DEFAULT }
MORE : { < ESCAPED_SYMBOLIC_NAME_OPEN: "`" > : ESC_SYMB_NAME }
MORE: { < ~["`"] > }
MORE: { "``" { image.delete( image.length() - 2, image.length() ); image.append( "`" ); } }
TOKEN: { { matchedToken.image = image.substring( 1, image.length() - 1 ); } : DEFAULT }
/**
* add new tokens to SymbolicNameString() if they should be accepted as an identifier as well
* add new tokens to IdentifierTokens.tokens for correct filtering of identifier tokens
*/
TOKEN [IGNORE_CASE] :
{
< ACCESS: "ACCESS" >
| < ACTIVE: "ACTIVE" >
| < ALIAS: "ALIAS" >
| < ALIASES: "ALIASES" >
| < ALL_SHORTEST_PATH: "allShortestPaths" >
| < ALL: "ALL" >
| < ALTER: "ALTER" >
| < AND: "AND" >
| < ANY: "ANY" >
| < AS: "AS" >
| < ASC: "ASC" ("ENDING")? >
| < ASSERT: "ASSERT" >
| < ASSIGN: "ASSIGN" >
| < AT: "AT" >
| < BAR: "|" >
| < BRIEF: "BRIEF" >
| < BTREE: "BTREE" >
| < BUILT: "BUILT" >
| < BY: "BY" >
| < CALL: "CALL" >
| < CASE: "CASE" >
| < CATALOG: "CATALOG">
| < CHANGE: "CHANGE">
| < COMMIT: "COMMIT" >
| < CONSTRAINT: "CONSTRAINT" >
| < CONSTRAINTS: "CONSTRAINTS" >
| < CONTAINS: "CONTAINS" >
| < COPY: "COPY" >
| < COUNT: "count" >
| < CREATE: "CREATE" >
| < CSV: "CSV" >
| < CURRENT: "CURRENT" >
| < DATA: "DATA">
| < DATABASE: "DATABASE">
| < DATABASES: "DATABASES">
| < DBMS: "DBMS">
| < DEFAULT_TOKEN: "DEFAULT">
| < DEFINED: "DEFINED">
| < DELETE: "DELETE" >
| < DENY: "DENY" >
| < DESC: "DESC" ("ENDING")? >
| < DESTROY: "DESTROY">
| < DETACH: "DETACH" >
| < DOLLAR: "$">
| < DISTINCT: "DISTINCT" >
| < DIVIDE: "/" >
| < DOT: "." >
| < DOTDOT: ".." >
| < DRIVER: "DRIVER" >
| < DROP: "DROP" >
| < DUMP: "DUMP" >
| < EACH: "EACH" >
| < ELEMENT: "ELEMENT" >
| < ELEMENTS: "ELEMENTS" >
| < ELSE: "ELSE" >
| < ENCRYPTED: "ENCRYPTED" >
| < END: "END" >
| < ENDS: "ENDS" >
| < EQ: "=" >
| < EXECUTABLE: "EXECUTABLE" >
| < EXIST: "EXIST" >
| < EXISTENCE: "EXISTENCE" >
| < EXISTS: "EXISTS" >
| < EXTRACT: "EXTRACT" >
| < FALSE: "false" >
| < FIELDTERMINATOR: "FIELDTERMINATOR" >
| < FILTER: "FILTER" >
| < FOR: "FOR" >
| < FOREACH: "FOREACH" >
| < FROM: "FROM" >
| < FULLTEXT: "FULLTEXT" >
| < FUNCTION: "FUNCTION" >
| < FUNCTIONS: "FUNCTIONS" >
| < GE: ">=" >
| < GRANT: "GRANT">
| < GRAPH: "GRAPH" >
| < GRAPHS: "GRAPHS" >
| < GT: ">" >
| < HEADERS: "HEADERS" >
| < HOME: "HOME">
| < IF: "IF" >
| < IMPERSONATE: "IMPERSONATE" >
| < IN: "IN" >
| < INDEX: "INDEX" >
| < INDEXES: "INDEXES" >
| < IS: "IS" >
| < JOIN: "JOIN" >
| < KEY: "KEY" >
| < LABEL: "LABEL" >
| < LABELS: "LABELS" >
| < LBRACKET: "[" >
| < LCURLY: "{" >
| < LE: "<=" >
| < LIMITROWS: "LIMIT" >
| < LOAD: "LOAD" >
| < LOOKUP: "LOOKUP" >
| < LPAREN: "(" >
| < LT: "<" >
| < MANAGEMENT: "MANAGEMENT" >
| < MATCH: "MATCH" >
| < MERGE: "MERGE" >
| < MINUS: "-" >
| < MODULO: "%" >
| < NEQ: "!=" >
| < NEQ2: "<>" >
| < NAME: "NAME" >
| < NAMES: "NAMES" >
| < NEW: "NEW" >
| < NODE: "NODE" >
| < NODES: "NODES" >
| < NONE: "NONE" >
| < NOT: "NOT" >
| < NOWAIT: "NOWAIT">
| < NULL: "null">
| < OF: "OF" >
| < ON: "ON" >
| < ONLY: "ONLY" >
| < OPTIONAL: "OPTIONAL" >
| < OPTIONS: "OPTIONS" >
| < OR: "OR" >
| < ORDER: "ORDER" >
| < OUTPUT: "OUTPUT" >
| < PASSWORD: "PASSWORD" >
| < PASSWORDS: "PASSWORDS" >
| < PERIODIC: "PERIODIC" >
| < PLAINTEXT: "PLAINTEXT" >
| < PLUS: "+" >
| < POINT: "POINT">
| < POPULATED: "POPULATED">
| < POW: "^" >
| < PRIVILEGE: "PRIVILEGE" >
| < PRIVILEGES: "PRIVILEGES" >
| < PROCEDURE: "PROCEDURE" >
| < PROCEDURES: "PROCEDURES" >
| < PROPERTY: "PROPERTY" >
| < RANGE: "RANGE" >
| < RBRACKET: "]" >
| < RCURLY: "}" >
| < READ: "READ" >
| < REDUCE: "REDUCE" >
| < RENAME: "RENAME" >
| < REGEQ: "=~" >
| < REL: "REL" >
| < RELATIONSHIP: "RELATIONSHIP" >
| < RELATIONSHIPS: "RELATIONSHIPS" >
| < REMOVE: "REMOVE" >
| < REPLACE: "REPLACE" >
| < REQUIRE: "REQUIRE" >
| < REQUIRED: "REQUIRED" >
| < RETURN: "RETURN" >
| < REVOKE: "REVOKE">
| < ROLE: "ROLE">
| < ROLES: "ROLES">
| < ROW: "ROW">
| < ROWS: "ROWS">
| < RPAREN: ")" >
| < SCAN: "SCAN" >
| < SEC: "SEC">
| < SECOND: "SECOND">
| < SECONDS: "SECONDS">
| < SEEK: "SEEK" >
| < SET: "SET" >
| < SHORTEST_PATH: "shortestPath" >
| < SHOW: "SHOW">
| < SINGLE: "SINGLE" >
| < SKIPROWS: "SKIP" >
| < START: "START">
| < STARTS: "STARTS" >
| < STATUS: "STATUS" >
| < STOP: "STOP">
| < SUSPENDED: "SUSPENDED">
| < TARGET: "TARGET" >
| < TERMINATE: "TERMINATE">
| < TEXT: "TEXT">
| < THEN: "THEN" >
| < TIMES: "*" >
| < TO: "TO" >
| < TRANSACTION: "TRANSACTION" >
| < TRANSACTIONS: "TRANSACTIONS" >
| < TRAVERSE: "TRAVERSE" >
| < TRUE: "true">
| < TYPE: "TYPE">
| < TYPES: "TYPES">
| < UNION: "UNION" >
| < UNIQUE: "UNIQUE" >
| < UNWIND: "UNWIND" >
| < USE: "USE" >
| < USER: "USER">
| < USERS: "USERS">
| < USING: "USING" >
| < VERBOSE: "VERBOSE" >
| < WAIT: "WAIT">
| < WHEN: "WHEN" >
| < WHERE: "WHERE" >
| < WITH: "WITH" >
| < WRITE: "WRITE" >
| < XOR: "XOR" >
| < YIELD: "YIELD" >
}
/* IDENTIFIERS */
TOKEN :
{
< IDENTIFIER: ()* >
| < #LETTER:
[ // all chars for which Character.isIdentifierStart is true except `$`
"\u0041"-"\u005a",
"\u005f",
"\u0061"-"\u007a",
"\u00a2"-"\u00a5",
"\u00aa",
"\u00b5",
"\u00ba",
"\u00c0"-"\u00d6",
"\u00d8"-"\u00f6",
"\u00f8"-"\u02c1",
"\u02c6"-"\u02d1",
"\u02e0"-"\u02e4",
"\u02ec",
"\u02ee",
"\u0370"-"\u0374",
"\u0376"-"\u0377",
"\u037a"-"\u037d",
"\u037f",
"\u0386",
"\u0388"-"\u038a",
"\u038c",
"\u038e"-"\u03a1",
"\u03a3"-"\u03f5",
"\u03f7"-"\u0481",
"\u048a"-"\u052f",
"\u0531"-"\u0556",
"\u0559",
"\u0560"-"\u0588",
"\u058f",
"\u05d0"-"\u05ea",
"\u05ef"-"\u05f2",
"\u060b",
"\u0620"-"\u064a",
"\u066e"-"\u066f",
"\u0671"-"\u06d3",
"\u06d5",
"\u06e5"-"\u06e6",
"\u06ee"-"\u06ef",
"\u06fa"-"\u06fc",
"\u06ff",
"\u0710",
"\u0712"-"\u072f",
"\u074d"-"\u07a5",
"\u07b1",
"\u07ca"-"\u07ea",
"\u07f4"-"\u07f5",
"\u07fa",
"\u07fe"-"\u0815",
"\u081a",
"\u0824",
"\u0828",
"\u0840"-"\u0858",
"\u0860"-"\u086a",
"\u08a0"-"\u08b4",
"\u08b6"-"\u08c7",
"\u0904"-"\u0939",
"\u093d",
"\u0950",
"\u0958"-"\u0961",
"\u0971"-"\u0980",
"\u0985"-"\u098c",
"\u098f"-"\u0990",
"\u0993"-"\u09a8",
"\u09aa"-"\u09b0",
"\u09b2",
"\u09b6"-"\u09b9",
"\u09bd",
"\u09ce",
"\u09dc"-"\u09dd",
"\u09df"-"\u09e1",
"\u09f0"-"\u09f3",
"\u09fb"-"\u09fc",
"\u0a05"-"\u0a0a",
"\u0a0f"-"\u0a10",
"\u0a13"-"\u0a28",
"\u0a2a"-"\u0a30",
"\u0a32"-"\u0a33",
"\u0a35"-"\u0a36",
"\u0a38"-"\u0a39",
"\u0a59"-"\u0a5c",
"\u0a5e",
"\u0a72"-"\u0a74",
"\u0a85"-"\u0a8d",
"\u0a8f"-"\u0a91",
"\u0a93"-"\u0aa8",
"\u0aaa"-"\u0ab0",
"\u0ab2"-"\u0ab3",
"\u0ab5"-"\u0ab9",
"\u0abd",
"\u0ad0",
"\u0ae0"-"\u0ae1",
"\u0af1",
"\u0af9",
"\u0b05"-"\u0b0c",
"\u0b0f"-"\u0b10",
"\u0b13"-"\u0b28",
"\u0b2a"-"\u0b30",
"\u0b32"-"\u0b33",
"\u0b35"-"\u0b39",
"\u0b3d",
"\u0b5c"-"\u0b5d",
"\u0b5f"-"\u0b61",
"\u0b71",
"\u0b83",
"\u0b85"-"\u0b8a",
"\u0b8e"-"\u0b90",
"\u0b92"-"\u0b95",
"\u0b99"-"\u0b9a",
"\u0b9c",
"\u0b9e"-"\u0b9f",
"\u0ba3"-"\u0ba4",
"\u0ba8"-"\u0baa",
"\u0bae"-"\u0bb9",
"\u0bd0",
"\u0bf9",
"\u0c05"-"\u0c0c",
"\u0c0e"-"\u0c10",
"\u0c12"-"\u0c28",
"\u0c2a"-"\u0c39",
"\u0c3d",
"\u0c58"-"\u0c5a",
"\u0c60"-"\u0c61",
"\u0c80",
"\u0c85"-"\u0c8c",
"\u0c8e"-"\u0c90",
"\u0c92"-"\u0ca8",
"\u0caa"-"\u0cb3",
"\u0cb5"-"\u0cb9",
"\u0cbd",
"\u0cde",
"\u0ce0"-"\u0ce1",
"\u0cf1"-"\u0cf2",
"\u0d04"-"\u0d0c",
"\u0d0e"-"\u0d10",
"\u0d12"-"\u0d3a",
"\u0d3d",
"\u0d4e",
"\u0d54"-"\u0d56",
"\u0d5f"-"\u0d61",
"\u0d7a"-"\u0d7f",
"\u0d85"-"\u0d96",
"\u0d9a"-"\u0db1",
"\u0db3"-"\u0dbb",
"\u0dbd",
"\u0dc0"-"\u0dc6",
"\u0e01"-"\u0e30",
"\u0e32"-"\u0e33",
"\u0e3f"-"\u0e46",
"\u0e81"-"\u0e82",
"\u0e84",
"\u0e86"-"\u0e8a",
"\u0e8c"-"\u0ea3",
"\u0ea5",
"\u0ea7"-"\u0eb0",
"\u0eb2"-"\u0eb3",
"\u0ebd",
"\u0ec0"-"\u0ec4",
"\u0ec6",
"\u0edc"-"\u0edf",
"\u0f00",
"\u0f40"-"\u0f47",
"\u0f49"-"\u0f6c",
"\u0f88"-"\u0f8c",
"\u1000"-"\u102a",
"\u103f",
"\u1050"-"\u1055",
"\u105a"-"\u105d",
"\u1061",
"\u1065"-"\u1066",
"\u106e"-"\u1070",
"\u1075"-"\u1081",
"\u108e",
"\u10a0"-"\u10c5",
"\u10c7",
"\u10cd",
"\u10d0"-"\u10fa",
"\u10fc"-"\u1248",
"\u124a"-"\u124d",
"\u1250"-"\u1256",
"\u1258",
"\u125a"-"\u125d",
"\u1260"-"\u1288",
"\u128a"-"\u128d",
"\u1290"-"\u12b0",
"\u12b2"-"\u12b5",
"\u12b8"-"\u12be",
"\u12c0",
"\u12c2"-"\u12c5",
"\u12c8"-"\u12d6",
"\u12d8"-"\u1310",
"\u1312"-"\u1315",
"\u1318"-"\u135a",
"\u1380"-"\u138f",
"\u13a0"-"\u13f5",
"\u13f8"-"\u13fd",
"\u1401"-"\u166c",
"\u166f"-"\u167f",
"\u1681"-"\u169a",
"\u16a0"-"\u16ea",
"\u16ee"-"\u16f8",
"\u1700"-"\u170c",
"\u170e"-"\u1711",
"\u1720"-"\u1731",
"\u1740"-"\u1751",
"\u1760"-"\u176c",
"\u176e"-"\u1770",
"\u1780"-"\u17b3",
"\u17d7",
"\u17db"-"\u17dc",
"\u1820"-"\u1878",
"\u1880"-"\u1884",
"\u1887"-"\u18a8",
"\u18aa",
"\u18b0"-"\u18f5",
"\u1900"-"\u191e",
"\u1950"-"\u196d",
"\u1970"-"\u1974",
"\u1980"-"\u19ab",
"\u19b0"-"\u19c9",
"\u1a00"-"\u1a16",
"\u1a20"-"\u1a54",
"\u1aa7",
"\u1b05"-"\u1b33",
"\u1b45"-"\u1b4b",
"\u1b83"-"\u1ba0",
"\u1bae"-"\u1baf",
"\u1bba"-"\u1be5",
"\u1c00"-"\u1c23",
"\u1c4d"-"\u1c4f",
"\u1c5a"-"\u1c7d",
"\u1c80"-"\u1c88",
"\u1c90"-"\u1cba",
"\u1cbd"-"\u1cbf",
"\u1ce9"-"\u1cec",
"\u1cee"-"\u1cf3",
"\u1cf5"-"\u1cf6",
"\u1cfa",
"\u1d00"-"\u1dbf",
"\u1e00"-"\u1f15",
"\u1f18"-"\u1f1d",
"\u1f20"-"\u1f45",
"\u1f48"-"\u1f4d",
"\u1f50"-"\u1f57",
"\u1f59",
"\u1f5b",
"\u1f5d",
"\u1f5f"-"\u1f7d",
"\u1f80"-"\u1fb4",
"\u1fb6"-"\u1fbc",
"\u1fbe",
"\u1fc2"-"\u1fc4",
"\u1fc6"-"\u1fcc",
"\u1fd0"-"\u1fd3",
"\u1fd6"-"\u1fdb",
"\u1fe0"-"\u1fec",
"\u1ff2"-"\u1ff4",
"\u1ff6"-"\u1ffc",
"\u203f"-"\u2040",
"\u2054",
"\u2071",
"\u207f",
"\u2090"-"\u209c",
"\u20a0"-"\u20bf",
"\u2102",
"\u2107",
"\u210a"-"\u2113",
"\u2115",
"\u2119"-"\u211d",
"\u2124",
"\u2126",
"\u2128",
"\u212a"-"\u212d",
"\u212f"-"\u2139",
"\u213c"-"\u213f",
"\u2145"-"\u2149",
"\u214e",
"\u2160"-"\u2188",
"\u2c00"-"\u2c2e",
"\u2c30"-"\u2c5e",
"\u2c60"-"\u2ce4",
"\u2ceb"-"\u2cee",
"\u2cf2"-"\u2cf3",
"\u2d00"-"\u2d25",
"\u2d27",
"\u2d2d",
"\u2d30"-"\u2d67",
"\u2d6f",
"\u2d80"-"\u2d96",
"\u2da0"-"\u2da6",
"\u2da8"-"\u2dae",
"\u2db0"-"\u2db6",
"\u2db8"-"\u2dbe",
"\u2dc0"-"\u2dc6",
"\u2dc8"-"\u2dce",
"\u2dd0"-"\u2dd6",
"\u2dd8"-"\u2dde",
"\u2e2f",
"\u3005"-"\u3007",
"\u3021"-"\u3029",
"\u3031"-"\u3035",
"\u3038"-"\u303c",
"\u3041"-"\u3096",
"\u309d"-"\u309f",
"\u30a1"-"\u30fa",
"\u30fc"-"\u30ff",
"\u3105"-"\u312f",
"\u3131"-"\u318e",
"\u31a0"-"\u31bf",
"\u31f0"-"\u31ff",
"\u3400"-"\u4dbf",
"\u4e00"-"\u9ffc",
"\ua000"-"\ua48c",
"\ua4d0"-"\ua4fd",
"\ua500"-"\ua60c",
"\ua610"-"\ua61f",
"\ua62a"-"\ua62b",
"\ua640"-"\ua66e",
"\ua67f"-"\ua69d",
"\ua6a0"-"\ua6ef",
"\ua717"-"\ua71f",
"\ua722"-"\ua788",
"\ua78b"-"\ua7bf",
"\ua7c2"-"\ua7ca",
"\ua7f5"-"\ua801",
"\ua803"-"\ua805",
"\ua807"-"\ua80a",
"\ua80c"-"\ua822",
"\ua838",
"\ua840"-"\ua873",
"\ua882"-"\ua8b3",
"\ua8f2"-"\ua8f7",
"\ua8fb",
"\ua8fd"-"\ua8fe",
"\ua90a"-"\ua925",
"\ua930"-"\ua946",
"\ua960"-"\ua97c",
"\ua984"-"\ua9b2",
"\ua9cf",
"\ua9e0"-"\ua9e4",
"\ua9e6"-"\ua9ef",
"\ua9fa"-"\ua9fe",
"\uaa00"-"\uaa28",
"\uaa40"-"\uaa42",
"\uaa44"-"\uaa4b",
"\uaa60"-"\uaa76",
"\uaa7a",
"\uaa7e"-"\uaaaf",
"\uaab1",
"\uaab5"-"\uaab6",
"\uaab9"-"\uaabd",
"\uaac0",
"\uaac2",
"\uaadb"-"\uaadd",
"\uaae0"-"\uaaea",
"\uaaf2"-"\uaaf4",
"\uab01"-"\uab06",
"\uab09"-"\uab0e",
"\uab11"-"\uab16",
"\uab20"-"\uab26",
"\uab28"-"\uab2e",
"\uab30"-"\uab5a",
"\uab5c"-"\uab69",
"\uab70"-"\uabe2",
"\uac00"-"\ud7a3",
"\ud7b0"-"\ud7c6",
"\ud7cb"-"\ud7fb",
"\uf900"-"\ufa6d",
"\ufa70"-"\ufad9",
"\ufb00"-"\ufb06",
"\ufb13"-"\ufb17",
"\ufb1d",
"\ufb1f"-"\ufb28",
"\ufb2a"-"\ufb36",
"\ufb38"-"\ufb3c",
"\ufb3e",
"\ufb40"-"\ufb41",
"\ufb43"-"\ufb44",
"\ufb46"-"\ufbb1",
"\ufbd3"-"\ufd3d",
"\ufd50"-"\ufd8f",
"\ufd92"-"\ufdc7",
"\ufdf0"-"\ufdfc",
"\ufe33"-"\ufe34",
"\ufe4d"-"\ufe4f",
"\ufe69",
"\ufe70"-"\ufe74",
"\ufe76"-"\ufefc",
"\uff04",
"\uff21"-"\uff3a",
"\uff3f",
"\uff41"-"\uff5a",
"\uff66"-"\uffbe",
"\uffc2"-"\uffc7",
"\uffca"-"\uffcf",
"\uffd2"-"\uffd7",
"\uffda"-"\uffdc",
"\uffe0"-"\uffe1",
"\uffe5"-"\uffe6"
] >
| < #PART_LETTER:
[ // all chars for which Character.isIdentifierPart is true
"\u0000"-"\u0008",
"\u000e"-"\u001b",
"\u0024",
"\u0030"-"\u0039",
"\u0041"-"\u005a",
"\u005f",
"\u0061"-"\u007a",
"\u007f"-"\u009f",
"\u00a2"-"\u00a5",
"\u00aa",
"\u00ad",
"\u00b5",
"\u00ba",
"\u00c0"-"\u00d6",
"\u00d8"-"\u00f6",
"\u00f8"-"\u02c1",
"\u02c6"-"\u02d1",
"\u02e0"-"\u02e4",
"\u02ec",
"\u02ee",
"\u0300"-"\u0374",
"\u0376"-"\u0377",
"\u037a"-"\u037d",
"\u037f",
"\u0386",
"\u0388"-"\u038a",
"\u038c",
"\u038e"-"\u03a1",
"\u03a3"-"\u03f5",
"\u03f7"-"\u0481",
"\u0483"-"\u0487",
"\u048a"-"\u052f",
"\u0531"-"\u0556",
"\u0559",
"\u0560"-"\u0588",
"\u058f",
"\u0591"-"\u05bd",
"\u05bf",
"\u05c1"-"\u05c2",
"\u05c4"-"\u05c5",
"\u05c7",
"\u05d0"-"\u05ea",
"\u05ef"-"\u05f2",
"\u0600"-"\u0605",
"\u060b",
"\u0610"-"\u061a",
"\u061c",
"\u0620"-"\u0669",
"\u066e"-"\u06d3",
"\u06d5"-"\u06dd",
"\u06df"-"\u06e8",
"\u06ea"-"\u06fc",
"\u06ff",
"\u070f"-"\u074a",
"\u074d"-"\u07b1",
"\u07c0"-"\u07f5",
"\u07fa",
"\u07fd"-"\u082d",
"\u0840"-"\u085b",
"\u0860"-"\u086a",
"\u08a0"-"\u08b4",
"\u08b6"-"\u08c7",
"\u08d3"-"\u0963",
"\u0966"-"\u096f",
"\u0971"-"\u0983",
"\u0985"-"\u098c",
"\u098f"-"\u0990",
"\u0993"-"\u09a8",
"\u09aa"-"\u09b0",
"\u09b2",
"\u09b6"-"\u09b9",
"\u09bc"-"\u09c4",
"\u09c7"-"\u09c8",
"\u09cb"-"\u09ce",
"\u09d7",
"\u09dc"-"\u09dd",
"\u09df"-"\u09e3",
"\u09e6"-"\u09f3",
"\u09fb"-"\u09fc",
"\u09fe",
"\u0a01"-"\u0a03",
"\u0a05"-"\u0a0a",
"\u0a0f"-"\u0a10",
"\u0a13"-"\u0a28",
"\u0a2a"-"\u0a30",
"\u0a32"-"\u0a33",
"\u0a35"-"\u0a36",
"\u0a38"-"\u0a39",
"\u0a3c",
"\u0a3e"-"\u0a42",
"\u0a47"-"\u0a48",
"\u0a4b"-"\u0a4d",
"\u0a51",
"\u0a59"-"\u0a5c",
"\u0a5e",
"\u0a66"-"\u0a75",
"\u0a81"-"\u0a83",
"\u0a85"-"\u0a8d",
"\u0a8f"-"\u0a91",
"\u0a93"-"\u0aa8",
"\u0aaa"-"\u0ab0",
"\u0ab2"-"\u0ab3",
"\u0ab5"-"\u0ab9",
"\u0abc"-"\u0ac5",
"\u0ac7"-"\u0ac9",
"\u0acb"-"\u0acd",
"\u0ad0",
"\u0ae0"-"\u0ae3",
"\u0ae6"-"\u0aef",
"\u0af1",
"\u0af9"-"\u0aff",
"\u0b01"-"\u0b03",
"\u0b05"-"\u0b0c",
"\u0b0f"-"\u0b10",
"\u0b13"-"\u0b28",
"\u0b2a"-"\u0b30",
"\u0b32"-"\u0b33",
"\u0b35"-"\u0b39",
"\u0b3c"-"\u0b44",
"\u0b47"-"\u0b48",
"\u0b4b"-"\u0b4d",
"\u0b55"-"\u0b57",
"\u0b5c"-"\u0b5d",
"\u0b5f"-"\u0b63",
"\u0b66"-"\u0b6f",
"\u0b71",
"\u0b82"-"\u0b83",
"\u0b85"-"\u0b8a",
"\u0b8e"-"\u0b90",
"\u0b92"-"\u0b95",
"\u0b99"-"\u0b9a",
"\u0b9c",
"\u0b9e"-"\u0b9f",
"\u0ba3"-"\u0ba4",
"\u0ba8"-"\u0baa",
"\u0bae"-"\u0bb9",
"\u0bbe"-"\u0bc2",
"\u0bc6"-"\u0bc8",
"\u0bca"-"\u0bcd",
"\u0bd0",
"\u0bd7",
"\u0be6"-"\u0bef",
"\u0bf9",
"\u0c00"-"\u0c0c",
"\u0c0e"-"\u0c10",
"\u0c12"-"\u0c28",
"\u0c2a"-"\u0c39",
"\u0c3d"-"\u0c44",
"\u0c46"-"\u0c48",
"\u0c4a"-"\u0c4d",
"\u0c55"-"\u0c56",
"\u0c58"-"\u0c5a",
"\u0c60"-"\u0c63",
"\u0c66"-"\u0c6f",
"\u0c80"-"\u0c83",
"\u0c85"-"\u0c8c",
"\u0c8e"-"\u0c90",
"\u0c92"-"\u0ca8",
"\u0caa"-"\u0cb3",
"\u0cb5"-"\u0cb9",
"\u0cbc"-"\u0cc4",
"\u0cc6"-"\u0cc8",
"\u0cca"-"\u0ccd",
"\u0cd5"-"\u0cd6",
"\u0cde",
"\u0ce0"-"\u0ce3",
"\u0ce6"-"\u0cef",
"\u0cf1"-"\u0cf2",
"\u0d00"-"\u0d0c",
"\u0d0e"-"\u0d10",
"\u0d12"-"\u0d44",
"\u0d46"-"\u0d48",
"\u0d4a"-"\u0d4e",
"\u0d54"-"\u0d57",
"\u0d5f"-"\u0d63",
"\u0d66"-"\u0d6f",
"\u0d7a"-"\u0d7f",
"\u0d81"-"\u0d83",
"\u0d85"-"\u0d96",
"\u0d9a"-"\u0db1",
"\u0db3"-"\u0dbb",
"\u0dbd",
"\u0dc0"-"\u0dc6",
"\u0dca",
"\u0dcf"-"\u0dd4",
"\u0dd6",
"\u0dd8"-"\u0ddf",
"\u0de6"-"\u0def",
"\u0df2"-"\u0df3",
"\u0e01"-"\u0e3a",
"\u0e3f"-"\u0e4e",
"\u0e50"-"\u0e59",
"\u0e81"-"\u0e82",
"\u0e84",
"\u0e86"-"\u0e8a",
"\u0e8c"-"\u0ea3",
"\u0ea5",
"\u0ea7"-"\u0ebd",
"\u0ec0"-"\u0ec4",
"\u0ec6",
"\u0ec8"-"\u0ecd",
"\u0ed0"-"\u0ed9",
"\u0edc"-"\u0edf",
"\u0f00",
"\u0f18"-"\u0f19",
"\u0f20"-"\u0f29",
"\u0f35",
"\u0f37",
"\u0f39",
"\u0f3e"-"\u0f47",
"\u0f49"-"\u0f6c",
"\u0f71"-"\u0f84",
"\u0f86"-"\u0f97",
"\u0f99"-"\u0fbc",
"\u0fc6",
"\u1000"-"\u1049",
"\u1050"-"\u109d",
"\u10a0"-"\u10c5",
"\u10c7",
"\u10cd",
"\u10d0"-"\u10fa",
"\u10fc"-"\u1248",
"\u124a"-"\u124d",
"\u1250"-"\u1256",
"\u1258",
"\u125a"-"\u125d",
"\u1260"-"\u1288",
"\u128a"-"\u128d",
"\u1290"-"\u12b0",
"\u12b2"-"\u12b5",
"\u12b8"-"\u12be",
"\u12c0",
"\u12c2"-"\u12c5",
"\u12c8"-"\u12d6",
"\u12d8"-"\u1310",
"\u1312"-"\u1315",
"\u1318"-"\u135a",
"\u135d"-"\u135f",
"\u1380"-"\u138f",
"\u13a0"-"\u13f5",
"\u13f8"-"\u13fd",
"\u1401"-"\u166c",
"\u166f"-"\u167f",
"\u1681"-"\u169a",
"\u16a0"-"\u16ea",
"\u16ee"-"\u16f8",
"\u1700"-"\u170c",
"\u170e"-"\u1714",
"\u1720"-"\u1734",
"\u1740"-"\u1753",
"\u1760"-"\u176c",
"\u176e"-"\u1770",
"\u1772"-"\u1773",
"\u1780"-"\u17d3",
"\u17d7",
"\u17db"-"\u17dd",
"\u17e0"-"\u17e9",
"\u180b"-"\u180e",
"\u1810"-"\u1819",
"\u1820"-"\u1878",
"\u1880"-"\u18aa",
"\u18b0"-"\u18f5",
"\u1900"-"\u191e",
"\u1920"-"\u192b",
"\u1930"-"\u193b",
"\u1946"-"\u196d",
"\u1970"-"\u1974",
"\u1980"-"\u19ab",
"\u19b0"-"\u19c9",
"\u19d0"-"\u19d9",
"\u1a00"-"\u1a1b",
"\u1a20"-"\u1a5e",
"\u1a60"-"\u1a7c",
"\u1a7f"-"\u1a89",
"\u1a90"-"\u1a99",
"\u1aa7",
"\u1ab0"-"\u1abd",
"\u1abf"-"\u1ac0",
"\u1b00"-"\u1b4b",
"\u1b50"-"\u1b59",
"\u1b6b"-"\u1b73",
"\u1b80"-"\u1bf3",
"\u1c00"-"\u1c37",
"\u1c40"-"\u1c49",
"\u1c4d"-"\u1c7d",
"\u1c80"-"\u1c88",
"\u1c90"-"\u1cba",
"\u1cbd"-"\u1cbf",
"\u1cd0"-"\u1cd2",
"\u1cd4"-"\u1cfa",
"\u1d00"-"\u1df9",
"\u1dfb"-"\u1f15",
"\u1f18"-"\u1f1d",
"\u1f20"-"\u1f45",
"\u1f48"-"\u1f4d",
"\u1f50"-"\u1f57",
"\u1f59",
"\u1f5b",
"\u1f5d",
"\u1f5f"-"\u1f7d",
"\u1f80"-"\u1fb4",
"\u1fb6"-"\u1fbc",
"\u1fbe",
"\u1fc2"-"\u1fc4",
"\u1fc6"-"\u1fcc",
"\u1fd0"-"\u1fd3",
"\u1fd6"-"\u1fdb",
"\u1fe0"-"\u1fec",
"\u1ff2"-"\u1ff4",
"\u1ff6"-"\u1ffc",
"\u200b"-"\u200f",
"\u202a"-"\u202e",
"\u203f"-"\u2040",
"\u2054",
"\u2060"-"\u2064",
"\u2066"-"\u206f",
"\u2071",
"\u207f",
"\u2090"-"\u209c",
"\u20a0"-"\u20bf",
"\u20d0"-"\u20dc",
"\u20e1",
"\u20e5"-"\u20f0",
"\u2102",
"\u2107",
"\u210a"-"\u2113",
"\u2115",
"\u2119"-"\u211d",
"\u2124",
"\u2126",
"\u2128",
"\u212a"-"\u212d",
"\u212f"-"\u2139",
"\u213c"-"\u213f",
"\u2145"-"\u2149",
"\u214e",
"\u2160"-"\u2188",
"\u2c00"-"\u2c2e",
"\u2c30"-"\u2c5e",
"\u2c60"-"\u2ce4",
"\u2ceb"-"\u2cf3",
"\u2d00"-"\u2d25",
"\u2d27",
"\u2d2d",
"\u2d30"-"\u2d67",
"\u2d6f",
"\u2d7f"-"\u2d96",
"\u2da0"-"\u2da6",
"\u2da8"-"\u2dae",
"\u2db0"-"\u2db6",
"\u2db8"-"\u2dbe",
"\u2dc0"-"\u2dc6",
"\u2dc8"-"\u2dce",
"\u2dd0"-"\u2dd6",
"\u2dd8"-"\u2dde",
"\u2de0"-"\u2dff",
"\u2e2f",
"\u3005"-"\u3007",
"\u3021"-"\u302f",
"\u3031"-"\u3035",
"\u3038"-"\u303c",
"\u3041"-"\u3096",
"\u3099"-"\u309a",
"\u309d"-"\u309f",
"\u30a1"-"\u30fa",
"\u30fc"-"\u30ff",
"\u3105"-"\u312f",
"\u3131"-"\u318e",
"\u31a0"-"\u31bf",
"\u31f0"-"\u31ff",
"\u3400"-"\u4dbf",
"\u4e00"-"\u9ffc",
"\ua000"-"\ua48c",
"\ua4d0"-"\ua4fd",
"\ua500"-"\ua60c",
"\ua610"-"\ua62b",
"\ua640"-"\ua66f",
"\ua674"-"\ua67d",
"\ua67f"-"\ua6f1",
"\ua717"-"\ua71f",
"\ua722"-"\ua788",
"\ua78b"-"\ua7bf",
"\ua7c2"-"\ua7ca",
"\ua7f5"-"\ua827",
"\ua82c",
"\ua838",
"\ua840"-"\ua873",
"\ua880"-"\ua8c5",
"\ua8d0"-"\ua8d9",
"\ua8e0"-"\ua8f7",
"\ua8fb",
"\ua8fd"-"\ua92d",
"\ua930"-"\ua953",
"\ua960"-"\ua97c",
"\ua980"-"\ua9c0",
"\ua9cf"-"\ua9d9",
"\ua9e0"-"\ua9fe",
"\uaa00"-"\uaa36",
"\uaa40"-"\uaa4d",
"\uaa50"-"\uaa59",
"\uaa60"-"\uaa76",
"\uaa7a"-"\uaac2",
"\uaadb"-"\uaadd",
"\uaae0"-"\uaaef",
"\uaaf2"-"\uaaf6",
"\uab01"-"\uab06",
"\uab09"-"\uab0e",
"\uab11"-"\uab16",
"\uab20"-"\uab26",
"\uab28"-"\uab2e",
"\uab30"-"\uab5a",
"\uab5c"-"\uab69",
"\uab70"-"\uabea",
"\uabec"-"\uabed",
"\uabf0"-"\uabf9",
"\uac00"-"\ud7a3",
"\ud7b0"-"\ud7c6",
"\ud7cb"-"\ud7fb",
"\uf900"-"\ufa6d",
"\ufa70"-"\ufad9",
"\ufb00"-"\ufb06",
"\ufb13"-"\ufb17",
"\ufb1d"-"\ufb28",
"\ufb2a"-"\ufb36",
"\ufb38"-"\ufb3c",
"\ufb3e",
"\ufb40"-"\ufb41",
"\ufb43"-"\ufb44",
"\ufb46"-"\ufbb1",
"\ufbd3"-"\ufd3d",
"\ufd50"-"\ufd8f",
"\ufd92"-"\ufdc7",
"\ufdf0"-"\ufdfc",
"\ufe00"-"\ufe0f",
"\ufe20"-"\ufe2f",
"\ufe33"-"\ufe34",
"\ufe4d"-"\ufe4f",
"\ufe69",
"\ufe70"-"\ufe74",
"\ufe76"-"\ufefc",
"\ufeff",
"\uff04",
"\uff10"-"\uff19",
"\uff21"-"\uff3a",
"\uff3f",
"\uff41"-"\uff5a",
"\uff66"-"\uffbe",
"\uffc2"-"\uffc7",
"\uffca"-"\uffcf",
"\uffd2"-"\uffd7",
"\uffda"-"\uffdc",
"\uffe0"-"\uffe1",
"\uffe5"-"\uffe6",
"\ufff9"-"\ufffb"
] >
}
TOKEN :
{
< ARROW_LINE: ["\u002d", "\u00ad", "\u2010", "\u2011", "\u2012", "\u2013", "\u2014", "\u2015", "\ufe58", "\ufe63", "\uff0d"] >
| < ARROW_LEFT_HEAD: ["\u27e8", "\u3008", "\ufe64", "\uff1c"] >
| < ARROW_RIGHT_HEAD: ["\u27e9", "\u3009", "\ufe65", "\uff1e"] >
}
<*> TOKEN :
{
< UNKNOWN: ~[",", ":", ";", " ", "\t", "\n", "\r"] >
}
/** Root production. */
List Statements() throws Exception :
{
STATEMENT x;
List stmts = new ArrayList<>();
}
{
try {
x=Statement() { stmts.add( x ); }
( LOOKAHEAD(2) ";" x=Statement() { stmts.add( x ); } )* ( LOOKAHEAD(2) ";" )?
{
return stmts;
}
} catch ( ParseException e ) {
Token t = e.currentToken.next;
if ( e.getMessage().contains( "Encountered \"\"" ) )
{
throw exceptionFactory.syntaxException( t.image, ParseExceptions.expected( e.expectedTokenSequences, e.tokenImage ), e,
t.endOffset + 1, t.endLine, t.endColumn + 1 );
}
else
{
throw exceptionFactory.syntaxException( t.image, ParseExceptions.expected( e.expectedTokenSequences, e.tokenImage ), e,
t.beginOffset, t.beginLine, t.beginColumn );
}
} catch ( InvalidUnicodeLiteral e ) {
throw exceptionFactory.syntaxException( e, e.offset, e.line, e.column );
}
}
STATEMENT Statement() throws Exception:
{
STATEMENT statement;
USE_CLAUSE useClause = null;
}
{
(
statement=PeriodicCommitQuery()
| useClause=UseClause() statement=SingleQueryOrCommandWithUseClause(useClause)
| statement=SingleQueryOrCommand()
)
{
return statement;
}
}
STATEMENT SingleQueryOrCommand() throws Exception:
{
STATEMENT statement = null;
QUERY query = null;
boolean hasCatalog = false;
}
{
(
LOOKAHEAD(2) ( { hasCatalog = true; })? statement=CreateCommand( null ) // CREATE admin thing vs CREATE graph thing
| ( { hasCatalog = true; })? statement=Command( null )
| query=SingleQuery() ( query=Union(query) )*
)
{
if ( query != null )
{
return query;
}
return hasCatalog ? astFactory.hasCatalog( statement ) : statement;
}
}
STATEMENT SingleQueryOrCommandWithUseClause( USE_CLAUSE useClause ) throws Exception:
{
STATEMENT statement = null;
QUERY query = null;
boolean hasCatalog = false;
}
{
(
LOOKAHEAD(2) ( { hasCatalog = true; })? statement=CreateCommand( useClause ) // CREATE admin thing vs CREATE graph thing
| ( { hasCatalog = true; })? statement=Command( useClause )
| query=SingleQueryWithUseClause( useClause ) ( query=Union(query) )*
)
{
if ( query != null )
{
return query;
}
return hasCatalog ? astFactory.hasCatalog( statement ) : statement;
}
}
QUERY PeriodicCommitQuery() :
{
Token t;
Token tPeriodicCommit;
Token batchSize = null;
CLAUSE loadCsv;
List queryBody;
}
{
t= tPeriodicCommit= ( batchSize= )?
loadCsv=LoadCSVClause()
queryBody=PeriodicCommitQueryBody()
{
return astFactory.periodicCommitQuery( pos( t ), pos( tPeriodicCommit ), batchSize == null ? null : batchSize.image, loadCsv, queryBody );
}
}
List PeriodicCommitQueryBody() :
{
CLAUSE x;
List clauses = new ArrayList<>();
}
{
( x=Clause() { clauses.add( x ); } )*
{
return clauses;
}
}
QUERY RegularQuery() :
{
QUERY x;
}
{
x=SingleQuery() ( x=Union(x) )*
{
return x;
}
}
QUERY Union( QUERY lhs ) :
{
Token t;
QUERY rhs;
boolean all = false;
}
{
t= ( { all = true; } )? rhs=SingleQuery()
{
return astFactory.newUnion( pos( t ), lhs, rhs, all );
}
}
QUERY SingleQuery() :
{
CLAUSE x;
List clauses = new ArrayList<>();
}
{
( x=Clause() { clauses.add( x ); } )+
{
return astFactory.newSingleQuery( clauses );
}
}
QUERY SingleQueryWithUseClause( CLAUSE useClause ) :
{
CLAUSE x;
List clauses = new ArrayList<>();
if ( useClause != null )
{
clauses.add( useClause );
}
}
{
( x=Clause() { clauses.add( x ); } )*
{
return astFactory.newSingleQuery( clauses );
}
}
CLAUSE Clause() :
{
CLAUSE x = null;
}
{
(
x=UseClause()
| x=ReturnClause()
| x=CreateClause() // because create index/constraint
| x=DeleteClause()
| x=SetClause()
| x=RemoveClause()
| x=MatchClause()
| x=MergeClause()
| x=WithClause()
| x=UnwindClause()
| LOOKAHEAD(2) x=CallClause() // because subqueries also start with CALL
| x=SubqueryClause()
| x=LoadCSVClause()
| x=ForeachClause()
)
{
return x;
}
}
// USE
USE_CLAUSE UseClause() :
{
Token t;
EXPRESSION e;
}
{
t= ( LOOKAHEAD( 2 ) )? e=Expression()
{
return astFactory.useClause( pos( t ), e );
}
}
// RETURN
RETURN_CLAUSE ReturnClause() :
{
Token t;
RETURN_CLAUSE clause = null;
}
{
t=
clause=ReturnBody( t )
{
return clause;
}
}
RETURN_CLAUSE ReturnBody( Token t ) :
{
Token skipPosition = null;
Token limitPosition = null;
boolean distinct = false;
List order = new ArrayList<>();
Token orderPos = null;
EXPRESSION skip = null;
EXPRESSION limit = null;
ORDER_ITEM o = null;
RETURN_ITEM x;
RETURN_ITEMS returnItems;
}
{
( LOOKAHEAD( 2 ) { distinct = true; } )?
( returnItems=ReturnItems() )
( orderPos= o=OrderItem() { order.add( o ); } ( "," o=OrderItem() {order.add( o ); } )* )? ( { skipPosition=token.next; } skip=Skip() )? ( { limitPosition=token.next; } limit=Limit() )?
{
return astFactory.newReturnClause( pos( t ), distinct, returnItems, order, pos( orderPos ), skip, pos( skipPosition ), limit, pos( limitPosition ) );
}
}
RETURN_ITEM ReturnItem() :
{
EXPRESSION e;
VARIABLE v = null;
Token eStart;
Token eEnd;
}
{
{ eStart = token; }
e=Expression() { eEnd = token; } ( v=Variable() )?
{
if ( v != null )
{
return astFactory.newReturnItem( pos( eStart.next ), e, v );
}
else
{
return astFactory.newReturnItem( pos( eStart.next ), e, eStart.next.beginOffset, eEnd.endOffset );
}
}
}
RETURN_ITEMS ReturnItems() :
{
Token returnItemsPosition;
RETURN_ITEM x;
List returnItems = new ArrayList<>();
boolean returnAll = false;
}
{
{ returnItemsPosition = token; }
(
{ returnAll = true; } ( "," x=ReturnItem() { returnItems.add( x ); } )*
| x=ReturnItem() { returnItems.add( x ); } ( "," x=ReturnItem() { returnItems.add( x ); } )*
) {
return astFactory.newReturnItems( pos( returnItemsPosition.next ), returnAll, returnItems );
}
}
ORDER_ITEM OrderItem() :
{
Token t;
EXPRESSION e;
}
{
{t = token;}
e=Expression()
(
{ return astFactory.orderDesc( pos( t.next ), e ); }
| ( )? { return astFactory.orderAsc( pos( t.next ), e ); }
)
}
EXPRESSION Skip() :
{
EXPRESSION e;
}
{
e=Expression()
{
return e;
}
}
EXPRESSION Limit() :
{
EXPRESSION e; }
{
e=Expression()
{
return e;
}
}
// WHERE
WHERE WhereClause() :
{
Token t;
EXPRESSION e;
}
{
t= e=Expression()
{
return astFactory.whereClause( pos( t ), e );
}
}
// WITH
CLAUSE WithClause() :
{
Token t;
RETURN_CLAUSE returnClause;
WHERE where = null;
}
{
t= returnClause=ReturnBody( t ) ( where=WhereClause() )?
{
return astFactory.withClause( pos( t ), returnClause, where );
}
}
// CREATE
CLAUSE CreateClause() :
{
Token t;
List patterns;
}
{
t= patterns=PatternList()
{
return astFactory.createClause( pos( t ), patterns );
}
}
// SET
SET_CLAUSE SetClause() :
{
Token t;
SET_ITEM item;
List items = new ArrayList<>();
}
{
t= item=SetItem() { items.add( item ); } ( "," item=SetItem() { items.add( item ); } )*
{
return astFactory.setClause( pos( t ), items );
}
}
SET_ITEM SetItem() :
{
EXPRESSION e;
PROPERTY p;
VARIABLE v;
List> labels;
}
{
LOOKAHEAD( 2 ) p=PropertyExpression() e=Expression() { return astFactory.setProperty( p, e ); }
| LOOKAHEAD( 2 ) v=Variable() e=Expression() { return astFactory.setVariable( v, e ); }
| LOOKAHEAD( 2 ) v = Variable() "+=" e=Expression() { return astFactory.addAndSetVariable( v, e ); }
| v = Variable() labels = NodeLabels() { return astFactory.setLabels( v, labels ); }
}
// REMOVE
CLAUSE RemoveClause() :
{
Token t;
REMOVE_ITEM item;
List items = new ArrayList<>();
}
{
t= item=RemoveItem() { items.add( item ); } ( "," item=RemoveItem() { items.add( item ); })*
{
return astFactory.removeClause( pos( t ), items );
}
}
REMOVE_ITEM RemoveItem() :
{
EXPRESSION e;
PROPERTY p;
VARIABLE v;
List> labels;
}
{
LOOKAHEAD(2) p=PropertyExpression() { return astFactory.removeProperty( p ); }
| v=Variable() labels=NodeLabels() { return astFactory.removeLabels( v, labels ); }
}
// DELETE
CLAUSE DeleteClause() :
{
Token detachT = null;
Token t;
boolean detach = false;
EXPRESSION e;
List list = new ArrayList<>();
}
{
( detachT= { detach = true; } )? t= e=Expression() {list.add( e );} ( "," e=Expression() { list.add( e ); } )*
{
return astFactory.deleteClause( pos( detachT != null ? detachT : t ), detach, list );
}
}
// MATCH
CLAUSE MatchClause() :
{
Token optionalT = null;
Token t;
Token whereToken = null;
boolean optional = false;
List patterns;
List hints;
WHERE where = null;
}
{
( optionalT= { optional = true; } )? t= patterns=PatternList() hints=Hints() ( where=WhereClause() )?
{
return astFactory.matchClause( pos( optionalT != null ? optionalT : t ), optional, patterns, pos( t.next ), hints, where );
}
}
List Hints() :
{
Token t;
boolean seek;
VARIABLE v;
Token labelOrRelType;
List joinVariables;
HINT hint;
List hints = null;
}
{
( t=
(
hint = IndexHintBody( HintIndexType.ANY, pos( t ) )
| hint = IndexHintBody( HintIndexType.BTREE, pos( t ) )
| hint = IndexHintBody( HintIndexType.TEXT, pos( t ) )
| joinVariables=VariableList1() { hint = astFactory.usingJoin( pos( t ), joinVariables ); }
| v=Variable() labelOrRelType=LabelOrRelType() { hint = astFactory.usingScan( pos( t ), v, labelOrRelType.image ); }
)
{
if ( hints == null )
{
hints = new ArrayList<>();
}
hints.add( hint );
}
)*
{
return hints;
}
}
HINT IndexHintBody( HintIndexType indexType, POS p ) :
{
boolean seek = false;
VARIABLE v;
Token labelOrRelType;
List propNames;
}
{
( LOOKAHEAD( 2 ) { seek = true; } )? v=Variable() labelOrRelType=LabelOrRelType() propNames=SymbolicNameList1()
{
return astFactory.usingIndexHint( p, v, labelOrRelType.image, propNames, seek, indexType);
}
}
// MERGE
CLAUSE MergeClause() :
{
Token t;
Token onToken;
PATTERN p;
SET_CLAUSE c;
ArrayList clauses = new ArrayList<>();
ArrayList positions = new ArrayList<>();
ArrayList actionTypes = new ArrayList<>();
}
{
t= p=Pattern()
(
onToken = (
c=SetClause() { clauses.add( c ); actionTypes.add( ASTFactory.MergeActionType.OnMatch ); positions.add( pos( onToken ) ); }
| c=SetClause() { clauses.add( c ); actionTypes.add( ASTFactory.MergeActionType.OnCreate ); positions.add( pos( onToken ) ); }
)
)*
{
return astFactory.mergeClause( pos( t ), p, clauses, actionTypes, positions );
}
}
// UNWIND
CLAUSE UnwindClause() :
{
Token t;
EXPRESSION e;
VARIABLE v;}
{
t= e=Expression() v=Variable()
{
return astFactory.unwindClause( pos( t ), e, v );
}
}
// CALL
CLAUSE CallClause() :
{
Token t;
Token procedureNamePosition;
Token procedureResultPosition = null;
List namespace;
String name;
EXPRESSION e;
List arguments = null;
boolean yieldAll = false;
CALL_RESULT_ITEM x;
List items = null;
WHERE where = null;
}
{
t= namespace=Namespace() {procedureNamePosition = token;} name=ProcedureName()
( { arguments = new ArrayList<>(); }
( LOOKAHEAD( 2 ) e=Expression() { arguments.add( e ); })? ( "," e=Expression() { arguments.add( e ); })*
)?
( procedureResultPosition= (
{ yieldAll = true; }
| { items = new ArrayList<>(); }
x=ProcedureResultItem() { items.add( x ); }
( "," x=ProcedureResultItem() { items.add( x ); })*
( where=WhereClause() )?
)
)?
{
return astFactory.callClause( pos( t ),
pos( t.next ),
pos( procedureNamePosition.next ),
pos( procedureResultPosition ),
namespace,
name,
arguments,
yieldAll,
items,
where );
}
}
String ProcedureName() :
{
Token t;
}
{
t=SymbolicNameString()
{
return t.image;
}
}
CALL_RESULT_ITEM ProcedureResultItem() :
{
Token t;
VARIABLE v = null;
}
{
t=SymbolicNameString() ( v=Variable() )?
{
return astFactory.callResultItem( pos( t ), t.image, v );
}
}
// LOAD CSV
CLAUSE LoadCSVClause() :
{
Token t;
boolean headers = false;
EXPRESSION source;
VARIABLE v;
Token sep = null;
}
{
t=
( { headers = true; } )?
source=Expression() v=Variable()
( ( sep=StringToken() ) )?
{
return astFactory.loadCsvClause( pos( t ), headers, source, v, sep == null ? null : sep.image );
}
}
// FOREACH
CLAUSE ForeachClause() :
{
Token t;
VARIABLE v;
EXPRESSION list;
CLAUSE c;
List clauses = new ArrayList<>();
}
{
t= v=Variable() list=Expression()
( c=Clause() { clauses.add( c ); } )+
{
return astFactory.foreachClause( pos( t ), v, list, clauses );
}
}
CLAUSE SubqueryClause() :
{
Token t;
QUERY q;
SUBQUERY_IN_TRANSACTIONS_PARAMETERS inTransactionsParams = null;
}
{
t=
( q=PeriodicCommitQuery() | q=RegularQuery() )
( inTransactionsParams = SubqueryInTransactionsParameters() )?
{
return astFactory.subqueryClause( pos( t ), q, inTransactionsParams );
}
}
SUBQUERY_IN_TRANSACTIONS_PARAMETERS SubqueryInTransactionsParameters() :
{
Token t;
EXPRESSION batchSize = null;
}
{
t=
( batchSize=Expression() ( | ))?
{
return astFactory.subqueryInTransactionsParams( pos( t ), batchSize );
}
}
// PATTERN
List PatternList() :
{
PATTERN p;
List patterns = new ArrayList<>();
}
{
p=Pattern() { patterns.add( p ); } ( "," p=Pattern() { patterns.add( p ); } )*
{
return patterns;
}
}
PATTERN Pattern() :
{
VARIABLE v;
PATTERN p;
}
{
LOOKAHEAD( 2 ) v=Variable() p=AnonymousPattern() { return astFactory.namedPattern( v, p ); }
| p=AnonymousPattern() { return p; }
}
PATTERN AnonymousPattern() :
{
PATTERN p;
}
{
(
p=ShortestPathPattern()
| LOOKAHEAD( 3 ) p=EveryPathPattern()
| p=AnonymousPattern()
)
{
return p;
}
}
PATTERN ShortestPathPattern() :
{
Token t;
PATTERN p;
}
{
t= p=EveryPathPattern() { return astFactory.shortestPathPattern( pos( t ), p ); }
| t= p=EveryPathPattern() { return astFactory.allShortestPathsPattern( pos( t ), p ); }
}
PATTERN EveryPathPattern() :
{
NODE_PATTERN n;
REL_PATTERN r;
List relationships = new ArrayList<>();
List nodes = new ArrayList<>();
}
{
n=NodePattern() { nodes.add( n ); }
(
LOOKAHEAD( 2 ) r=RelationshipPattern() { relationships.add( r ); }
n=NodePattern() { nodes.add( n ); }
)*
{
return astFactory.everyPathPattern( nodes, relationships );
}
}
PATTERN EveryPathPatternNonEmpty() :
{
NODE_PATTERN n;
REL_PATTERN r;
List relationships = new ArrayList<>();
List nodes = new ArrayList<>();
}
{
n=NodePattern() { nodes.add( n ); }
(
LOOKAHEAD( 2 ) r=RelationshipPattern() {relationships.add( r );}
n=NodePattern() { nodes.add( n ); }
)+
{
return astFactory.everyPathPattern( nodes, relationships );
}
}
NODE_PATTERN NodePattern() :
{
Token t;
VARIABLE v = null;
List> labels = new ArrayList<>();
EXPRESSION properties = null;
EXPRESSION predicate = null;
}
{
t=
(
v=Variable() [labels=NodeLabels()] [properties=Properties()] [ predicate=Expression()]
| [labels=NodeLabels()] [properties=Properties()]
)
{
return astFactory.nodePattern( pos( t ), v, labels, properties, predicate );
}
}
List> NodeLabels() :
{
Token label;
List> labels = new ArrayList<>();
}
{
( LOOKAHEAD( 2 ) label=LabelOrRelType() { labels.add( new StringPos<>( label.image, pos( label ) ) ); } )+
{
return labels;
}
}
EXPRESSION HasLabels(EXPRESSION subject) :
{
List> labels;
}
{
labels=NodeLabels()
{
return astFactory.hasLabelsOrTypes( subject, labels );
}
}
Token LabelOrRelType() :
{
Token t;
}
{
":" t=SymbolicNameString()
{
return t;
}
}
List> LabelOrRelTypes() :
{
List> labels = new ArrayList<>();
StringPos label;
}
{
":" SymbolicNameString() { labels.add( new StringPos( token.image, pos(token) ) ); }
( SymbolicNameString() { labels.add( new StringPos( token.image, pos(token) ) ); } )*
{
return labels;
}
}
EXPRESSION Properties() :
{
EXPRESSION e;
}
{
(
LOOKAHEAD( 3 ) e=MapLiteral()
| e=Parameter( ParameterType.ANY )
| e=OldParameter()
)
{
return e;
}
}
REL_PATTERN RelationshipPattern() :
{
Token firstToken = token.next;
Token t;
boolean left = false;
boolean right = false;
VARIABLE v = null;
List> relTypes = new ArrayList<>();
boolean legacyTypeSeparator = false;
PATH_LENGTH pathLength = null;
EXPRESSION properties = null;
}
{
( LeftArrow() { left = true; })? ArrowLine()
( ( v=Variable() )?
( ":" t=SymbolicNameString()
{
relTypes = new ArrayList<>();
relTypes.add(new StringPos<>( t.image, pos( t ) ) );
}
( ( ":" {legacyTypeSeparator = true; })? t=SymbolicNameString() { relTypes.add( new StringPos<>( t.image, pos( t ) ) ); })*
)?
( pathLength=PathLength() )?
( properties=Properties() )?
)?
ArrowLine() ( RightArrow() { right = true; } )?
{
return astFactory.relationshipPattern( pos( firstToken ), left, right, v, relTypes, pathLength, properties, legacyTypeSeparator );
}
}
void LeftArrow() :
{}
{
|
}
void ArrowLine() :
{}
{
|
}
void RightArrow() :
{}
{
|
}
PATH_LENGTH PathLength() :
{
Token t;
PATH_LENGTH p = null;
}
{
t= ( p=PathLengthLiteral( t ) )?
{
return p == null ? astFactory.pathLength( pos( t ), null, null, null, null ) : p;
}
}
PATH_LENGTH PathLengthLiteral( Token t ) :
{
Token v1 = null;
Token v2 = null;
}
{
LOOKAHEAD( 2 ) ( v1= )? t= ( v2= )?
{
return astFactory.pathLength( pos( t ), v1 == null ? null : pos ( v1 ), v2 == null ? null : pos ( v2 ), v1 == null ? "" : v1.image, v2 == null ? "" : v2.image );
}
| v1=
{
String v = v1 == null ? "" : v1.image;
return astFactory.pathLength( pos( t ), v1 == null ? null : pos ( v1 ), v1 == null ? null : pos ( v1 ), v, v);
}
}
// EXPRESSIONS
EXPRESSION Expression() :
{
EXPRESSION e;
}
{
e=Expression12()
{
return e;
}
}
EXPRESSION Expression12() :
{
Token t;
EXPRESSION e;
EXPRESSION temp;
}
{
e=Expression11() ( t= temp=Expression11() { e = astFactory.or( pos( t ), e, temp ); } )*
{
return e;
}
}
EXPRESSION Expression11() :
{
Token t;
EXPRESSION e;
EXPRESSION temp;
}
{
e=Expression10() ( t= temp=Expression10() { e = astFactory.xor( pos( t ), e, temp ); } )*
{
return e;
}
}
EXPRESSION Expression10() :
{
Token t;
EXPRESSION e;
EXPRESSION temp;
}
{
e=Expression9() (t= temp=Expression9() { e = astFactory.and( pos( t ), e, temp ); } )*
{
return e;
}
}
EXPRESSION Expression9() :
{
Token t;
EXPRESSION e;
}
{
(
LOOKAHEAD( 3 ) t= e=Expression9() { e = astFactory.not( pos( t ), e ); }
| e=Expression8()
)
{
return e;
}
}
EXPRESSION Expression8() :
{
Token t;
EXPRESSION e;
EXPRESSION lhs;
EXPRESSION rhs;
List expressions = new ArrayList();
}
{
e=Expression7() { lhs = e; } (
LOOKAHEAD( 2 ) t= rhs=Expression7() { expressions.add( astFactory.eq( pos( t ), lhs, rhs)); lhs = rhs; }
| t= rhs=Expression7() { expressions.add( astFactory.neq( pos( t ), lhs, rhs ) ); lhs = rhs; }
| t= rhs=Expression7() { expressions.add( astFactory.neq2( pos( t ), lhs, rhs ) ); lhs = rhs; }
| t= rhs=Expression7() { expressions.add( astFactory.lte( pos( t ), lhs, rhs ) ); lhs = rhs; }
| t= rhs=Expression7() { expressions.add( astFactory.gte( pos( t ), lhs, rhs ) ); lhs = rhs; }
| t= rhs=Expression7() { expressions.add( astFactory.lt( pos( t ), lhs, rhs ) ); lhs = rhs; }
| t= rhs=Expression7() { expressions.add( astFactory.gt( pos( t ), lhs, rhs ) ); lhs = rhs; }
)*
{
if ( expressions.isEmpty() )
{
return e;
}
else if ( expressions.size() == 1 )
{
return expressions.get( 0 );
}
else
{
return astFactory.ands( expressions );
}
}
}
EXPRESSION Expression7() :
{
EXPRESSION e;
}
{
e=Expression6() ( e=ComparisonExpression6( e ) )?
{
return e;
}
}
EXPRESSION ComparisonExpression6( EXPRESSION lhs ) :
{
Token t;
EXPRESSION rhs;
}
{
LOOKAHEAD( 2 ) t= rhs=Expression6() { return astFactory.regeq( pos( t ), lhs, rhs ); }
| t= rhs=Expression6() { return astFactory.startsWith( pos( t ), lhs, rhs ); }
| t= rhs=Expression6() { return astFactory.endsWith( pos( t ), lhs, rhs ); }
| t= rhs=Expression6() { return astFactory.contains( pos( t ), lhs, rhs ); }
| t= rhs=Expression6() { return astFactory.in( pos( t ), lhs, rhs ); }
| t= (
{ return astFactory.isNull( pos( t ), lhs ); }
| { return astFactory.isNotNull( pos( t ), lhs ); }
)
}
EXPRESSION Expression6() :
{
Token t;
EXPRESSION lhs;
EXPRESSION rhs;
}
{
lhs=Expression5() (
t= rhs=Expression5() { lhs = astFactory.plus( pos( t ), lhs, rhs); }
| t= rhs=Expression5() { lhs = astFactory.minus( pos( t ), lhs, rhs); }
)*
{
return lhs;
}
}
EXPRESSION Expression5() :
{
Token t;
EXPRESSION lhs;
EXPRESSION rhs;
}
{
lhs=Expression4() (
t= rhs=Expression4() { lhs = astFactory.multiply( pos( t ), lhs, rhs ); }
| t= rhs=Expression4() { lhs = astFactory.divide( pos( t ), lhs, rhs ); }
| t= rhs=Expression4() { lhs = astFactory.modulo( pos( t ), lhs, rhs ); }
)*
{
return lhs;
}
}
EXPRESSION Expression4() :
{
Token t;
EXPRESSION lhs;
EXPRESSION rhs;
}
{
lhs=Expression3() ( t= rhs=Expression3() { lhs = astFactory.pow( pos( t ), lhs, rhs ); } )*
{
return lhs;
}
}
EXPRESSION Expression3() :
{
Token t;
EXPRESSION e;
}
{
(
LOOKAHEAD(3) e=Expression2()
| t = e=Expression2() { e = astFactory.unaryPlus( pos( t ), e ); }
| t = e=Expression2() { e = astFactory.unaryMinus( pos( t ), e ); }
)
{
return e;
}
}
EXPRESSION Expression2() :
{
EXPRESSION e;
}
{
e=Expression1() ( e=PostFix1( e ) )*
{
return e;
}
}
EXPRESSION PostFix1( EXPRESSION subject ) :
{
Token t;
EXPRESSION e1 = null;
EXPRESSION e2 = null;
EXPRESSION ret;
}
{
(
ret=Property( subject )
| ret=HasLabels( subject )
| LOOKAHEAD( Expression() ) e1=Expression() { ret=astFactory.listLookup( subject, e1 ); }
| t= ( e1=Expression() )? ( e2=Expression() )? { ret=astFactory.listSlice( pos( t ), subject, e1, e2 ); }
)
{
return ret;
}
}
PROPERTY Property( EXPRESSION subject ) :
{
EXPRESSION e;
StringPos propKeyName;
}
{
propKeyName=PropertyKeyName()
{
return astFactory.property( subject, propKeyName );
}
}
PROPERTY PropertyExpression() :
{
EXPRESSION subject;
PROPERTY p;
}
{
subject=Expression1() ( p=Property( subject ) { subject = p; } )+
{
return p;
}
}
EXPRESSION Expression1() :
{
EXPRESSION e = null;
Token t;
}
{
(
e=NumberLiteral()
| e=StringLiteral()
| e=Parameter( ParameterType.ANY )
| t= { e = astFactory.newTrueLiteral( pos( t ) ); }
| t= { e = astFactory.newFalseLiteral( pos( t ) ); }
| LOOKAHEAD( 2 ) t= { e = astFactory.newNullLiteral( pos( t ) ); }
| LOOKAHEAD( 3 ) e=CaseExpression()
| LOOKAHEAD( 3 ) t= { e = astFactory.newCountStar( pos( t ) ); }
| LOOKAHEAD( 3 ) e=MapLiteral()
| LOOKAHEAD( 3 ) e=ExistsSubQuery() // `exists { match` should not be a map-projection
| LOOKAHEAD( 2 ) e=MapProjection()
| e=OldParameter()
| LOOKAHEAD( v=Variable() e=Expression() ( | | )) e=ListComprehension() // before literal because it takes precedence. Lookahead due to potential confusion with ListLiteral
| LOOKAHEAD( PatternComprehensionPrefix() ) e=PatternComprehension() // Only after matching up to "WHERE" or "|" can we be sure it is a PatternComprehension and not a ListLiteral.
| LOOKAHEAD( 3 ) e=ListLiteral()
| LOOKAHEAD( 3 ) e=FilterExpression()
| LOOKAHEAD( 3 ) e=ExtractExpression()
| LOOKAHEAD( 3 ) e=ReduceExpression()
| LOOKAHEAD( 3 ) e=AllExpression()
| LOOKAHEAD( 3 ) e=AnyExpression()
| LOOKAHEAD( 3 ) e=NoneExpression()
| LOOKAHEAD( 3 ) e=SingleExpression()
| LOOKAHEAD( NodePattern() RelationshipPattern() ) e=PatternExpression()
| LOOKAHEAD( 2 ) e=ShortestPathExpression()
| e=Expression()
| LOOKAHEAD( (SymbolicNameString() )* SymbolicNameString() ) e=FunctionInvocation()
| e=Variable()
)
{
return e;
}
}
EXPRESSION CaseExpression() :
{
Token t;
EXPRESSION caseExpr = null;
EXPRESSION e;
List when = new ArrayList<>();
List