Back to site

Кампілятар Ragel State Machine

Што такое Ragel?

Ragel кампілюе выкананы канчатковых аўтаматаў з рэгулярных моў. Ragel мэты C, C + +, Objective-C, D, Java і Ruby. стан машыны Ragel можа не толькі прызнаць паслядоўнасці байтаў, як рэгулярныя выразы машыны робяць, але таксама можа выконваць код у адвольных кропках у прызнанні рэгулярнай мовы. Кодэкс укладанне робіцца з дапамогай убудаваных аператараў, якія не парушаюць сінтаксіс рэгулярнай мовы.

Ядро мовы складаецца са стандартных аператараў рэгулярных выразаў (напрыклад, звяз, аб'яднанне і Клини зоркі) і дзеянняў аператараў укладання. рэгулярныя выразы карыстача кампілююцца ў дэтэрмінаваных дзяржаўнай машыны і ўбудаваныя дзеянні, злучаныя з пераходамі з машыны. Разуменне фармальныя адносіны паміж рэгулярнымі выразамі і дэтэрмінаваных канчатковых аўтаматаў з'яўляецца ключом да выкарыстання Ragel эфектыўна.

Ragel таксама падае аператарам, якія дазваляюць кіраваць любы не-дэтэрмінізм, які вы ствараеце, пабудаваць сканары, і пабудаваць стан машыны пры дапамозе Statechart мадэлі. Акрамя таго, можна ўплываць на выкананне дзяржаўнай машыны знутры ўбудаваных дзеянняў, скокнуўшы ці патэлефанаваўшы ў іншыя часткі машыны, ці перапрацоўцы ўваходу.

Ragel забяспечвае вельмі гнуткі інтэрфейс да базавых мовай, што спробы паставіць мінімальныя абмежаванні на генераванага кода інтэгравана ў прыкладанні. Згенераваны код не мае залежнасцяў.

action dgt      { printf("DGT: %c\n", fc); }
action dec      { printf("DEC:.\n"); }
action exp      { printf("EXP: %c\n", fc); }
action exp_sign { printf("SGN: %c\n", fc); }
action number   { /*NUMBER*/ }

number = (
    [0-9]+ $dgt ('.' @dec [0-9]+ $dgt)?
    ([eE] ([+\-] $exp_sign)? [0-9]+ $exp)?
) %number;

main := (number '\n')*;
   =>   
st0:
    if (++p == pe)
        goto out0;
    if (48 <= (*p) && (*p) <= 57)
        goto tr0;
    goto st_err;
tr0:
    { printf("DGT: %c\n", (*p)); }
st1:
    if (++p == pe)
        goto out1;
    switch ((*p)) {
        case 10: goto tr5;
        case 46: goto tr7;
        case 69: goto st4;
        case 101: goto st4;
    }
    if (48 <= (*p) && (*p) <= 57)
        goto tr0;
    goto st_err;
||
\/

http://www.complang.org/ragel/click for larger

Якія задачы Ragel добра?

  • Даць надзейных рэалізацый пратаколу.
  • Разбор фарматаў дадзеных.
  • Лексічны аналіз моў праграмавання.
  • Праверка карыстацкага ўводу.

Асаблівасці

  • Пабудаваць канчатковых аўтаматаў з дапамогай:
    • рэгулярных аператараў мовы
    • дзяржаўных аператараў дыяграмы
    • Сканар аператара
    • некаторыя спалучэнні вышэй
  • Уставіць дзеянняў у машыны ў адвольных месцах.
  • Кіраванне недэтэрмінаваныя выкарыстаннем ахоўваная аператараў.
  • Машыны Згарнуць станы з дапамогай алгарытму Хопкрофт.
  • Візуалізуйце выйсце з Graphviz.
  • Выкарыстоўвайце байт, падвойны байт ці слова памеру алфавітаў.
  • Стварыць C, C + +, Objective-C, D, Java ці Ruby код без залежнасцяў.
  • Абярыце з табліцы ці кіраванне струменем driven аўтаматаў.

Публікацыі

[1] Adrian D. Терстон. "Разбор кампутара Мовы з аўтамата складзены на аснове аднаго рэгулярнага выраза". У 11-й Міжнароднай канферэнцыі па ўкараненні і ўжыванню аўтаматаў (CIAA 2006), Лекцыі па вылічальнай тэхніцы, аб'ём 4094, стар. 285-286, Тайпей, Тайвань, жнівень 2006. PDF.

Дакументацыя, рэдактары і спіс рассылання

Ragel мае інструкцыю даступныя ў PDF фармаце, бо чалавек старонцы. Асноўныя рэлізы ўтрымоўваюць нумар версіі мовы змены. Гл. ChangeLog і выпуску падрабязна.

Калі вы выкарыстоўваеце Vim, ёсць сінтаксіс файла ragel.vim для рэдагавання задавальненне. Калі вы выкарыстоўваеце TextMate ёсць Ragel расслаенне Ragel.tmbundle.

Спіс рассылання Ragel можна азнаёміцца тут: Ragel-карыстачоў. Папытаеце пра дапамогу, пасля разбору праблемы, ці сказаць што вы думаеце о Ragel.

Спасылкі

  • Выкарыстанне Ragel і XCode. спасылка
  • Mongrel з'яўляецца бібліятэка HTTP і сервер для Ruby.
  • Hpricot з'яўляецца разбор HTML і бібліятэка для працы з Ruby.
  • RFuzz з'яўляецца разбуральнікам HTTP.
  • Zed Shaw на Ragel дзяржавы Charts. спасылка
  • SuperRedCloth гэта хутка ажыццяўленні Тэкстыль для Ruby.
  • JSON парсер JSON і генератар для Ruby.
  • Аналізатар JSON для Пайк. спасылка
  • Lib2geom : вылічальныя бібліятэкі геаметрыі для Inkscape.
  • Уту : інтэрнэт-сувязі з крыптаграфічнымі гвалтоўных ідэнтычнасці, рэпутацыі і адплаты.
  • AppID : за адзін праход пратакол ідэнтыфікацыі прыкладання.
  • RaSPF з'яўляецца бібліятэка SPF у С.
  • Макет мовы выразаў (частка марнатраўства) з'яўляецца для пабудовы графічнага інтэрфейсу Swing з JRuby.
  • Qfsm гэта графічная прылада для праектавання канчатковых аўтаматаў. Яна складаецца з функцыю Ragel экспарту.
  • ABNF генератара з'яўляецца прыладай, які прымае граматык у ABNF і выйсці Ragel вызначэнняў.
  • Perian з'яўляецца адным з кампанентаў QuickTime, які дадае ўбудаваная падтрымка большасці папулярных відэа фарматаў.
  • devChix артыкулы: "Hello World" для Ruby на Ragel. (Абноўлена)
  • Бразільскі партугальскі пераклад вышэй: Um Hello World пункт о Ruby ет Ragel 6,0

Прыклады

Ляск: сканар для простых З падобнай мовай. clang.rl

Паштовая скрыня: разбірае файлы паштовых скрынь Unix. Гэта разбівае файлы на асобныя паведамленні, загалоўкі ў паведамленні і органаў паведамленняў. mailbox.rl

AwkEmu: выконвае асноўныя разбору, што AWK праграмы выступае на ўваход. awkemu.rl

Atoi: пераўтворыць радок у лік. atoi.rl

Паралельнае: выконвае некалькі незалежных задач адначасова. concurrent.rl

Statechart: машына Atoi пабудаваны з імем дзяржавы і спіс парадыгмы пераходу. statechart.rl

GotoCallRet: дэманстрацыя выкарыстанні fgoto, fcall, ірваць і fhold. gotocallret.rl

Параметры: аналізуе аргументы каманднага радка. params.rl

RagelScan: скануе Ragel уваходных файлаў. rlscan.rl

CppScan: C + + сканар, які выкарыстоўвае самы доўгі матч метад сканавання cppscan.rl

Запампаваць

Распрацоўваная версія: Калі ласка, выкарыстоўвайце гэта для стварэння патчаў.

http://svn.complang.org/ragel/trunk/

Tar.gz: апошні рэліз версіі Ragel-6.6.tar.gz (сігналу).

Пажылыя: Папярэднія версіі даступныя тут.

Debian: на хатняй старонцы Debian пакет Ragel гэта тут. Гэта з'яўляецца Роберт Lemmen.

OpenPKG: Ragel была ўключана ў OpenPKG праекта.

FreeBSD: порт для Ragel даступны ў FreeBSD портаў.

NetBSD: Існуе пакет для Ragel у Pkgsrc базы дадзеных.

Mac OS X: порт даступны ў MacPorts сховішча.

Crux: порт для Crux размеркаванні Linux даступная тут.

Gentoo: Gentoo порт даступны.

Suse: пакеты для Suse можна знайсці тут.

Windows: Ragel могуць быць скампіляваны з выкарыстаннем Cygwin ці MinGW. Binaries складзены з Visual Studio з'яўляюцца тут (6,6), пры ўмове, Джозаф Goettgens.

RedHat / Fedora: пакет для Ragel даступны ў Fedora Extras.

Slackware: пакет даступны на LinuxPackages.net

Версія: 6.6
Дата: 2 снежня 2009
Змены рэгістрацыі: ChangeLog
Tar.gz: Ragel-6.6.tar.gz (сігналаў)
Zip: Ragel-6.6.zip (сігналаў)
Кіраўніцтва карыстача PDF: Ragel-гід-6.6.pdf

Адкрыты ключ для пакета подпіс тут.

Ліцэнзія

Ragel выпушчаны пад ліцэнзіяй GNU General Public License. Копія ліцэнзіі знаходзіцца ў размеркаванні. Яна таксама даступная з GNU.

Нататка: часці выйсця Ragel капіююцца з крыніцы Ragel якія ахопліваюцца ліцэнзіяй GNU GPL. У якасці выключэння да GPL, вы можаце выкарыстоўваць часткі выйсця Ragel скапіяваны з Ragel крыніцы без абмежаванняў. Рэштка выходных Ragel з'яўляецца вытворным ад уваходнага і ўспадкоўвае прававы статут уваходнага файла. Выкарыстанне Ragel не дае ніякіх патрабаванняў пра ліцэнзію згенераваны код.

Крэдыты

Ragel была напісана Adrian Thurston. Першапачаткова ён быў распрацаваны напачатку 2000 гады і ўпершыню была выпушчана студзеня 2002 гады. Шматлікія людзі ўнеслі свой унёсак зваротнай сувязі, ідэі і код. Калі ласка, пагледзіце на КРЭДЫТЫ файл.


Popular Links
Published (Last edited): Feb 10