Как мне разобрать это в Rebol? - PullRequest
       23

Как мне разобрать это в Rebol?

2 голосов
/ 16 сентября 2011

Как мне выполнить синтаксический анализ этой строки

"a:foo[and it's cousin bar[are here]]"

в этой

"a:" "foo[" "and" "it's" "cousin" "bar[" "are" "here" "]" "]"

По сути, я стремлюсь выполнить три вещи, извлечь назначение «a:»извлечь разделы "foo [" (включая вложенные разделы) и закрывающий раздел "]".Я мог бы равномерно распределить их и просто выполнить простой анализ, но я не хочу этого делать.

Надеюсь, это имеет смысл.Любая помощь будет принята с благодарностью!

Спасибо!

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Определите элементы вашего языка, затем соберите их, когда вы их соответствуете:

parse-my-language: use [word assignment section section-end space][

    word: use [letters][
        letters: charset [#"a" - #"z" ".'"]
        [some letters]
    ]
    assignment: [word ":"]
    section: [word "["]
    section-end: "]"

    space: charset " "

    func [statement /local out element][
        out: copy []
        if parse/all statement [
            any [
                copy element [
                    assignment | section | section-end | word
                ] (append out element)
                | some space
            ]
        ][out]
    ]
]

probe parse-my-language "a:foo[and it's cousin bar[are here]]"

Примечание: я использую 'use, чтобы выделить слова, используемые исключительно для этой цели.

2 голосов
/ 19 сентября 2011

Может помочь еще немного контекста вокруг примера, так как часто есть много вариантов, которые вы можете попробовать в rebol.

Одним из простых подходов было бы «исправить» вашу строку, чтобы она стала более похожа на обычные данные ребол.

source-string: "a:foo[and it's cousin bar[are here]]"
replace/all source-string "[" " [ "
replace/all source-string "]" " ] "
replace/all source-string ":" ": "
output: load source-string

Редко использовать строки таким образом в реболе. Блоки, как правило, более гибкие и простые для анализа.

...