J'utilise le générateur de parser Jison pour Javascript et j'ai des problèmes avec ma spécification de langue.Comment puis-je m'assurer qu'une expression rationnelle ne correspond pas à une chaîne vide?
Le programme que j'écris sera une calculatrice qui peut gérer les pieds, les pouces et les seizièmes. Pour ce faire, j'ai les spécifications suivantes:
%%
([0-9]+\s*"'")?\s*([0-9]+\s*"\"")?\s*([0-9]+\s*"s")? {return 'FIS';}
[0-9]+("."[0-9]+)?\b {return 'NUMBER';}
\s+ {/* skip whitespace */}
"*" {return '*';}
"/" {return '/';}
"-" {return '-';}
"+" {return '+';}
"(" {return '(';}
")" {return ')';}
<<EOF>> {return 'EOF';}
La plupart de ces lignes proviennent d'un cahier des charges de la calculatrice de base. J'ai simplement ajouté la première ligne.
La regex correspond correctement aux pieds, pouces, seizièmes, tels que 6'4"
(six pieds, 4 pouces) ou 4"5s
(4 pouces, 5 seizièmes) avec n'importe quel espace entre les chiffres et les indicateurs.
Le problème est que la regex aussi correspond à une chaîne vide. Par conséquent, l'analyse lexicale enregistre toujours un FIS au début de la ligne, puis l'analyse échoue.
Voici ma question: existe-t-il un moyen de modifier cette regex pour garantir qu'elle ne correspondra qu'à une chaîne de longueur non nulle? Bien que la regex ait des groupes de capture, je n'ai pas besoin de capturer ces groupes. Je sais que je pourrais utiliser des groupes qui ne capturent pas, mais c'est un peu plus clair sans les (?:...)
.
Merci! Malheureusement, cette regex n'est pas supportée par Jison, mais les félicitations pour la résolution de la question * réelle * que j'ai posée ... l'ajout de * fait * correspondre correctement la chaîne – Dancrumb
Correction ... cette regex ** est ** supportée par Jison. Pour mon besoin spécifique, j'ai dû utiliser: (? = [^ 0-9 */\ - +()]), de sorte qu'il ne correspondrait pas aux autres jetons – Dancrumb