; ===================================================================== ; A complete ABNF for URI and IRI Templates ; ===================================================================== ABNF = template / template-expansion template = utemplate / itemplate template-expansion = utemplate-expansion / itemplate-expansion wsp = *(%x20 / %x09) sep = wsp "," wsp delim = "|" alphanum = ALPHA / DIGIT range = *DIGIT [ "-" *DIGIT ] ; ===================================================================== ; Template Operators ; ===================================================================== oppfx = "-" append = oppfx "append" prefix = oppfx "prefix" join = oppfx "join" listjoin = oppfx "listjoin" opt = oppfx "opt" neg = oppfx "neg" sub = oppfx "sub" extop = oppfx 1*ALPHA ; ===================================================================== ; URI Template Tokens ; ===================================================================== value = *(unreserved / pct-encoded) ; replacement value for token unreservedsansdash = (alphanum / "." / "_" / "~") arg = *(reserved / unreserved / pct-encoded) varname = unreservedsansdash *(unreserved) vardefault = value var = varname [ "=" vardefault ] vars = var [*(sep var)] varnodefault = varname varsnodefault = varname [*(sep varname)] identitytoken = var operatortoken = ( append "|" arg "|" var ) / ( prefix "|" arg "|" var ) / ( join "|" arg "|" vars ) / ( listjoin "|" arg "|" varnodefault ) / ( opt "|" arg "|" varsnodefault ) / ( neg "|" arg "|" varsnodefault ) / ( sub "|" range "|" var ) / ( extop "|" (arg / range) "|" (var / vars / varnodefault / varsnodefault) ) token = identitytoken / operatortoken utemplate = *(reserved / unreserved / pct-encoded / "{" token "}") utemplate_expansion = URI / URI-reference ; ===================================================================== ; URI Template Tokens ; ===================================================================== ivalue = *(iunreserved / pct-encoded) ; replacement value for token iunreservedsansdash = (alphanum / "." / "_" / "~" / ucschar) iarg = *(reserved / iunreserved / pct-encoded) ivarname = iunreservedsansdash *(iunreserved) ivardefault = ivalue ivar = ivarname [ "=" ivardefault ] ivars = ivar [*(sep ivar)] ivarnofefault = ivarname ivarsnodefault = ivarname [*(sep ivarname)] iidentitytoken = ivar ioperatortoken = ( append "|" iarg "|" ivar ) / ( prefix "|" iarg "|" ivar ) / ( join "|" iarg "|" ivars ) / ( listjoin "|" iarg "|" ivarnodefault ) / ( opt "|" iarg "|" ivarnodefault ) / ( neg "|" iarg "|" ivarnodefault ) / ( sub "|" range "|" ivar ) / ( extop "|" (iarg / range) "|" (ivar / ivars / ivarnodefault / ivarsnodefault) ) itoken = "{" iidentitytoken / ioperatortoken "}" itemplate = *(reserved / ipchar / iprivate / "{" itoken "}") itemplate_expansion = IRI / IRI-reference