Expression

EBNF

Expression = OrExpression ;
OrExpression = XorExpression, { SP, (O,R), SP, XorExpression } ;
XorExpression = AndExpression, { SP, (X,O,R), SP, AndExpression } ;
AndExpression = NotExpression, { SP, (A,N,D), SP, NotExpression } ;
NotExpression = { (N,O,T), [SP] }, ComparisonExpression ;
ComparisonExpression = StringListNullPredicateExpression, { [SP], PartialComparisonExpression } ;
StringListNullPredicateExpression = AddOrSubtractExpression, { StringPredicateExpression | ListPredicateExpression | NullPredicateExpression } ;
AddOrSubtractExpression = MultiplyDivideModuloExpression, { ([SP], '+', [SP], MultiplyDivideModuloExpression) | ([SP], '-', [SP], MultiplyDivideModuloExpression) } ;
MultiplyDivideModuloExpression = PowerOfExpression, { ([SP], '*', [SP], PowerOfExpression) | ([SP], '/', [SP], PowerOfExpression) | ([SP], '%', [SP], PowerOfExpression) } ;
PowerOfExpression = UnaryAddOrSubtractExpression, { [SP], '^', [SP], UnaryAddOrSubtractExpression } ;
UnaryAddOrSubtractExpression = NonArithmeticOperatorExpression
                             | (('+' | '-'), [SP], NonArithmeticOperatorExpression)
                             ;
NonArithmeticOperatorExpression = Atom, { ([SP], ListOperatorExpression) | ([SP], PropertyLookup) }, [[SP], NodeLabels] ;
ListOperatorExpression = ('[', Expression, ']')
                       | ('[', [Expression], '..', [Expression], ']')
                       ;
NodeLabels = NodeLabel, { [SP], NodeLabel } ;
NodeLabel = ':', [SP], LabelName ;
LabelName = SchemaName ;
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 ;
ListPredicateExpression = SP, (I,N), [SP], AddOrSubtractExpression ;
NullPredicateExpression = (SP, (I,S), SP, (N,U,L,L))
                        | (SP, (I,S), SP, (N,O,T), SP, (N,U,L,L))
                        ;
PartialComparisonExpression = ('=', [SP], StringListNullPredicateExpression)
                            | ('<>', [SP], StringListNullPredicateExpression)
                            | ('<', [SP], StringListNullPredicateExpression)
                            | ('>', [SP], StringListNullPredicateExpression)
                            | ('<=', [SP], StringListNullPredicateExpression)
                            | ('>=', [SP], StringListNullPredicateExpression)
                            ;

Referenced from