2010-03-12 6 views
1

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 (?:...).

Répondre

1

vous pouvez ajouter (?=.) au début de votre regex.

+0

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

+0

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

0

Le problème est que tout dans votre première ligne est facultatif - soit ? (0 ou 1) ou * (0 ou plus).

Je connais pas trop avec le système anglo-saxon (je ne l'ai jamais vu avant ... croches), mais peut-être quelque chose comme

([0-9]+\s*["'s])+ (with whatever escaping is necessary for the " and ' - I'm not a javascript guy) 

Cela garantit certainement qu'il ne correspond pas à une chaîne vide , le problème est qu'il permettrait quelque chose comme 5 s 4" 6' , ce qui est sans doute pas tout à fait ce que vous voulez ...

+0

ouais ... C'est la solution avec laquelle je travaille actuellement. Vous avez raison sur l'orde problème d'anneau. En ce moment, cela est géré par la méthode 'FIS.fromString' (définie ailleurs) – Dancrumb

Questions connexes