[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]
Subject: Re: Prohibiting duplicate attributes.
Kohsuke KAWAGUCHI wrote: > Murata-san suggested to me that restricting duplicate attributes (see > the issue #21) is a good thing in several ways. Thanks for starting this thread on behalf of lazy M-san. First, let's consider some examples of errors. Kohsuke KAWAGUCHI wrote: > For example, > > <group> > <attribute name="foo"/> > <attribute name="foo"/> > </group> > > is an error. Yes. This is an error, since @foo matches both <attribute/>. > <group> > <attribute name="foo"/> > <attribute> > <anyName/> > ... > </attribute> > </group> > > is also an error. This is also an error, since @foo matches both. Here is slightly more complicated example <group> <choice><attribute name="a"/><attribute name="b"><empty/></choice> <choice><attribute name="b"/><attribute name="c"><empty/></choice> </group> Again, this is an error. @b matches both <choice/>. If this example had <interleave> rather than <group>, we had the same error. <group> <oneOrMore><choice><attribute name="a"/><attribute name="b"><empty/></choice></oneOrMore> <choice><attribute name="b"/><attribute name="c"><empty/></choice> </group> is also an error. Intuitively speaking, my proposal is as follows: Given <group> p1 p2 </group> or <interleave> p1 p2 </interleave>, a single attribute never matches an <attribute> occurring in p1 as well as an <attribute> occurring in p2. This restriction allows eager construction of hedge automata even for attribute-element content models (no combinatory explosion). More about this, see my next mail. Now, I present my algorithm for detecting duplicate attributes. I assume that we have boolean operators for name classes and that we cant test emptyness of name classes. As usual, I assume that the pattern is already in the normalized form. Furthermore, I assume that restrictions on <oneOrMore> and <list> are checked elsewhere. Here is the algorithm. proc checkDuplicatedAttributeDcl(pattern p) returns nameClass { switch (p) { case <attribute>nc p1</attribute>: return nc; case <group>p1 p2</group>: case <interleave>p1 p2</interleave>: nc1 = checkDuplicatedAttributeDcl(p1); nc2 = checkDuplicatedAttributeDcl(p2); if the intersection of nc1 and nc2 is NOT empty then print "duplication of attributes" fi nc3 = the union of nc1 and nc2; return nc3; case <choice>p1 p2</choice>: nc1 = checkDuplicatedAttributeDcl(p1); nc2 = checkDuplicatedAttributeDcl(p2); nc3 = the union of nc1 and nc2; return nc3; case <oneOrMore>p1 </oneOrMore>: nc1 = checkDuplicatedAttributeDcl(p1); return nc1; case <list/>: //I suppose that <list> does not contain subordinate //<ref> or <attribute>. case <value/>: case <data/>: case <text/>: } Cheers, Makoto
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]
Powered by eList eXpress LLC