Hi Patrick,

Is this more or less what you are loking for?


start-char: charset join {"} "{"
not-start-char: complement start-char
rule: [
        some[
                any not-start-char
                [
                        ["{" copy string to "}" "}"]
                        |
                        [{"} copy string to {"} {"}]
                        (print string)
                ]
        ]
]
parse mold code rule

Hello World!
test
test 2
alone in the line
Salut {you}
problem?



On Sun, 16 Nov 2003 [EMAIL PROTECTED] wrote:

>
> Hi List
>
> I have being struggling all day with a parse problem: extracting all strings from a 
> Rebol script.
> It may seem trivial at the first look.
> However as you know strings are delimited by a pair of (") or by ({) and (}) and 
> inclusions are allowed.
> {Hello "vous"} and "Salut {you}" are valid strings.
>
> I have produced several solutions that were ok with my test data by failed with a 
> real script.
> Here is my final draft which passed all my tests.
> However it may not be perfect or simply wrong.
>
> Here is how it is supposed to work:
>
> rule1 is for "string" delimited by (")
> rule2 is for {string} delimited by ({) and (})
>
> rule1 AND rule2 are applied.
> If both passed, I keep the one with the nearest match and the parsing position is 
> adjusted.
> otherwise rule1 is applied
> otherwise rule2 is applied
>
> I will be glad if some parse gurus may have a critical look...
>
> 8<-----------------------------------------------------
>
> code: [
>         Rebol []
>         ; This is a program
>         str: "Hello World!"
>         print "test"
>         str2: {Hello "vous"}
>         print {test 2}
>         print
>         {alone in the line}
>         print {"strange" thing}
>         str3: "Salut {you}"
>         print {problem?}
> ]
>
> script: mold code
> strings: copy []
>
> rule1: [thru #"^"" mark1: copy text1 to #"^"" skip end1:]
> rule2: [thru #"{" mark2: copy text2 to #"}" skip end2:]
>
> store: [either (index? mark1) > (index? mark2)
>                         [
>                                 append strings text2
>                                 restart: end2
>                         ][
>                                 append strings text1
>                                 restart: end1
>                         ]
>                 ] ; store
>
>
> parse script [ any [start: rule1 :start rule2 (do store) :restart |
>                                         rule1 (append strings text1)|
>                                         rule2 (append strings text2)] to end]
>
> foreach s strings [print s]
>
> 8<-----------------------------------------------------
>
> Regards
> Patrick
>
> --
> To unsubscribe from this list, just send an email to
> [EMAIL PROTECTED] with unsubscribe as the subject.
>
-- 
To unsubscribe from this list, just send an email to
[EMAIL PROTECTED] with unsubscribe as the subject.

Reply via email to