Esempio n. 1
0
        RdpPattern ReplaceAfterHeadWithEmpty(RdpPattern p)
        {
            if (p is RdpAbstractSingleContent)
            {
                return(new RdpChoice(RdpEmpty.Instance, p));
            }
            RdpAbstractBinary ab = p as RdpAbstractBinary;

            if (ab == null)
            {
                return(p);
            }
            if (ab is RdpGroup)
            {
                return(new RdpGroup(ReplaceAfterHeadWithEmpty(ab.LValue), ReplaceAfterHeadWithEmpty(ab.RValue)));
            }
            else if (ab is RdpChoice)
            {
                return(new RdpChoice(ReplaceAfterHeadWithEmpty(ab.LValue), ReplaceAfterHeadWithEmpty(ab.RValue)));
            }
            else if (ab is RdpInterleave)
            {
                return(new RdpInterleave(ReplaceAfterHeadWithEmpty(ab.LValue), ReplaceAfterHeadWithEmpty(ab.RValue)));
            }
            else if (ab is RdpAfter)
            {
                return(new RdpAfter(RdpEmpty.Instance, ab.RValue));
            }
            throw new SystemException("INTERNAL ERROR: unexpected pattern: " + p.GetType());
        }
Esempio n. 2
0
        // Error recovery feature can be enabled by using
        // InvalidNodeFound event of type RelaxngValidationEventHandler.
        //
        // Other than startTagOpenDeriv, it is (again) based on
        // James Clark's derivative algorithm.
        // http://www.thaiopensource.com/relaxng/derivative.html
        // For invalid start tag, we just recover from it by using
        // xs:any-like pattern for unexpected node occurence.

        RdpPattern MakeGroupHeadOptional(RdpPattern p)
        {
            if (p is RdpAbstractSingleContent)
            {
                return(new RdpChoice(RdpEmpty.Instance, p));
            }
            RdpAbstractBinary ab = p as RdpAbstractBinary;

            if (ab == null)
            {
                return(p);
            }
            if (ab is RdpGroup)
            {
                return(new RdpGroup(new RdpChoice(RdpEmpty.Instance, ab.LValue), ab.RValue));
            }
            else if (ab is RdpChoice)
            {
                return(new RdpChoice(MakeGroupHeadOptional(ab.LValue), MakeGroupHeadOptional(ab.RValue)));
            }
            else if (ab is RdpInterleave)
            {
                return(new RdpInterleave(MakeGroupHeadOptional(ab.LValue), MakeGroupHeadOptional(ab.RValue)));
            }
            else if (ab is RdpAfter) // FIXME: is it correct?
            {
                return(new RdpAfter(MakeGroupHeadOptional(ab.LValue), MakeGroupHeadOptional(ab.RValue)));
            }
            throw new SystemException("INTERNAL ERROR: unexpected pattern: " + p.GetType());
        }
Esempio n. 3
0
        RdpPattern ReplaceAttributesWithEmpty(RdpPattern p)
        {
            if (p is RdpAttribute)
            {
                return(RdpEmpty.Instance);
            }

            RdpAbstractSingleContent asc = p as RdpAbstractSingleContent;

            if (asc is RdpList)
            {
                return(new RdpList(ReplaceAttributesWithEmpty(asc.Child)));
            }
            if (asc is RdpOneOrMore)
            {
                return(new RdpOneOrMore(ReplaceAttributesWithEmpty(asc.Child)));
            }
            else if (asc is RdpElement)
            {
                return(asc); // should not be expected to contain any attribute as RdpElement.
            }
            RdpAbstractBinary ab = p as RdpAbstractBinary;

            if (ab == null)
            {
                return(p);
            }
            if (ab is RdpGroup)
            {
                return(new RdpGroup(ReplaceAttributesWithEmpty(ab.LValue), ReplaceAttributesWithEmpty(ab.RValue)));
            }
            else if (ab is RdpChoice)
            {
                return(new RdpChoice(ReplaceAttributesWithEmpty(ab.LValue), ReplaceAttributesWithEmpty(ab.RValue)));
            }
            else if (ab is RdpInterleave)
            {
                return(new RdpInterleave(ReplaceAttributesWithEmpty(ab.LValue), ReplaceAttributesWithEmpty(ab.RValue)));
            }
            else if (ab is RdpAfter) // FIXME: is it correct?
            {
                return(new RdpAfter(ReplaceAttributesWithEmpty(ab.LValue), ReplaceAttributesWithEmpty(ab.RValue)));
            }
            throw new SystemException("INTERNAL ERROR: unexpected pattern: " + p.GetType());
        }