Автомат на основе альтернативы re2 - PullRequest
2 голосов
/ 06 июля 2010

Мне нужно реализовать регулярные выражения в программе на C ++, которую я пишу, и я хотел использовать re2, но я не смог скомпилировать его в Windows.Кто-нибудь знает о другой библиотеке регулярных выражений или о том, как она называется, которая легко компилируется в Windows и не является движком регулярных выражений «backtracking», а базируется на теории автоматов (что бы это ни значило), например re2?

Или просто понять, как скомпилировать re2 на windows, было бы идеально.

Ответы [ 3 ]

1 голос
/ 06 июля 2010

Взгляните на

http://www.complang.org/ragel/

Это внешний DSL, так что технически это не C ++.Однако, поскольку он генерирует чистый C ++ / C из регулярных выражений, он должен быть намного быстрее, чем все, что создается во время выполнения ./

Например.

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' )*;

get скомпилировано до

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;
1 голос
/ 06 июля 2010

Регулярные выражения являются частью стандарта TR1, поэтому, скорее всего, у вас уже есть заголовок <tr1/regex>, который содержит класс std::tr1::regex и связанные с ним функции.

0 голосов
/ 02 декабря 2011

У меня есть порт RE2 для Windows на http://code.google.com/p/re2win/. Он строит с большим количеством предупреждений, без ошибок.

...