LINUX.ORG.RU

Ответ на: комментарий от hizel

> в perl6 PEG из коропки

Оно ещё толком не реализовано нигде

anonymous
()
Ответ на: комментарий от hizel

Дракон силён, но тяжел сильно.

Если язык не сложен, то проще почитать элементарные алгоритмы синтаксического анализа + формальные грамматики чуть-чуть курнуть. После чего руками за вечерок сваять свой лексер+парсер, а не тратить кучу времени на составление грамматики для языка(с ходу может и не получиться банально).

Norgat ★★★★★
()

самое лучшее и краткое введение в грамматический разбор - это пример калькулятора из Страуструпа :)

tailgunner ★★★★★
()
Ответ на: комментарий от Norgat

Если язык не сложен, то проще почитать элементарные алгоритмы синтаксического анализа + формальные грамматики чуть-чуть курнуть.

После этого ещё можно курнуть доки к Boost::Spirit, чтобы веселее пошло.

gizzka ★★
()
Ответ на: комментарий от gizzka

> После этого ещё можно курнуть доки к Boost::Spirit, чтобы веселее пошло.

Проще взять F#/OCaml/Haskell/Scala/Nemerle и на мучаться с C++, ибо match-with + размеченные объединения оч. облегчают жизнь когда делается лексер.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

В Spirit'е по большому счету уже все сделано, мучиться не надо. Просто там довольно навороченные шаблоны, поэтому желательно немного понимать, что пишешь, а то можно на какие-нибудь грабли наступить. Ну и он не самый быстрый.

размеченные объединения

Boost.Variant, Boost.Optional (уже встроены и активно используются Spirit'ом)

match-with

Нуу, там просто задается грамматика в виде, похожем на EBNF (примеры).

Хотя готовую библиотеку с языковыми средствами сравнивать некорректно, да. И я не спорю, что F# и тот же Haskell для написания с нуля могут быть удобнее.

gizzka ★★
()
Ответ на: комментарий от gizzka

В Spirit'е по большому счету уже все сделано, мучиться не надо. Просто там довольно навороченные шаблоны, поэтому желательно немного понимать, что пишешь, а то можно на какие-нибудь грабли наступить. Ну и он не самый быстрый.

Сделано то оно сделано, но обычно(исхожу из fslex, fsyacc и их аналогов под Си) нужно составлять формальную грамматику и правила под неё, а это, без опр. сноровки сложнее(для небольшого языка, про который вроде как писал топикстартер), чем написать ручками свой лексер и парсер(ест. не на C/C++)

размеченные объединения

Boost.Variant, Boost.Optional (уже встроены и активно используются Spirit'ом)

Посмотрел, имхо, ужс) хотя это скорее моя привычка к F#.

Я на нём могу вот так делать просто(это именно чистый язык):

// объявляю некоторый набор констант
type Operators =
    | PLUS
    | MINUS
    | MULT

// некий простенький синтаксический разбор
let (|Plus|Minus|Mult|NoOp|Splitter|) (ch : char) =
    match ch with
        | '+' -> Plus '+'
        | '-' -> Minus '-'
        | '*' -> Mult '*'
        | ';' -> Splitter ';'
        | _   -> NoOp

// обработка разобранного текста
let tokenize (str : string) =
        if str.Length = 1
            then
                match str.[0] with
                    | Plus x        -> OPERATOR PLUS
                    | Minus x       -> OPERATOR MINUS
                    | Mult x        -> OPERATOR MULT
                    | Splitter x    -> SPLITTER BSPLIT
                    | _ -> FUNCTOR str
            else
                FUNCTOR str

Это кусочек каких то моих экспериметнов старых. Думаю разница с тем же C++ в читабельности очевидна уже на этом примере.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

> Проще взять F#/OCaml/Haskell/Scala/Nemerle и на мучаться с C++, ибо match-with + размеченные объединения оч. облегчают жизнь когда делается лексер.

lexer - это одна из самых маленьких частей транслятора.

anonymous
()

А почему именно на перл? Да, токенайзер на перле пишется тривиально, ибо регулярные выражения в язык встроены, а вот с построением синтаксического дерева видимо придется потрахаться. Может таки взять flex/bison ?

Reset ★★★★★
()
Ответ на: комментарий от tailgunner

нет, пример калькулятора из Кернигана

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.