2014-08-29 4 views

ответ

0

Если грамматика ABNF также будет в порядке, вы можете найти правила построения ABNF для URI OData V4 here.

+0

Спасибо, я посмотрю. –

1

http://bottlecaps.de/convert делает некоторые преобразования от ABNF до W3C-стиля EBNF.

Но грамматика OData говорит:

; This grammar uses the ABNF defined in RFC5234 with one extension: literals 
; enclosed in single quotes (e.g. '$metadata') are treated case-sensitive. 

После вручную возвращаясь одиночные кавычки в двойные кавычки, конвертер будет обрабатывать его с результатом, показанным ниже. Он непосредственно подходит для производства синтаксических диаграмм на http://bottlecaps.de/rr

/* converted on Tue Sep 2, 2014, 16:37 (UTC+02) by abnf-to-w3c v0.33.722 which is Copyright (c) 2011-2013 by Gunther Rademacher <[email protected]> */ 

dummyStartRule 
     ::= odataUri 
      | header 
      | primitiveValue 
odataUri ::= serviceRoot odataRelativeUri? 
serviceRoot 
     ::= ('https' | 'http') '://' host (':' port)? '/' (segment-nz '/')* 
odataRelativeUri 
     ::= '$batch' 
      | '$entity' '?' entityOptions 
      | '$entity' '/' qualifiedEntityTypeName '?' entityCastOptions 
      | '$metadata' ('?' format)? context? 
      | resourcePath ('?' queryOptions)? 
resourcePath 
     ::= entitySetName collectionNavigation? 
      | singletonEntity singleNavigation? 
      | actionImportCall 
      | entityColFunctionImportCall collectionNavigation? 
      | entityFunctionImportCall singleNavigation? 
      | complexColFunctionImportCall collectionPath? 
      | complexFunctionImportCall complexPath? 
      | primitiveColFunctionImportCall collectionPath? 
      | primitiveFunctionImportCall singlePath? 
      | crossjoin 
      | '$all' 
collectionNavigation 
     ::= ('/' qualifiedEntityTypeName)? collectionNavPath? 
collectionNavPath 
     ::= keyPredicate singleNavigation? 
      | collectionPath 
      | ref 
keyPredicate 
     ::= simpleKey 
      | compoundKey 
simpleKey 
     ::= OPEN keyPropertyValue CLOSE 
compoundKey 
     ::= OPEN keyValuePair (COMMA keyValuePair)* CLOSE 
keyValuePair 
     ::= (primitiveKeyProperty | keyPropertyAlias) EQ keyPropertyValue 
keyPropertyValue 
     ::= primitiveLiteral 
keyPropertyAlias 
     ::= odataIdentifier 
singleNavigation 
     ::= ('/' qualifiedEntityTypeName)? ('/' propertyPath | boundOperation | ref | value)? 
propertyPath 
     ::= entityColNavigationProperty collectionNavigation? 
      | entityNavigationProperty singleNavigation? 
      | complexColProperty collectionPath? 
      | complexProperty complexPath? 
      | primitiveColProperty collectionPath? 
      | primitiveProperty singlePath? 
      | streamProperty boundOperation? 
collectionPath 
     ::= count 
      | boundOperation 
singlePath 
     ::= value 
      | boundOperation 
complexPath 
     ::= ('/' qualifiedComplexTypeName)? ('/' propertyPath | boundOperation) 
count ::= '/$count' 
ref  ::= '/$ref' 
value ::= '/$value' 
boundOperation 
     ::= '/' (boundActionCall | boundEntityColFuncCall collectionNavigation? | boundEntityFuncCall singleNavigation? | boundComplexColFuncCall collectionPath? | boundComplexFuncCall complexPath? | boundPrimitiveColFuncCall collectionPath? | boundPrimitiveFuncCall singlePath?) 
actionImportCall 
     ::= actionImport 
boundActionCall 
     ::= namespace '.' action 
boundEntityFuncCall 
     ::= namespace '.' entityFunction functionParameters 
boundEntityColFuncCall 
     ::= namespace '.' entityColFunction functionParameters 
boundComplexFuncCall 
     ::= namespace '.' complexFunction functionParameters 
boundComplexColFuncCall 
     ::= namespace '.' complexColFunction functionParameters 
boundPrimitiveFuncCall 
     ::= namespace '.' primitiveFunction functionParameters 
boundPrimitiveColFuncCall 
     ::= namespace '.' primitiveColFunction functionParameters 
entityFunctionImportCall 
     ::= entityFunctionImport functionParameters 
entityColFunctionImportCall 
     ::= entityColFunctionImport functionParameters 
complexFunctionImportCall 
     ::= complexFunctionImport functionParameters 
complexColFunctionImportCall 
     ::= complexColFunctionImport functionParameters 
primitiveFunctionImportCall 
     ::= primitiveFunctionImport functionParameters 
primitiveColFunctionImportCall 
     ::= primitiveColFunctionImport functionParameters 
functionParameters 
     ::= OPEN (functionParameter (COMMA functionParameter)*)? CLOSE 
functionParameter 
     ::= parameterName EQ (parameterAlias | primitiveLiteral) 
parameterName 
     ::= odataIdentifier 
parameterAlias 
     ::= AT odataIdentifier 
crossjoin 
     ::= '$crossjoin' OPEN entitySetName (COMMA entitySetName)* CLOSE 
queryOptions 
     ::= queryOption ('&' queryOption)* 
queryOption 
     ::= systemQueryOption 
      | aliasAndValue 
      | customQueryOption 
entityOptions 
     ::= (entityIdOption '&')* id ('&' entityIdOption)* 
entityIdOption 
     ::= format 
      | customQueryOption 
entityCastOptions 
     ::= (entityCastOption '&')* id ('&' entityCastOption)* 
entityCastOption 
     ::= entityIdOption 
      | expand 
      | select 
id  ::= '$id' EQ IRI-in-query 
systemQueryOption 
     ::= expand 
      | filter 
      | format 
      | id 
      | inlinecount 
      | orderby 
      | search 
      | select 
      | skip 
      | skiptoken 
      | top 
expand ::= '$expand' EQ expandItem (COMMA expandItem)* 
expandItem 
     ::= STAR (ref | OPEN levels CLOSE)? 
      | expandPath (ref (OPEN expandRefOption (SEMI expandRefOption)* CLOSE)? | count (OPEN expandCountOption (SEMI expandCountOption)* CLOSE)? | OPEN expandOption (SEMI expandOption)* CLOSE)? 
expandPath 
     ::= (qualifiedEntityTypeName '/')? ((complexProperty | complexColProperty) '/' (qualifiedComplexTypeName '/')?)* navigationProperty ('/' qualifiedEntityTypeName)? 
expandCountOption 
     ::= filter 
      | search 
expandRefOption 
     ::= expandCountOption 
      | orderby 
      | skip 
      | top 
      | inlinecount 
expandOption 
     ::= expandRefOption 
      | select 
      | expand 
      | levels 
levels ::= '$levels' EQ (DIGIT+ | 'max') 
filter ::= '$filter' EQ boolCommonExpr 
orderby ::= '$orderby' EQ orderbyItem (COMMA orderbyItem)* 
orderbyItem 
     ::= commonExpr (RWS ('asc' | 'desc'))? 
skip  ::= '$skip' EQ DIGIT+ 
top  ::= '$top' EQ DIGIT+ 
format ::= '$format' EQ ('atom' | 'json' | 'xml' | pchar+ '/' pchar+) 
inlinecount 
     ::= '$count' EQ booleanValue 
search ::= '$search' EQ BWS searchExpr 
searchExpr 
     ::= (OPEN BWS searchExpr BWS CLOSE | searchTerm) (searchOrExpr | searchAndExpr)? 
searchOrExpr 
     ::= RWS 'OR' RWS searchExpr 
searchAndExpr 
     ::= RWS ('AND' RWS)? searchExpr 
searchTerm 
     ::= ('NOT' RWS)? (searchPhrase | searchWord) 
searchPhrase 
     ::= quotation-mark qchar-no-AMP-DQUOTE+ quotation-mark 
searchWord 
     ::= ALPHA+ 
select ::= '$select' EQ selectItem (COMMA selectItem)* 
selectItem 
     ::= STAR 
      | allOperationsInSchema 
      | (qualifiedEntityTypeName '/')? (selectProperty | qualifiedActionName | qualifiedFunctionName) 
selectProperty 
     ::= primitiveProperty 
      | primitiveColProperty 
      | navigationProperty 
      | selectPath ('/' selectProperty)? 
selectPath 
     ::= (complexProperty | complexColProperty) ('/' qualifiedComplexTypeName)? 
allOperationsInSchema 
     ::= namespace '.' STAR 
qualifiedActionName 
     ::= namespace '.' action 
qualifiedFunctionName 
     ::= namespace '.' function (OPEN parameterNames CLOSE)? 
parameterNames 
     ::= parameterName (COMMA parameterName)* 
skiptoken 
     ::= '$skiptoken' EQ qchar-no-AMP+ 
aliasAndValue 
     ::= parameterAlias EQ parameterValue 
parameterValue 
     ::= arrayOrObject 
      | commonExpr 
customQueryOption 
     ::= customName (EQ customValue)? 
customName 
     ::= qchar-no-AMP-EQ-AT-DOLLAR qchar-no-AMP-EQ* 
customValue 
     ::= qchar-no-AMP* 
context ::= '#' contextFragment 
contextFragment 
     ::= 'Collection($ref)' 
      | '$ref' 
      | 'Collection(Edm.EntityType)' 
      | 'Collection(Edm.ComplexType)' 
      | singletonEntity 
      | qualifiedTypeName 
      | entitySet ('/$deletedEntity' | '/$link' | '/$deletedLink') 
      | entitySet keyPredicate '/' contextPropertyPath 
      | entitySet selectList? ('/$entity' | '/$delta')? 
entitySet 
     ::= entitySetName containmentNavigation* ('/' qualifiedEntityTypeName)? 
containmentNavigation 
     ::= keyPredicate ('/' qualifiedEntityTypeName)? ('/' complexProperty ('/' qualifiedComplexTypeName)?)* '/' navigationProperty 
selectList 
     ::= OPEN selectListItem (COMMA selectListItem)* CLOSE 
selectListItem 
     ::= STAR 
      | allOperationsInSchema 
      | (qualifiedEntityTypeName '/')? (qualifiedActionName | qualifiedFunctionName | selectListProperty) 
selectListProperty 
     ::= primitiveProperty 
      | primitiveColProperty 
      | navigationProperty '+'? selectList? 
      | selectPath ('/' selectListProperty)? 
contextPropertyPath 
     ::= primitiveProperty 
      | primitiveColProperty 
      | complexColProperty 
      | complexProperty (('/' qualifiedComplexTypeName)? '/' contextPropertyPath)? 
commonExpr 
     ::= (primitiveLiteral | parameterAlias | arrayOrObject | rootExpr | firstMemberExpr | functionExpr | negateExpr | methodCallExpr | parenExpr | castExpr) (addExpr | subExpr | mulExpr | divExpr | modExpr)? 
boolCommonExpr 
     ::= (isofExpr | boolMethodCallExpr | notExpr | commonExpr (eqExpr | neExpr | ltExpr | leExpr | gtExpr | geExpr | hasExpr)? | boolParenExpr) (andExpr | orExpr)? 
rootExpr ::= '$root/' (entitySetName keyPredicate | singletonEntity) singleNavigationExpr? 
firstMemberExpr 
     ::= memberExpr 
      | inscopeVariableExpr ('/' memberExpr)? 
memberExpr 
     ::= (qualifiedEntityTypeName '/')? (propertyPathExpr | boundFunctionExpr) 
propertyPathExpr 
     ::= entityColNavigationProperty collectionNavigationExpr? 
      | entityNavigationProperty singleNavigationExpr? 
      | complexColProperty collectionPathExpr? 
      | complexProperty complexPathExpr? 
      | primitiveColProperty collectionPathExpr? 
      | primitiveProperty singlePathExpr? 
      | streamProperty 
inscopeVariableExpr 
     ::= implicitVariableExpr 
      | lambdaVariableExpr 
implicitVariableExpr 
     ::= '$it' 
lambdaVariableExpr 
     ::= odataIdentifier 
collectionNavigationExpr 
     ::= ('/' qualifiedEntityTypeName)? (keyPredicate singleNavigationExpr? | collectionPathExpr) 
singleNavigationExpr 
     ::= '/' memberExpr 
collectionPathExpr 
     ::= count 
      | '/' boundFunctionExpr 
      | '/' anyExpr 
      | '/' allExpr 
complexPathExpr 
     ::= '/' (qualifiedComplexTypeName '/')? (propertyPathExpr | boundFunctionExpr) 
singlePathExpr 
     ::= '/' boundFunctionExpr 
boundFunctionExpr 
     ::= functionExpr 
functionExpr 
     ::= namespace '.' (entityColFunction functionExprParameters collectionNavigationExpr? | entityFunction functionExprParameters singleNavigationExpr? | complexColFunction functionExprParameters collectionPathExpr? | complexFunction functionExprParameters complexPathExpr? | primitiveColFunction functionExprParameters collectionPathExpr? | primitiveFunction functionExprParameters singlePathExpr?) 
functionExprParameters 
     ::= OPEN (functionExprParameter (COMMA functionExprParameter)*)? CLOSE 
functionExprParameter 
     ::= parameterName EQ (parameterAlias | parameterValue) 
anyExpr ::= 'any' OPEN BWS (lambdaVariableExpr BWS COLON BWS lambdaPredicateExpr)? BWS CLOSE 
allExpr ::= 'all' OPEN BWS lambdaVariableExpr BWS COLON BWS lambdaPredicateExpr BWS CLOSE 
lambdaPredicateExpr 
     ::= boolCommonExpr 
methodCallExpr 
     ::= indexOfMethodCallExpr 
      | toLowerMethodCallExpr 
      | toUpperMethodCallExpr 
      | trimMethodCallExpr 
      | substringMethodCallExpr 
      | concatMethodCallExpr 
      | lengthMethodCallExpr 
      | yearMethodCallExpr 
      | monthMethodCallExpr 
      | dayMethodCallExpr 
      | hourMethodCallExpr 
      | minuteMethodCallExpr 
      | secondMethodCallExpr 
      | fractionalsecondsMethodCallExpr 
      | totalsecondsMethodCallExpr 
      | dateMethodCallExpr 
      | timeMethodCallExpr 
      | roundMethodCallExpr 
      | floorMethodCallExpr 
      | ceilingMethodCallExpr 
      | distanceMethodCallExpr 
      | geoLengthMethodCallExpr 
      | totalOffsetMinutesMethodCallExpr 
      | minDateTimeMethodCallExpr 
      | maxDateTimeMethodCallExpr 
      | nowMethodCallExpr 
boolMethodCallExpr 
     ::= endsWithMethodCallExpr 
      | startsWithMethodCallExpr 
      | containsMethodCallExpr 
      | intersectsMethodCallExpr 
containsMethodCallExpr 
     ::= 'contains' OPEN BWS commonExpr BWS COMMA BWS commonExpr BWS CLOSE 
startsWithMethodCallExpr 
     ::= 'startswith' OPEN BWS commonExpr BWS COMMA BWS commonExpr BWS CLOSE 
endsWithMethodCallExpr 
     ::= 'endswith' OPEN BWS commonExpr BWS COMMA BWS commonExpr BWS CLOSE 
lengthMethodCallExpr 
     ::= 'length' OPEN BWS commonExpr BWS CLOSE 
indexOfMethodCallExpr 
     ::= 'indexof' OPEN BWS commonExpr BWS COMMA BWS commonExpr BWS CLOSE 
substringMethodCallExpr 
     ::= 'substring' OPEN BWS commonExpr BWS COMMA BWS commonExpr BWS (COMMA BWS commonExpr BWS)? CLOSE 
toLowerMethodCallExpr 
     ::= 'tolower' OPEN BWS commonExpr BWS CLOSE 
toUpperMethodCallExpr 
     ::= 'toupper' OPEN BWS commonExpr BWS CLOSE 
trimMethodCallExpr 
     ::= 'trim' OPEN BWS commonExpr BWS CLOSE 
concatMethodCallExpr 
     ::= 'concat' OPEN BWS commonExpr BWS COMMA BWS commonExpr BWS CLOSE 
yearMethodCallExpr 
     ::= 'year' OPEN BWS commonExpr BWS CLOSE 
monthMethodCallExpr 
     ::= 'month' OPEN BWS commonExpr BWS CLOSE 
dayMethodCallExpr 
     ::= 'day' OPEN BWS commonExpr BWS CLOSE 
hourMethodCallExpr 
     ::= 'hour' OPEN BWS commonExpr BWS CLOSE 
minuteMethodCallExpr 
     ::= 'minute' OPEN BWS commonExpr BWS CLOSE 
secondMethodCallExpr 
     ::= 'second' OPEN BWS commonExpr BWS CLOSE 
fractionalsecondsMethodCallExpr 
     ::= 'fractionalseconds' OPEN BWS commonExpr BWS CLOSE 
totalsecondsMethodCallExpr 
     ::= 'totalseconds' OPEN BWS commonExpr BWS CLOSE 
dateMethodCallExpr 
     ::= 'date' OPEN BWS commonExpr BWS CLOSE 
timeMethodCallExpr 
     ::= 'time' OPEN BWS commonExpr BWS CLOSE 
totalOffsetMinutesMethodCallExpr 
     ::= 'totaloffsetminutes' OPEN BWS commonExpr BWS CLOSE 
minDateTimeMethodCallExpr 
     ::= 'mindatetime(' BWS ')' 
maxDateTimeMethodCallExpr 
     ::= 'maxdatetime(' BWS ')' 
nowMethodCallExpr 
     ::= 'now(' BWS ')' 
roundMethodCallExpr 
     ::= 'round' OPEN BWS commonExpr BWS CLOSE 
floorMethodCallExpr 
     ::= 'floor' OPEN BWS commonExpr BWS CLOSE 
ceilingMethodCallExpr 
     ::= 'ceiling' OPEN BWS commonExpr BWS CLOSE 
distanceMethodCallExpr 
     ::= 'geo.distance' OPEN BWS commonExpr BWS COMMA BWS commonExpr BWS CLOSE 
geoLengthMethodCallExpr 
     ::= 'geo.length' OPEN BWS commonExpr BWS CLOSE 
intersectsMethodCallExpr 
     ::= 'geo.intersects' OPEN BWS commonExpr BWS COMMA BWS commonExpr BWS CLOSE 
boolParenExpr 
     ::= OPEN BWS boolCommonExpr BWS CLOSE 
parenExpr 
     ::= OPEN BWS commonExpr BWS CLOSE 
andExpr ::= RWS 'and' RWS boolCommonExpr 
orExpr ::= RWS 'or' RWS boolCommonExpr 
eqExpr ::= RWS 'eq' RWS commonExpr 
neExpr ::= RWS 'ne' RWS commonExpr 
ltExpr ::= RWS 'lt' RWS commonExpr 
leExpr ::= RWS 'le' RWS commonExpr 
gtExpr ::= RWS 'gt' RWS commonExpr 
geExpr ::= RWS 'ge' RWS commonExpr 
hasExpr ::= RWS 'has' RWS commonExpr 
addExpr ::= RWS 'add' RWS commonExpr 
subExpr ::= RWS 'sub' RWS commonExpr 
mulExpr ::= RWS 'mul' RWS commonExpr 
divExpr ::= RWS 'div' RWS commonExpr 
modExpr ::= RWS 'mod' RWS commonExpr 
negateExpr 
     ::= '-' BWS commonExpr 
notExpr ::= 'not' RWS boolCommonExpr 
isofExpr ::= 'isof' OPEN BWS (commonExpr BWS COMMA BWS)? qualifiedTypeName BWS CLOSE 
castExpr ::= 'cast' OPEN BWS (commonExpr BWS COMMA BWS)? qualifiedTypeName BWS CLOSE 
arrayOrObject 
     ::= complexColInUri 
      | complexInUri 
      | rootExprCol 
      | primitiveColInUri 
complexColInUri 
     ::= begin-array (complexInUri (value-separator complexInUri)*)? end-array 
complexInUri 
     ::= begin-object ((annotationInUri | primitivePropertyInUri | complexPropertyInUri | collectionPropertyInUri | navigationPropertyInUri) (value-separator (annotationInUri | primitivePropertyInUri | complexPropertyInUri | collectionPropertyInUri | navigationPropertyInUri))*)? end-object 
collectionPropertyInUri 
     ::= quotation-mark primitiveColProperty quotation-mark name-separator primitiveColInUri 
      | quotation-mark complexColProperty quotation-mark name-separator complexColInUri 
primitiveColInUri 
     ::= begin-array (primitiveLiteralInJSON (value-separator primitiveLiteralInJSON)*)? end-array 
complexPropertyInUri 
     ::= quotation-mark complexProperty quotation-mark name-separator complexInUri 
annotationInUri 
     ::= quotation-mark namespace '.' termName quotation-mark name-separator (complexInUri | complexColInUri | primitiveLiteralInJSON | primitiveColInUri) 
primitivePropertyInUri 
     ::= quotation-mark primitiveProperty quotation-mark name-separator primitiveLiteralInJSON 
navigationPropertyInUri 
     ::= singleNavPropInJSON 
      | collectionNavPropInJSON 
singleNavPropInJSON 
     ::= quotation-mark entityNavigationProperty quotation-mark name-separator rootExpr 
collectionNavPropInJSON 
     ::= quotation-mark entityColNavigationProperty quotation-mark name-separator rootExprCol 
rootExprCol 
     ::= begin-array (rootExpr (value-separator rootExpr)*)? end-array 
begin-object 
     ::= BWS ('{' | '%7B') BWS 
end-object 
     ::= BWS ('}' | '%7D') BWS 
begin-array 
     ::= BWS ('[' | '%5B') BWS 
end-array 
     ::= BWS (']' | '%5D') BWS 
quotation-mark 
     ::= DQUOTE 
      | '%22' 
name-separator 
     ::= BWS COLON BWS 
value-separator 
     ::= BWS COMMA BWS 
primitiveLiteralInJSON 
     ::= stringInJSON 
      | numberInJSON 
      | 'true' 
      | 'false' 
      | 'null' 
stringInJSON 
     ::= quotation-mark charInJSON* quotation-mark 
charInJSON 
     ::= qchar-unescaped 
      | qchar-JSON-special 
      | escape (quotation-mark | escape | ('/' | '%2F') | 'b' | 'f' | 'n' | 'r' | 't' | 'u' HEXDIG HEXDIG HEXDIG HEXDIG) 
qchar-JSON-special 
     ::= SP 
      | ':' 
      | '{' 
      | '}' 
      | '[' 
      | ']' 
escape ::= '\' 
      | '%5C' 
numberInJSON 
     ::= '-'? int frac? exp? 
int  ::= '0' 
      | oneToNine DIGIT* 
frac  ::= '.' DIGIT+ 
exp  ::= 'e' ('-' | '+')? DIGIT+ 
singleQualifiedTypeName 
     ::= qualifiedEntityTypeName 
      | qualifiedComplexTypeName 
      | qualifiedTypeDefinitionName 
      | qualifiedEnumTypeName 
      | primitiveTypeName 
qualifiedTypeName 
     ::= singleQualifiedTypeName 
      | 'Collection' OPEN singleQualifiedTypeName CLOSE 
qualifiedEntityTypeName 
     ::= namespace '.' entityTypeName 
qualifiedComplexTypeName 
     ::= namespace '.' complexTypeName 
qualifiedTypeDefinitionName 
     ::= namespace '.' typeDefinitionName 
qualifiedEnumTypeName 
     ::= namespace '.' enumerationTypeName 
namespace 
     ::= namespacePart ('.' namespacePart)* 
namespacePart 
     ::= odataIdentifier 
entitySetName 
     ::= odataIdentifier 
singletonEntity 
     ::= odataIdentifier 
entityTypeName 
     ::= odataIdentifier 
complexTypeName 
     ::= odataIdentifier 
typeDefinitionName 
     ::= odataIdentifier 
enumerationTypeName 
     ::= odataIdentifier 
enumerationMember 
     ::= odataIdentifier 
termName ::= odataIdentifier 
odataIdentifier 
     ::= identifierLeadingCharacter identifierCharacter* 
identifierLeadingCharacter 
     ::= ALPHA 
      | '_' 
identifierCharacter 
     ::= ALPHA 
      | '_' 
      | DIGIT 
primitiveTypeName 
     ::= 'Edm.' ('Binary' | 'Boolean' | 'Byte' | 'Date' | 'DateTimeOffset' | 'Decimal' | 'Double' | 'Duration' | 'Guid' | 'Int16' | 'Int32' | 'Int64' | 'SByte' | 'Single' | 'Stream' | 'String' | 'TimeOfDay' | abstractSpatialTypeName concreteSpatialTypeName?) 
abstractSpatialTypeName 
     ::= 'Geography' 
      | 'Geometry' 
concreteSpatialTypeName 
     ::= 'Collection' 
      | 'LineString' 
      | 'MultiLineString' 
      | 'MultiPoint' 
      | 'MultiPolygon' 
      | 'Point' 
      | 'Polygon' 
primitiveProperty 
     ::= primitiveKeyProperty 
      | primitiveNonKeyProperty 
primitiveKeyProperty 
     ::= odataIdentifier 
primitiveNonKeyProperty 
     ::= odataIdentifier 
primitiveColProperty 
     ::= odataIdentifier 
complexProperty 
     ::= odataIdentifier 
complexColProperty 
     ::= odataIdentifier 
streamProperty 
     ::= odataIdentifier 
navigationProperty 
     ::= entityNavigationProperty 
      | entityColNavigationProperty 
entityNavigationProperty 
     ::= odataIdentifier 
entityColNavigationProperty 
     ::= odataIdentifier 
action ::= odataIdentifier 
actionImport 
     ::= odataIdentifier 
function ::= entityFunction 
      | entityColFunction 
      | complexFunction 
      | complexColFunction 
      | primitiveFunction 
      | primitiveColFunction 
entityFunction 
     ::= odataIdentifier 
entityColFunction 
     ::= odataIdentifier 
complexFunction 
     ::= odataIdentifier 
complexColFunction 
     ::= odataIdentifier 
primitiveFunction 
     ::= odataIdentifier 
primitiveColFunction 
     ::= odataIdentifier 
entityFunctionImport 
     ::= odataIdentifier 
entityColFunctionImport 
     ::= odataIdentifier 
complexFunctionImport 
     ::= odataIdentifier 
complexColFunctionImport 
     ::= odataIdentifier 
primitiveFunctionImport 
     ::= odataIdentifier 
primitiveColFunctionImport 
     ::= odataIdentifier 
primitiveLiteral 
     ::= nullValue 
      | booleanValue 
      | guidValue 
      | dateValue 
      | dateTimeOffsetValue 
      | timeOfDayValue 
      | decimalValue 
      | doubleValue 
      | singleValue 
      | sbyteValue 
      | byteValue 
      | int16Value 
      | int32Value 
      | int64Value 
      | string 
      | duration 
      | binary 
      | enum 
      | geographyCollection 
      | geographyLineString 
      | geographyMultiLineString 
      | geographyMultiPoint 
      | geographyMultiPolygon 
      | geographyPoint 
      | geographyPolygon 
      | geometryCollection 
      | geometryLineString 
      | geometryMultiLineString 
      | geometryMultiPoint 
      | geometryMultiPolygon 
      | geometryPoint 
      | geometryPolygon 
primitiveValue 
     ::= booleanValue 
      | guidValue 
      | durationValue 
      | dateValue 
      | dateTimeOffsetValue 
      | timeOfDayValue 
      | enumValue 
      | fullCollectionLiteral 
      | fullLineStringLiteral 
      | fullMultiPointLiteral 
      | fullMultiLineStringLiteral 
      | fullMultiPolygonLiteral 
      | fullPointLiteral 
      | fullPolygonLiteral 
      | decimalValue 
      | doubleValue 
      | singleValue 
      | sbyteValue 
      | byteValue 
      | int16Value 
      | int32Value 
      | int64Value 
      | binaryValue 
nullValue 
     ::= 'null' 
binary ::= 'binary' SQUOTE binaryValue SQUOTE 
binaryValue 
     ::= (base64char base64char base64char base64char)* (base64b16 | base64b8)? 
base64b16 
     ::= base64char base64char ('A' | 'E' | 'I' | 'M' | 'Q' | 'U' | 'Y' | 'c' | 'g' | 'k' | 'o' | 's' | 'w' | '0' | '4' | '8') '='? 
base64b8 ::= base64char ('A' | 'Q' | 'g' | 'w') '=='? 
base64char 
     ::= ALPHA 
      | DIGIT 
      | '-' 
      | '_' 
booleanValue 
     ::= 'true' 
      | 'false' 
decimalValue 
     ::= SIGN? DIGIT+ ('.' DIGIT+)? 
doubleValue 
     ::= decimalValue ('e' SIGN? DIGIT+)? 
      | nanInfinity 
singleValue 
     ::= doubleValue 
nanInfinity 
     ::= 'NaN' 
      | '-INF' 
      | 'INF' 
guidValue 
     ::= HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG '-' HEXDIG HEXDIG HEXDIG HEXDIG '-' HEXDIG HEXDIG HEXDIG HEXDIG '-' HEXDIG HEXDIG HEXDIG HEXDIG '-' HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG HEXDIG+ 
byteValue 
     ::= DIGIT (DIGIT DIGIT?)? 
sbyteValue 
     ::= SIGN? DIGIT (DIGIT DIGIT?)? 
int16Value 
     ::= SIGN? DIGIT (DIGIT (DIGIT (DIGIT DIGIT?)?)?)? 
int32Value 
     ::= SIGN? DIGIT+ 
int64Value 
     ::= SIGN? DIGIT+ 
string ::= SQUOTE (SQUOTE-in-string | pchar-no-SQUOTE)* SQUOTE 
SQUOTE-in-string 
     ::= SQUOTE SQUOTE 
dateValue 
     ::= year '-' month '-' day 
dateTimeOffsetValue 
     ::= year '-' month '-' day 'T' hour ':' minute (':' second ('.' fractionalSeconds)?)? ('Z' | SIGN hour ':' minute) 
duration ::= 'duration' SQUOTE durationValue SQUOTE 
durationValue 
     ::= SIGN? 'P' (DIGIT+ 'D')? ('T' (DIGIT+ 'H')? (DIGIT+ 'M')? (DIGIT+ ('.' DIGIT+)? 'S')?)? 
timeOfDayValue 
     ::= hour ':' minute (':' second ('.' fractionalSeconds)?)? 
oneToNine 
     ::= '1' 
      | '2' 
      | '3' 
      | '4' 
      | '5' 
      | '6' 
      | '7' 
      | '8' 
      | '9' 
zeroToFiftyNine 
     ::= ('0' | '1' | '2' | '3' | '4' | '5') DIGIT 
year  ::= '-'? ('0' DIGIT DIGIT DIGIT | oneToNine DIGIT DIGIT DIGIT+) 

// ... remainder omitted, because too large for SO post