OData URI查询的EBNF语法

时间:2014-08-29 10:49:19

标签: odata ebnf sablecc

有没有人知道在哪里可以找到OData URI查询的EBNF语法?

我想将它与SableCC一起使用来生成用于解析OData URI查询的C ++类。

2 个答案:

答案 0 :(得分:2)

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 <grd@gmx.net> */

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

答案 1 :(得分:0)

如果ABNF语法也没问题,你可以找到OData V4 URI here的ABNF构造规则。