Jump to content

Rebol Programming/Language Features/Parse/Parsing examples

From Wikibooks, open books for an open world

Simply split

[edit | edit source]

This is an example of simple splitting using parse expression matching. As opposed to the NONE rule, this example does not treat the quotation marks specially. It can be modified easily to suit your needs.

simply-split: func [
    input [string!]
    /local delimiter whitespace regular result split
] [
    delimiter: charset ",;"
    whitespace: charset [#"^A" - #" " "^(7F)^(A0)"]
    regular: complement union delimiter whitespace
    ; result is a block containing the splits we collect
    result: copy []
    ; turn off the default whitespace handling,
    ; since we handle whitespace explicitly
    parse/all input [
        ; skip the leading whitespace
        any whitespace
        any [
            ; no split encountered
            delimiter
            (append result copy "")
            any whitespace
            | copy split some regular
            (append result split)
            any whitespace
            [delimiter any whitespace |]
        ]
    ]
    result
]

The SIMPLY-SPLIT function behaves like the PARSE function obtaining the NONE rule (examples above) except for the CSV case:

simply-split {"red","blue","green"}
; == [{"red"} {"blue"} {"green"}]

Porter measure of a word

[edit | edit source]
; vowel variants
vowel-after-consonant: charset "aeiouyAEIOUY"
vowel-otherwise: charset "aeiouAEIOU"

; consonant variants
consonant-after-consonant: exclude charset [
    #"a" - #"z" #"A" - #"Z"
] vowel-after-consonant
consonant-otherwise: union consonant-after-consonant charset "yY"

; adjusting the Vowel and Consonant rules to the Otherwise state
otherwise: first [
    (
        ; vowel detection does not change state
        vowel: vowel-otherwise
        ; consonant detection changes state to After-consonant
        consonant: [consonant-otherwise after-consonant]
    )
]

; adjusting the Vowel and Consonant rules to the After-consonant state
after-consonant: first [
    (
        ; vowel detection provokes transition to the Otherwise state
        vowel: [vowel-after-consonant otherwise]
        ; consonant detection does not change state
        consonant: consonant-after-consonant
    )
]

measure: [
    ; initialization
    (
        ; zeroing the counter
        m: 0
    )

    ; setting the state to Otherwise
    otherwise
    ; initialization end

    any consonant
    any [some vowel some consonant (m: m + 1)]
    any vowel
]