[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Solution for GCS ! ambiguity in ABNF
In doing the final review of the 05 Syntax spec, a solution to the
longstanding issue about the ambiguity of "!" was identified. This email
briefly summarizes the issue and the solution. The proposed change to the
ABNF that fixes it has been closely reviewed by Dave, Chetan, and myself, so
we plan to roll this change into the 06 draft unless anyone has an
objection.
SUMMARY OF THE ISSUE
For simplicities sake, the current ABNF treats "!" the same as the other GCS
characters, when in fact the intent all along has been that unlike the other
GCS characters, "!" should only be followed by a persistent subsegment,
i.e., that as an absolute XRI, you could only have "!!123" and never "!123".
It should be unambiguous that the latter is a relative persistent XRI
subsegment.
However the current ABNF does not enforce this rule, so a relative XRI
starting with "!" is currently ambiguous. As a result in the 05 draft Dave
needed to add a section (2.4.7) that explained that you can't just write
"!123" as a relative subsegment, but instead you need to prefix it with
"./!123" to make sure it's not ambiguous.
Because this is ugly, and because it requires treating relative
!sub-segments differently than relative *sub-segments, the following
solution was identified.
PROPOSED SOLUTION
The solution involves changing six lines of the ABNF, with five of these
changes being just to make room for the one new production that actually
eliminates the ambiguity. Following is a complete analysis.
First, below is the current ABNF from the authority and path sections:
****CURRENT ABNF****
xri-authority = gcs-authority / xref-authority
gcs-authority = gcs-char xri-segment
xref-authority = xref *xri-subseg
gcs-char = "=" / "@" / "+" / "$" / "!"
xri-path = xri-path-absolute
/ xri-path-noscheme
/ ipath-empty
xri-path-absolute = "/" [ xri-segment-nz *( "/" xri-segment ) ]
xri-path-noscheme = xri-subseg-od-nx *xri-subseg-nc
*( "/" xri-segment )
xri-segment = xri-subseg-od *xri-subseg
xri-segment-nz = xri-subseg-od-nz *xri-subseg
xri-subseg = ( "*" / "!" ) (xref / *xri-pchar)
xri-subseg-nc = ( "*" / "!" ) (xref / *xri-pchar-nc)
xri-subseg-od = [ "*" / "!" ] (xref / *xri-pchar)
xri-subseg-od-nz = [ "*" / "!" ] (xref / 1*xri-pchar)
xri-subseg-od-nx = [ "*" / "!" ] 1*xri-pchar-nc
xri-gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "("
/ ")" / "*" / gcs-char
***END***
Second, following are the six changed lines of ABNF that would be needed.
Two of them are revisions to current productions (gcs-authority and
xri-gen-delims), two are renamed productions (gcs-char renamed rgcs-char,
and gsc-authority renamed rgcs-authority), and two are new productions
(pgcs-authority and xri-subseg-pt-nz). Note also that "xri-subseg-pt-nz" is
named to match the rest of the "xri-subseg" productions, with the "pt"
standing for "persistent".
Also note that the only changes in the rgcs-char and xri-gen-delims
productions are to move "!" out of the rgcs-char because of its special
treatment vs. the other reassignable GCS characters.
****LINES THAT WOULD CHANGE IN THE REVISED ABNF****
gcs-authority = pgcs-authority / rgcs-authority
pgcs-authority = "!" xri-subseg-pt-nz *xri-subseg
xri-subseg-pt-nz = "!" (xref / 1*xri-pchar)
rgcs-authority = rgcs-char xri-segment
rgcs-char = "=" / "@" / "+" / "$"
xri-gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "("
/ ")" / "*" / "!" / rgcs-char
****END****
The net effect of this change is simply to separate out the special
restriction on using "!" as a GCS character. Because of the new
pgcs-authority production, it is no longer ambiguous that a single bang
represents a relative persistent subsegment, i.e., it is fine to write
"!123".
To see it all in context, following is the fully revised ABNF for this set
of productions (again, only the six lines above have changed):
****FULL REVISED ABNF****
xri-authority = gcs-authority / xref-authority
gcs-authority = pgcs-authority / rgcs-authority
pgcs-authority = "!" xri-subseg-pt-nz *xri-subseg
rgcs-authority = rgcs-char xri-segment
xref-authority = xref *xri-subseg
rgcs-char = "=" / "@" / "+" / "$"
xri-path = xri-path-absolute
/ xri-path-noscheme
/ ipath-empty
xri-path-absolute = "/" [ xri-segment-nz *( "/" xri-segment ) ]
xri-path-noscheme = xri-subseg-od-nx *xri-subseg-nc
*( "/" xri-segment )
xri-segment = xri-subseg-od *xri-subseg
xri-segment-nz = xri-subseg-od-nz *xri-subseg
xri-subseg = ( "*" / "!" ) (xref / *xri-pchar)
xri-subseg-nc = ( "*" / "!" ) (xref / *xri-pchar-nc)
xri-subseg-od = [ "*" / "!" ] (xref / *xri-pchar)
xri-subseg-od-nz = [ "*" / "!" ] (xref / 1*xri-pchar)
xri-subseg-od-nx = [ "*" / "!" ] 1*xri-pchar-nc
xri-subseg-pt-nz = "!" (xref / 1*xri-pchar)
xri-gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "("
/ ")" / "*" / "!" / rgcs-char
***END***
=Drummond
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]