alternative basée à RE2 Automata
-
02-10-2019 - |
Question
Je suis besoin de mettre en œuvre des expressions régulières dans un programme C ++ je suis en train d'écrire, et je voulais utiliser RE2 mais je ne pouvais pas le compiler sur les fenêtres. Quelqu'un sait-il d'une autre bibliothèque d'expressions régulières ou quelque chose comme ça qui compile facilement sur les fenêtres et n'est pas un « retour en arrière » moteur regex, mais une théorie des automates basé un (quoi que cela signifie) comme RE2 est?
Ou tout simplement déterminer comment compiler RE2 sur les fenêtres serait parfait.
La solution
Les expressions régulières font partie de la norme TR1, si les chances sont que vous avez déjà un en-tête <tr1/regex>
que contient une classe std::tr1::regex
et fonctions connexes.
Autres conseils
Jetez un oeil à
http://www.complang.org/ragel/
Il est un DSL externe donc pas techniquement C ++. Cependant, comme il génère pur C ++ / C des expressions régulières, il devrait être beaucoup plus rapide que tout ce qui est construit à l'exécution ./
Par exemple.
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 compilé en
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;
J'ai un port de RE2 pour Windows http://code.google.com/p/ re2win / . Il construit avec beaucoup d'avertissements, aucune erreur.