OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

relax-ng message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]


Subject: Re: unambiguity constraint


I should also mention that I believe the technique I use here can also be
used for determining whether the intersection of two name classes is empty:

function overlaps(nameClass nc1, nameClass nc2) returns boolean
{
  for x in union(possibleNames(nc1), possibleNames(nc2)) {
     if (contains(nc1, x) and contains(nc2, x)) {
       return true;
     }
  return false;
}

----- Original Message -----
From: "James Clark" <jjc@jclark.com>
To: "Kohsuke KAWAGUCHI" <kohsuke.kawaguchi@eng.sun.com>; "TREX ML"
<trex@lists.oasis-open.org>
Sent: Saturday, May 05, 2001 11:58 AM
Subject: Re: unambiguity constraint


> I think you can use an algorithm along the lines of
>
> http://lists.oasis-open.org/archives/trex/200103/msg00014.html
>
> Define a category to be
>
> category ::= null
>                       | key(NCName)
>                       | keyref(NCName)
>
> function directCategories(pattern p) returns set(category)
> {
>   switch (p) {
>    case <group>p1 p2</group>:
>    case <choice>p1 p2</choice>:
>    case <interleave>p1 p2</interleave>:
>       return union(directCategories(p1), directCategories(p2));
>   case <oneOrMore>p1</oneOrMore>:
>      return directCategories(p1);
>    case <attribute/>:
>    case <element/>:
>       return {};
>    case <data key=s>:
>       return { key(s) };
>    case <data keyref=s>:
>       return { keyref(s) };
>     case <anyString/>:
>     case <data/>:
>     case <string/>:
>        return { null };
>     }
> }
>
> function possibleElements(pattern p) returns set(name) {
>    switch (p) {
>    case <group>p1 p2</group>:
>    case <choice>p1 p2</choice>:
>    case <interleave>p1 p2</interleave>:
>        return union(possibleElements(p1), possibleElements(p2);
>     case <element>nc p1</element>
>         return possibleNames(nc);
>    case <attribute/>;
>     case <anyString/>:
>     case <data/>:
>     case <string/>:
>       return {};
>    }
> }
>
> string MAGIC = "\u0000";  // any string that is illegal in XML will do
>
> function possibleNames(nameClass nc) returns set(name) {
>   switch (nc) {
>     case <name>n</name>:
>        return { expand(n) };
>     case <anyName/>:
>        return { name(MAGIC, MAGIC); }
>     case <nsName ns=ns/>:
>        return { name(ns, MAGIC); }
>      case <not>nc1</not>:
>         return union({ name(MAGIC, MAGIC }, possibleNames(nc1));
>      case <choice>nc1 nc2</choice>:
>      case <difference>nc1 nc2</difference>:
>         return union(possibleNames(nc1), possibleNames(nc2));
>    }
> }
>
> function combinedElementPattern(pattern p, name x) returns pattern {
>    switch (p) {
>    case <group>p1 p2</group>:
>    case <choice>p1 p2</choice>:
>    case <interleave>p1 p2</interleave>:
>        return <choice>combinedElementPattern(p1)
> combinedElementPattern(p2)</choice>;
>     case <element>nc p1</element>:
>        if (contains(nc, x) {
>          return p1;
>        }
>       else
>           return <empty/>;
>     case <attribute/>;
>     case <anyString/>:
>     case <data/>:
>     case <string/>:
>       return <empty/>;
>    }
> }
>
> function checkAmbig(pattern p)
> {
>   if (alreadyChecked(p))
>      return; // avoid infinite recursion.
>    mark p as already checked;
>    if (size(directCategories(p)) > 1)
>      it's ambiguous;
>    for each x in possibleNames(possibleAttributes(p)) {
>      checkAmbig(combinedAttributePattern(p, x));
>    }
>    for each x in possibleNames(possibleElements(p)) {
>       checkAmbig(combinedElementPattern(p, x));
>    }
> }
>
> combinedAttributePattern and possibleAttributes are similar to
> combinedElementPattern and possibleElements
>
> ----- Original Message -----
> From: "Kohsuke KAWAGUCHI" <kohsuke.kawaguchi@eng.sun.com>
> To: "TREX ML" <trex@lists.oasis-open.org>
> Sent: Saturday, May 05, 2001 11:19 AM
> Subject: Re: unambiguity constraint
>
>
> >
> > > The same constraint should be applied to ancestors recursively.
> >
> > That's true. But this makes the language tree-local and therefore
> > impractical.
> >
> > Well, mine is broken. We need a different constraint, I guess....
> >
> > --
> > Kohsuke KAWAGUCHI                          +1 650 786 0721
> > Sun Microsystems                   kohsuke.kawaguchi@eng.sun.com
> >
> >
> >
> >
>
>
>
>



[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]


Powered by eList eXpress LLC