Hi,

the latest version (see below) is better (the generated rule can
be used recursively if needed):

A-B-rule: func [
    {Generate an A-B parse rule}
    A [block!] {A-rule}
    B [block!] {B-rule}
    /local o
] [
    o: make object! [
        A-rule: A
        B-rule: B
        res-rule: none
    ]
    bind/copy [
        (self)
        [
            B-rule (res-rule: [to end skip]) |
            (res-rule: A-rule)
        ]
        res-rule
    ] in o 'self
]

{
    Example:

    a: [any "a" "b"]
    b: ["aa"]
    a-b: a-b-rule a b
    parse "ab" a-b
    parse "aab" a-b
}

not-rule: func [
    "Generate a not A parse rule"
    A [block!] {A-rule}
    /local o
] [
    o: make object! [
        A-rule: A
        res-rule: none
    ]
    bind/copy [
        (self)
        [
            A-rule (res-rule: [to end skip]) |
            (res-rule: [])
        ]
        res-rule
    ] in o 'self
]

{
    Example:

    a: [any "a" "b"]
    not-a: not-rule a
    parse "ab" not-a
    parse "b" not-a
    parse "" not-a

}

> That's brilliant Ladislav. It took a little while to understand
what magic
> you put there, and I learnt something as a result.
>
> I've made a few tests so far and cannot fault it.
>
> Thanks,
> Brett.
>
>
> ----- Original Message -----
> From: <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Monday, July 31, 2000 4:06 AM
> Subject: [REBOL] Parse does not have "not" match type. Re:
>
>
> > Hi, I think, that Parse has got a bug as in:
> >
> > >> parse "a" [none skip]
> > == true
> >
> > cc-ing to feedback. Here is a version of A-B-rule, that should
> > work reliably. Test it please.
> >
> > A-B-rule: func [
> >     "Generate an A-B parse rule"
> >     A [block!] {A-rule}
> >     B [block!] {B-rule}
> >     /local o
> > ] [
> >     o: make object! [
> >         A-rule: A
> >         B-rule: B
> >         res-rule: none
> >     ]
> >     bind/copy [
> >         (self)
> >         [
> >             B-rule (res-rule: [to end skip]) |
> >             A-rule (res-rule: []) |
> >             (res-rule: [to end skip])
> >         ]
> >         res-rule
> >     ] in o 'self
> > ]
> >
> >
>
>
>

Reply via email to