hydra-0.8.0: src/main/haskell/Hydra/Sources/Tier4/Ext/Cypher/OpenCypher.hs
{-# LANGUAGE OverloadedStrings #-}
module Hydra.Sources.Tier4.Ext.Cypher.OpenCypher where
import Hydra.Sources.Tier3.All
import Hydra.Dsl.Annotations
import Hydra.Dsl.Bootstrap
import Hydra.Dsl.Types as Types
openCypherModule :: Module
openCypherModule = Module ns elements [hydraCoreModule] tier0Modules $
Just ("A Cypher model based on the OpenCypher specification (version 23), copyright Neo Technology, available at:\n" ++
" https://opencypher.org/resources/")
where
ns = Namespace "hydra/ext/cypher/openCypher"
def = datatype ns
cypher = typeref ns
elements = [
-- Cypher = [SP], Statement, [[SP], ';'], [SP], EOI ;
--
-- Statement = Query ;
--
-- Query = RegularQuery
-- | StandaloneCall
-- ;
def "Query" $
union [
"regular">: cypher "RegularQuery",
"standalone">: cypher "StandaloneCall"],
-- RegularQuery = SingleQuery, { [SP], Union } ;
def "RegularQuery" $
record [
"head">: cypher "SingleQuery",
"rest">: list $ cypher "Union"],
-- Union = ((U,N,I,O,N), SP, (A,L,L), [SP], SingleQuery)
-- | ((U,N,I,O,N), [SP], SingleQuery)
-- ;
def "Union" $
record [
"all">: boolean,
"query">: cypher "SingleQuery"],
-- SingleQuery = SinglePartQuery
-- | MultiPartQuery
-- ;
def "SingleQuery" $
union [
"singlePart">: cypher "SinglePartQuery",
"multiPart">: cypher "MultiPartQuery"],
-- SinglePartQuery = ({ ReadingClause, [SP] }, Return)
-- | ({ ReadingClause, [SP] }, UpdatingClause, { [SP], UpdatingClause }, [[SP], Return])
-- ;
def "SinglePartQuery" $
record [
"reading">: list $ cypher "ReadingClause",
"updating">: list $ cypher "UpdatingClause",
"return">: optional $ cypher "Return"],
-- MultiPartQuery = { { ReadingClause, [SP] }, { UpdatingClause, [SP] }, With, [SP] }-, SinglePartQuery ;
def "WithClause" $
record [
"reading">: list $ cypher "ReadingClause",
"updating">: list $ cypher "UpdatingClause",
"with">: cypher "With"],
def "MultiPartQuery" $
record [
"with">: list $ cypher "WithClause",
"body">: cypher "SinglePartQuery"],
-- UpdatingClause = Create
-- | Merge
-- | Delete
-- | Set
-- | Remove
-- ;
def "UpdatingClause" $
union [
"create">: cypher "Create",
"merge">: cypher "Merge",
"delete">: cypher "Delete",
"set">: cypher "Set",
"remove">: cypher "Remove"],
-- ReadingClause = Match
-- | Unwind
-- | InQueryCall
-- ;
def "ReadingClause" $
union [
"match">: cypher "Match",
"unwind">: cypher "Unwind",
"inQueryCall">: cypher "InQueryCall"],
-- Match = [(O,P,T,I,O,N,A,L), SP], (M,A,T,C,H), [SP], Pattern, [[SP], Where] ;
def "Match" $
record [
"optional">: boolean,
"pattern">: cypher "Pattern",
"where">: optional $ cypher "Where"],
-- Unwind = (U,N,W,I,N,D), [SP], Expression, SP, (A,S), SP, Variable ;
def "Unwind" $
record [
"expression">: cypher "Expression",
"variable">: cypher "Variable"],
-- Merge = (M,E,R,G,E), [SP], PatternPart, { SP, MergeAction } ;
def "Merge" $
record [
"patternPart">: cypher "PatternPart",
"actions">: list $ cypher "MergeAction"],
-- MergeAction = ((O,N), SP, (M,A,T,C,H), SP, Set)
-- | ((O,N), SP, (C,R,E,A,T,E), SP, Set)
-- ;
def "MatchOrCreate" $
enum ["match", "create"],
def "MergeAction" $
record [
"action">: cypher "MatchOrCreate",
"set">: cypher "Set"],
-- Create = (C,R,E,A,T,E), [SP], Pattern ;
def "Create" $ cypher "Pattern",
-- Set = (S,E,T), [SP], SetItem, { [SP], ',', [SP], SetItem } ;
def "Set" $
nonemptyList $ cypher "SetItem",
-- SetItem = (PropertyExpression, [SP], '=', [SP], Expression)
-- | (Variable, [SP], '=', [SP], Expression)
-- | (Variable, [SP], '+=', [SP], Expression)
-- | (Variable, [SP], NodeLabels)
-- ;
def "SetItem" $
union [
"property">: cypher "PropertyEquals",
"variableEqual">: cypher "VariableEquals",
"variablePlusEqual">: cypher "VariablePlusEquals",
"variableLabels">: cypher "VariableAndNodeLabels"],
def "PropertyEquals" $
record [
"lhs">: cypher "PropertyExpression",
"rhs">: cypher "Expression"],
def "VariableEquals" $
record [
"lhs">: cypher "Variable",
"rhs">: cypher "Expression"],
def "VariablePlusEquals" $
record [
"lhs">: cypher "Variable",
"rhs">: cypher "Expression"],
def "VariableAndNodeLabels" $
record [
"variable">: cypher "Variable",
"labels">: cypher "NodeLabels"],
-- Delete = [(D,E,T,A,C,H), SP], (D,E,L,E,T,E), [SP], Expression, { [SP], ',', [SP], Expression } ;
def "Delete" $
record [
"detach">: boolean,
"expressions">: nonemptyList $ cypher "Expression"],
-- Remove = (R,E,M,O,V,E), SP, RemoveItem, { [SP], ',', [SP], RemoveItem } ;
def "Remove" $
nonemptyList $ cypher "RemoveItem",
-- RemoveItem = (Variable, NodeLabels)
-- | PropertyExpression
-- ;
def "RemoveItem" $
union [
"variableLabels">: cypher "VariableAndNodeLabels",
"property">: cypher "PropertyExpression"],
-- InQueryCall = (C,A,L,L), SP, ExplicitProcedureInvocation, [[SP], (Y,I,E,L,D), SP, YieldItems] ;
def "InQueryCall" $
record [
"call">: cypher "ExplicitProcedureInvocation",
"yieldItems">: optional $ cypher "YieldItems"],
-- StandaloneCall = (C,A,L,L), SP, (ExplicitProcedureInvocation | ImplicitProcedureInvocation), [[SP], (Y,I,E,L,D), SP, ('*' | YieldItems)] ;
def "ProcedureInvocation" $
union [
"explicit">: cypher "ExplicitProcedureInvocation",
"implicit">: cypher "ImplicitProcedureInvocation"],
def "StarOrYieldItems" $
union [
"star">: unit,
"items">: cypher "YieldItems"],
def "StandaloneCall" $
record [
"call">: cypher "ProcedureInvocation",
"yieldItems">: optional $ cypher "StarOrYieldItems"],
-- YieldItems = YieldItem, { [SP], ',', [SP], YieldItem }, [[SP], Where] ;
def "YieldItems" $
record [
"items">: nonemptyList $ cypher "YieldItem",
"where">: optional $ cypher "Where"],
-- YieldItem = [ProcedureResultField, SP, (A,S), SP], Variable ;
def "YieldItem" $
record [
"field">: optional $ cypher "ProcedureResultField",
"variable">: cypher "Variable"],
-- With = (W,I,T,H), ProjectionBody, [[SP], Where] ;
def "With" $
record [
"projection">: cypher "ProjectionBody",
"where">: optional $ cypher "Where"],
-- Return = (R,E,T,U,R,N), ProjectionBody ;
def "Return" $
cypher "ProjectionBody",
-- ProjectionBody = [[SP], (D,I,S,T,I,N,C,T)], SP, ProjectionItems, [SP, Order], [SP, Skip], [SP, Limit] ;
def "ProjectionBody" $
record [
"distinct">: boolean,
"projectionItems">: cypher "ProjectionItems",
"order">: optional $ cypher "Order",
"skip">: optional $ cypher "Skip",
"limit">: optional $ cypher "Limit"],
-- ProjectionItems = ('*', { [SP], ',', [SP], ProjectionItem })
-- | (ProjectionItem, { [SP], ',', [SP], ProjectionItem })
-- ;
def "ProjectionItems" $
record [
"star">: boolean,
"explicit">: list $ cypher "ProjectionItem"],
-- ProjectionItem = (Expression, SP, (A,S), SP, Variable)
-- | Expression
-- ;
def "ProjectionItem" $
record [
"expression">: cypher "Expression",
"variable">: optional $ cypher "Variable"],
-- Order = (O,R,D,E,R), SP, (B,Y), SP, SortItem, { ',', [SP], SortItem } ;
def "Order" $
nonemptyList $ cypher "SortItem",
-- Skip = (S,K,I,P), SP, Expression ;
def "Skip" $
cypher "Expression",
-- Limit = (L,I,M,I,T), SP, Expression ;
def "Limit" $
cypher "Expression",
-- SortItem = Expression, [[SP], ((A,S,C,E,N,D,I,N,G) | (A,S,C) | (D,E,S,C,E,N,D,I,N,G) | (D,E,S,C))] ;
def "SortOrder" $
enum ["ascending", "descending"],
def "SortItem" $
record [
"expression">: cypher "Expression",
"order">: optional $ cypher "SortOrder"],
-- Where = (W,H,E,R,E), SP, Expression ;
def "Where" $
cypher "Expression",
-- Pattern = PatternPart, { [SP], ',', [SP], PatternPart } ;
def "Pattern" $
nonemptyList $ cypher "PatternPart",
-- PatternPart = (Variable, [SP], '=', [SP], AnonymousPatternPart)
-- | AnonymousPatternPart
-- ;
def "PatternPart" $
record [
"variable">: optional $ cypher "Variable",
"pattern">: cypher "AnonymousPatternPart"],
-- AnonymousPatternPart = PatternElement ;
def "AnonymousPatternPart" $
cypher "PatternElement",
-- PatternElement = (NodePattern, { [SP], PatternElementChain })
-- | ('(', PatternElement, ')')
-- ;
def "NodePatternChain" $
record [
"nodePattern">: cypher "NodePattern",
"chain">: list $ cypher "PatternElementChain"],
def "PatternElement" $
union [
"chained">: cypher "NodePatternChain",
"parenthesized">: cypher "PatternElement"],
-- RelationshipsPattern = NodePattern, { [SP], PatternElementChain }- ;
def "RelationshipsPattern" $
record [
"nodePattern">: cypher "NodePattern",
"chain">: nonemptyList $ cypher "PatternElementChain"],
-- NodePattern = '(', [SP], [Variable, [SP]], [NodeLabels, [SP]], [Properties, [SP]], ')' ;
def "NodePattern" $
record [
"variable">: optional $ cypher "Variable",
"labels">: optional $ cypher "NodeLabels",
"properties">: optional $ cypher "Properties"],
-- PatternElementChain = RelationshipPattern, [SP], NodePattern ;
def "PatternElementChain" $
record [
"relationship">: cypher "RelationshipPattern",
"node">: cypher "NodePattern"],
-- RelationshipPattern = (LeftArrowHead, [SP], Dash, [SP], [RelationshipDetail], [SP], Dash, [SP], RightArrowHead)
-- | (LeftArrowHead, [SP], Dash, [SP], [RelationshipDetail], [SP], Dash)
-- | (Dash, [SP], [RelationshipDetail], [SP], Dash, [SP], RightArrowHead)
-- | (Dash, [SP], [RelationshipDetail], [SP], Dash)
-- ;
def "RelationshipPattern" $
record [
"leftArrow">: boolean,
"detail">: optional $ cypher "RelationshipDetail",
"rightArrow">: boolean],
-- RelationshipDetail = '[', [SP], [Variable, [SP]], [RelationshipTypes, [SP]], [RangeLiteral], [Properties, [SP]], ']' ;
def "RelationshipDetail" $
record [
"variable">: optional $ cypher "Variable",
"types">: optional $ cypher "RelationshipTypes",
"range">: optional $ cypher "RangeLiteral",
"properties">: optional $ cypher "Properties"],
-- Properties = MapLiteral
-- | Parameter
-- ;
def "Properties" $
union [
"map">: cypher "MapLiteral",
"parameter">: cypher "Parameter"],
-- RelationshipTypes = ':', [SP], RelTypeName, { [SP], '|', [':'], [SP], RelTypeName } ;
-- TODO: check whether the slight difference in colon syntax is significant
def "RelationshipTypes" $ nonemptyList $ cypher "RelTypeName",
-- NodeLabels = NodeLabel, { [SP], NodeLabel } ;
def "NodeLabels" $ nonemptyList $ cypher "NodeLabel",
-- NodeLabel = ':', [SP], LabelName ;
def "NodeLabel" string,
-- RangeLiteral = '*', [SP], [IntegerLiteral, [SP]], ['..', [SP], [IntegerLiteral, [SP]]] ;
def "RangeLiteral" $
record [
"start">: optional bigint,
"end">: optional bigint],
-- LabelName = SchemaName ;
--
-- RelTypeName = SchemaName ;
def "RelTypeName" string,
-- PropertyExpression = Atom, { [SP], PropertyLookup }- ;
def "PropertyExpression" $
record [
"atom">: cypher "Atom",
"lookups">: nonemptyList $ cypher "PropertyLookup"],
-- Expression = OrExpression ;
def "Expression" $ cypher "OrExpression",
-- OrExpression = XorExpression, { SP, (O,R), SP, XorExpression } ;
def "OrExpression" $ nonemptyList $ cypher "XorExpression",
-- XorExpression = AndExpression, { SP, (X,O,R), SP, AndExpression } ;
def "XorExpression" $ nonemptyList $ cypher "AndExpression",
-- AndExpression = NotExpression, { SP, (A,N,D), SP, NotExpression } ;
def "AndExpression" $ nonemptyList $ cypher "NotExpression",
-- NotExpression = { (N,O,T), [SP] }, ComparisonExpression ;
def "NotExpression" $
record [
"not">: boolean,
"expression">: cypher "ComparisonExpression"],
-- ComparisonExpression = StringListNullPredicateExpression, { [SP], PartialComparisonExpression } ;
def "ComparisonExpression" $
record [
"left">: cypher "StringListNullPredicateExpression",
"right">: list $ cypher "PartialComparisonExpression"],
-- PartialComparisonExpression = ('=', [SP], StringListNullPredicateExpression)
-- | ('<>', [SP], StringListNullPredicateExpression)
-- | ('<', [SP], StringListNullPredicateExpression)
-- | ('>', [SP], StringListNullPredicateExpression)
-- | ('<=', [SP], StringListNullPredicateExpression)
-- | ('>=', [SP], StringListNullPredicateExpression)
-- ;
def "ComparisonOperator" $
enum [
"eq",
"neq",
"lt",
"gt",
"lte",
"gte"],
def "PartialComparisonExpression" $
record [
"operator">: cypher "ComparisonOperator",
"right">: cypher "StringListNullPredicateExpression"],
-- StringListNullPredicateExpression = AddOrSubtractExpression, { StringPredicateExpression | ListPredicateExpression | NullPredicateExpression } ;
def "StringListNullPredicateExpression" $
record [
"left">: cypher "AddOrSubtractExpression",
"right">: list $ cypher "StringListNullPredicateRightHandSide"],
def "StringListNullPredicateRightHandSide" $
union [
"string">: cypher "StringPredicateExpression",
"list">: cypher "ListPredicateExpression",
"null">: cypher "NullPredicateExpression"],
-- StringPredicateExpression = ((SP, (S,T,A,R,T,S), SP, (W,I,T,H)) | (SP, (E,N,D,S), SP, (W,I,T,H)) | (SP, (C,O,N,T,A,I,N,S))), [SP], AddOrSubtractExpression ;
def "StringPredicateExpression" $
record [
"operator">: cypher "StringPredicateOperator",
"expression">: cypher "AddOrSubtractExpression"],
def "StringPredicateOperator" $
enum [
"startsWith",
"endsWith",
"contains"],
-- ListPredicateExpression = SP, (I,N), [SP], AddOrSubtractExpression ;
def "ListPredicateExpression" $
cypher "AddOrSubtractExpression",
-- NullPredicateExpression = (SP, (I,S), SP, (N,U,L,L))
-- | (SP, (I,S), SP, (N,O,T), SP, (N,U,L,L))
-- ;
def "NullPredicateExpression" $
boolean, -- true: NULL, false: NOT NULL
-- AddOrSubtractExpression = MultiplyDivideModuloExpression, { ([SP], '+', [SP], MultiplyDivideModuloExpression) | ([SP], '-', [SP], MultiplyDivideModuloExpression) } ;
def "AddOrSubtractExpression" $
record [
"left">: cypher "MultiplyDivideModuloExpression",
"right">: list $ cypher "AddOrSubtractRightHandSide"],
def "AddOrSubtractRightHandSide" $
record [
"operator">: cypher "AddOrSubtractOperator",
"expression">: cypher "MultiplyDivideModuloExpression"],
def "AddOrSubtractOperator" $
enum [
"add",
"subtract"],
-- MultiplyDivideModuloExpression = PowerOfExpression, { ([SP], '*', [SP], PowerOfExpression) | ([SP], '/', [SP], PowerOfExpression) | ([SP], '%', [SP], PowerOfExpression) } ;
def "MultiplyDivideModuloExpression" $
record [
"left">: cypher "PowerOfExpression",
"right">: list $ cypher "MultiplyDivideModuloRightHandSide"],
def "MultiplyDivideModuloRightHandSide" $
record [
"operator">: cypher "MultiplyDivideModuloOperator",
"expression">: cypher "PowerOfExpression"],
def "MultiplyDivideModuloOperator" $
enum [
"multiply",
"divide",
"modulo"],
-- PowerOfExpression = UnaryAddOrSubtractExpression, { [SP], '^', [SP], UnaryAddOrSubtractExpression } ;
def "PowerOfExpression" $ nonemptyList $ cypher "UnaryAddOrSubtractExpression",
-- UnaryAddOrSubtractExpression = NonArithmeticOperatorExpression
-- | (('+' | '-'), [SP], NonArithmeticOperatorExpression)
-- ;
def "UnaryAddOrSubtractExpression" $
record [
"operator">: optional $ cypher "AddOrSubtractOperator",
"expression">: cypher "NonArithmeticOperatorExpression"],
-- NonArithmeticOperatorExpression = Atom, { ([SP], ListOperatorExpression) | ([SP], PropertyLookup) }, [[SP], NodeLabels] ;
def "ListOperatorExpressionOrPropertyLookup" $
union [
"list">: cypher "ListOperatorExpression",
"property">: cypher "PropertyLookup"],
def "NonArithmeticOperatorExpression" $
record [
"atom">: cypher "Atom",
"listsAndLookups">: list $ cypher "ListOperatorExpressionOrPropertyLookup",
"labels">: optional $ cypher "NodeLabels"],
-- ListOperatorExpression = ('[', Expression, ']')
-- | ('[', [Expression], '..', [Expression], ']')
-- ;
def "RangeExpression" $
record [
"start">: optional $ cypher "Expression",
"end">: optional $ cypher "Expression"],
def "ListOperatorExpression" $
union [
"single">: cypher "Expression",
"range">: cypher "RangeExpression"],
-- PropertyLookup = '.', [SP], (PropertyKeyName) ;
def "PropertyLookup" $
cypher "PropertyKeyName",
-- Atom = Literal
-- | Parameter
-- | CaseExpression
-- | ((C,O,U,N,T), [SP], '(', [SP], '*', [SP], ')')
-- | ListComprehension
-- | PatternComprehension
-- | Quantifier
-- | PatternPredicate
-- | ParenthesizedExpression
-- | FunctionInvocation
-- | ExistentialSubquery
-- | Variable
-- ;
def "Atom" $
union [
"literal">: cypher "Literal",
"parameter">: cypher "Parameter",
"case">: cypher "CaseExpression",
"countStar">: unit,
"listComprehension">: cypher "ListComprehension",
"patternComprehension">: cypher "PatternComprehension",
"quantifier">: cypher "Quantifier",
"patternPredicate">: cypher "PatternPredicate",
"parenthesized">: cypher "ParenthesizedExpression",
"functionInvocation">: cypher "FunctionInvocation",
"existentialSubquery">: cypher "ExistentialSubquery",
"variable">: cypher "Variable"],
-- CaseExpression = (((C,A,S,E), { [SP], CaseAlternative }-) | ((C,A,S,E), [SP], Expression, { [SP], CaseAlternative }-)), [[SP], (E,L,S,E), [SP], Expression], [SP], (E,N,D) ;
def "CaseExpression" $
record [
"expression">: optional $ cypher "Expression",
"alternatives">: nonemptyList $ cypher "CaseAlternative",
"else">: optional $ cypher "Expression"],
-- CaseAlternative = (W,H,E,N), [SP], Expression, [SP], (T,H,E,N), [SP], Expression ;
def "CaseAlternative" $
record [
"condition">: cypher "Expression",
"result">: cypher "Expression"],
-- ListComprehension = '[', [SP], FilterExpression, [[SP], '|', [SP], Expression], [SP], ']' ;
def "ListComprehension" $
record [
"left">: cypher "FilterExpression",
"right">: optional $ cypher "Expression"],
-- PatternComprehension = '[', [SP], [Variable, [SP], '=', [SP]], RelationshipsPattern, [SP], [Where, [SP]], '|', [SP], Expression, [SP], ']' ;
def "PatternComprehension" $
record [
"variable">: optional $ cypher "Variable",
"pattern">: cypher "RelationshipsPattern",
"where">: optional $ cypher "Where",
"right">: cypher "Expression"],
-- Quantifier = ((A,L,L), [SP], '(', [SP], FilterExpression, [SP], ')')
-- | ((A,N,Y), [SP], '(', [SP], FilterExpression, [SP], ')')
-- | ((N,O,N,E), [SP], '(', [SP], FilterExpression, [SP], ')')
-- | ((S,I,N,G,L,E), [SP], '(', [SP], FilterExpression, [SP], ')')
-- ;
def "Quantifier" $
record [
"operator">: cypher "QuantifierOperator",
"expression">: cypher "FilterExpression"],
def "QuantifierOperator" $
enum [
"all",
"any",
"none",
"single"],
-- FilterExpression = IdInColl, [[SP], Where] ;
def "FilterExpression" $
record [
"idInColl">: cypher "IdInColl",
"where">: optional $ cypher "Where"],
-- PatternPredicate = RelationshipsPattern ;
def "PatternPredicate" $ cypher "RelationshipsPattern",
-- ParenthesizedExpression = '(', [SP], Expression, [SP], ')' ;
def "ParenthesizedExpression" $ cypher "Expression",
-- IdInColl = Variable, SP, (I,N), SP, Expression ;
def "IdInColl" $
record [
"variable">: cypher "Variable",
"expression">: cypher "Expression"],
-- FunctionInvocation = FunctionName, [SP], '(', [SP], [(D,I,S,T,I,N,C,T), [SP]], [Expression, [SP], { ',', [SP], Expression, [SP] }], ')' ;
def "FunctionInvocation" $
record [
"name">: cypher "QualifiedName",
"distinct">: boolean,
"arguments">: list $ cypher "Expression"],
-- FunctionName = Namespace, SymbolicName ;
def "QualifiedName" $
record [
"namespace">: string,
"local">: string],
-- ExistentialSubquery = (E,X,I,S,T,S), [SP], '{', [SP], (RegularQuery | (Pattern, [[SP], Where])), [SP], '}' ;
def "PatternWhere" $
record [
"pattern">: cypher "Pattern",
"where">: optional $ cypher "Where"],
def "ExistentialSubquery" $
union [
"regular">: cypher "RegularQuery",
"pattern">: cypher "PatternWhere"],
-- ExplicitProcedureInvocation = ProcedureName, [SP], '(', [SP], [Expression, [SP], { ',', [SP], Expression, [SP] }], ')' ;
def "ExplicitProcedureInvocation" $
record [
"name">: cypher "QualifiedName",
"arguments">: list $ cypher "Expression"],
-- ImplicitProcedureInvocation = ProcedureName ;
def "ImplicitProcedureInvocation" $ cypher "QualifiedName",
-- ProcedureResultField = SymbolicName ;
def "ProcedureResultField" string,
-- ProcedureName = Namespace, SymbolicName ;
--
-- Namespace = { SymbolicName, '.' } ;
--
-- Variable = SymbolicName ;
def "Variable" string,
-- Literal = BooleanLiteral
-- | (N,U,L,L)
-- | NumberLiteral
-- | StringLiteral
-- | ListLiteral
-- | MapLiteral
-- ;
def "Literal" $
union [
"boolean">: boolean,
"null">: unit,
"number">: cypher "NumberLiteral",
"string">: cypher "StringLiteral",
"list">: cypher "ListLiteral",
"map">: cypher "MapLiteral"],
-- BooleanLiteral = (T,R,U,E)
-- | (F,A,L,S,E)
-- ;
--
-- NumberLiteral = DoubleLiteral
-- | IntegerLiteral
-- ;
def "NumberLiteral" $
union [
"double">: float64,
"integer">: bigint],
-- IntegerLiteral = HexInteger
-- | OctalInteger
-- | DecimalInteger
-- ;
--
-- HexInteger = '0x', { HexDigit }- ;
--
-- DecimalInteger = ZeroDigit
-- | (NonZeroDigit, { Digit })
-- ;
--
-- OctalInteger = '0o', { OctDigit }- ;
--
-- HexLetter = (A)
-- | (B)
-- | (C)
-- | (D)
-- | (E)
-- | (F)
-- ;
--
-- HexDigit = Digit
-- | HexLetter
-- ;
--
-- Digit = ZeroDigit
-- | NonZeroDigit
-- ;
--
-- NonZeroDigit = NonZeroOctDigit
-- | '8'
-- | '9'
-- ;
--
-- NonZeroOctDigit = '1'
-- | '2'
-- | '3'
-- | '4'
-- | '5'
-- | '6'
-- | '7'
-- ;
--
-- OctDigit = ZeroDigit
-- | NonZeroOctDigit
-- ;
--
-- ZeroDigit = '0' ;
--
-- DoubleLiteral = ExponentDecimalReal
-- | RegularDecimalReal
-- ;
--
-- ExponentDecimalReal = ({ Digit }- | ({ Digit }-, '.', { Digit }-) | ('.', { Digit }-)), (E), ['-'], { Digit }- ;
--
-- RegularDecimalReal = { Digit }, '.', { Digit }- ;
--
-- StringLiteral = ('"', { ANY - ('"' | '\') | EscapedChar }, '"')
-- | ("'", { ANY - ("'" | '\') | EscapedChar }, "'")
-- ;
def "StringLiteral" string,
-- EscapedChar = '\', ('\' | "'" | '"' | (B) | (F) | (N) | (R) | (T) | ((U), 4 * HexDigit) | ((U), 8 * HexDigit)) ;
--
-- ListLiteral = '[', [SP], [Expression, [SP], { ',', [SP], Expression, [SP] }], ']' ;
def "ListLiteral" $
list $ cypher "Expression",
-- MapLiteral = '{', [SP], [PropertyKeyName, [SP], ':', [SP], Expression, [SP], { ',', [SP], PropertyKeyName, [SP], ':', [SP], Expression, [SP] }], '}' ;
def "MapLiteral" $
list $ cypher "KeyValuePair",
def "KeyValuePair" $
record [
"key">: cypher "PropertyKeyName",
"value">: cypher "Expression"],
-- PropertyKeyName = SchemaName ;
def "PropertyKeyName" string,
-- Parameter = '$', (SymbolicName | DecimalInteger) ;
def "Parameter" $
union [
"symbolic">: string,
"integer">: bigint]]
-- SchemaName = SymbolicName
-- | ReservedWord
-- ;
--
-- ReservedWord = (A,L,L)
-- | (A,S,C)
-- | (A,S,C,E,N,D,I,N,G)
-- | (B,Y)
-- | (C,R,E,A,T,E)
-- | (D,E,L,E,T,E)
-- | (D,E,S,C)
-- | (D,E,S,C,E,N,D,I,N,G)
-- | (D,E,T,A,C,H)
-- | (E,X,I,S,T,S)
-- | (L,I,M,I,T)
-- | (M,A,T,C,H)
-- | (M,E,R,G,E)
-- | (O,N)
-- | (O,P,T,I,O,N,A,L)
-- | (O,R,D,E,R)
-- | (R,E,M,O,V,E)
-- | (R,E,T,U,R,N)
-- | (S,E,T)
-- | (S,K,I,P)
-- | (W,H,E,R,E)
-- | (W,I,T,H)
-- | (U,N,I,O,N)
-- | (U,N,W,I,N,D)
-- | (A,N,D)
-- | (A,S)
-- | (C,O,N,T,A,I,N,S)
-- | (D,I,S,T,I,N,C,T)
-- | (E,N,D,S)
-- | (I,N)
-- | (I,S)
-- | (N,O,T)
-- | (O,R)
-- | (S,T,A,R,T,S)
-- | (X,O,R)
-- | (F,A,L,S,E)
-- | (T,R,U,E)
-- | (N,U,L,L)
-- | (C,O,N,S,T,R,A,I,N,T)
-- | (D,O)
-- | (F,O,R)
-- | (R,E,Q,U,I,R,E)
-- | (U,N,I,Q,U,E)
-- | (C,A,S,E)
-- | (W,H,E,N)
-- | (T,H,E,N)
-- | (E,L,S,E)
-- | (E,N,D)
-- | (M,A,N,D,A,T,O,R,Y)
-- | (S,C,A,L,A,R)
-- | (O,F)
-- | (A,D,D)
-- | (D,R,O,P)
-- ;
--
-- SymbolicName = UnescapedSymbolicName
-- | EscapedSymbolicName
-- | HexLetter
-- | (C,O,U,N,T)
-- | (F,I,L,T,E,R)
-- | (E,X,T,R,A,C,T)
-- | (A,N,Y)
-- | (N,O,N,E)
-- | (S,I,N,G,L,E)
-- ;
--
-- UnescapedSymbolicName = IdentifierStart, { IdentifierPart } ;
--
-- (* Based on the unicode identifier and pattern syntax
-- * (http://www.unicode.org/reports/tr31/)
-- * And extended with a few characters.
-- *)IdentifierStart = ID_Start
-- | Pc
-- ;
--
-- (* Based on the unicode identifier and pattern syntax
-- * (http://www.unicode.org/reports/tr31/)
-- * And extended with a few characters.
-- *)IdentifierPart = ID_Continue
-- | Sc
-- ;
--
-- (* Any character except "`", enclosed within `backticks`. Backticks are escaped with double backticks.
-- *)EscapedSymbolicName = { '`', { ANY - ('`') }, '`' }- ;
--
-- SP = { whitespace }- ;
--
-- whitespace = SPACE
-- | TAB
-- | LF
-- | VT
-- | FF
-- | CR
-- | FS
-- | GS
-- | RS
-- | US
-- | ' '
-- | ''
-- | ' '
-- | ' '
-- | ' '
-- | ' '
-- | ' '
-- | ' '
-- | ' '
-- | ' '
-- | ' '
-- | ' '
-- | '
'
-- | '
'
-- | ' '
-- | ' '
-- | ' '
-- | ' '
-- | ' '
-- | Comment
-- ;
--
-- Comment = ('/*', { ANY - ('*') | ('*', ANY - ('/')) }, '*/')
-- | ('//', { ANY - (LF | CR) }, [CR], (LF | EOI))
-- ;
--
-- LeftArrowHead = '<'
-- | '⟨'
-- | '〈'
-- | '﹤'
-- | '<'
-- ;
--
-- RightArrowHead = '>'
-- | '⟩'
-- | '〉'
-- | '﹥'
-- | '>'
-- ;
--
-- Dash = '-'
-- | ''
-- | '‐'
-- | '‑'
-- | '‒'
-- | '–'
-- | '—'
-- | '―'
-- | '−'
-- | '﹘'
-- | '﹣'
-- | '-'
-- ;
--
-- A = 'A' | 'a' ;
-- B = 'B' | 'b' ;
-- C = 'C' | 'c' ;
-- D = 'D' | 'd' ;
-- E = 'E' | 'e' ;
-- F = 'F' | 'f' ;
-- G = 'G' | 'g' ;
-- H = 'H' | 'h' ;
-- I = 'I' | 'i' ;
-- K = 'K' | 'k' ;
-- L = 'L' | 'l' ;
-- M = 'M' | 'm' ;
-- N = 'N' | 'n' ;
-- O = 'O' | 'o' ;
-- P = 'P' | 'p' ;
-- Q = 'Q' | 'q' ;
-- R = 'R' | 'r' ;
-- S = 'S' | 's' ;
-- T = 'T' | 't' ;
-- U = 'U' | 'u' ;
-- V = 'V' | 'v' ;
-- W = 'W' | 'w' ;
-- X = 'X' | 'x' ;
-- Y = 'Y' | 'y' ;