[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: FW: Proposed BNF changes in the XRI Spec
Note to XRI TC Members: I'm forwarding this mail from Editor's SC chair Dave McAlpin because changes in Epok's domain name appear to be confusing the Kavi servers. I want to thank Dave and the rest of the Epok team for their extremely hard work boiling out every potential issue they could find in the BNF (and Dave in particular for preparing the crystal-clean version of the spec for the Committee Draft Revote.) =Drummond -----Original Message----- From: Dave McAlpin [mailto:dave.mcalpin@epok.net] Sent: Thursday, January 08, 2004 4:11 PM To: Drummond Reed Subject: Proposed BNF changes in the XRI Spec After the vote on the spec but before publication, a few minor problems with the BNF surfaced. Since OASIS has asked us to vote again on the spec, I'd like to incorporate these changes into the version we'll be voting on rather than publish them as errata. These proposed changes have been looked at pretty carefully by several people so I won't include a whole lot of analysis in this mail, but I'll be happy to discuss details if anyone is interested. Attached to this mail is the original collected BNF, the proposed BNF and a slightly cleaned up diff file between the two. A summary of the seven problems and their fixes: 1) "domainlabel", "global-xri" and "xri-path" were never used and were consequently removed. 2) idomainlabel was changed from idomainlabel = 1*ucschar to idomainlabel = ( ALPHA / ucschar ) *( ucschar / alphanum / "-" ) The original was completely wrong in that it allowed _only_ international characters. For example, xri://www.example.com was illegal under the original production. The new version isn't ideal because ABNF isn't sufficient to capture all the constraints on idomainlabel. We address this in the text when we say "A hostname, after the transformation described in step 4 of section 2.2.4.3, MUST meet the rules defined in section 3.2.2 of [RFC2396]. The productions for idomainlabel, qualified, and hostname, therefore, have additional restrictions not reflected in the ABNF." The new production is good enough, I think, and is at least unambiguous with respect to IPv4address. 3) The productions containing [query-frag] were edited because multiple query-frags were possible because xri-value could contain a global-path followed by a query-frag, and global-path itself could contain a query frag. For example, the following was legal: xri:@foo?bar=1#baz?fred=alice#bob 4) The local-path production was fixed so that / by itself is now a legal local-path. (It was not before, or more accurately, it was legal by accident and other proposed changes required that it be made explicitly legal.) 5) The path productions were updated to fix the fact that dots and colons could be repeated and can end an xri-segment. For example, the following was legal. xri:@foo/:::....:::bar:/baz. 6) The path productions were also updated to fix the fact that ../ and ./ were only legal at the beginning of a relative path. However, they are legal throughout a URI. 2396bis has the example eXAMPLE://a/./b/../b/c/%7a 7) Another problem was that query-frag could be empty and was also optional. If it's not in an XRI, it's ambiguous whether it's not there or whether it's there and empty. Problems 3 through 7 will be taken together because they affect the same set of productions. Here are the ones that have changed, with the original BNF followed by the proposed new BNF. (Note that these are only the changed productions - any production that did not change does not appear.) Original global-path = authority-path [ local-path ] [ query-frag ] query-frag = [ "?" xri-query ] [ "#" xri-fragment ] relative-path = *( [ "." ] "./" ) xri-segments relative-xri = ( local-path / relative-path ) [ query-frag ] sub-segment = *xri-pchar / xref XRI-authority = ( gcs-char xri-segment ) / xref-authority xri-segments = xri-segment *( "/" xri-segment ) xri-value = [ global-path / local-path / relative-path ] [ query-frag ] Proposed global-path = authority-path [ local-path ] relative-path = [ xri-segments ] [ "?" xri-query ] [ "#" xri-fragment ] relative-xri = local-path / relative-path sub-segment = 1*xri-pchar / xref XRI-authority = ( gcs-char [ xri-segment ] ) / xref-authority xri-segments = xri-segment-val *( "/" [ xri-segment-val ] ) xri-segment-val = xri-segment / "." / ".." xri-value = global-path / local-path / relative-path Here are the highlights. What was query-frag is now in one spot - inlined into relative-path. This addresses problems 3 and 7, and accounts for the changes to global-path, query-frag and relative-xri, and some of the changes to relative-path and xri-value. sub-segment can no longer be empty; it must contain at least one character. This solves problem 5. xri-segment-val is introduced as an intermediate production that contains either an xri-segment (i.e. a run of sub-segments which cannot be empty), "." or "..", and xri-segments is redefined in terms of xri-segment-val. This solves problem 6. Because xri-segment can no longer be empty, XRI-authority makes it explicitly optional. relative-path is redefined to inline what was query-frag and to drop support for ./ and ../, which is now handled in xri-segments. Because xri-segments cannot be empty (since xri-segment-val cannot be empty), xri-segments is made optional in relative-path. This makes relative-path potentially empty, which is desired. This also solves problem 4 in an explicit way. Because relative-path can be empty, it isn't desirable to have xri-value be potentially empty. Otherwise it would be ambiguous as to whether xri-value was empty or whether it contained an empty relative-path. xri-value is therefore changed to require either a global-path, a local-path or a relative-path. Please take a look at the attached files and provide feedback if you're interested. Unless we hear otherwise, these changes will be incorporated into the version of the spec that we'll be voting on in the next few days. Dave
abs-path = "/" path-segments absolute-xri = "xri:" global-path alphanum = ALPHA / DIGIT authority = [ userinfo "@" ] host [ ":" port ] authority-path = URI-authority / XRI-authority dec-octet = DIGIT ; 0-9 / %x31-39 DIGIT ; 10-99 / "1" 2DIGIT ; 100-199 / "2" %x30-34 DIGIT ; 200-249 / "25" %x30-35 ; 250-255 delims = "<" / ">" / "%" / DQUOTE domainlabel = alphanum [ 0*61( alphanum / "-" ) alphanum ] escaped = "%" HEXDIG HEXDIG excluded = invisible / delims / unwise fragment = *( pchar / "/" / "?" ) gcs-char = "+" / "=" / "@" / "$" / "*" / "!" global-path = authority-path [ local-path ] [ query-frag ] global-xri = global-path [ "?" xri-query ] [ "#" xri-fragment ] h4 = 1*4HEXDIG hier-part = net-path / abs-path / rel-path host = [ hostname / IPv4address / IPv6reference ] hostname = idomainlabel qualified idomainlabel = 1*ucschar invisible = CTL / SP / %x80-FF IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet IPv6address = 6( h4 ":" ) ls32 / "::" 5( h4 ":" ) ls32 / [ h4 ] "::" 4( h4 ":" ) ls32 / [ *1( h4 ":" ) h4 ] "::" 3( h4 ":" ) ls32 / [ *2( h4 ":" ) h4 ] "::" 2( h4 ":" ) ls32 / [ *3( h4 ":" ) h4 ] "::" h4 ":" ls32 / [ *4( h4 ":" ) h4 ] "::" ls32 / [ *5( h4 ":" ) h4 ] "::" h4 / [ *6( h4 ":" ) h4 ] "::" IPv6reference = "[" IPv6address "]" local-path = "/" relative-path ls32 = ( h4 ":" h4 ) / IPv4address ; least-significant 32 bits of address mark = "-" / "_" / "." / "!" / "~" / "*" / "'" / "(" / ")" net-path = "//" authority [ abs-path ] path-segments = segment *( "/" segment ) pchar = unreserved / escaped / ";" / ":" / "@" / "&" / "=" / "+" / "$" / "," port = *DIGIT qualified = *( "." idomainlabel ) [ "." ] query = *( pchar / "/" / "?" ) query-frag = [ "?" xri-query ] [ "#" xri-fragment ] relative-path = *( [ "." ] "./" ) xri-segments relative-xri = ( local-path / relative-path ) [ query-frag ] rel-path = path-segments reserved = "/" / "?" / "#" / "[" / "]" / ";" / ":" / "@" / "&" / "=" / "+" / "$" / "," scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) segment = *pchar sub-segment = *xri-pchar / xref ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD / %xD0000-DFFFD / %xE1000-EFFFD unreserved = ALPHA / DIGIT / mark unwise = "{" / "}" / "|" / "\" / "^" / "`" URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] URI-authority = "//" [ userinfo "@" ] host [ ":" port ] uric = reserved / unreserved / escaped userinfo = *( unreserved / escaped / ";" / ":" / "&" / "=" / "+" / "$" / "," ) xref = "(" ( xri-value / URI ) ")" xref-authority = xref ( "." sub-segment / ":" sub-segment) *( "." sub-segment / ":" sub-segment) XRI = absolute-xri / relative-xri XRI-authority = ( gcs-char xri-segment ) / xref-authority xri-characters = xri-reserved / xri-unreserved / escaped xri-fragment = [ xref ] * ( xri-pchar / "." / ":" / "/" / "?" ) xri-mark = "-" / "_" / "~" / "'" xri-path = global-path / local-path / relative-path xri-pchar = xri-unreserved / escaped / ";" / "!" / "*" "@" / "&" / "=" / "+" / "$" / "," xri-query = [ xref ] * ( xri-pchar / "." / ":" / "/" / "?" ) xri-reserved = "/" / "?" / "#" / "[" / "]" / "(" / ")" / ";" / ":" / "," / "." / "&" / "@" / "=" / "+" / "*" / "$" / "!" xri-segment = ( [ "." ] sub-segment / ":" sub-segment ) *( "." sub-segment / ":" sub-segment ) xri-segments = xri-segment *( "/" xri-segment ) xri-unreserved = ALPHA / DIGIT / ucschar / xri-mark xri-value = [ global-path / local-path / relative-path ] [ query-frag ]
abs-path = "/" path-segments absolute-xri = "xri:" global-path alphanum = ALPHA / DIGIT authority = [ userinfo "@" ] host [ ":" port ] authority-path = URI-authority / XRI-authority dec-octet = DIGIT ; 0-9 / %x31-39 DIGIT ; 10-99 / "1" 2DIGIT ; 100-199 / "2" %x30-34 DIGIT ; 200-249 / "25" %x30-35 ; 250-255 delims = "<" / ">" / "%" / DQUOTE escaped = "%" HEXDIG HEXDIG excluded = invisible / delims / unwise fragment = *( pchar / "/" / "?" ) gcs-char = "+" / "=" / "@" / "$" / "*" / "!" global-path = authority-path [ local-path ] h4 = 1*4HEXDIG hier-part = net-path / abs-path / rel-path host = [ hostname / IPv4address / IPv6reference ] hostname = idomainlabel qualified idomainlabel = ( ALPHA / ucschar ) *( ucschar / alphanum / "-" ) invisible = CTL / SP / %x80-FF IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet IPv6address = 6( h4 ":" ) ls32 / "::" 5( h4 ":" ) ls32 / [ h4 ] "::" 4( h4 ":" ) ls32 / [ *1( h4 ":" ) h4 ] "::" 3( h4 ":" ) ls32 / [ *2( h4 ":" ) h4 ] "::" 2( h4 ":" ) ls32 / [ *3( h4 ":" ) h4 ] "::" h4 ":" ls32 / [ *4( h4 ":" ) h4 ] "::" ls32 / [ *5( h4 ":" ) h4 ] "::" h4 / [ *6( h4 ":" ) h4 ] "::" IPv6reference = "[" IPv6address "]" local-path = "/" relative-path ls32 = ( h4 ":" h4 ) / IPv4address ; least-significant 32 bits of address mark = "-" / "_" / "." / "!" / "~" / "*" / "'" / "(" / ")" net-path = "//" authority [ abs-path ] path-segments = segment *( "/" segment ) pchar = unreserved / escaped / ";" / ":" / "@" / "&" / "=" / "+" / "$" / "," port = *DIGIT qualified = *( "." idomainlabel ) [ "." ] query = *( pchar / "/" / "?" ) relative-path = [ xri-segments ] [ "?" xri-query ] [ "#" xri-fragment ] relative-xri = local-path / relative-path rel-path = path-segments reserved = "/" / "?" / "#" / "[" / "]" / ";" / ":" / "@" / "&" / "=" / "+" / "$" / "," scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) segment = *pchar sub-segment = 1*xri-pchar / xref ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD / %xD0000-DFFFD / %xE1000-EFFFD unreserved = ALPHA / DIGIT / mark unwise = "{" / "}" / "|" / "\" / "^" / "`" URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] URI-authority = "//" [ userinfo "@" ] host [ ":" port ] uric = reserved / unreserved / escaped userinfo = *( unreserved / escaped / ";" / ":" / "&" / "=" / "+" / "$" / "," ) xref = "(" ( xri-value / URI ) ")" xref-authority = xref ( "." sub-segment / ":" sub-segment ) *( "." sub-segment / ":" sub-segment ) XRI = absolute-xri / relative-xri XRI-authority = ( gcs-char [ xri-segment ] ) / xref-authority xri-characters = xri-reserved / xri-unreserved / escaped xri-fragment = [ xref ] * ( xri-pchar / "." / ":" / "/" / "?" ) xri-mark = "-" / "_" / "~" / "'" xri-pchar = xri-unreserved / escaped / ";" / "!" / "*" "@" / "&" / "=" / "+" / "$" / "," xri-query = [ xref ] * ( xri-pchar / "." / ":" / "/" / "?" ) xri-reserved = "/" / "?" / "#" / "[" / "]" / "(" / ")" / ";" / ":" / "," / "." / "&" / "@" / "=" / "+" / "*" / "$" / "!" xri-segment = ( [ "." ] sub-segment / ":" sub-segment ) *( "." sub-segment / ":" sub-segment ) xri-segments = xri-segment-val *( "/" [ xri-segment-val ] ) xri-segment-val = xri-segment / "." / ".." xri-unreserved = ALPHA / DIGIT / ucschar / xri-mark xri-value = global-path / local-path / relative-path
19,20d18 < domainlabel = alphanum [ 0*61( alphanum / "-" ) alphanum ] < 29,31c27 < global-path = authority-path [ local-path ] [ query-frag ] < < global-xri = global-path [ "?" xri-query ] [ "#" xri-fragment ] --- > global-path = authority-path [ local-path ] 41c37 < idomainlabel = 1*ucschar --- > idomainlabel = ( ALPHA / ucschar ) *( ucschar / alphanum / "-" ) 79,81c75 < query-frag = [ "?" xri-query ] [ "#" xri-fragment ] < < relative-path = *( [ "." ] "./" ) xri-segments --- > relative-path = [ xri-segments ] [ "?" xri-query ] [ "#" xri-fragment ] 83c77 < relative-xri = ( local-path / relative-path ) [ query-frag ] --- > relative-xri = local-path / relative-path 94c88 < sub-segment = *xri-pchar / xref --- > sub-segment = 1*xri-pchar / xref 118,119c112,113 < xref-authority = xref ( "." sub-segment / ":" sub-segment) *( "." < sub-segment / ":" sub-segment) --- > xref-authority = xref ( "." sub-segment / ":" sub-segment ) *( "." > sub-segment / ":" sub-segment ) 123c117 < XRI-authority = ( gcs-char xri-segment ) / xref-authority --- > XRI-authority = ( gcs-char [ xri-segment ] ) / xref-authority 131,132d124 < xri-path = global-path / local-path / relative-path < 142c134,136 > xri-segments = xri-segment-val *( "/" [ xri-segment-val ] ) 144c138 < xri-segments = xri-segment *( "/" xri-segment ) --- > xri-segment-val = xri-segment / "." / ".." 148,149c142 < xri-value = [ global-path / local-path / relative-path ] < [ query-frag ] --- > xri-value = global-path / local-path / relative-path
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]